qlogicagent 1.3.0 → 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/dist/index.js CHANGED
@@ -1,42 +1,44 @@
1
- var Yu=Object.defineProperty;var K=(r,e)=>()=>(r&&(e=r(r=0)),e);var Ds=(r,e)=>{for(var t in e)Yu(r,t,{get:e[t],enumerable:!0})};function Ce(r){if(!r||typeof r!="object")return r;if(Array.isArray(r))return r.map(n=>Ce(n));let e=r,t={};for(let[n,o]of Object.entries(e))if(!Xu.has(n)){if(n==="properties"&&o&&typeof o=="object"&&!Array.isArray(o)){t[n]=Object.fromEntries(Object.entries(o).map(([s,i])=>[s,Ce(i)]));continue}if(n==="items"&&o&&typeof o=="object"){t[n]=Array.isArray(o)?o.map(s=>Ce(s)):Ce(o);continue}if((n==="anyOf"||n==="oneOf"||n==="allOf")&&Array.isArray(o)){t[n]=o.map(s=>Ce(s));continue}if(o&&typeof o=="object"&&!Array.isArray(o)){t[n]=Ce(o);continue}if(Array.isArray(o)){t[n]=o.map(s=>Ce(s));continue}t[n]=o}return t}var Xu,wo=K(()=>{"use strict";Xu=new Set(["patternProperties","additionalProperties","$schema","$id","$ref","$defs","definitions","examples","minLength","maxLength","minimum","maximum","multipleOf","pattern","format","minItems","maxItems","uniqueItems","minProperties","maxProperties","const"])});function vo(r,e,t,n){return{role:"assistant",content:e||null,tool_calls:r,...t&&t.length>0?{thinkingBlocks:t}:{},...n?{reasoning_content:n}:{}}}function vt(r,e){let t=e.ok?typeof e.payload=="string"?e.payload:JSON.stringify(e.payload??""):`Error: ${e.error??"Tool execution failed"}`;return{role:"tool",tool_call_id:r,content:t,...e.toolReferences?.length?{toolReferences:e.toolReferences}:{}}}var Us=K(()=>{"use strict";wo()});function Je(r,e){if(!r)return!1;let t=r.toLowerCase();return e.some(n=>n instanceof RegExp?n.test(t):t.includes(n))}function md(r){return Je(r,Ke.format)}function Ns(r){return Je(r,Ke.rateLimit)}function gd(r){return Je(r,Ke.timeout)}function fd(r){return Qu.test(r)}function xo(r){let e=r.toLowerCase();return e?r.length>td?ed.test(e):Je(e,Ke.billing)?!0:Zu.test(r)?e.includes("upgrade")||e.includes("credits")||e.includes("payment")||e.includes("plan"):!1:!1}function js(r){return Je(r,Ke.authPermanent)}function hd(r){return Je(r,Ke.auth)}function Fs(r){return Je(r,Ke.overloaded)}function qe(r,e){return e.some(t=>r.includes(t))}function yd(r){return qe(r,rd)||qe(r,sd)&&r.includes("limit")||r.includes("billing hard limit")||r.includes("hard limit reached")||r.includes("maximum allowed")&&r.includes("limit")}function bd(r){let e=qe(r,id),t=r.includes("spend limit")||r.includes("spending limit"),n=qe(r,cd);return qe(r,ad)&&qe(r,ld)||e&&(r.includes("usage limit")||t)||e&&r.includes("limit")&&r.includes("reset")||n&&r.includes("limit")&&(t||qe(r,ud))}function kd(r){return r.trim().toLowerCase().replace(pd,"").trim()}function Bs(r){let e=kd(r);return!e||yd(e)?"billing":Ns(e)||bd(e)?"rate_limit":"billing"}function Td(r){return dd.test(r)?Bs(r):null}function Ws(r){let e=r.match(nd);if(!e)return null;let t=Number(e[1]);return Number.isFinite(t)?{code:t,rest:(e[2]??"").trim()}:null}function wd(r){if(!r)return!1;let e=r.toLowerCase();return e.includes('"type":"api_error"')&&e.includes("internal server error")}function vd(r){let e=r.trim();if(!e)return!1;let t=Ws(e);return t?od.has(t.code):!1}function Gs(r,e){return typeof r!="number"||!Number.isFinite(r)?null:r===402?e?Bs(e):"billing":r===429?"rate_limit":r===401||r===403?e&&js(e)?"auth_permanent":"auth":r===408?"timeout":r===503?e&&Fs(e)?"overloaded":"timeout":r===502||r===504?"timeout":r===529?"overloaded":r===400?e&&xo(e)?"billing":"format":null}function xd(r){if(!r)return!1;let e=r.toLowerCase();return!!(e.includes("unknown model")||e.includes("model not found")||e.includes("model_not_found")||e.includes("not_found_error")||e.includes("does not exist")&&e.includes("model")||e.includes("invalid model")&&!e.includes("invalid model reference")||/models\/[^\s]+ is not found/i.test(r)||/\b404\b/.test(r)&&/not[-_ ]?found/i.test(r))}function Sd(r){if(!r)return!1;let e=r.toLowerCase();return e.includes("session not found")||e.includes("session does not exist")||e.includes("session expired")||e.includes("session invalid")||e.includes("conversation not found")||e.includes("conversation does not exist")||e.includes("conversation expired")||e.includes("conversation invalid")||e.includes("no such session")||e.includes("invalid session")||e.includes("session id not found")||e.includes("conversation id not found")}function Hs(r){if(Sd(r))return"session_expired";if(xd(r))return"model_not_found";let e=Td(r);return e||(fd(r)?xo(r)?"billing":"rate_limit":Ns(r)?"rate_limit":Fs(r)?"overloaded":vd(r)?Ws(r.trim())?.code===529?"overloaded":"timeout":wd(r)?"timeout":md(r)?"format":xo(r)?"billing":gd(r)?"timeout":js(r)?"auth_permanent":hd(r)?"auth":null)}var Qu,Ke,Zu,ed,td,nd,od,rd,sd,id,ad,ld,cd,ud,dd,pd,Vs=K(()=>{"use strict";Qu=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,Ke={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]},Zu=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,ed=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,td=512,nd=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i,od=new Set([500,502,503,504,521,522,523,524,529]),rd=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],sd=["upgrade your plan","upgrade plan","current plan","subscription"],id=["daily","weekly","monthly"],ad=["try again","retry","temporary","cooldown"],ld=["usage limit","rate limit","organization usage"],cd=["organization","workspace"],ud=["billing period","exceeded","reached","exhausted"],dd=/["']?(?: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,pd=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i});function at(r,e){let t=Gs(r,e)??(e?Hs(e):null);return t?_d[t]:typeof r=="number"&&r>=400&&r<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function So(r){return Rd.has(r)}var _d,Rd,zs=K(()=>{"use strict";Vs();_d={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"},Rd=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"])});function Ct(r){return typeof r.compressAsync=="function"}function Cd(r,e){if(r.length<=e)return r;let t=r.slice(0,e);if(r.trimStart().startsWith("{")||r.trimStart().startsWith("[")){let s=Math.max(t.lastIndexOf("},"),t.lastIndexOf("],"),t.lastIndexOf(`}
1
+ var ru=Object.defineProperty;var J=(r,e)=>()=>(r&&(e=r(r=0)),e);var Ws=(r,e)=>{for(var t in e)ru(r,t,{get:e[t],enumerable:!0})};function Pe(r){if(!r||typeof r!="object")return r;if(Array.isArray(r))return r.map(n=>Pe(n));let e=r,t={};for(let[n,o]of Object.entries(e))if(!su.has(n)){if(n==="properties"&&o&&typeof o=="object"&&!Array.isArray(o)){t[n]=Object.fromEntries(Object.entries(o).map(([s,i])=>[s,Pe(i)]));continue}if(n==="items"&&o&&typeof o=="object"){t[n]=Array.isArray(o)?o.map(s=>Pe(s)):Pe(o);continue}if((n==="anyOf"||n==="oneOf"||n==="allOf")&&Array.isArray(o)){t[n]=o.map(s=>Pe(s));continue}if(o&&typeof o=="object"&&!Array.isArray(o)){t[n]=Pe(o);continue}if(Array.isArray(o)){t[n]=o.map(s=>Pe(s));continue}t[n]=o}return t}var su,Mo=J(()=>{"use strict";su=new Set(["patternProperties","additionalProperties","$schema","$id","$ref","$defs","definitions","examples","minLength","maxLength","minimum","maximum","multipleOf","pattern","format","minItems","maxItems","uniqueItems","minProperties","maxProperties","const"])});function Io(r,e,t,n){return{role:"assistant",content:e||null,tool_calls:r,...t&&t.length>0?{thinkingBlocks:t}:{},...n?{reasoning_content:n}:{}}}function Pt(r,e){let t=e.ok?typeof e.payload=="string"?e.payload:JSON.stringify(e.payload??""):`Error: ${e.error??"Tool execution failed"}`;return{role:"tool",tool_call_id:r,content:t,...e.toolReferences?.length?{toolReferences:e.toolReferences}:{}}}var Hs=J(()=>{"use strict";Mo()});function et(r,e){if(!r)return!1;let t=r.toLowerCase();return e.some(n=>n instanceof RegExp?n.test(t):t.includes(n))}function wu(r){return et(r,Ze.format)}function zs(r){return et(r,Ze.rateLimit)}function vu(r){return et(r,Ze.timeout)}function xu(r){return iu.test(r)}function Eo(r){let e=r.toLowerCase();return e?r.length>cu?lu.test(e):et(e,Ze.billing)?!0:au.test(r)?e.includes("upgrade")||e.includes("credits")||e.includes("payment")||e.includes("plan"):!1:!1}function Vs(r){return et(r,Ze.authPermanent)}function Su(r){return et(r,Ze.auth)}function qs(r){return et(r,Ze.overloaded)}function Qe(r,e){return e.some(t=>r.includes(t))}function _u(r){return Qe(r,pu)||Qe(r,mu)&&r.includes("limit")||r.includes("billing hard limit")||r.includes("hard limit reached")||r.includes("maximum allowed")&&r.includes("limit")}function Ru(r){let e=Qe(r,gu),t=r.includes("spend limit")||r.includes("spending limit"),n=Qe(r,yu);return Qe(r,fu)&&Qe(r,hu)||e&&(r.includes("usage limit")||t)||e&&r.includes("limit")&&r.includes("reset")||n&&r.includes("limit")&&(t||Qe(r,bu))}function Cu(r){return r.trim().toLowerCase().replace(Tu,"").trim()}function Ks(r){let e=Cu(r);return!e||_u(e)?"billing":zs(e)||Ru(e)?"rate_limit":"billing"}function Au(r){return ku.test(r)?Ks(r):null}function Js(r){let e=r.match(du);if(!e)return null;let t=Number(e[1]);return Number.isFinite(t)?{code:t,rest:(e[2]??"").trim()}:null}function Pu(r){if(!r)return!1;let e=r.toLowerCase();return e.includes('"type":"api_error"')&&e.includes("internal server error")}function Mu(r){let e=r.trim();if(!e)return!1;let t=Js(e);return t?uu.has(t.code):!1}function Ys(r,e){return typeof r!="number"||!Number.isFinite(r)?null:r===402?e?Ks(e):"billing":r===429?"rate_limit":r===401||r===403?e&&Vs(e)?"auth_permanent":"auth":r===408?"timeout":r===503?e&&qs(e)?"overloaded":"timeout":r===502||r===504?"timeout":r===529?"overloaded":r===400?e&&Eo(e)?"billing":"format":null}function Iu(r){if(!r)return!1;let e=r.toLowerCase();return!!(e.includes("unknown model")||e.includes("model not found")||e.includes("model_not_found")||e.includes("not_found_error")||e.includes("does not exist")&&e.includes("model")||e.includes("invalid model")&&!e.includes("invalid model reference")||/models\/[^\s]+ is not found/i.test(r)||/\b404\b/.test(r)&&/not[-_ ]?found/i.test(r))}function Eu(r){if(!r)return!1;let e=r.toLowerCase();return e.includes("session not found")||e.includes("session does not exist")||e.includes("session expired")||e.includes("session invalid")||e.includes("conversation not found")||e.includes("conversation does not exist")||e.includes("conversation expired")||e.includes("conversation invalid")||e.includes("no such session")||e.includes("invalid session")||e.includes("session id not found")||e.includes("conversation id not found")}function Xs(r){if(Eu(r))return"session_expired";if(Iu(r))return"model_not_found";let e=Au(r);return e||(xu(r)?Eo(r)?"billing":"rate_limit":zs(r)?"rate_limit":qs(r)?"overloaded":Mu(r)?Js(r.trim())?.code===529?"overloaded":"timeout":Pu(r)?"timeout":wu(r)?"format":Eo(r)?"billing":vu(r)?"timeout":Vs(r)?"auth_permanent":Su(r)?"auth":null)}var iu,Ze,au,lu,cu,du,uu,pu,mu,gu,fu,hu,yu,bu,ku,Tu,Qs=J(()=>{"use strict";iu=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,Ze={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]},au=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,lu=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,cu=512,du=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i,uu=new Set([500,502,503,504,521,522,523,524,529]),pu=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],mu=["upgrade your plan","upgrade plan","current plan","subscription"],gu=["daily","weekly","monthly"],fu=["try again","retry","temporary","cooldown"],hu=["usage limit","rate limit","organization usage"],yu=["organization","workspace"],bu=["billing period","exceeded","reached","exhausted"],ku=/["']?(?: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,Tu=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i});function pt(r,e){let t=Ys(r,e)??(e?Xs(e):null);return t?Ou[t]:typeof r=="number"&&r>=400&&r<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function Oo(r){return Lu.has(r)}var Ou,Lu,Zs=J(()=>{"use strict";Qs();Ou={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"},Lu=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"])});function Lt(r){return typeof r.compressAsync=="function"}function Du(r,e){if(r.length<=e)return r;let t=r.slice(0,e);if(r.trimStart().startsWith("{")||r.trimStart().startsWith("[")){let s=Math.max(t.lastIndexOf("},"),t.lastIndexOf("],"),t.lastIndexOf(`}
2
2
  `),t.lastIndexOf(`]
3
3
  `));if(s>e*.5)return t.slice(0,s+1)+`
4
4
  [...truncated: ${r.length-s-1} chars omitted]`}let o=t.lastIndexOf(`
5
5
  `);return o>e*.7?t.slice(0,o)+`
6
6
  [...truncated: ${r.length-o} chars omitted]`:t+`
7
- [...truncated: ${r.length-e} chars omitted]`}function _o(...r){return{compress(e,t){let n=e,o=0,s=[];for(let i of r){let a=i.compress(n,t);n=a.messages,o+=a.droppedCount,a.droppedCount>0&&s.push(a.strategy)}return{messages:n,droppedCount:o,strategy:s.length>0?s.join("+"):"none"}}}}function Ro(...r){return{compress(e,t){let n=e,o=0,s=[];for(let i of r){let a=i.compress(n,t);n=a.messages,o+=a.droppedCount,a.droppedCount>0&&s.push(a.strategy)}return{messages:n,droppedCount:o,strategy:s.length>0?s.join("+"):"none"}},async compressAsync(e,t){let n=e,o=0,s=[],i=0,a=!1,l=!1;for(let u of r){let c=Ct(u)?await u.compressAsync(n,t):u.compress(n,t);n=c.messages,o+=c.droppedCount,c.droppedCount>0&&s.push(c.strategy),c.metrics&&(i+=c.metrics.latencyMs,a=a||c.metrics.usedLlm,l=l||!!c.metrics.cacheInvalidated)}return{messages:n,droppedCount:o,strategy:s.length>0?s.join("+"):"none",metrics:i>0||a?{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:i,usedLlm:a,cacheInvalidated:l}:void 0}}}}function Ks(r,e){let t=r.filter(i=>i.role==="user"),n=r.filter(i=>i.tool_calls!=null),o=r.filter(i=>i.role==="tool"),s=["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. ${n.length>0?`${n.length} tool calls and ${o.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","MUST preserve verbatim: IP addresses, file paths, URLs, port numbers, credentials/tokens, specific numeric values, version numbers, proper nouns, identifiers, and any user-provided data points. These MUST appear exactly as stated in the original conversation.","","### 6. Error & Recovery History","Summarize any errors encountered and how they were resolved.","","### 7. User Preferences Expressed",`The user sent ${t.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 e?.taskContext&&s.push("","## Additional Context",e.taskContext),s.push("","## Conversation to Summarize","",...r.map(i=>{let a=typeof i.content=="string"?i.content:JSON.stringify(i.content??""),l=i.role==="user"?a:a.length>2e3?a.slice(0,2e3)+"...":a;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."),s.join(`
8
- `)}function pn(r={}){let e={...Js,...r},t=Math.floor(e.modelContextWindow*e.targetUsageRatio);return Math.max(e.minBudget,Math.min(t,e.maxBudget))}function At(r,e){let t=r/e;return t<=.8?"none":t<=1?"trim-only":t<=1.5?"sliding-window":"llm-summarize"}function Ad(r){let e=[],t=[];for(let n of r)n.role==="system"?e.push(n):t.push(n);return{system:e,nonSystem:t}}function Co(r){let e=typeof r.content=="string"?r.content:r.content!=null?JSON.stringify(r.content):"";return Math.ceil(e.length/4)}function dn(r){let e=Math.min(r.length,5),t=[];for(let n=0;n<e;n++){let o=r[n],s=typeof o.content=="string"?o.content.slice(0,200):"";t.push(`${o.role}:${s}`)}return t.join("|")}function Pd(r){let e=new Map;for(let t=0;t<r.length;t++){let n=r[t];if(n.tool_calls&&Array.isArray(n.tool_calls))for(let o of n.tool_calls){let s=o.function?.name??"";if(/read|edit|write|file/i.test(s)&&o.function?.arguments)try{let i=JSON.parse(o.function.arguments),a=i.path??i.filePath??i.file_path??i.file;a&&typeof a=="string"&&e.set(a,t)}catch{}}n.role==="tool"&&n.name&&/read|edit|write|file/i.test(n.name)}return[...e.entries()].sort((t,n)=>n[1]-t[1]).map(([t])=>t)}async function Ao(r,e,t){let n=t.estimateTokens??(p=>Math.ceil(p.length/4)),o=Pd(e);if(o.length===0)return r;let s=r.map(p=>typeof p.content=="string"?p.content:"").join(`
9
- `),i=o.filter(p=>!s.includes(p));if(i.length===0)return r;let a=t.maxTokenBudget,l=[],u=0;for(let p of i){if(u>=t.maxFiles||a<=0)break;let m=await t.readFile(p);if(!m)continue;let g=n(m);g>a||(a-=g,u++,l.push({role:"system",content:`[Post-compact file recovery: ${p}]
7
+ [...truncated: ${r.length-e} chars omitted]`}function Lo(...r){return{compress(e,t){let n=e,o=0,s=[];for(let i of r){let a=i.compress(n,t);n=a.messages,o+=a.droppedCount,a.droppedCount>0&&s.push(a.strategy)}return{messages:n,droppedCount:o,strategy:s.length>0?s.join("+"):"none"}}}}function Do(...r){return{compress(e,t){let n=e,o=0,s=[];for(let i of r){let a=i.compress(n,t);n=a.messages,o+=a.droppedCount,a.droppedCount>0&&s.push(a.strategy)}return{messages:n,droppedCount:o,strategy:s.length>0?s.join("+"):"none"}},async compressAsync(e,t){let n=e,o=0,s=[],i=0,a=!1,c=!1;for(let d of r){let l=Lt(d)?await d.compressAsync(n,t):d.compress(n,t);n=l.messages,o+=l.droppedCount,l.droppedCount>0&&s.push(l.strategy),l.metrics&&(i+=l.metrics.latencyMs,a=a||l.metrics.usedLlm,c=c||!!l.metrics.cacheInvalidated)}return{messages:n,droppedCount:o,strategy:s.length>0?s.join("+"):"none",metrics:i>0||a?{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:i,usedLlm:a,cacheInvalidated:c}:void 0}}}}function ti(r,e){let t=r.filter(i=>i.role==="user"),n=r.filter(i=>i.tool_calls!=null),o=r.filter(i=>i.role==="tool"),s=["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. ${n.length>0?`${n.length} tool calls and ${o.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","MUST preserve verbatim: IP addresses, file paths, URLs, port numbers, credentials/tokens, specific numeric values, version numbers, proper nouns, identifiers, and any user-provided data points. These MUST appear exactly as stated in the original conversation.","","### 6. Error & Recovery History","Summarize any errors encountered and how they were resolved.","","### 7. User Preferences Expressed",`The user sent ${t.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 e?.taskContext&&s.push("","## Additional Context",e.taskContext),s.push("","## Conversation to Summarize","",...r.map(i=>{let a=typeof i.content=="string"?i.content:JSON.stringify(i.content??""),c=i.role==="user"?a:a.length>2e3?a.slice(0,2e3)+"...":a;return`[${i.role}]: ${c}`}),"","## 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."),s.join(`
8
+ `)}function Tn(r={}){let e={...ni,...r},t=Math.floor(e.modelContextWindow*e.targetUsageRatio);return Math.max(e.minBudget,Math.min(t,e.maxBudget))}function Dt(r,e){let t=r/e;return t<=.8?"none":t<=1?"trim-only":t<=1.5?"sliding-window":"llm-summarize"}function $u(r){let e=[],t=[];for(let n of r)n.role==="system"?e.push(n):t.push(n);return{system:e,nonSystem:t}}function $o(r){let e=typeof r.content=="string"?r.content:r.content!=null?JSON.stringify(r.content):"";return Math.ceil(e.length/4)}function kn(r){let e=Math.min(r.length,5),t=[];for(let n=0;n<e;n++){let o=r[n],s=typeof o.content=="string"?o.content.slice(0,200):"";t.push(`${o.role}:${s}`)}return t.join("|")}function Uu(r){let e=new Map;for(let t=0;t<r.length;t++){let n=r[t];if(n.tool_calls&&Array.isArray(n.tool_calls))for(let o of n.tool_calls){let s=o.function?.name??"";if(/read|edit|write|file/i.test(s)&&o.function?.arguments)try{let i=JSON.parse(o.function.arguments),a=i.path??i.filePath??i.file_path??i.file;a&&typeof a=="string"&&e.set(a,t)}catch{}}n.role==="tool"&&n.name&&/read|edit|write|file/i.test(n.name)}return[...e.entries()].sort((t,n)=>n[1]-t[1]).map(([t])=>t)}async function No(r,e,t){let n=t.estimateTokens??(p=>Math.ceil(p.length/4)),o=Uu(e);if(o.length===0)return r;let s=r.map(p=>typeof p.content=="string"?p.content:"").join(`
9
+ `),i=o.filter(p=>!s.includes(p));if(i.length===0)return r;let a=t.maxTokenBudget,c=[],d=0;for(let p of i){if(d>=t.maxFiles||a<=0)break;let m=await t.readFile(p);if(!m)continue;let g=n(m);g>a||(a-=g,d++,c.push({role:"system",content:`[Post-compact file recovery: ${p}]
10
10
 
11
- ${m}`}))}if(l.length===0)return r;let c=[...r],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 Mo(r,e,t=Co){if(e.size===0)return{messages:r,tokensFreed:0,removedCount:0};let n=0,o=0,s=[];for(let a of r){let l=a.tool_call_id??"";if(l&&e.has(l)){n+=t(a),o++,e.delete(l);continue}s.push(a)}let i=o>0?{role:"system",content:`[${o} messages removed by snip]`}:void 0;return{messages:s,tokensFreed:n,removedCount:o,boundaryMessage:i}}var qs,lt,Ye,xt,St,Js,_t,Rt,Md,je,Po=K(()=>{"use strict";qs=4,lt=class{constructor(e){this.estimateTokens=e}estimateTokens;compress(e,t){let n=[],o=[];for(let c of e)c.role==="system"?n.push(c):o.push(c);let s=t;for(let c of n)s-=this.estimateTokens(c);let i;for(let c of o)if(c.role==="user"){i=c;break}if(i&&(s-=this.estimateTokens(i)),s<=0)return{messages:i?[...n,i]:n,droppedCount:o.length-(i?1:0),strategy:"sliding-window"};let a=[],l=0;for(let c=o.length-1;c>=0;c--){let d=o[c];if(d===i)continue;let p=this.estimateTokens(d);if(s-p<0&&l>=qs)break;if(s-p<0&&l<qs){a.unshift(d),l++;continue}s-=p,a.unshift(d),l++}let u=[...n];return i&&!a.includes(i)&&u.push(i),u.push(...a),{messages:u,droppedCount:o.length-(a.length+(i&&!a.includes(i)?1:0)),strategy:"sliding-window"}}},Ye=class{constructor(e=8e3){this.maxToolResultChars=e}maxToolResultChars;compress(e,t){let n=0;return{messages:e.map(s=>s.role!=="tool"||typeof s.content!="string"||s.content.length<=this.maxToolResultChars?s:(n++,{...s,content:Cd(s.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};xt=class{config;constructor(e){this.config={protectedHeadExchanges:e.protectedHeadExchanges,protectedTailMessages:e.protectedTailMessages,summarize:e.summarize,estimateTokens:e.estimateTokens??Co,taskContext:e.taskContext}}compress(e,t){return{messages:e,droppedCount:0,strategy:"head-tail-protected"}}async compressAsync(e,t){let n=Date.now(),{system:o,nonSystem:s}=Ad(e),i=e.reduce((y,C)=>y+this.config.estimateTokens(C),0);if(i<=t)return{messages:e,droppedCount:0,strategy:"head-tail-protected"};let a=0,l=0;for(let y=0;y<s.length&&(s[y].role==="user"&&l++,!(l>this.config.protectedHeadExchanges));y++)a=y+1;let u=Math.max(this.config.protectedTailMessages,Math.floor(s.length*.4)),c=Math.max(a,s.length-u);if(c<=a)return{messages:e,droppedCount:0,strategy:"head-tail-protected"};let d=s.slice(0,a),p=s.slice(a,c),m=s.slice(c),g=Ks(p,{taskContext:this.config.taskContext}),f=await this.config.summarize(p,g),b={role:"system",content:`[Conversation summary \u2014 ${p.length} messages compressed]
11
+ ${m}`}))}if(c.length===0)return r;let l=[...r],u=-1;for(let p=0;p<l.length;p++)l[p].role==="system"&&(u=p);return l.splice(u+1,0,...c),l}function Uo(r,e,t=$o){if(e.size===0)return{messages:r,tokensFreed:0,removedCount:0};let n=0,o=0,s=[];for(let a of r){let c=a.tool_call_id??"";if(c&&e.has(c)){n+=t(a),o++,e.delete(c);continue}s.push(a)}let i=o>0?{role:"system",content:`[${o} messages removed by snip]`}:void 0;return{messages:s,tokensFreed:n,removedCount:o,boundaryMessage:i}}var ei,mt,tt,Mt,It,ni,Et,Ot,Nu,ze,jo=J(()=>{"use strict";ei=4,mt=class{constructor(e){this.estimateTokens=e}estimateTokens;compress(e,t){let n=[],o=[];for(let l of e)l.role==="system"?n.push(l):o.push(l);let s=t;for(let l of n)s-=this.estimateTokens(l);let i;for(let l of o)if(l.role==="user"){i=l;break}if(i&&(s-=this.estimateTokens(i)),s<=0)return{messages:i?[...n,i]:n,droppedCount:o.length-(i?1:0),strategy:"sliding-window"};let a=[],c=0;for(let l=o.length-1;l>=0;l--){let u=o[l];if(u===i)continue;let p=this.estimateTokens(u);if(s-p<0&&c>=ei)break;if(s-p<0&&c<ei){a.unshift(u),c++;continue}s-=p,a.unshift(u),c++}let d=[...n];return i&&!a.includes(i)&&d.push(i),d.push(...a),{messages:d,droppedCount:o.length-(a.length+(i&&!a.includes(i)?1:0)),strategy:"sliding-window"}}},tt=class{constructor(e=8e3){this.maxToolResultChars=e}maxToolResultChars;compress(e,t){let n=0;return{messages:e.map(s=>s.role!=="tool"||typeof s.content!="string"||s.content.length<=this.maxToolResultChars?s:(n++,{...s,content:Du(s.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};Mt=class{config;constructor(e){this.config={protectedHeadExchanges:e.protectedHeadExchanges,protectedTailMessages:e.protectedTailMessages,summarize:e.summarize,estimateTokens:e.estimateTokens??$o,taskContext:e.taskContext}}compress(e,t){return{messages:e,droppedCount:0,strategy:"head-tail-protected"}}async compressAsync(e,t){let n=Date.now(),{system:o,nonSystem:s}=$u(e),i=e.reduce((R,y)=>R+this.config.estimateTokens(y),0);if(i<=t)return{messages:e,droppedCount:0,strategy:"head-tail-protected"};let a=0,c=0;for(let R=0;R<s.length&&(s[R].role==="user"&&c++,!(c>this.config.protectedHeadExchanges));R++)a=R+1;let d=Math.max(this.config.protectedTailMessages,Math.floor(s.length*.4)),l=Math.max(a,s.length-d);if(l<=a)return{messages:e,droppedCount:0,strategy:"head-tail-protected"};let u=s.slice(0,a),p=s.slice(a,l),m=s.slice(l),g=ti(p,{taskContext:this.config.taskContext}),f=await this.config.summarize(p,g),b={role:"system",content:`[Conversation summary \u2014 ${p.length} messages compressed]
12
12
 
13
- ${f}`},T=[...o,...d,b,...m],w=Date.now()-n,_=T.reduce((y,C)=>y+this.config.estimateTokens(C),0);return{messages:T,droppedCount:p.length,strategy:"head-tail-protected",metrics:{tokensBefore:i,tokensAfter:_,compressionRatio:i>0?_/i:1,latencyMs:w,usedLlm:!0,cacheInvalidated:!0}}}},St=class{config;constructor(e){this.config=e}compress(e,t){let n=dn(e),o=this.config.inner.compress(e,t),s=dn(o.messages),i=n!==s&&o.droppedCount>0;return i&&this.config.onCacheInvalidated?.({droppedCount:o.droppedCount,strategy:o.strategy}),{...o,metrics:{...o.metrics??{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1},cacheInvalidated:i}}}async compressAsync(e,t){let n=dn(e),o=Ct(this.config.inner)?await this.config.inner.compressAsync(e,t):this.config.inner.compress(e,t),s=dn(o.messages),i=n!==s&&o.droppedCount>0;return i&&this.config.onCacheInvalidated?.({droppedCount:o.droppedCount,strategy:o.strategy}),{...o,metrics:{...o.metrics??{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1},cacheInvalidated:i}}}},Js={modelContextWindow:128e3,targetUsageRatio:.75,minBudget:16e3,maxBudget:12e4};_t=class{events=[];maxEvents;constructor(e=100){this.maxEvents=e}record(e){this.events.push(e),this.events.length>this.maxEvents&&this.events.shift()}snapshot(){let e=this.events.length;if(e===0)return{totalCompressions:0,totalLlmCalls:0,totalCacheInvalidations:0,averageCompressionRatio:1,averageLatencyMs:0,totalTokensSaved:0,recentEvents:[]};let t=0,n=0,o=0,s=0,i=0;for(let a of this.events)t+=a.tokensBefore>0?a.tokensAfter/a.tokensBefore:1,n+=a.latencyMs,o+=Math.max(0,a.tokensBefore-a.tokensAfter),a.usedLlm&&s++,a.cacheInvalidated&&i++;return{totalCompressions:e,totalLlmCalls:s,totalCacheInvalidations:i,averageCompressionRatio:t/e,averageLatencyMs:n/e,totalTokensSaved:o,recentEvents:this.events.slice(-10)}}reset(){this.events.length=0}},Rt=class{engines=new Map;activeId;register(e){this.engines.set(e.id,e)}activate(e){return this.engines.has(e)?(this.activeId=e,!0):!1}getActive(){return this.activeId?this.engines.get(this.activeId):void 0}listEngines(){return Array.from(this.engines.values()).map(e=>({id:e.id,label:e.label,active:e.id===this.activeId}))}};Md=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"]),je=class{constructor(e=20,t=Co){this.preserveRecentCount=e;this.estimateTokens=t}preserveRecentCount;estimateTokens;compress(e,t){if(e.length<=this.preserveRecentCount)return{messages:e,droppedCount:0,strategy:"micro-compact"};let n=e.length-this.preserveRecentCount,o=0,s=0;return{messages:e.map((a,l)=>{if(l>=n||a.role!=="tool"||typeof a.content!="string"||!a.name||!Md.has(a.name)||a.content.length<=200)return a;let u=this.estimateTokens(a);return s+=u,o++,{...a,content:`[result cleared \u2014 ${a.content.length} chars]`}}),droppedCount:o,strategy:"micro-compact",metrics:o>0?{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1,cacheInvalidated:!1}:void 0}}}});function Io(){return{stages:[]}}function Eo(r,e,t){let n=t?.thresholdMessages??40;if(r.filter(a=>a.role!=="system").length<=n)return{messages:r,stagedCount:0};let s=Ys(r,e),i=Id(s,e,n);if(i.length===0)return{messages:s,stagedCount:0};for(let a of i)e.stages.push(a);return s=Ys(r,e),{messages:s,stagedCount:i.length}}function Oo(r,e){let t=0;for(let n of e.stages)n.committed||(n.committed=!0,t++);return t===0?{messages:r,committed:0}:{messages:Xs(r,e),committed:t}}function Ys(r,e){return e.stages.filter(n=>n.committed).length===0?r:Xs(r,e)}function Xs(r,e){let t=e.stages.filter(o=>o.committed).sort((o,s)=>s.range[0]-o.range[0]),n=[...r];for(let o of t){let[s,i]=o.range;if(s>=n.length)continue;let a=Math.min(i,n.length),l={role:"system",content:o.summary};n.splice(s,a-s,l)}return n}function Id(r,e,t){let n=Math.max(0,r.length-Math.floor(t/2)),o=[],s=new Set(e.stages.map(l=>`${l.range[0]}-${l.range[1]}`)),i=-1,a=0;for(let l=0;l<n;l++){let u=r[l];if(u.role==="tool"||u.role==="assistant"&&typeof u.content=="string"&&u.content==="")i<0&&(i=l),a++;else{if(a>=3){let d=`${i}-${i+a}`;s.has(d)||o.push({id:`collapse_${i}_${i+a}`,range:[i,i+a],summary:`[${a} tool results collapsed]`,committed:!1})}i=-1,a=0}}if(a>=3){let l=`${i}-${i+a}`;s.has(l)||o.push({id:`collapse_${i}_${i+a}`,range:[i,i+a],summary:`[${a} tool results collapsed]`,committed:!1})}return o}var Qs=K(()=>{"use strict"});function Ed(r){return!(!r.ok||r.existingSkillName||!r.multiStep||r.toolCallCount<3||r.distinctToolCount<2)}function Od(r){return r.existingSkillName?r.feedback==="negative":!1}function Mt(r,e){return Od(r)?{type:"skill.improve",skillName:r.existingSkillName,reason:"negative user feedback on existing skill execution"}:Ed(r)?{type:"skill.create",suggestedName:e.suggestedName??`auto-skill-${e.tools.slice(0,3).join("-")}`,description:`Multi-step orchestration using ${e.tools.join(", ")}`,tools:e.tools,stepCount:r.toolCallCount}:null}var Zs=K(()=>{"use strict"});function ei(r){return r.function&&typeof r.function=="object"&&typeof r.function.name=="string"?r.function.name.trim():typeof r.name=="string"?r.name.trim():""}function Ld(r){return r==="enabled-eligible"||r==="installed-awaiting-approval"}function $d(r){return new Map((r??[]).map(e=>[e.toolName,e]))}function Dd(r){if(!r.eligibility?.length)return[...r.tools];let e=$d(r.eligibility);return r.tools.filter(t=>{let n=ei(t);if(!n)return!1;let o=e.get(n);return!o||Ld(o.status)})}function Ud(r){let e=[],t=r.compatibility??{},n=r.toolChoice;if(r.thinkingEnabled&&t.requireAutoWhenThinking){let o=typeof n=="object"&&n&&!Array.isArray(n)?String(n.type??""):n;o&&o!=="auto"&&o!=="none"&&(e.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),n="auto")}if(n==="required"&&t.allowRequiredToolChoice===!1){let o=t.requiredFallback??"auto";e.push(`tool_choice=required is not supported by this provider; downgraded to ${o}.`),n=o}if(n&&typeof n=="object"&&!Array.isArray(n)&&n.type==="function"&&t.allowNamedToolChoice===!1){let o=t.namedFallback??"required";e.push(`named tool_choice is not supported by this provider; downgraded to ${o}.`),n=o}return{normalizedToolChoice:n,warnings:e}}function Lo(r){let e=Ud({toolChoice:r.toolChoice,thinkingEnabled:r.thinkingEnabled,compatibility:r.compatibility}),t=e.normalizedToolChoice,n=[...e.warnings],o=Dd({tools:r.tools,eligibility:r.eligibility});if(!t||t==="auto")return{tools:o,normalizedToolChoice:t,warnings:n};if(t==="none")return{tools:[],normalizedToolChoice:"none",warnings:n};if(t==="required"){if(o.length===0)throw new Error("tool_choice=required but no tools were provided");return{tools:o,normalizedToolChoice:"required",extraSystemPrompt:"You must call one of the available tools before responding.",warnings:n}}if(typeof t=="object"&&!Array.isArray(t)&&t.type==="function"){let s=t.function??void 0,i=typeof s?.name=="string"?s.name.trim():"";if(!i)throw new Error("tool_choice.function.name is required");let a=o.filter(l=>ei(l)===i);if(a.length===0)throw new Error(`tool_choice requested unknown tool: ${i}`);return{tools:a,normalizedToolChoice:{type:"function",function:{name:i}},extraSystemPrompt:`You must call the ${i} tool before responding.`,warnings:n}}return{tools:o,normalizedToolChoice:t,warnings:n}}var ti=K(()=>{"use strict"});function ni(r){return r==null?[]:typeof r=="string"?r.length>0?[{type:"text",text:r}]:[]:Array.isArray(r)?r:[{type:"text",text:String(r)}]}function Fd(r,e){return{...r,content:[...ni(r.content),...ni(e.content)]}}function Bd(r){if(!r||typeof r!="object")return!1;if(r.function&&typeof r.function=="object"){let e=r.function.name;if(typeof e=="string"&&e.length>0)return!0}return typeof r.name=="string"&&r.name.length>0}function Wd(r){return new Set((r??Nd).map(e=>e.trim().toLowerCase()))}function Gd(r,e){return r?Wd(e).has(r.trim().toLowerCase()):!1}function $o(r){if(!Array.isArray(r)||r.length===0)return[...r];let e=r.map(a=>{if(a.role==="assistant"&&Array.isArray(a.tool_calls)){let l=a.tool_calls.filter(u=>Bd(u));return{...a,...l.length>0?{tool_calls:l}:{tool_calls:void 0}}}return{...a}}),t=new Set;for(let a of e)if(!(a.role!=="assistant"||!Array.isArray(a.tool_calls)))for(let l of a.tool_calls)typeof l.id=="string"&&l.id&&t.add(l.id);let n=e.filter(a=>a.role!=="tool"?!0:!!(a.tool_call_id&&t.has(a.tool_call_id))),o=new Set;for(let a of n)a.role==="tool"&&typeof a.tool_call_id=="string"&&a.tool_call_id&&o.add(a.tool_call_id);let s=[];for(let a of n){if(a.role==="assistant"&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0){let l=a.tool_calls.filter(u=>typeof u.id=="string"&&o.has(u.id));if(l.length===0){let{tool_calls:u,...c}=a;c.content!=null&&c.content!==""&&s.push(c);continue}if(l.length<a.tool_calls.length){s.push({...a,tool_calls:l});continue}}s.push(a)}let i=[];for(let a of s){let l=i.length>0?i[i.length-1]:void 0;if(a.role==="user"&&l?.role==="user"){i[i.length-1]=Fd(l,a);continue}i.push(a)}return i}function Do(r,e){return Gd(e?.stopReason,e?.forcedStopReasons)?r.map(t=>{if(t.role!=="assistant")return{...t};let n={...t};for(let o of jd)delete n[o];return n}):[...r]}function Uo(r,e){let t=e?.placeholderToolResult??"Error: Tool loop interrupted before the tool result was replayed.",n=new Set;for(let s of r)s.role==="tool"&&typeof s.tool_call_id=="string"&&s.tool_call_id&&n.add(s.tool_call_id);let o=[];for(let s of r)if(o.push({...s}),!(s.role!=="assistant"||!Array.isArray(s.tool_calls)||s.tool_calls.length===0))for(let i of s.tool_calls)typeof i.id!="string"||!i.id||n.has(i.id)||(n.add(i.id),o.push({role:"tool",tool_call_id:i.id,content:t}));return o}function No(r,e){let t=$o(r),n=Do(t,e);return Uo(n,e)}var Nd,jd,jo=K(()=>{"use strict";Nd=["stop","aborted","timeout","cancelled","interrupted","error"],jd=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"]});function Hd(r){let e=new Set,t=new Set;for(let n of r){if(n.role==="assistant"&&Array.isArray(n.tool_calls))for(let o of n.tool_calls)typeof o.id=="string"&&o.id&&e.add(o.id);n.role==="tool"&&typeof n.tool_call_id=="string"&&n.tool_call_id&&t.add(n.tool_call_id)}return[...e].filter(n=>!t.has(n))}function Vd(r){let e=new Set;for(let t of r)t.role==="tool"&&typeof t.tool_call_id=="string"&&t.tool_call_id&&e.add(t.tool_call_id);return[...e]}function zd(r){return{round:r.round??0,maxRounds:r.maxRounds,pendingToolCallIds:[...r.pendingToolCallIds??[]],completedToolCallIds:[...r.completedToolCallIds??[]],lastStopReason:r.lastStopReason,replayMessages:[...r.replayMessages??[]]}}function Fo(r,e){return{round:r.round+1,maxRounds:r.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??r.pendingToolCallIds],completedToolCallIds:[...e.completedToolCallIds??r.completedToolCallIds],lastStopReason:e.lastStopReason??r.lastStopReason,replayMessages:[...e.replayMessages??r.replayMessages]}}function mn(r,e){return{round:r.round,maxRounds:r.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...e.completedToolCallIds??r.completedToolCallIds],lastStopReason:e.lastStopReason??r.lastStopReason,replayMessages:[...e.replayMessages??r.replayMessages]}}function gn(r){let e=[],t=$o(r.replayMessages);t.length!==r.replayMessages.length&&e.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let n=Do(t,r.options);n.some((s,i)=>s!==t[i])&&e.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let o=Uo(n,r.options);return o.length>n.length&&e.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:zd({maxRounds:r.maxRounds,round:r.round,lastStopReason:r.lastStopReason,replayMessages:o,pendingToolCallIds:Hd(o),completedToolCallIds:Vd(o)}),recoveryActions:e}}var oi=K(()=>{"use strict";jo()});function Bo(r){return r?qd.has(r):!0}function Wo(r){return r===429||r===529}function fn(r,e=500,t=32e3){let n=Math.min(e*Math.pow(2,r-1),t);return n+Math.floor(Math.random()*n*.25)}function Go(){let r=process.env.QLOGICAGENT_PERSISTENT_RETRY;return r==="1"||r==="true"}var qd,vT,Pt,ri=K(()=>{"use strict";qd=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);vT={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};Pt=class extends Error{constructor(t,n){super(`Model fallback triggered: ${t} -> ${n}`);this.originalModel=t;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel}});function Ho(r,e){if(e.allowedTools&&e.allowedTools.length>0){let t=new Set(e.allowedTools);return r.filter(n=>t.has(n))}if(e.toolAccessMode==="none")return[];if(e.toolAccessMode==="read-only"){let t=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 r.filter(n=>!t.has(n))}return e.canFork?[...r]:r.filter(t=>t!=="agent")}var Vo=K(()=>{"use strict"});function zo(r){return ep.find(e=>e.name===r)}var Kd,Jd,Yd,Xd,Qd,Zd,ep,qo=K(()=>{"use strict";Kd={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},Jd={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},Yd={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},Xd={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolAccessMode:"full",canFork:!0},Qd={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},Zd={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},ep=[Kd,Jd,Yd,Xd,Qd,Zd]});var si=K(()=>{"use strict"});function Ko(r){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:r.maxOutputTokens,consecutiveTruncations:0,aborted:r.abortSignal?.aborted??!1}}function Jo(r,e){if(r.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let t=e.contextWindowTokens-e.responseBufferTokens-r.currentMaxOutputTokens,n=t>0?r.promptTokens/t*100:100;return r.promptTokens>=t?r.hasAttemptedReactiveCompact||!e.reactiveCompactEnabled?{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:n>=85?{level:"warning",usagePercent:n,remainingTokens:t-r.promptTokens}:{level:"ok"}}function Yo(r,e,t){let n=r.message?.toLowerCase()??"",o=r.status??0;return o===413||n.includes("prompt_too_long")||n.includes("context_length_exceeded")?!e.hasAttemptedReactiveCompact&&t.reactiveCompactEnabled?{action:"reactive_compact"}:{action:"abort",reason:"prompt_too_long_unrecoverable"}:o>=500&&o<600?{action:"retry",reason:`server_error_${o}`}:o===429?{action:"retry",reason:"rate_limited"}:o===401||o===403?{action:"abort",reason:"auth_error"}:o===404?{action:"abort",reason:"model_not_found"}:{action:"abort",reason:n||"unknown_error"}}function Xo(r,e,t){if(!e.outputEscalationEnabled)return{shouldEscalate:!1,newMax:r.currentMaxOutputTokens};if(r.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:r.currentMaxOutputTokens};let n=Math.min(r.currentMaxOutputTokens*2,t);return n<=r.currentMaxOutputTokens?{shouldEscalate:!1,newMax:r.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:n}}function Qo(r,e){return r.aborted?!0:e.abortSignal?.aborted?(r.aborted=!0,!0):!1}var ii=K(()=>{"use strict"});function Zo(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function ct(r,e=tp){return!(r.attemptedThisTurn||r.consecutiveFailures>=e.maxConsecutiveFailures)}var tp,ai=K(()=>{"use strict";tp={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50}});var ut=K(()=>{"use strict";Us();zs();Po();Po();Qs();Zs();ti();jo();oi();ri();Vo();qo();si();ii();ai()});function er(r,e){let t=r.get(e.index);t||(t={id:"",name:"",arguments:""},r.set(e.index,t)),e.id&&(t.id=e.id),e.name&&(t.name+=e.name),t.arguments+=e.arguments}var tr=K(()=>{"use strict"});var li,ci,ui,di,pi,mi,gi,fi,hi,yi,It,nr,bi,ki,Ti,or,hn=K(()=>{"use strict";li=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),ci=3,ui=128e3,di=13e3,pi=16384,mi=65536,gi=3,fi=65536,hi=3e4,yi=3,It=10,nr=500,bi=3,ki=5e4,Ti=2e5,or=2e3});import{mkdir as op,writeFile as rp}from"fs/promises";import{join as wi}from"path";import{tmpdir as sp}from"os";function xi(){return{seenIds:new Set,replacements:new Map}}function Si(r){return wi(sp(),"qlogicagent-sessions",r,ip)}async function lp(r){try{await op(Si(r),{recursive:!0})}catch{}}function cp(r,e){let t=e.replace(/[^a-zA-Z0-9_-]/g,"_");return wi(Si(r),`${t}.txt`)}function up(r,e){if(r.length<=e)return{preview:r,hasMore:!1};let n=r.slice(0,e).lastIndexOf(`
14
- `),o=n>e*.5?n:e;return{preview:r.slice(0,o),hasMore:!0}}function _i(r){return r.includes(vi)}async function Ri(r,e,t){await lp(t);let n=cp(t,e);try{await rp(n,r,{encoding:"utf-8",flag:"wx"})}catch(i){if(i.code!=="EEXIST")return null}let{preview:o,hasMore:s}=up(r,or);return{filepath:n,originalSize:r.length,preview:o,hasMore:s}}function Ci(r){let e=`${vi}
13
+ ${f}`},w=[...o,...u,b,...m],T=Date.now()-n,_=w.reduce((R,y)=>R+this.config.estimateTokens(y),0);return{messages:w,droppedCount:p.length,strategy:"head-tail-protected",metrics:{tokensBefore:i,tokensAfter:_,compressionRatio:i>0?_/i:1,latencyMs:T,usedLlm:!0,cacheInvalidated:!0}}}},It=class{config;constructor(e){this.config=e}compress(e,t){let n=kn(e),o=this.config.inner.compress(e,t),s=kn(o.messages),i=n!==s&&o.droppedCount>0;return i&&this.config.onCacheInvalidated?.({droppedCount:o.droppedCount,strategy:o.strategy}),{...o,metrics:{...o.metrics??{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1},cacheInvalidated:i}}}async compressAsync(e,t){let n=kn(e),o=Lt(this.config.inner)?await this.config.inner.compressAsync(e,t):this.config.inner.compress(e,t),s=kn(o.messages),i=n!==s&&o.droppedCount>0;return i&&this.config.onCacheInvalidated?.({droppedCount:o.droppedCount,strategy:o.strategy}),{...o,metrics:{...o.metrics??{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1},cacheInvalidated:i}}}},ni={modelContextWindow:128e3,targetUsageRatio:.75,minBudget:16e3,maxBudget:12e4};Et=class{events=[];maxEvents;constructor(e=100){this.maxEvents=e}record(e){this.events.push(e),this.events.length>this.maxEvents&&this.events.shift()}snapshot(){let e=this.events.length;if(e===0)return{totalCompressions:0,totalLlmCalls:0,totalCacheInvalidations:0,averageCompressionRatio:1,averageLatencyMs:0,totalTokensSaved:0,recentEvents:[]};let t=0,n=0,o=0,s=0,i=0;for(let a of this.events)t+=a.tokensBefore>0?a.tokensAfter/a.tokensBefore:1,n+=a.latencyMs,o+=Math.max(0,a.tokensBefore-a.tokensAfter),a.usedLlm&&s++,a.cacheInvalidated&&i++;return{totalCompressions:e,totalLlmCalls:s,totalCacheInvalidations:i,averageCompressionRatio:t/e,averageLatencyMs:n/e,totalTokensSaved:o,recentEvents:this.events.slice(-10)}}reset(){this.events.length=0}},Ot=class{engines=new Map;activeId;register(e){this.engines.set(e.id,e)}activate(e){return this.engines.has(e)?(this.activeId=e,!0):!1}getActive(){return this.activeId?this.engines.get(this.activeId):void 0}listEngines(){return Array.from(this.engines.values()).map(e=>({id:e.id,label:e.label,active:e.id===this.activeId}))}};Nu=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"]),ze=class{constructor(e=20,t=$o){this.preserveRecentCount=e;this.estimateTokens=t}preserveRecentCount;estimateTokens;compress(e,t){if(e.length<=this.preserveRecentCount)return{messages:e,droppedCount:0,strategy:"micro-compact"};let n=e.length-this.preserveRecentCount,o=0,s=0;return{messages:e.map((a,c)=>{if(c>=n||a.role!=="tool"||typeof a.content!="string"||!a.name||!Nu.has(a.name)||a.content.length<=200)return a;let d=this.estimateTokens(a);return s+=d,o++,{...a,content:`[result cleared \u2014 ${a.content.length} chars]`}}),droppedCount:o,strategy:"micro-compact",metrics:o>0?{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1,cacheInvalidated:!1}:void 0}}}});function Fo(){return{stages:[]}}function Bo(r,e,t){let n=t?.thresholdMessages??40;if(r.filter(a=>a.role!=="system").length<=n)return{messages:r,stagedCount:0};let s=oi(r,e),i=ju(s,e,n);if(i.length===0)return{messages:s,stagedCount:0};for(let a of i)e.stages.push(a);return s=oi(r,e),{messages:s,stagedCount:i.length}}function Go(r,e){let t=0;for(let n of e.stages)n.committed||(n.committed=!0,t++);return t===0?{messages:r,committed:0}:{messages:ri(r,e),committed:t}}function oi(r,e){return e.stages.filter(n=>n.committed).length===0?r:ri(r,e)}function ri(r,e){let t=e.stages.filter(o=>o.committed).sort((o,s)=>s.range[0]-o.range[0]),n=[...r];for(let o of t){let[s,i]=o.range;if(s>=n.length)continue;let a=Math.min(i,n.length),c={role:"system",content:o.summary};n.splice(s,a-s,c)}return n}function ju(r,e,t){let n=Math.max(0,r.length-Math.floor(t/2)),o=[],s=new Set(e.stages.map(c=>`${c.range[0]}-${c.range[1]}`)),i=-1,a=0;for(let c=0;c<n;c++){let d=r[c];if(d.role==="tool"||d.role==="assistant"&&typeof d.content=="string"&&d.content==="")i<0&&(i=c),a++;else{if(a>=3){let u=`${i}-${i+a}`;s.has(u)||o.push({id:`collapse_${i}_${i+a}`,range:[i,i+a],summary:`[${a} tool results collapsed]`,committed:!1})}i=-1,a=0}}if(a>=3){let c=`${i}-${i+a}`;s.has(c)||o.push({id:`collapse_${i}_${i+a}`,range:[i,i+a],summary:`[${a} tool results collapsed]`,committed:!1})}return o}var si=J(()=>{"use strict"});function Fu(r){return!(!r.ok||r.existingSkillName||!r.multiStep||r.toolCallCount<3||r.distinctToolCount<2)}function Bu(r){return r.existingSkillName?r.feedback==="negative":!1}function $t(r,e){return Bu(r)?{type:"skill.improve",skillName:r.existingSkillName,reason:"negative user feedback on existing skill execution"}:Fu(r)?{type:"skill.create",suggestedName:e.suggestedName??`auto-skill-${e.tools.slice(0,3).join("-")}`,description:`Multi-step orchestration using ${e.tools.join(", ")}`,tools:e.tools,stepCount:r.toolCallCount}:null}var ii=J(()=>{"use strict"});function ai(r){return r.function&&typeof r.function=="object"&&typeof r.function.name=="string"?r.function.name.trim():typeof r.name=="string"?r.name.trim():""}function Gu(r){return r==="enabled-eligible"||r==="installed-awaiting-approval"}function Wu(r){return new Map((r??[]).map(e=>[e.toolName,e]))}function Hu(r){if(!r.eligibility?.length)return[...r.tools];let e=Wu(r.eligibility);return r.tools.filter(t=>{let n=ai(t);if(!n)return!1;let o=e.get(n);return!o||Gu(o.status)})}function zu(r){let e=[],t=r.compatibility??{},n=r.toolChoice;if(r.thinkingEnabled&&t.requireAutoWhenThinking){let o=typeof n=="object"&&n&&!Array.isArray(n)?String(n.type??""):n;o&&o!=="auto"&&o!=="none"&&(e.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),n="auto")}if(n==="required"&&t.allowRequiredToolChoice===!1){let o=t.requiredFallback??"auto";e.push(`tool_choice=required is not supported by this provider; downgraded to ${o}.`),n=o}if(n&&typeof n=="object"&&!Array.isArray(n)&&n.type==="function"&&t.allowNamedToolChoice===!1){let o=t.namedFallback??"required";e.push(`named tool_choice is not supported by this provider; downgraded to ${o}.`),n=o}return{normalizedToolChoice:n,warnings:e}}function Wo(r){let e=zu({toolChoice:r.toolChoice,thinkingEnabled:r.thinkingEnabled,compatibility:r.compatibility}),t=e.normalizedToolChoice,n=[...e.warnings],o=Hu({tools:r.tools,eligibility:r.eligibility});if(!t||t==="auto")return{tools:o,normalizedToolChoice:t,warnings:n};if(t==="none")return{tools:[],normalizedToolChoice:"none",warnings:n};if(t==="required"){if(o.length===0)throw new Error("tool_choice=required but no tools were provided");return{tools:o,normalizedToolChoice:"required",extraSystemPrompt:"You must call one of the available tools before responding.",warnings:n}}if(typeof t=="object"&&!Array.isArray(t)&&t.type==="function"){let s=t.function??void 0,i=typeof s?.name=="string"?s.name.trim():"";if(!i)throw new Error("tool_choice.function.name is required");let a=o.filter(c=>ai(c)===i);if(a.length===0)throw new Error(`tool_choice requested unknown tool: ${i}`);return{tools:a,normalizedToolChoice:{type:"function",function:{name:i}},extraSystemPrompt:`You must call the ${i} tool before responding.`,warnings:n}}return{tools:o,normalizedToolChoice:t,warnings:n}}var li=J(()=>{"use strict"});function ci(r){return r==null?[]:typeof r=="string"?r.length>0?[{type:"text",text:r}]:[]:Array.isArray(r)?r:[{type:"text",text:String(r)}]}function Ku(r,e){return{...r,content:[...ci(r.content),...ci(e.content)]}}function Ju(r){if(!r||typeof r!="object")return!1;if(r.function&&typeof r.function=="object"){let e=r.function.name;if(typeof e=="string"&&e.length>0)return!0}return typeof r.name=="string"&&r.name.length>0}function Yu(r){return new Set((r??Vu).map(e=>e.trim().toLowerCase()))}function Xu(r,e){return r?Yu(e).has(r.trim().toLowerCase()):!1}function Ho(r){if(!Array.isArray(r)||r.length===0)return[...r];let e=r.map(a=>{if(a.role==="assistant"&&Array.isArray(a.tool_calls)){let c=a.tool_calls.filter(d=>Ju(d));return{...a,...c.length>0?{tool_calls:c}:{tool_calls:void 0}}}return{...a}}),t=new Set;for(let a of e)if(!(a.role!=="assistant"||!Array.isArray(a.tool_calls)))for(let c of a.tool_calls)typeof c.id=="string"&&c.id&&t.add(c.id);let n=e.filter(a=>a.role!=="tool"?!0:!!(a.tool_call_id&&t.has(a.tool_call_id))),o=new Set;for(let a of n)a.role==="tool"&&typeof a.tool_call_id=="string"&&a.tool_call_id&&o.add(a.tool_call_id);let s=[];for(let a of n){if(a.role==="assistant"&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0){let c=a.tool_calls.filter(d=>typeof d.id=="string"&&o.has(d.id));if(c.length===0){let{tool_calls:d,...l}=a;l.content!=null&&l.content!==""&&s.push(l);continue}if(c.length<a.tool_calls.length){s.push({...a,tool_calls:c});continue}}s.push(a)}let i=[];for(let a of s){let c=i.length>0?i[i.length-1]:void 0;if(a.role==="user"&&c?.role==="user"){i[i.length-1]=Ku(c,a);continue}i.push(a)}return i}function zo(r,e){return Xu(e?.stopReason,e?.forcedStopReasons)?r.map(t=>{if(t.role!=="assistant")return{...t};let n={...t};for(let o of qu)delete n[o];return n}):[...r]}function Vo(r,e){let t=e?.placeholderToolResult??"Error: Tool loop interrupted before the tool result was replayed.",n=new Set;for(let s of r)s.role==="tool"&&typeof s.tool_call_id=="string"&&s.tool_call_id&&n.add(s.tool_call_id);let o=[];for(let s of r)if(o.push({...s}),!(s.role!=="assistant"||!Array.isArray(s.tool_calls)||s.tool_calls.length===0))for(let i of s.tool_calls)typeof i.id!="string"||!i.id||n.has(i.id)||(n.add(i.id),o.push({role:"tool",tool_call_id:i.id,content:t}));return o}function qo(r,e){let t=Ho(r),n=zo(t,e);return Vo(n,e)}var Vu,qu,Ko=J(()=>{"use strict";Vu=["stop","aborted","timeout","cancelled","interrupted","error"],qu=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"]});function Qu(r){let e=new Set,t=new Set;for(let n of r){if(n.role==="assistant"&&Array.isArray(n.tool_calls))for(let o of n.tool_calls)typeof o.id=="string"&&o.id&&e.add(o.id);n.role==="tool"&&typeof n.tool_call_id=="string"&&n.tool_call_id&&t.add(n.tool_call_id)}return[...e].filter(n=>!t.has(n))}function Zu(r){let e=new Set;for(let t of r)t.role==="tool"&&typeof t.tool_call_id=="string"&&t.tool_call_id&&e.add(t.tool_call_id);return[...e]}function ep(r){return{round:r.round??0,maxRounds:r.maxRounds,pendingToolCallIds:[...r.pendingToolCallIds??[]],completedToolCallIds:[...r.completedToolCallIds??[]],lastStopReason:r.lastStopReason,replayMessages:[...r.replayMessages??[]]}}function Jo(r,e){return{round:r.round+1,maxRounds:r.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??r.pendingToolCallIds],completedToolCallIds:[...e.completedToolCallIds??r.completedToolCallIds],lastStopReason:e.lastStopReason??r.lastStopReason,replayMessages:[...e.replayMessages??r.replayMessages]}}function wn(r,e){return{round:r.round,maxRounds:r.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...e.completedToolCallIds??r.completedToolCallIds],lastStopReason:e.lastStopReason??r.lastStopReason,replayMessages:[...e.replayMessages??r.replayMessages]}}function vn(r){let e=[],t=Ho(r.replayMessages);t.length!==r.replayMessages.length&&e.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let n=zo(t,r.options);n.some((s,i)=>s!==t[i])&&e.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let o=Vo(n,r.options);return o.length>n.length&&e.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:ep({maxRounds:r.maxRounds,round:r.round,lastStopReason:r.lastStopReason,replayMessages:o,pendingToolCallIds:Qu(o),completedToolCallIds:Zu(o)}),recoveryActions:e}}var di=J(()=>{"use strict";Ko()});function Yo(r){return r?tp.has(r):!0}function Xo(r){return r===429||r===529}function xn(r,e=500,t=32e3){let n=Math.min(e*Math.pow(2,r-1),t);return n+Math.floor(Math.random()*n*.25)}function Qo(){let r=process.env.QLOGICAGENT_PERSISTENT_RETRY;return r==="1"||r==="true"}var tp,BT,Nt,ui=J(()=>{"use strict";tp=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);BT={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};Nt=class extends Error{constructor(t,n){super(`Model fallback triggered: ${t} -> ${n}`);this.originalModel=t;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel}});function Zo(r,e){if(e.allowedTools&&e.allowedTools.length>0){let t=new Set(e.allowedTools);return r.filter(n=>t.has(n))}if(e.toolAccessMode==="none")return[];if(e.toolAccessMode==="read-only"){let t=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 r.filter(n=>!t.has(n))}return e.canFork?[...r]:r.filter(t=>t!=="agent")}var er=J(()=>{"use strict"});function Sn(r){return lp.find(e=>e.name===r)}var np,op,rp,sp,ip,ap,lp,tr=J(()=>{"use strict";np={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},op={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},rp={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},sp={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolAccessMode:"full",canFork:!0},ip={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},ap={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},lp=[np,op,rp,sp,ip,ap]});var pi=J(()=>{"use strict"});function nr(r){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:r.maxOutputTokens,consecutiveTruncations:0,aborted:r.abortSignal?.aborted??!1}}function or(r,e){if(r.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let t=e.contextWindowTokens-e.responseBufferTokens-r.currentMaxOutputTokens,n=t>0?r.promptTokens/t*100:100;return r.promptTokens>=t?r.hasAttemptedReactiveCompact||!e.reactiveCompactEnabled?{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:n>=85?{level:"warning",usagePercent:n,remainingTokens:t-r.promptTokens}:{level:"ok"}}function rr(r,e,t){let n=r.message?.toLowerCase()??"",o=r.status??0;return o===413||n.includes("prompt_too_long")||n.includes("context_length_exceeded")?!e.hasAttemptedReactiveCompact&&t.reactiveCompactEnabled?{action:"reactive_compact"}:{action:"abort",reason:"prompt_too_long_unrecoverable"}:o>=500&&o<600?{action:"retry",reason:`server_error_${o}`}:o===429?{action:"retry",reason:"rate_limited"}:o===401||o===403?{action:"abort",reason:"auth_error"}:o===404?{action:"abort",reason:"model_not_found"}:{action:"abort",reason:n||"unknown_error"}}function sr(r,e,t){if(!e.outputEscalationEnabled)return{shouldEscalate:!1,newMax:r.currentMaxOutputTokens};if(r.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:r.currentMaxOutputTokens};let n=Math.min(r.currentMaxOutputTokens*2,t);return n<=r.currentMaxOutputTokens?{shouldEscalate:!1,newMax:r.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:n}}function ir(r,e){return r.aborted?!0:e.abortSignal?.aborted?(r.aborted=!0,!0):!1}var mi=J(()=>{"use strict"});function ar(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function gt(r,e=cp){return!(r.attemptedThisTurn||r.consecutiveFailures>=e.maxConsecutiveFailures)}var cp,gi=J(()=>{"use strict";cp={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50}});var ft=J(()=>{"use strict";Hs();Zs();jo();jo();si();ii();li();Ko();di();ui();er();tr();pi();mi();gi()});function lr(r,e){let t=r.get(e.index);t||(t={id:"",name:"",arguments:""},r.set(e.index,t)),e.id&&(t.id=e.id),e.name&&(t.name+=e.name),t.arguments+=e.arguments}var cr=J(()=>{"use strict"});var fi,hi,yi,bi,ki,Ti,wi,vi,xi,Si,Ut,dr,_i,Ri,Ci,ur,_n=J(()=>{"use strict";fi=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),hi=3,yi=128e3,bi=13e3,ki=16384,Ti=65536,wi=3,vi=65536,xi=3e4,Si=3,Ut=10,dr=500,_i=3,Ri=5e4,Ci=2e5,ur=2e3});import{mkdir as up,writeFile as pp}from"fs/promises";import{join as Ai}from"path";import{tmpdir as mp}from"os";function Mi(){return{seenIds:new Set,replacements:new Map}}function Ii(r){return Ai(mp(),"qlogicagent-sessions",r,gp)}async function hp(r){try{await up(Ii(r),{recursive:!0})}catch{}}function yp(r,e){let t=e.replace(/[^a-zA-Z0-9_-]/g,"_");return Ai(Ii(r),`${t}.txt`)}function bp(r,e){if(r.length<=e)return{preview:r,hasMore:!1};let n=r.slice(0,e).lastIndexOf(`
14
+ `),o=n>e*.5?n:e;return{preview:r.slice(0,o),hasMore:!0}}function Ei(r){return r.includes(Pi)}async function Oi(r,e,t){await hp(t);let n=yp(t,e);try{await pp(n,r,{encoding:"utf-8",flag:"wx"})}catch(i){if(i.code!=="EEXIST")return null}let{preview:o,hasMore:s}=bp(r,ur);return{filepath:n,originalSize:r.length,preview:o,hasMore:s}}function Li(r){let e=`${Pi}
15
15
  `;return e+=`Output too large (${r.originalSize} chars). Full output saved to: ${r.filepath}
16
16
 
17
- `,e+=`Preview (first ${or} bytes):
17
+ `,e+=`Preview (first ${ur} bytes):
18
18
  `,e+=r.preview,e+=r.hasMore?`
19
19
  ...
20
20
  `:`
21
- `,e+=ap,e}async function Ai(r,e,t,n=ki){if(r.length<=n||_i(r))return r;let o=await Ri(r,e,t);return o?Ci(o):r.slice(0,n)+`
22
- ...[truncated ${r.length-n} chars]`}function dp(r){let e=[],t=[];for(let n of r)n.role==="tool"&&typeof n.content=="string"&&n.tool_call_id?_i(n.content)||t.push({toolCallId:n.tool_call_id,content:n.content,size:n.content.length}):n.role==="assistant"&&t.length>0&&(e.push(t),t=[]);return t.length>0&&e.push(t),e}function pp(r,e){let t=[],n=[],o=[];for(let s of r){let i=e.replacements.get(s.toolCallId);i!==void 0?t.push({...s,replacement:i}):e.seenIds.has(s.toolCallId)?n.push(s):o.push(s)}return{mustReapply:t,frozen:n,fresh:o}}function mp(r,e,t){let n=[...r].sort((i,a)=>a.size-i.size),o=[],s=e+r.reduce((i,a)=>i+a.size,0);for(let i of n){if(s<=t)break;o.push(i),s-=i.size}return o}async function Mi(r,e,t,n=Ti){let o=dp(r);if(o.length===0)return{messages:r,newlyReplacedCount:0};let s=new Map,i=[];for(let c of o){let{mustReapply:d,frozen:p,fresh:m}=pp(c,e);for(let w of d)s.set(w.toolCallId,w.replacement);if(m.length===0){for(let w of c)e.seenIds.add(w.toolCallId);continue}let g=p.reduce((w,_)=>w+_.size,0),f=m.reduce((w,_)=>w+_.size,0),b=g+f>n?mp(m,g,n):[],T=new Set(b.map(w=>w.toolCallId));for(let w of c)T.has(w.toolCallId)||e.seenIds.add(w.toolCallId);b.length>0&&i.push(...b)}if(s.size===0&&i.length===0)return{messages:r,newlyReplacedCount:0};let a=await Promise.all(i.map(async c=>{let d=await Ri(c.content,c.toolCallId,t);return{candidate:c,result:d}})),l=0;for(let{candidate:c,result:d}of a){if(e.seenIds.add(c.toolCallId),!d)continue;let p=Ci(d);s.set(c.toolCallId,p),e.replacements.set(c.toolCallId,p),l++}return s.size===0?{messages:r,newlyReplacedCount:0}:{messages:r.map(c=>{if(c.role!=="tool"||!c.tool_call_id)return c;let d=s.get(c.tool_call_id);return d===void 0?c:{...c,content:d}}),newlyReplacedCount:l}}var ip,vi,ap,rr=K(()=>{"use strict";hn();ip="tool-results",vi="<persisted-output>",ap="</persisted-output>"});function hp(r){try{return JSON.parse(r)}catch{return}}var gp,fp,yn,Pi=K(()=>{"use strict";ut();rr();gp=new Set(["read_file","file_read","FileRead","grep","Grep","glob","Glob","search","list_dir","find_files","web_fetch","web_search","WebFetch","WebSearch"]),fp=new Set(["bash","execute_command","Bash","shell"]),yn=class{tools=[];hasErrored=!1;erroredToolDescription="";discarded=!1;siblingAbortController;progressResolve;config;concurrencySafe;constructor(e){this.config=e,this.concurrencySafe=e.concurrencySafeTools??gp,this.siblingAbortController=new AbortController,e.signal&&e.signal.addEventListener("abort",()=>{this.siblingAbortController.abort("parent_abort")},{once:!0})}discard(){this.discarded=!0}addTool(e){let t=this.concurrencySafe.has(e.function.name);this.tools.push({id:e.id,toolCall:e,status:"queued",isConcurrencySafe:t,results:[],pendingProgress:[]}),this.processQueue()}canExecuteTool(e){let t=this.tools.filter(o=>o.status==="executing"),n=this.config.maxConcurrentTools;return n&&n>0&&t.length>=n?!1:t.length===0||e&&t.every(o=>o.isConcurrencySafe)}async processQueue(){for(let e of this.tools)if(e.status==="queued"){if(this.canExecuteTool(e.isConcurrencySafe))await this.executeTool(e);else if(!e.isConcurrencySafe)break}}getAbortReason(){return this.discarded?"discarded":this.hasErrored?"sibling_error":this.config.signal?.aborted?"user_interrupted":null}getToolDescription(e){let t;try{t=JSON.parse(e.toolCall.function.arguments)}catch{}let n=t?.command??t?.file_path??t?.pattern??"";if(typeof n=="string"&&n.length>0){let o=n.length>40?n.slice(0,40)+"\u2026":n;return`${e.toolCall.function.name}(${o})`}return e.toolCall.function.name}createSyntheticError(e,t){let n=this.erroredToolDescription,o=t==="user_interrupted"?"User rejected tool use":t==="discarded"?"Streaming fallback - tool execution discarded":n?`Cancelled: parallel tool call ${n} errored`:"Cancelled: parallel tool call errored";return{callId:e.id,toolName:e.toolCall.function.name,ok:!1,error:o,message:vt(e.id,{ok:!1,error:o})}}async executeTool(e){e.status="executing";let n=(async()=>{let o=this.getAbortReason();if(o){e.results.push(this.createSyntheticError(e,o)),e.status="completed";return}let{toolInvoker:s,hooks:i,sessionId:a,turnId:l,log:u}=this.config,c=e.toolCall.function.name,d=!1,p=e.toolCall.function.arguments;if(i)try{let w=await i.invoke("tool.before_invoke",{sessionId:a,turnId:l,callId:e.id,toolName:c,arguments:hp(p)});if(w.action==="abort"){let _=w.reason??"blocked by policy";u.info(`tool ${c} blocked: ${_}`),e.results.push({callId:e.id,toolName:c,ok:!1,error:_,blocked:!0,blockReason:_,message:vt(e.id,{ok:!1,error:_})}),e.status="completed";return}w.action==="continue"&&w.context?.arguments&&(p=JSON.stringify(w.context.arguments))}catch{}let m=await s.invoke(l,c,p,this.siblingAbortController.signal),g=this.getAbortReason();if(g&&!d){e.results.push(this.createSyntheticError(e,g)),e.status="completed";return}let f=!m.error,b=m.result;f&&b&&b.length>5e4&&(b=await Ai(b,e.id,a));let T=vt(e.id,{ok:f,payload:b,error:m.error,toolReferences:m.toolReferences});f||(d=!0,fp.has(c)&&(this.hasErrored=!0,this.erroredToolDescription=this.getToolDescription(e),this.siblingAbortController.abort("sibling_error"))),i?.invoke(f?"tool.after_invoke":"tool.invoke_failed",{sessionId:a,turnId:l,callId:e.id,toolName:c,ok:f,...m.error?{error:m.error}:{}}).catch(()=>{}),e.results.push({callId:e.id,toolName:c,ok:f,error:m.error,message:T}),e.status="completed"})();e.promise=n,n.finally(()=>{this.processQueue()})}*getCompletedResults(){if(!this.discarded){for(let e of this.tools)if(e.status!=="yielded"){if(e.status==="completed"&&e.results.length>0){e.status="yielded";for(let t of e.results)yield t}else if(e.status==="executing"&&!e.isConcurrencySafe)break}}}async*getRemainingResults(){if(!this.discarded){for(;this.hasUnfinishedTools();){await this.processQueue();for(let e of this.getCompletedResults())yield e;if(this.hasExecutingTools()&&!this.hasCompletedResults()){let e=this.tools.filter(n=>n.status==="executing"&&n.promise).map(n=>n.promise),t=new Promise(n=>{this.progressResolve=n});e.length>0&&await Promise.race([...e,t])}}for(let e of this.getCompletedResults())yield e}}hasCompletedResults(){return this.tools.some(e=>e.status==="completed")}hasExecutingTools(){return this.tools.some(e=>e.status==="executing")}hasUnfinishedTools(){return this.tools.some(e=>e.status!=="yielded")}}});import{readFile as yp}from"node:fs/promises";function Xe(r){let e=typeof r.content=="string"?r.content:r.content!=null?JSON.stringify(r.content):"";return Math.ceil(e.length/4)}function Qe(r){let e=0;for(let t of r)e+=Xe(t);return e}function Oi(r){if(!r)return 128e3;if(r in sr)return sr[r];let e=r.toLowerCase();for(let[t,n]of Object.entries(sr))if(e.startsWith(t.toLowerCase()))return n;return 128e3}function kp(r,e){return async(t,n)=>{let o=e?.transport,s=e?.apiKey;if(!o||!s)return r.debug("[context-compression] no LLM transport for summarization \u2014 using sync fallback"),ir(t);try{let i="",a=e?.model??bp;for await(let l of o.stream({model:a,messages:[{role:"system",content:"You are a precise conversation summarizer."},{role:"user",content:n}],maxTokens:2e3,temperature:.3},s,AbortSignal.timeout(3e4)))l.type==="delta"&&(i+=l.text);return i||(r.warn("[context-compression] empty summary response"),ir(t))}catch(i){return r.warn({err:i.message},"[context-compression] summarize call error \u2014 using fallback"),ir(t)}}}function ir(r){let e=r.filter(n=>n.role==="user"),t=e.slice(0,10).map(n=>{let o=typeof n.content=="string"?n.content:JSON.stringify(n.content??"");return`- ${o.slice(0,200)}${o.length>200?"...":""}`});return`User requests (${e.length} messages):
21
+ `,e+=fp,e}async function Di(r,e,t,n=Ri){if(r.length<=n||Ei(r))return r;let o=await Oi(r,e,t);return o?Li(o):r.slice(0,n)+`
22
+ ...[truncated ${r.length-n} chars]`}function kp(r){let e=[],t=[];for(let n of r)n.role==="tool"&&typeof n.content=="string"&&n.tool_call_id?Ei(n.content)||t.push({toolCallId:n.tool_call_id,content:n.content,size:n.content.length}):n.role==="assistant"&&t.length>0&&(e.push(t),t=[]);return t.length>0&&e.push(t),e}function Tp(r,e){let t=[],n=[],o=[];for(let s of r){let i=e.replacements.get(s.toolCallId);i!==void 0?t.push({...s,replacement:i}):e.seenIds.has(s.toolCallId)?n.push(s):o.push(s)}return{mustReapply:t,frozen:n,fresh:o}}function wp(r,e,t){let n=[...r].sort((i,a)=>a.size-i.size),o=[],s=e+r.reduce((i,a)=>i+a.size,0);for(let i of n){if(s<=t)break;o.push(i),s-=i.size}return o}async function $i(r,e,t,n=Ci){let o=kp(r);if(o.length===0)return{messages:r,newlyReplacedCount:0};let s=new Map,i=[];for(let l of o){let{mustReapply:u,frozen:p,fresh:m}=Tp(l,e);for(let T of u)s.set(T.toolCallId,T.replacement);if(m.length===0){for(let T of l)e.seenIds.add(T.toolCallId);continue}let g=p.reduce((T,_)=>T+_.size,0),f=m.reduce((T,_)=>T+_.size,0),b=g+f>n?wp(m,g,n):[],w=new Set(b.map(T=>T.toolCallId));for(let T of l)w.has(T.toolCallId)||e.seenIds.add(T.toolCallId);b.length>0&&i.push(...b)}if(s.size===0&&i.length===0)return{messages:r,newlyReplacedCount:0};let a=await Promise.all(i.map(async l=>{let u=await Oi(l.content,l.toolCallId,t);return{candidate:l,result:u}})),c=0;for(let{candidate:l,result:u}of a){if(e.seenIds.add(l.toolCallId),!u)continue;let p=Li(u);s.set(l.toolCallId,p),e.replacements.set(l.toolCallId,p),c++}return s.size===0?{messages:r,newlyReplacedCount:0}:{messages:r.map(l=>{if(l.role!=="tool"||!l.tool_call_id)return l;let u=s.get(l.tool_call_id);return u===void 0?l:{...l,content:u}}),newlyReplacedCount:c}}var gp,Pi,fp,pr=J(()=>{"use strict";_n();gp="tool-results",Pi="<persisted-output>",fp="</persisted-output>"});function Sp(r){try{return JSON.parse(r)}catch{return}}var vp,xp,Rn,Ni=J(()=>{"use strict";ft();pr();vp=new Set(["read_file","file_read","FileRead","grep","Grep","glob","Glob","search","list_dir","find_files","web_fetch","web_search","WebFetch","WebSearch"]),xp=new Set(["bash","execute_command","Bash","shell"]),Rn=class{tools=[];hasErrored=!1;erroredToolDescription="";discarded=!1;siblingAbortController;progressResolve;config;concurrencySafe;constructor(e){this.config=e,this.concurrencySafe=e.concurrencySafeTools??vp,this.siblingAbortController=new AbortController,e.signal&&e.signal.addEventListener("abort",()=>{this.siblingAbortController.abort("parent_abort")},{once:!0})}discard(){this.discarded=!0}addTool(e){let t=this.concurrencySafe.has(e.function.name);this.tools.push({id:e.id,toolCall:e,status:"queued",isConcurrencySafe:t,results:[],pendingProgress:[]}),this.processQueue()}canExecuteTool(e){let t=this.tools.filter(o=>o.status==="executing"),n=this.config.maxConcurrentTools;return n&&n>0&&t.length>=n?!1:t.length===0||e&&t.every(o=>o.isConcurrencySafe)}async processQueue(){for(let e of this.tools)if(e.status==="queued"){if(this.canExecuteTool(e.isConcurrencySafe))await this.executeTool(e);else if(!e.isConcurrencySafe)break}}getAbortReason(){return this.discarded?"discarded":this.hasErrored?"sibling_error":this.config.signal?.aborted?"user_interrupted":null}getToolDescription(e){let t;try{t=JSON.parse(e.toolCall.function.arguments)}catch{}let n=t?.command??t?.file_path??t?.pattern??"";if(typeof n=="string"&&n.length>0){let o=n.length>40?n.slice(0,40)+"\u2026":n;return`${e.toolCall.function.name}(${o})`}return e.toolCall.function.name}createSyntheticError(e,t){let n=this.erroredToolDescription,o=t==="user_interrupted"?"User rejected tool use":t==="discarded"?"Streaming fallback - tool execution discarded":n?`Cancelled: parallel tool call ${n} errored`:"Cancelled: parallel tool call errored";return{callId:e.id,toolName:e.toolCall.function.name,ok:!1,error:o,message:Pt(e.id,{ok:!1,error:o})}}async executeTool(e){e.status="executing";let n=(async()=>{let o=this.getAbortReason();if(o){e.results.push(this.createSyntheticError(e,o)),e.status="completed";return}let{toolInvoker:s,hooks:i,sessionId:a,turnId:c,log:d}=this.config,l=e.toolCall.function.name,u=!1,p=e.toolCall.function.arguments;if(i)try{let T=await i.invoke("tool.before_invoke",{sessionId:a,turnId:c,callId:e.id,toolName:l,arguments:Sp(p)});if(T.action==="abort"){let _=T.reason??"blocked by policy";d.info(`tool ${l} blocked: ${_}`),e.results.push({callId:e.id,toolName:l,ok:!1,error:_,blocked:!0,blockReason:_,message:Pt(e.id,{ok:!1,error:_})}),e.status="completed";return}T.action==="continue"&&T.context?.arguments&&(p=JSON.stringify(T.context.arguments))}catch{}let m=await s.invoke(c,l,p,this.siblingAbortController.signal),g=this.getAbortReason();if(g&&!u){e.results.push(this.createSyntheticError(e,g)),e.status="completed";return}let f=!m.error,b=m.result;f&&b&&b.length>5e4&&(b=await Di(b,e.id,a));let w=Pt(e.id,{ok:f,payload:b,error:m.error,toolReferences:m.toolReferences});f||(u=!0,xp.has(l)&&(this.hasErrored=!0,this.erroredToolDescription=this.getToolDescription(e),this.siblingAbortController.abort("sibling_error"))),i?.invoke(f?"tool.after_invoke":"tool.invoke_failed",{sessionId:a,turnId:c,callId:e.id,toolName:l,ok:f,...m.error?{error:m.error}:{}}).catch(()=>{}),e.results.push({callId:e.id,toolName:l,ok:f,error:m.error,message:w}),e.status="completed"})();e.promise=n,n.finally(()=>{this.processQueue()})}*getCompletedResults(){if(!this.discarded){for(let e of this.tools)if(e.status!=="yielded"){if(e.status==="completed"&&e.results.length>0){e.status="yielded";for(let t of e.results)yield t}else if(e.status==="executing"&&!e.isConcurrencySafe)break}}}async*getRemainingResults(){if(!this.discarded){for(;this.hasUnfinishedTools();){await this.processQueue();for(let e of this.getCompletedResults())yield e;if(this.hasExecutingTools()&&!this.hasCompletedResults()){let e=this.tools.filter(n=>n.status==="executing"&&n.promise).map(n=>n.promise),t=new Promise(n=>{this.progressResolve=n});e.length>0&&await Promise.race([...e,t])}}for(let e of this.getCompletedResults())yield e}}hasCompletedResults(){return this.tools.some(e=>e.status==="completed")}hasExecutingTools(){return this.tools.some(e=>e.status==="executing")}hasUnfinishedTools(){return this.tools.some(e=>e.status!=="yielded")}}});import{readFile as _p}from"node:fs/promises";function nt(r){let e=typeof r.content=="string"?r.content:r.content!=null?JSON.stringify(r.content):"";return Math.ceil(e.length/4)}function ot(r){let e=0;for(let t of r)e+=nt(t);return e}function Fi(r){if(!r)return 128e3;if(r in mr)return mr[r];let e=r.toLowerCase();for(let[t,n]of Object.entries(mr))if(e.startsWith(t.toLowerCase()))return n;return 128e3}function Cp(r,e){return async(t,n)=>{let o=e?.transport,s=e?.apiKey;if(!o||!s)return r.debug("[context-compression] no LLM transport for summarization \u2014 using sync fallback"),gr(t);try{let i="",a=e?.model??Rp;for await(let c of o.stream({model:a,messages:[{role:"system",content:"You are a precise conversation summarizer."},{role:"user",content:n}],maxTokens:2e3,temperature:.3},s,AbortSignal.timeout(3e4)))c.type==="delta"&&(i+=c.text);return i||(r.warn("[context-compression] empty summary response"),gr(t))}catch(i){return r.warn({err:i.message},"[context-compression] summarize call error \u2014 using fallback"),gr(t)}}}function gr(r){let e=r.filter(n=>n.role==="user"),t=e.slice(0,10).map(n=>{let o=typeof n.content=="string"?n.content:JSON.stringify(n.content??"");return`- ${o.slice(0,200)}${o.length>200?"...":""}`});return`User requests (${e.length} messages):
23
23
  ${t.join(`
24
- `)}`}function Tp(){return _o(new Ye(ar),new je(20,Xe),new lt(Xe))}function Ei(r,e){let t=Ro(new Ye(ar),new je(20,Xe),new xt({protectedHeadExchanges:1,protectedTailMessages:8,summarize:r,estimateTokens:Xe}),new lt(Xe));return new St({inner:t,estimateTokens:Xe,onCacheInvalidated:e?.onCacheInvalidated})}function $i(r,e){let t=e?.budget??pn({modelContextWindow:Oi(e?.model)}),o=(e?.pipeline??Tp()).compress(r,t);if(o.droppedCount>0){let s=Qe(r),i=Qe(o.messages);Li.record({timestamp:Date.now(),strategy:o.strategy,tokensBefore:s,tokensAfter:i,droppedCount:o.droppedCount,latencyMs:o.metrics?.latencyMs??0,usedLlm:!1,cacheInvalidated:o.metrics?.cacheInvalidated??!1,tier:At(s,t)})}return o.droppedCount>0&&lr?.(o.droppedCount,Qe(o.messages)),o}async function wp(r,e,t){let n=t??pn({modelContextWindow:Oi(e.model)}),o=Qe(r),s=At(o,n),i;switch(s){case"none":i={messages:r,droppedCount:0,strategy:"none"};break;case"trim-only":i=new Ye(ar).compress(r,n);break;case"sliding-window":{i=await Ei(e.summarize).compressAsync(r,n);break}case"llm-summarize":{let a=e.pipeline??Ei(e.summarize);i=Ct(a)?await a.compressAsync(r,n):a.compress(r,n);break}}return i.droppedCount>0&&(i={...i,messages:await Ao(i.messages,r,{maxFiles:5,maxTokenBudget:5e4,readFile:async a=>{try{return await yp(a,"utf-8")}catch{return null}}})}),vp(r,i,n),i}function vp(r,e,t){if(e.droppedCount>0||e.metrics?.usedLlm){let n=e.metrics?.tokensBefore||Qe(r),o=e.metrics?.tokensAfter||Qe(e.messages);Li.record({timestamp:Date.now(),strategy:e.strategy,tokensBefore:n,tokensAfter:o,droppedCount:e.droppedCount,latencyMs:e.metrics?.latencyMs??0,usedLlm:e.metrics?.usedLlm??!1,cacheInvalidated:e.metrics?.cacheInvalidated??!1,tier:At(n,t)})}if(e.droppedCount>0){let n=e.metrics?.tokensAfter||Qe(e.messages);lr?.(e.droppedCount,n)}}function xp(r,e){let t=kp(r,e),n={id:"builtin-compressor",label:"4-Layer Compression Funnel (built-in)",async compressAsync(o,s,i){return wp(o,{budget:s,model:i?.model,sessionId:i?.sessionId,summarize:t},s)}};Ii.register(n),Ii.activate(n.id),r.info(`[context-compression] registered context engine: ${n.id}`)}function Di(r,e,t){xp(e,t),r.register({point:"context.before_compact",priority:50,label:"context-compression-bridge",handler:(n,o)=>{let s=o.messageCount;return s&&s>0&&e.debug(`[context-compression] before_compact: ${s} messages entering compression`),{action:"continue"}}}),lr=(n,o)=>{e.debug(`[context-compression] after_compact: removed ${n}, ${o} tokens remaining`),r.invoke("context.after_compact",{sessionId:"",turnId:"",removedCount:n,tokenCount:o}).catch(()=>{})}}var sr,ar,bp,Li,Ii,lr,cr=K(()=>{"use strict";ut();sr={"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};ar=8e3,bp="deepseek-v4-flash",Li=new _t(200),Ii=new Rt;lr=null});function Ui(r,e,t){let n=t-e;return`[Budget] ${Math.round(r)}% used (${e.toLocaleString()} / ${t.toLocaleString()} tokens). ${n.toLocaleString()} tokens remaining. `+(r>=90?"Wrap up your current task \u2014 you are near the token limit.":"Continue working \u2014 do not summarize prematurely.")}var Ni=K(()=>{"use strict"});var ji={};Ds(ji,{resolveToolEligibility:()=>Ap});function _p(r,e){if(Sp.some(t=>t.test(r)))return!0;if(e)for(let t of e)try{if(new RegExp(t,"i").test(r))return!0}catch{}return!1}function Rp(r,e){let t=r.function.name,n=r.meta,o=[];return e.blockedToolNames?.includes(t)?(o.push("policy_blocked"),{level:5,reasons:o}):n?.isReadOnly?(o.push("always_allowed"),{level:1,reasons:o}):n?.requiresApproval?(o.push("approval_required"),{level:4,reasons:o}):n?.isDangerous||_p(t,e.dangerousPatterns)?(o.push("dangerous_tool"),{level:3,reasons:o}):{level:2,reasons:o}}function Cp(r){switch(r){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 Ap(r,e={}){let t=new Map,n=[],o=[],s=[];for(let i of r){let a=i.function.name,{level:l,reasons:u}=Rp(i,e),c=Cp(l),d={toolName:a,status:c,permissionLevel:l,approvalRequired:l===4,reasonCodes:u};t.set(a,d),l===5?o.push(d):(n.push(i),l===4&&s.push(d))}return{eligibleTools:n,blockedTools:o,approvalRequiredTools:s,eligibilityByName:t}}var Sp,Fi=K(()=>{"use strict";Sp=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:write_file|delete_file|move_file|create_directory)$/i,/^(?:git_push|git_reset|git_force)$/i]});function Ep(r){let e=r.split(".").pop()?.toLowerCase()??"";return["png","jpg","jpeg","gif","webp","svg","bmp","ico"].includes(e)?"image":["md","txt","pdf","doc","docx","rtf","html"].includes(e)?"document":["mermaid","mmd","dot","puml","plantuml"].includes(e)?"diagram":["csv","tsv","xlsx","xls"].includes(e)?"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(e)?"code":"file"}function Op(r){let e=r.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"}[e]}function Lp(r){return typeof r=="number"&&Number.isFinite(r)&&r>=1?Math.min(Math.round(r),100):li}function Bi(r){let e=r.message.toLowerCase();return r.status===413||e.includes("prompt_too_long")||e.includes("context_length_exceeded")||e.includes("maximum context length")}function $p(r){return r==="length"||r==="max_tokens"}function Wi(r){let e=r.message.toLowerCase();return(e.includes("image")||e.includes("media")||e.includes("file too large")||e.includes("payload too large"))&&(r.status===413||e.includes("too large")||e.includes("size"))}function Dp(r){let e=r.headers;if(!e)return null;let t=e["retry-after"]??e["Retry-After"];if(!t)return null;let n=parseInt(t,10);return!isNaN(n)&&n>0?n*1e3:null}function Up(r){if(r.status!==400)return null;let e=r.message.match(/input length and `max_tokens` exceed context limit: (\d+) \+ (\d+) > (\d+)/);if(!e?.[1]||!e?.[3])return null;let t=parseInt(e[1],10),n=parseInt(e[3],10);if(isNaN(t)||isNaN(n))return null;let o=n-t-1e3;return o>=3e3?o:null}function Np(r){return r.filter(e=>e.role!=="assistant"?!0:!(typeof e.content=="string"&&e.content.trim()===""))}async function*Gi(r,e,t,n){let{turnId:o,sessionId:s,messages:i,tools:a,model:l,apiKey:u,temperature:c=0,hooks:d,signal:p}=r,m={sessionId:s,turnId:o},g=r.maxTurns??0,f=r.querySource,{resolveToolEligibility:b}=await Promise.resolve().then(()=>(Fi(),ji)),T=b(a,r.toolEligibilityContext),w=T.eligibleTools;for(let j of T.blockedTools)yield{type:"tool_blocked",turnId:o,callId:"",name:j.toolName,reason:"blocked-by-policy"};if(!w.length){yield*jp(o,l,i,u,c,p,e,n);return}let _=Lp(r.maxRounds),y={contextWindowTokens:r.contextWindowTokens??ui,responseBufferTokens:di,maxOutputTokens:r.maxOutputTokens??pi,abortSignal:p,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},C=new Set,E=0,D=w,L,v={messages:[...i],maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:1,transition:void 0,guardState:Ko(y),reactiveCompactState:Zo(),toolLoopState:gn({maxRounds:_,replayMessages:[...i]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{prompt:0,completion:0},collapseStore:Io(),currentModel:l,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:void 0,lastResponseId:void 0,snipRemovedIds:new Set,contentReplacementState:xi(),budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0},ce=Math.max(g*5,200),F=0;for(;;){if(F++,F>ce){n.info(`hard iteration cap reached (${ce}), forcing completion`);let S=v.finalText||bn(v.messages,n);yield{type:"end",turnId:o,content:S,usage:v.totalUsage,model:v.currentModel};return}let{messages:j,maxOutputTokensRecoveryCount:ne,hasAttemptedReactiveCompact:re,maxOutputTokensOverride:ue,turnCount:V,guardState:B,reactiveCompactState:fe,collapseStore:Oe}=v,{toolLoopState:he}=v;if(L){try{let S=await L;S&&(yield{type:"tool_use_summary",turnId:o,summary:S})}catch{}L=void 0}if(r.refreshTools&&V>1){let S=r.refreshTools();S!==D&&(D=S,n.debug(`tools refreshed: ${S.length} tools`))}if(Qo(B,y)){n.info(`turn aborted by guard at turn ${V}`),yield{type:"error",turnId:o,error:"Turn aborted",code:"ABORTED",usage:v.totalUsage};return}let h=Jo(B,y);if(h.level==="blocking"){h.reason==="prompt_too_long"&&ct(fe)&&(fe.attemptedThisTurn=!0,B.hasAttemptedReactiveCompact=!0,n.info(`token budget blocking (${h.reason}), reactive compact needed`),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"token budget pre-check"}),n.info(`token budget blocking (${h.reason}), ending tool loop`);break}h.level==="warning"&&n.info(`token budget warning: ${h.usagePercent}% used, ${h.remainingTokens} remaining`);let k;{let S=await Mi(j,v.contentReplacementState,s);k=S.messages,S.newlyReplacedCount>0&&(n.info(`tool-result-budget: persisted ${S.newlyReplacedCount} oversized tool results`),yield{type:"recovery",turnId:o,action:"tool_result_budget",detail:`${S.newlyReplacedCount} persisted`})}{let S=Mo(k,v.snipRemovedIds);k=S.messages,S.removedCount>0&&(n.info(`snip: removed ${S.removedCount} messages, freed ~${S.tokensFreed} tokens`),yield{type:"recovery",turnId:o,action:"snip",detail:`${S.removedCount} messages`})}{let M=new je().compress(k,0);M.droppedCount>0&&(k=M.messages,n.info(`microcompact: cleared ${M.droppedCount} old tool results`))}if(k=Eo(k,Oe).messages,B.promptTokens>0){let S=$i(k,{budget:y.contextWindowTokens*.75,model:v.currentModel});S.droppedCount>0&&(k=S.messages,n.info(`autocompact: ${S.strategy}, dropped ${S.droppedCount}`),yield{type:"recovery",turnId:o,action:"autocompact",detail:`${S.strategy}: ${S.droppedCount} dropped`},v.hasAttemptedReactiveCompact=!1,d?.invoke("context.after_compact",{...m,removedCount:S.droppedCount}).catch(()=>{}))}k=Np(k);let x=Lo({tools:D,toolChoice:r.toolChoice??"auto"}),R=gn({maxRounds:_,replayMessages:k,lastStopReason:he.lastStopReason,options:{stopReason:he.lastStopReason}}),A=x.extraSystemPrompt?[{role:"system",content:x.extraSystemPrompt},...R.state.replayMessages]:R.state.replayMessages;he=R.state,R.recoveryActions.length>0&&n.debug(`tool loop recovery: ${R.recoveryActions.map(S=>S.detail??S.kind).join("; ")}`),n.debug(`turn ${V}, messages: ${A.length}`),d?.invoke("turn.before_inference",{...m,model:v.currentModel}).catch(()=>{});let O=!1,q=[],W=new Map,ae="stop",Q,I=null,se=!1,ze=[],X=[];try{for await(let S of e.stream({model:v.currentModel,messages:A,tools:x.tools,toolChoice:x.normalizedToolChoice??"auto",temperature:c,maxTokens:(ue??B.currentMaxOutputTokens)||void 0,streamRequired:r.streamRequired,previousResponseId:v.lastResponseId,reasoning:r.reasoning,promptCacheKey:r.promptCacheKey,promptCacheRetention:r.promptCacheRetention,serviceTier:r.serviceTier,openaiBuiltinTools:r.openaiBuiltinTools,maxToolCalls:r.maxToolCalls,parallelToolCalls:r.parallelToolCalls,textVerbosity:r.textVerbosity},u,p))switch(S.type){case"delta":q.push(S.text),O||(yield{type:"delta",turnId:o,text:S.text});break;case"tool_call_delta":O=!0,er(W,S);break;case"reasoning_delta":ze.push(S.text);break;case"reasoning_block_complete":S.signature&&X.push({thinking:ze.join(""),signature:S.signature}),ze.length=0;break;case"usage":Q={prompt:S.promptTokens,completion:S.completionTokens,reasoning:S.reasoningTokens,cacheRead:S.cacheReadTokens,cacheCreation:S.cacheCreationTokens};break;case"response_id":v.lastResponseId=S.id;break;case"annotations":yield{type:"annotations",turnId:o,annotations:S.annotations};break;case"builtin_tool_status":yield{type:"heartbeat",turnId:o,message:`${S.toolType}: ${S.event}`};break;case"done":ae=S.finishReason;break}if(O||d?.invoke("turn.after_inference",{...m,model:v.currentModel}).catch(()=>{}),r.postSamplingHooks&&r.postSamplingHooks.length>0){let S=v.currentModel;for(let M of r.postSamplingHooks)try{M({messages:[...k],model:S,sessionId:s})}catch{}}}catch(S){if(S instanceof Pt&&r.fallbackModel){n.info(`model fallback triggered: ${S.originalModel} \u2192 ${S.fallbackModel}`),yield{type:"recovery",turnId:o,action:"model_fallback",detail:`${S.originalModel} \u2192 ${S.fallbackModel}`},v={...v,currentModel:S.fallbackModel,consecutive529Errors:0,consecutiveApiRetries:0,transition:void 0};continue}let M=S instanceof Error?S.message:String(S),$=typeof S?.status=="number"?S.status:void 0;if(!$&&M&&(M.includes("ECONNRESET")||M.includes("EPIPE"))){let oe=(v.consecutiveApiRetries??0)+1;if(oe>It){n.info(`stale connection retry limit reached (${It}), aborting`),yield{type:"error",turnId:o,error:M,code:"RETRIES_EXHAUSTED",usage:v.totalUsage};return}n.info(`stale connection (${M.includes("ECONNRESET")?"ECONNRESET":"EPIPE"}): retrying`),yield{type:"recovery",turnId:o,action:"stale_connection_retry",detail:M.slice(0,80)},v={...v,consecutiveApiRetries:oe,transition:void 0};continue}let Y=Up({status:$,message:M});if(Y!==null){n.info(`max_tokens overflow: adjusting to ${Y}`),B.currentMaxOutputTokens=Y,v={...v,maxOutputTokensOverride:Y,transition:void 0};continue}if(Wo($)){if(v.consecutive529Errors++,v.consecutive529Errors>=yi&&r.fallbackModel&&v.currentModel!==r.fallbackModel){n.info(`529 \xD7 ${v.consecutive529Errors}: triggering fallback to ${r.fallbackModel}`),yield{type:"recovery",turnId:o,action:"model_fallback",detail:`529 \xD7 ${v.consecutive529Errors}`},v={...v,currentModel:r.fallbackModel,consecutive529Errors:0,transition:void 0};continue}if(Go()){let oe=fn(v.consecutive529Errors);n.info(`persistent retry: waiting ${oe}ms (attempt ${v.consecutive529Errors})`);let z=oe;for(;z>0;){if(p?.aborted){yield{type:"error",turnId:o,error:"Aborted during retry wait",code:"ABORTED",usage:v.totalUsage};return}yield{type:"heartbeat",turnId:o,message:`Retrying in ${Math.ceil(z/1e3)}s (${$})`};let pe=Math.min(z,hi);await new Promise(To=>setTimeout(To,pe)),z-=pe}v={...v,transition:void 0};continue}if(Bo(f)){let z=Dp({status:$,message:M})??fn(v.consecutive529Errors);n.info(`transient ${$}: retry in ${z}ms`),yield{type:"recovery",turnId:o,action:"retry",detail:`${$} retry in ${z}ms`},await new Promise(pe=>setTimeout(pe,z)),v={...v,transition:void 0};continue}n.info(`background source ${f}: not retrying ${$}`)}I={status:$,message:M}}if(I&&d?.invoke("turn.after_inference",{...m,model:v.currentModel,response:{error:I.message}}).catch(()=>{}),I)if(Bi(I))se=!0,n.info(`withheld prompt_too_long error (status=${I.status})`);else if(Wi(I))se=!0,n.info(`withheld media_size error (status=${I.status})`);else{let S=Yo({status:I.status??500,message:I.message},B,y);if(S.action==="reactive_compact"&&ct(fe)&&(fe.attemptedThisTurn=!0,B.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:o,action:"reactive_compact",detail:`API ${I.status??500}: ${I.message}`}),S.action==="retry"){let $=(v.consecutiveApiRetries??0)+1;if($>It){n.info(`API retry limit reached (${It}), aborting`);let Y=at(I.status,I.message);yield{type:"error",turnId:o,error:I.message,code:Y,usage:v.totalUsage};return}yield{type:"recovery",turnId:o,action:"retry",detail:S.reason},v={...v,consecutiveApiRetries:$,transition:void 0};continue}let M=at(I.status,I.message);d?.invoke("stop.failure",{sessionId:s,reason:M,error:I.message}).catch(()=>{}),yield{type:"error",turnId:o,error:I.message,code:M,usage:v.totalUsage};return}Q&&(v.totalUsage.prompt+=Q.prompt,v.totalUsage.completion+=Q.completion,Q.reasoning&&(v.totalUsage.reasoning=(v.totalUsage.reasoning??0)+Q.reasoning),Q.cacheRead&&(v.totalUsage.cacheRead=(v.totalUsage.cacheRead??0)+Q.cacheRead),Q.cacheCreation&&(v.totalUsage.cacheCreation=(v.totalUsage.cacheCreation??0)+Q.cacheCreation)),Q?.prompt&&(B.promptTokens=Q.prompt);let un=q.join("");un&&(v.finalText=un);let Se=[...W.values()].map(S=>({id:S.id||`tc_${o}_${V}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:S.name,arguments:S.arguments}}));if(Se.length===0&&!O){if(se&&I&&Bi(I)){if(v.transition?.reason!=="collapse_drain_retry"){let M=Oo(k,Oe);if(M.committed>0){n.info(`collapse drain: committed ${M.committed} stages`),yield{type:"recovery",turnId:o,action:"collapse_drain",detail:`${M.committed} stages committed`},v={...v,messages:M.messages,transition:{reason:"collapse_drain_retry",committed:M.committed}};continue}}if(ct(fe)){fe.attemptedThisTurn=!0,B.hasAttemptedReactiveCompact=!0,n.info("withheld 413: reactive compact attempt"),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"withheld prompt_too_long"},v={...v,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}n.info("withheld 413: recovery exhausted, surfacing error"),d?.invoke("stop.failure",{sessionId:s,reason:"prompt_too_long",error:I.message}).catch(()=>{}),yield{type:"error",turnId:o,error:I.message,code:"PROMPT_TOO_LONG",usage:v.totalUsage};return}if(se&&I&&Wi(I)){if(ct(fe)){fe.attemptedThisTurn=!0,B.hasAttemptedReactiveCompact=!0,n.info("withheld media error: reactive compact strip-retry"),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"media error strip-retry"},v={...v,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}n.info("withheld media error: recovery exhausted"),d?.invoke("stop.failure",{sessionId:s,reason:"media_error",error:I.message}).catch(()=>{}),yield{type:"error",turnId:o,error:I.message,code:"IMAGE_ERROR",usage:v.totalUsage};return}if($p(ae)){B.consecutiveTruncations+=1;let M=r.modelMaxOutputTokens??mi,$=Xo(B,y,M);if($.shouldEscalate&&ue===void 0){B.currentMaxOutputTokens=$.newMax,n.info(`max_output_tokens escalate: ${$.newMax} tokens`),yield{type:"recovery",turnId:o,action:"output_escalation",detail:`${$.newMax} tokens`},v={...v,maxOutputTokensOverride:fi,transition:{reason:"max_output_tokens_escalate"}};continue}if(ne<gi){let Y={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 #${ne+1}`),yield{type:"recovery",turnId:o,action:"max_output_tokens_recovery",detail:`attempt ${ne+1}`},v={...v,messages:[...k,Y],maxOutputTokensRecoveryCount:ne+1,maxOutputTokensOverride:void 0,transition:{reason:"max_output_tokens_recovery",attempt:ne+1}};continue}n.info("max_output_tokens recovery exhausted, completing with partial content")}else B.consecutiveTruncations=0;if(he=mn(he,{replayMessages:j,lastStopReason:"completed"}),d){let M=await d.invoke("stop",{sessionId:s,reason:"completed"});if(M.action==="prevent"){n.info(`stop hook prevented continuation: ${M.reason??"no reason"}`),yield{type:"end",turnId:o,content:v.finalText,usage:v.totalUsage,model:v.currentModel};return}if(M.action==="abort"){let $=M.reason??"Stop hook requested continuation";n.info(`stop hook blocking: ${$}`);let Y={role:"user",content:$},oe={role:"assistant",content:v.finalText,...X.length>0&&{thinkingBlocks:[...X]}};v={...v,messages:[...j,oe,Y],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(r.tokenBudget&&r.tokenBudget>0&&v.budgetContinuationCount<5){let M=v.totalUsage.prompt+v.totalUsage.completion+(v.totalUsage.reasoning??0),$=M/r.tokenBudget*100,Y=M-v.lastBudgetGlobalTokens,oe=v.budgetContinuationCount>=bi&&Y<nr&&v.lastBudgetDeltaTokens<nr;if(oe&&n.info(`token budget early stop: diminishing returns at ${Math.round($)}% (delta=${Y})`),!oe&&$<90){let z=v.budgetContinuationCount+1,pe={role:"user",content:Ui($,M,r.tokenBudget)};n.info(`token budget continuation #${z}: ${Math.round($)}% used`),yield{type:"recovery",turnId:o,action:"budget_continuation",detail:`${Math.round($)}% used (#${z})`};let To={role:"assistant",content:v.finalText,...X.length>0&&{thinkingBlocks:[...X]}};v={...v,messages:[...j,To,pe],budgetContinuationCount:z,lastBudgetDeltaTokens:Y,lastBudgetGlobalTokens:M,transition:{reason:"token_budget_continuation"}};continue}}if(E>0){let M={ok:!0,toolCallCount:E,distinctToolCount:C.size,multiStep:E>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},$=Mt(M,{tools:[...C]});$&&(yield{type:"skill_instruction",turnId:o,instruction:$})}yield{type:"end",turnId:o,content:v.finalText,usage:v.totalUsage,model:v.currentModel};return}for(let S of Se){let M=S.function.arguments,$=D.find(Y=>Y.function.name===S.function.name);if($?.backfillObservableInput)try{let Y=JSON.parse(S.function.arguments),oe={...Y};$.backfillObservableInput(oe),Object.keys(oe).some(pe=>!(pe in Y))&&(M=JSON.stringify(oe))}catch{}yield{type:"tool_call",turnId:o,callId:S.id,name:S.function.name,arguments:M}}let Ku=X.length===0&&ze.length>0?ze.join(""):void 0;j.push(vo(Se,v.finalText||void 0,X.length>0?X:void 0,Ku)),he=Fo(he,{replayMessages:j,pendingToolCallIds:Se.map(S=>S.id),completedToolCallIds:he.completedToolCallIds,lastStopReason:"tool_calls"});let Ls=[];try{let S=new yn({toolInvoker:t,hooks:d,sessionId:s,turnId:o,log:n,signal:p,maxConcurrentTools:r?.maxConcurrentTools});for(let M of Se)S.addTool(M);for await(let M of S.getRemainingResults()){M.blocked&&(yield{type:"tool_blocked",turnId:o,callId:M.callId,name:M.toolName,reason:M.blockReason??"blocked"}),j.push(M.message),Ls.push(M.callId),C.add(M.toolName),E++;let $=typeof M.message?.content=="string"?M.message.content:"",Y=M.ok&&$?$.slice(0,2e3):void 0;if(yield{type:"tool_result",turnId:o,callId:M.callId,name:M.toolName,ok:M.ok,error:M.error,outputPreview:Y},M.ok){let oe=Se.find(z=>z.id===M.callId);if(oe){if(M.toolName==="plan_mode")try{let z=JSON.parse(oe.function.arguments);z.action==="exit"&&typeof z.plan=="string"&&z.plan.length>0&&(yield{type:"plan_update",turnId:o,slug:"approved-plan",content:z.plan})}catch{}if(Ip.has(M.toolName))try{let z=JSON.parse(oe.function.arguments),pe=typeof z.file_path=="string"?z.file_path:typeof z.filePath=="string"?z.filePath:typeof z.path=="string"?z.path:void 0;pe&&(yield{type:"artifact",turnId:o,artifactId:`artifact-${M.callId}`,artifactType:Ep(pe),title:pe.split(/[\\/]/).pop()||pe,filePath:pe,language:Op(pe)})}catch{}}}}}catch(S){let M=S instanceof Error?S.message:String(S);yield{type:"error",turnId:o,error:M,code:"TOOL_EXECUTION_ERROR",usage:v.totalUsage};return}if(he=mn(he,{replayMessages:j,completedToolCallIds:[...he.completedToolCallIds,...Ls],lastStopReason:"tool_calls"}),r.generateToolUseSummary&&Se.length>0){let S=Se.map(M=>({name:M.function.name,arguments:M.function.arguments}));L=r.generateToolUseSummary(S).catch(()=>null)}let $s=j.slice(-Se.length),Ju=$s.length>0&&$s.every(S=>{let M=S?.content;return typeof M!="string"?!1:M.startsWith("Error: ")}),wt=v.consecutiveFailedRounds;if(Ju){if(wt+=1,wt>=ci){let S=v.finalText||bn(j,n);n.info(`early exit: ${wt} consecutive failed rounds, returning ${v.finalText?"partial":"fallback"} response`),yield{type:"end",turnId:o,content:S,usage:v.totalUsage,model:v.currentModel};return}}else wt=0;let ko=V+1;if(g>0&&ko>g){if(n.info(`max turns reached (${g}), completing`),d){let M=await d.invoke("stop",{sessionId:s,reason:"max_turns"});if(M.action==="abort"){let $=M.reason??"Stop hook requested continuation after max_turns",Y={role:"assistant",content:v.finalText,...X.length>0&&{thinkingBlocks:[...X]}};v={...v,messages:[...j,Y,{role:"user",content:$}],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}let S=v.finalText||bn(j,n);yield{type:"end",turnId:o,content:S,usage:v.totalUsage,model:v.currentModel};return}if(ko>_){if(n.info(`tool loop budget exhausted (${_} rounds), returning`),E>0){let M={ok:!0,toolCallCount:E,distinctToolCount:C.size,multiStep:E>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},$=Mt(M,{tools:[...C]});$&&(yield{type:"skill_instruction",turnId:o,instruction:$})}let S=v.finalText||bn(j,n);yield{type:"end",turnId:o,content:S,usage:v.totalUsage,model:v.currentModel};return}v={messages:j,maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:ko,transition:{reason:"next_turn"},guardState:B,reactiveCompactState:fe,toolLoopState:he,consecutiveFailedRounds:wt,finalText:v.finalText,totalUsage:v.totalUsage,collapseStore:Oe,currentModel:v.currentModel,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:v.stopHookActive,lastResponseId:v.lastResponseId,snipRemovedIds:v.snipRemovedIds,contentReplacementState:v.contentReplacementState,budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0}}}function bn(r,e){let t=[];for(let n=r.length-1;n>=0;n--){let o=r[n];if(o.role==="tool"&&typeof o.content=="string")t.unshift(o.content.slice(0,500));else if(o.role==="assistant"){if(typeof o.content=="string"&&o.content.trim())return e.info("synthesizeFallbackContent: found assistant text, using it"),o.content;break}else break}return t.length>0?(e.info(`synthesizeFallbackContent: synthesized from ${t.length} tool result(s)`),t.join(`
25
-
26
- `)):""}async function*jp(r,e,t,n,o,s,i,a){let l=[],u;a.debug(`single LLM round, messages: ${t.length}`);for await(let c of i.stream({model:e,messages:t,temperature:o},n,s))switch(c.type){case"delta":l.push(c.text),yield{type:"delta",turnId:r,text:c.text};break;case"usage":u={prompt:c.promptTokens,completion:c.completionTokens,reasoning:c.reasoningTokens,cacheRead:c.cacheReadTokens,cacheCreation:c.cacheCreationTokens};break;case"done":break}yield{type:"end",turnId:r,content:l.join(""),usage:u??{prompt:0,completion:0},model:e}}var Ip,Hi=K(()=>{"use strict";tr();ut();Pi();cr();Ni();rr();hn();Ip=new Set(["write","edit","patch","apply_patch"])});var zi={};Ds(zi,{Agent:()=>dt});var dt,kn=K(()=>{"use strict";ut();Hi();hn();dt=class{transport;apiKey;toolInvoker;log;hooks;maxRounds;constructor(e){this.transport=e.llmTransport,this.apiKey=e.apiKey,this.toolInvoker=e.toolInvoker,this.log=e.log,this.hooks=e.hooks,this.maxRounds=Math.min(e.maxRounds??25,100)}async*run(e,t){let{turnId:n,messages:o,tools:s,systemPrompt:i,config:a}=e,l={sessionId:e.sessionId,turnId:n};yield{type:"start",turnId:n},this.hooks?.invoke("turn.submitted",{...l,prompt:o[o.length-1]?.content??void 0}).catch(()=>{});let u=No(o),c=[];if(i&&c.push({role:"system",content:i}),c.push(...u),this.hooks){let m=u.filter(f=>f.role==="user").pop(),g=typeof m?.content=="string"?m.content.slice(0,500):void 0;if(g)try{let f=await this.hooks.invoke("memory.before_recall",{sessionId:e.sessionId,turnId:n,query:g}),b=f?.context?.recalledMemories;if(b&&b.length>0){let T=b.map(w=>`- ${w.text}`).join(`
27
- `);c.splice(i?1:0,0,{role:"system",content:`[Recalled from long-term memory]
28
- ${T}`})}this.hooks.invoke("memory.after_recall",{sessionId:e.sessionId,turnId:n,blockCount:f?.context?.recalledMemories?.length??0}).catch(()=>{})}catch{}}let d=a?.model??"",p=Math.min(a?.maxRounds??this.maxRounds,100);try{let m=a?.summaryModel?async b=>{try{let T=b.map(y=>`${y.name}(${y.arguments.slice(0,200)})`).join(", "),w=this.transport.stream({model:a.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:T}],tools:[],maxTokens:60},a.apiKey??this.apiKey),_="";for await(let y of w)y.type==="delta"&&(_+=y.text);return _.trim()||null}catch{return null}}:void 0,g={turnId:n,sessionId:e.sessionId,messages:c,tools:s,model:d,apiKey:a?.apiKey??this.apiKey,temperature:a?.temperature,maxRounds:p,contextWindowTokens:a?.contextWindowTokens,maxOutputTokens:a?.maxOutputTokens,modelMaxOutputTokens:a?.modelMaxOutputTokens,toolChoice:a?.toolChoice,parentDepth:a?.parentDepth,hooks:this.hooks,fallbackModel:a?.fallbackModel,maxTurns:a?.maxTurns,tokenBudget:a?.tokenBudget,maxConcurrentTools:a?.maxConcurrentTools,streamRequired:a?.streamRequired,reasoning:a?.reasoning,promptCacheKey:a?.promptCacheKey,promptCacheRetention:a?.promptCacheRetention,serviceTier:a?.serviceTier,openaiBuiltinTools:a?.openaiBuiltinTools,maxToolCalls:a?.maxToolCalls,parallelToolCalls:a?.parallelToolCalls,textVerbosity:a?.textVerbosity,generateToolUseSummary:m,signal:t},f;for await(let b of Gi(g,this.transport,this.toolInvoker,this.log))f=b,yield b;f?.type==="end"?this.hooks?.invoke("turn.completed",{...l}).catch(()=>{}):f?.type==="error"&&this.hooks?.invoke("turn.failed",{...l,code:f.code,error:f.error}).catch(()=>{})}catch(m){if(t?.aborted)this.hooks?.invoke("turn.failed",{...l,code:"ABORTED",error:"Turn aborted"}).catch(()=>{}),yield{type:"error",turnId:n,error:"Turn aborted",code:"ABORTED"};else{let g=m instanceof Error?m.message:String(m),f=typeof m?.status=="number"?m.status:void 0,b=at(f,g);this.log.error(`turn ${n} error [${b}, retryable=${So(b)}]: ${g}`),this.hooks?.invoke("turn.failed",{...l,code:b,error:g}).catch(()=>{}),yield{type:"error",turnId:n,error:g,code:b}}}}}});kn();function Bp(r){let e={verbose:!1};for(let t of r.slice(2))(t==="--verbose"||t==="-v")&&(e.verbose=!0);return e}import{createInterface as Wp}from"node:readline";var Et=class{messageHandler=null;closeHandler=null;verbose;constructor(e){this.verbose=e?.verbose??!1}onMessage(e){this.messageHandler=e}onClose(e){this.closeHandler=e}send(e){process.stdout.write(`${JSON.stringify(e)}
29
- `)}start(){let e=Wp({input:process.stdin,crlfDelay:Number.POSITIVE_INFINITY});e.on("line",t=>{let n=t.trim();if(n)try{let o=JSON.parse(n);this.messageHandler?.(o)}catch{this.log(`invalid JSON on stdin: ${n.slice(0,200)}`)}}),e.on("close",()=>{this.closeHandler?.()})}close(){}log(e){this.verbose&&process.stderr.write(`[transport] ${e}
30
- `)}};import{randomUUID as xe}from"node:crypto";kn();tr();var _e=class{supportedTypes=["image","video","3d"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??18e4}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"video":return this.generateVideo(e,t,n);case"3d":return this.generate3D(e,t,n);default:throw new Error(`VolcengineMediaTransport: unsupported mediaType "${e.mediaType}"`)}}canHandle(e){return!!this.supportedTypes.includes(e.mediaType)}async generateImage(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v3/images/generations`,i={model:e.model,prompt:e.prompt,size:e.size??"2K",n:e.n??1,response_format:"url",sequential_image_generation:"disabled",watermark:!0};e.imageUrl&&(i.image=e.imageUrl),e.referenceImages&&e.referenceImages.length>0&&(i.image_urls=e.referenceImages),e.style&&(i.style=e.style),e.quality&&(i.quality=e.quality),e.seed!==void 0&&(i.seed=e.seed),e.guidanceScale!==void 0&&(i.guidance_scale=e.guidanceScale),e.enhancePrompt!==void 0&&(i.enhance_prompt=e.enhancePrompt),e.streamImage&&(i.stream=!0);let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`Volcengine image API error ${a.status}: ${c}`)}return e.streamImage&&a.body?this.parseStreamingImage(a.body,e,o):{mediaUrls:((await a.json()).data??[]).map(c=>c.url).filter(c=>!!c),model:e.model,size:e.size??"1024x1024",durationMs:Date.now()-o}}async parseStreamingImage(e,t,n){let o=new TextDecoder,s="",i="",a=e.getReader();try{for(;;){let{done:l,value:u}=await a.read();if(l)break;s+=o.decode(u,{stream:!0});let c;for(;(c=s.indexOf(`
31
- `))!==-1;){let d=s.slice(0,c).trim();if(s=s.slice(c+1),!d||d.startsWith(":")||!d.startsWith("data:"))continue;let p=d.slice(5).trim();if(p==="[DONE]")break;try{let g=JSON.parse(p).data?.[0]?.url;g&&(i=g,t.onProgress?.(50,"streaming"))}catch{}}}}finally{a.releaseLock()}return t.onProgress?.(100,"completed"),{mediaUrls:i?[i]:[],model:t.model,size:t.size??"1024x1024",durationMs:Date.now()-n}}async generateVideo(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v3/contents/generations/tasks`,i=e.referenceVideos?.length??0,a=e.referenceAudios?.length??0,l=e.referenceImages?.length??0,u=!!(e.imageUrl||l>0);if(i>3)throw new Error(`Seedance 2.0: max 3 reference videos (got ${i}). Total duration must be \u226415s.`);if(a>3)throw new Error(`Seedance 2.0: max 3 reference audios (got ${a}). Total duration must be \u226415s.`);if(a>0&&!u&&i===0)throw new Error("Seedance 2.0: reference audio cannot be used alone. Provide at least one reference image or video.");if(e.operation==="edit"&&l>9)throw new Error(`Seedance 2.0 video edit: max 9 reference images (got ${l}).`);let c=[];switch(e.draftTaskId&&c.push({type:"draft_task",id:e.draftTaskId}),e.operation){case"multimodal_reference":{if(e.prompt&&c.push({type:"text",text:e.prompt}),e.referenceImages?.length)for(let T=0;T<e.referenceImages.length;T++){let w=e.imageRoles?.[T]??"reference_image";c.push({type:"image_url",image_url:{url:e.referenceImages[T]},role:w})}if(e.referenceVideos?.length)for(let T of e.referenceVideos)c.push({type:"video_url",video_url:{url:T},role:"reference_video"});if(e.referenceAudios?.length)for(let T of e.referenceAudios)c.push({type:"audio_url",audio_url:{url:T},role:"reference_audio"});break}case"extend":{if(e.sourceVideos?.length)for(let T of e.sourceVideos)c.push({type:"video_url",video_url:{url:T},role:"reference_video"});e.prompt&&c.push({type:"text",text:e.prompt});break}case"merge":for(let T of e.sourceVideos??[])c.push({type:"video_url",video_url:{url:T}});e.prompt&&c.push({type:"text",text:e.prompt});break;case"upscale":e.sourceVideos?.[0]&&c.push({type:"video_url",video_url:{url:e.sourceVideos[0]}}),c.push({type:"text",text:e.prompt||"upscale"});break;case"edit":for(let T of e.sourceVideos??[])c.push({type:"video_url",video_url:{url:T},role:"reference_video"});if(e.referenceImages?.length)for(let T of e.referenceImages)c.push({type:"image_url",image_url:{url:T},role:"reference_image"});e.prompt&&c.push({type:"text",text:e.prompt});break;default:{let T=(e.referenceVideos?.length??0)>0,w=(e.referenceAudios?.length??0)>0,_=(e.imageRoles?.length??0)>0;if(T||w||_){if(e.prompt&&c.push({type:"text",text:e.prompt}),e.referenceImages?.length)for(let y=0;y<e.referenceImages.length;y++){let C=e.imageRoles?.[y]??"reference_image";c.push({type:"image_url",image_url:{url:e.referenceImages[y]},role:C})}if(T)for(let y of e.referenceVideos)c.push({type:"video_url",video_url:{url:y},role:"reference_video"});if(w)for(let y of e.referenceAudios)c.push({type:"audio_url",audio_url:{url:y},role:"reference_audio"})}else if(e.referenceImages?.length){for(let y of e.referenceImages)c.push({type:"image_url",image_url:{url:y}});e.prompt&&c.push({type:"text",text:e.prompt})}else e.imageUrl?(c.push({type:"image_url",image_url:{url:e.imageUrl}}),e.prompt&&c.push({type:"text",text:e.prompt})):e.prompt&&c.push({type:"text",text:e.prompt});break}}let d={model:e.model,content:c};e.duration&&(d.duration=e.duration),e.aspectRatio&&(d.ratio=e.aspectRatio),e.resolution&&(d.resolution=e.resolution),e.seed!==void 0&&(d.seed=e.seed),e.fps&&(d.fps=e.fps),e.generateAudio!==void 0&&(d.generate_audio=e.generateAudio),e.watermark!==void 0&&(d.watermark=e.watermark),e.enhancePrompt!==void 0&&(d.enhance_prompt=e.enhancePrompt),e.cameraFixed!==void 0&&(d.camera_fixed=e.cameraFixed),e.returnLastFrame!==void 0&&(d.return_last_frame=e.returnLastFrame),e.serviceTier&&(d.service_tier=e.serviceTier),e.executionExpiresAfterSeconds!==void 0&&(d.execution_expires_after=e.executionExpiresAfterSeconds),e.draft!==void 0&&(d.draft=e.draft),e.safetyIdentifier&&(d.safety_identifier=e.safetyIdentifier),e.callbackUrl&&(d.callback_url=e.callbackUrl),e.videoTools?.length&&(d.tools=e.videoTools.map(T=>({type:T})));let p=await this.submitTask(s,d,t,n),m=await this.pollTask(`${this.baseUrl}/v3/contents/generations/tasks/${p}`,t,n,e.onProgress,p),g=[],f=m.content;typeof f?.video_url=="string"&&g.push(f.video_url);let b=typeof f?.last_frame_url=="string"?f.last_frame_url:void 0;return{mediaUrls:g,model:e.model,durationMs:Date.now()-o,lastFrameUrl:b,taskId:p}}async generate3D(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v3/contents/generations/tasks`,i=[],a=[];e.outputFormat&&a.push(`--fileformat ${e.outputFormat}`),e.prompt&&a.push(e.prompt),a.length>0&&i.push({type:"text",text:a.join(" ")}),e.imageUrl&&i.push({type:"image_url",image_url:{url:e.imageUrl}});let l={model:e.model,content:i},u=await this.submitTask(s,l,t,n),c=await this.pollTask(`${this.baseUrl}/v3/contents/generations/tasks/${u}`,t,n,e.onProgress,u),d=[],p=c.content;if(typeof p?.video_url=="string"&&d.push(p.video_url),d.length===0&&p)for(let[,g]of Object.entries(p))typeof g=="string"&&/^https?:\/\//.test(g)&&d.push(g);let m=c.output;if(m?.model_urls){let g=m.model_urls;for(let f of Object.values(g))f&&!d.includes(f)&&d.push(f)}if(d.length===0){let g=Object.keys(c),f=p?Object.keys(p):[],b=m?Object.keys(m):[];console.error(`[volcengine-3d] No media URLs found. Response keys: [${g}], content keys: [${f}], output keys: [${b}]`);let T=c.data;if(T?.content){let w=T.content;for(let[,_]of Object.entries(w))typeof _=="string"&&/^https?:\/\//.test(_)&&d.push(_)}}return{mediaUrls:d,model:e.model,durationMs:Date.now()-o,metadata:d.length===0?{debugResponseKeys:Object.keys(c),debugContentKeys:p?Object.keys(p):null,debugContentSample:p?JSON.stringify(p).slice(0,500):null,debugOutputKeys:m?Object.keys(m):null,debugResultSample:JSON.stringify(c).slice(0,800)}:void 0}}async getTaskStatus(e,t,n){let o=`${this.baseUrl}/v3/contents/generations/tasks/${e}`,s=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let l=await s.text().catch(()=>"");throw new Error(`Volcengine task status error ${s.status}: ${l}`)}let i=await s.json();return{status:i.status??"unknown",task:i}}async listVideoTasks(e,t,n){let o=new URLSearchParams;t?.after&&o.set("after",t.after),t?.limit&&o.set("limit",String(t.limit)),t?.status&&o.set("status",t.status);let s=o.toString(),i=`${this.baseUrl}/v3/contents/generations/tasks${s?`?${s}`:""}`,a=await fetch(i,{method:"GET",headers:{Authorization:`Bearer ${e}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let l=await a.text().catch(()=>"");throw new Error(`Volcengine list tasks error ${a.status}: ${l}`)}return await a.json()}async deleteVideoTask(e,t,n){let o=`${this.baseUrl}/v3/contents/generations/tasks/${e}`,s=await fetch(o,{method:"DELETE",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Volcengine delete task error ${s.status}: ${i}`)}}async uploadFile(e,t,n,o){let s=`${this.baseUrl}/v3/files`,i=new FormData;i.append("file",e instanceof Blob?e:new Blob([e]),n?.filename??"upload"),i.append("purpose",n?.purpose??"user_data");let a=await fetch(s,{method:"POST",headers:{Authorization:`Bearer ${t}`},body:i,signal:o??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let u=await a.text().catch(()=>"");throw new Error(`Volcengine file upload error ${a.status}: ${u}`)}let l=await a.json();return{id:String(l.id??""),status:String(l.status??"")}}async getFile(e,t,n){let o=`${this.baseUrl}/v3/files/${e}`,s=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Volcengine get file error ${s.status}: ${i}`)}return await s.json()}async listFiles(e,t,n){let o=new URLSearchParams;t?.after&&o.set("after",t.after),t?.limit&&o.set("limit",String(t.limit)),t?.purpose&&o.set("purpose",t.purpose),t?.order&&o.set("order",t.order);let s=o.toString(),i=`${this.baseUrl}/v3/files${s?`?${s}`:""}`,a=await fetch(i,{method:"GET",headers:{Authorization:`Bearer ${e}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let l=await a.text().catch(()=>"");throw new Error(`Volcengine list files error ${a.status}: ${l}`)}return await a.json()}async deleteFile(e,t,n){let o=`${this.baseUrl}/v3/files/${e}`,s=await fetch(o,{method:"DELETE",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Volcengine delete file error ${s.status}: ${i}`)}}async submitTask(e,t,n,o){let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(t),signal:o??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let l=await s.text().catch(()=>"");throw new Error(`Volcengine task submit error ${s.status}: ${l}`)}let i=await s.json(),a=i.id??i.task_id;if(!a)throw new Error("Volcengine task submit: no task_id in response");return a}async pollTask(e,t,n,o,s){let i=Date.now()+6e5,a=0;for(;Date.now()<i;){n?.throwIfAborted();let l=await fetch(e,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let m=await l.text().catch(()=>"");throw new Error(`Volcengine task poll error ${l.status}: ${m}`)}let u=await l.json(),c=u.status;if(c==="succeeded"||c==="complete")return o?.(100,"completed",s),u;if(c==="failed"||c==="cancelled"){let m=u.error?.message??"Task failed";throw new Error(`Volcengine task failed: ${m}`)}a++;let d=Date.now()-(i-6e5),p=Math.min(95,Math.round(d/6e5*100));o?.(p,c??"running",s),await new Promise(m=>setTimeout(m,3e3))}throw new Error("Volcengine task timed out after polling")}};import{writeFileSync as Hp,mkdirSync as Vp}from"node:fs";import{join as aa}from"node:path";import{randomUUID as zp}from"node:crypto";import{homedir as Gp}from"node:os";import{join as Z}from"node:path";var ye=".qlogicagent";function G(){return Z(Gp(),ye)}function ur(){return Z(G(),"sessions")}function qi(r){return Z(ur(),r)}function Ki(){return Z(G(),"plugins")}function dr(){return Z(G(),"skills")}function pt(){return Z(G(),"settings.json")}function Re(){return Z(G(),"cache")}function Ji(){return Z(G(),"debug-logs")}function Yi(r){let e=Z(G(),"checkpoints");return r?Z(e,r):e}function Xi(){return Z(G(),"plugin-cache")}function Qi(){return Z(G(),"mcp.json")}function Zi(){return Z(G(),"marketplace.json")}function ea(){return Z(G(),"workflows")}function ta(){return Z(G(),"rules")}function Fe(r){return Z(r??process.cwd(),ye)}function na(r){return Z(Fe(r),"workflows")}function oa(r){return Z(Fe(r),"INSTRUCTIONS.md")}function ra(r){return Z(Fe(r),"rules")}function sa(r){return Z(Fe(r),"sessions")}function ia(r){return Z(r,ye,"hooks")}var qp=18e4,Ot=class{supportedTypes=["image","tts"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??qp}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"tts":return this.generateTTS(e,t,n);default:throw new Error(`OpenAIMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateImage(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v1/images/generations`,i={model:e.model,prompt:e.prompt,n:e.n??1,size:e.size??"1024x1024",response_format:"url"};e.quality&&(i.quality=e.quality),e.style&&(i.style=e.style),e.background&&(i.background=e.background);let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`OpenAI images API error ${a.status}: ${c}`)}return{mediaUrls:((await a.json()).data??[]).map(c=>c.url).filter(c=>!!c),model:e.model,size:e.size??"1024x1024",durationMs:Date.now()-o}}async generateTTS(e,t,n){let o=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("OpenAIMediaTransport: text or prompt is required for TTS");let i=`${this.baseUrl}/v1/audio/speech`,a={model:e.model||"tts-1",input:s,voice:e.voice??"alloy",response_format:e.audioFormat??"mp3"};e.speed!==void 0&&(a.speed=e.speed);let l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(a),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let m=await l.text().catch(()=>"");throw new Error(`OpenAI TTS API error ${l.status}: ${m}`)}let u=Buffer.from(await l.arrayBuffer()),c=aa(Re(),"tts");Vp(c,{recursive:!0});let d=`openai-tts-${zp()}.mp3`,p=aa(c,d);return Hp(p,u),{mediaUrls:[`file://${p}`],model:e.model||"tts-1",durationMs:Date.now()-o,billingUnit:"per_character",billingQuantity:s.length}}};var Ze=class{supportedTypes=["music","video"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/anthropic\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??6e4}async generate(e,t,n){switch(e.mediaType){case"music":return this.generateMusic(e,t,n);case"video":return this.generateVideo(e,t,n);default:throw new Error(`MiniMaxMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateMusic(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v1/music_generation`,i={model:e.model,prompt:e.prompt,output_format:"url"};e.lyrics&&(i.lyrics=e.lyrics),e.duration&&(i.duration=e.duration),(e.isInstrumental||!e.lyrics)&&(i.is_instrumental=!0),e.audioUrl&&(i.audio_url=e.audioUrl),e.lyricsOptimizer&&(i.lyrics_optimizer=!0),(e.audioFormat||e.voice)&&(i.audio_setting={sample_rate:44100,bitrate:256e3,format:e.audioFormat??"mp3"});let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(6e5)});if(!a.ok){let m=await a.text().catch(()=>"");throw new Error(`MiniMax music error ${a.status}: ${m}`)}let l=await a.json();if(l.base_resp?.status_code&&l.base_resp.status_code!==0)throw new Error(`MiniMax music rejected: ${l.base_resp.status_msg??"unknown"}`);let u=l.data?.audio??l.audio_file;if(u)return{mediaUrls:[u],model:e.model,durationMs:Date.now()-o};let c=l.task_id;if(!c)throw new Error("MiniMax music: no audio_file or task_id in response");let d=`${this.baseUrl}/v1/music_generation/${c}`;return{mediaUrls:(await this.pollTask(d,t,n,e.onProgress,c)).audioUrls,model:e.model,durationMs:Date.now()-o}}async pollTask(e,t,n,o,s){let i=Date.now()+6e5;for(;Date.now()<i;){n?.throwIfAborted();let a=await fetch(e,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let d=await a.text().catch(()=>"");throw new Error(`MiniMax music poll error ${a.status}: ${d}`)}let l=await a.json(),u=l.status;if(u==="Success"||u==="Finished"){o?.(100,"completed",s);let d=[];return l.audio_file&&d.push(l.audio_file),{audioUrls:d}}if(u==="Failed"||u==="Cancelled")throw new Error(`MiniMax music task failed: ${l.base_resp?.status_msg??"unknown"}`);let c=Date.now()-(i-6e5);o?.(Math.min(95,Math.round(c/6e5*100)),u??"running",s),await new Promise(d=>setTimeout(d,3e3))}throw new Error("MiniMax music task timed out after polling")}async generateLyrics(e,t,n){let o=`${this.baseUrl}/v1/lyrics_generation`,s=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({prompt:e}),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let a=await s.text().catch(()=>"");throw new Error(`MiniMax lyrics API error ${s.status}: ${a}`)}let i=await s.json();if(i.base_resp?.status_code&&i.base_resp.status_code!==0)throw new Error(`MiniMax lyrics error: ${i.base_resp.status_msg??"unknown"}`);return i.data?.lyrics??""}async generateVideo(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v1/video_generation`,i={model:e.model||"S2V-01",prompt:e.prompt};if(e.referenceImages?.length&&e.imageRoles){let d=e.imageRoles.includes("first_frame"),p=e.imageRoles.includes("last_frame");if(d&&p){let m=e.imageRoles.indexOf("first_frame"),g=e.imageRoles.indexOf("last_frame");i.first_frame_image=e.referenceImages[m],i.last_frame_image=e.referenceImages[g]}else if(d){let m=e.imageRoles.indexOf("first_frame");i.first_frame_image=e.referenceImages[m]}else i.subject_reference=e.referenceImages.map((m,g)=>({type:"character",image:m}))}else e.imageUrl&&(i.first_frame_image=e.imageUrl);e.callbackUrl&&(i.callback_url=e.callbackUrl);let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let d=await a.text().catch(()=>"");throw new Error(`MiniMax video submit error ${a.status}: ${d}`)}let l=await a.json();if(l.base_resp?.status_code&&l.base_resp.status_code!==0)throw new Error(`MiniMax video rejected: ${l.base_resp.status_msg??"unknown"}`);let u=l.task_id;if(!u)throw new Error("MiniMax video: no task_id in response");let c=await this.pollVideoTask(u,t,n,e.onProgress);return{mediaUrls:c.downloadUrl?[c.downloadUrl]:[],model:e.model||"S2V-01",durationMs:Date.now()-o,taskId:u,metadata:{fileId:c.fileId,width:c.width,height:c.height}}}async pollVideoTask(e,t,n,o){let s=Date.now()+6e5;for(;Date.now()<s;){n?.throwIfAborted();let i=`${this.baseUrl}/v1/query/video_generation?task_id=${encodeURIComponent(e)}`,a=await fetch(i,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let m=await a.text().catch(()=>"");throw new Error(`MiniMax video poll error ${a.status}: ${m}`)}let l=await a.json();if(l.base_resp?.status_code&&l.base_resp.status_code!==0)throw new Error(`MiniMax video task error ${l.base_resp.status_code}: ${l.base_resp.status_msg??""}`);let u=l.status;if(u==="Success"){o?.(100,"completed",e);let m;if(l.file_id)try{m=await this.getFileDownloadUrl(l.file_id,t,n)}catch{}return{fileId:l.file_id,downloadUrl:m,width:l.video_width,height:l.video_height}}if(u==="Fail")throw new Error(`MiniMax video task failed: ${l.base_resp?.status_msg??"unknown"}`);let c=u??"running",d=Date.now()-(s-6e5),p=Math.min(95,Math.round(d/6e5*100));o?.(p,c,e),await new Promise(m=>setTimeout(m,3e3))}throw new Error("MiniMax video task timed out after polling")}async getFileDownloadUrl(e,t,n){let o=`${this.baseUrl}/v1/files/retrieve?file_id=${encodeURIComponent(e)}`,s=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let l=await s.text().catch(()=>"");throw new Error(`MiniMax file retrieve error ${s.status}: ${l}`)}let a=(await s.json()).file?.download_url;if(!a)throw new Error("MiniMax file retrieve: no download_url in response");return a}async getTaskStatus(e,t,n){let o=`${this.baseUrl}/v1/query/video_generation?task_id=${encodeURIComponent(e)}`,s=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let u=await s.text().catch(()=>"");throw new Error(`MiniMax task status error ${s.status}: ${u}`)}let i=await s.json(),a=i.status??"unknown";return{status:a==="Success"?"succeeded":a==="Fail"?"failed":a.toLowerCase(),task:i}}async listVideoTasks(e,t,n){return{data:[]}}async deleteVideoTask(e,t,n){throw new Error("MiniMax does not support video task cancellation.")}};import{writeFileSync as ca,mkdirSync as ua}from"node:fs";import{join as wn}from"node:path";import{randomUUID as da}from"node:crypto";import{writeFileSync as Kp,mkdirSync as Jp}from"node:fs";import{join as la}from"node:path";import{randomUUID as Yp}from"node:crypto";var Tn=class{ws=null;wsUrl;model="models/lyria-realtime-exp";onAudioChunk=null;onFilteredPrompt=null;onError=null;onClose=null;constructor(e){let t=e.baseUrl.replace(/\/+$/,""),n=new URL(t).origin.replace(/^http/,"ws");this.wsUrl=`${n}/ws/google.ai.generativelanguage.v1alpha.GenerativeService.BidiGenerateContent`}async connect(e,t){t.model&&(this.model=t.model.startsWith("models/")?t.model:`models/${t.model}`);let n=`${this.wsUrl}?key=${encodeURIComponent(e)}`,o=new WebSocket(n);this.ws=o,await new Promise((s,i)=>{let a=()=>{o.removeEventListener("error",l),s()},l=()=>{o.removeEventListener("open",a),i(new Error("Lyria RealTime WebSocket connection failed"))};o.addEventListener("open",a,{once:!0}),o.addEventListener("error",l,{once:!0})}),o.addEventListener("message",s=>this.handleMessage(s)),o.addEventListener("error",()=>{this.onError?.(new Error("Lyria RealTime WebSocket error"))}),o.addEventListener("close",()=>{this.ws=null,this.onClose?.()}),this.send({setup:{model:this.model}}),await new Promise(s=>setTimeout(s,100)),await this.setWeightedPrompts(t.prompts),t.config&&await this.setMusicGenerationConfig(t.config)}async setWeightedPrompts(e){this.send({musicInput:{weightedPrompts:e.map(t=>({text:t.text,weight:t.weight}))}})}async setMusicGenerationConfig(e){let t={};e.bpm!==void 0&&(t.bpm=e.bpm),e.density!==void 0&&(t.density=e.density),e.brightness!==void 0&&(t.brightness=e.brightness),e.guidance!==void 0&&(t.guidance=e.guidance),e.scale!==void 0&&(t.scale=e.scale),e.temperature!==void 0&&(t.temperature=e.temperature),e.topK!==void 0&&(t.top_k=e.topK),e.seed!==void 0&&(t.seed=e.seed),e.muteBass!==void 0&&(t.mute_bass=e.muteBass),e.muteDrums!==void 0&&(t.mute_drums=e.muteDrums),e.onlyBassAndDrums!==void 0&&(t.only_bass_and_drums=e.onlyBassAndDrums),e.musicGenerationMode!==void 0&&(t.music_generation_mode=e.musicGenerationMode),e.audioFormat!==void 0&&(t.audio_format=e.audioFormat),e.sampleRateHz!==void 0&&(t.sample_rate_hz=e.sampleRateHz),this.send({musicInput:{musicGenerationConfig:t}})}async play(){this.send({musicInput:{playbackControl:"PLAY"}})}async pause(){this.send({musicInput:{playbackControl:"PAUSE"}})}async stop(){this.send({musicInput:{playbackControl:"STOP"}})}async resetContext(){this.send({musicInput:{playbackControl:"RESET_CONTEXT"}})}close(){this.ws&&this.ws.readyState!==WebSocket.CLOSED&&this.ws.close(),this.ws=null}get connected(){return this.ws!==null&&this.ws.readyState===WebSocket.OPEN}send(e){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("Lyria RealTime session not connected");this.ws.send(JSON.stringify(e))}handleMessage(e){let t;try{t=JSON.parse(typeof e.data=="string"?e.data:e.data.toString())}catch{return}let n=t.serverContent;if(!n)return;let o=n.audioChunks;if(o&&this.onAudioChunk)for(let i of o)i.data&&this.onAudioChunk({data:Buffer.from(i.data,"base64")});let s=n.filteredPrompt;s&&this.onFilteredPrompt?.(s)}};async function pr(r,e,t){let n=t.durationSeconds??30,o=Date.now(),s=new Tn(e),i=[];s.onAudioChunk=l=>{i.push(l.data)};let a=null;s.onError=l=>{a=l};try{await s.connect(r,{model:t.model??"lyria-realtime-exp",prompts:t.prompts,config:t.musicConfig}),t.onProgress?.(5,"connected"),await s.play(),t.onProgress?.(10,"streaming");let l=Date.now()+n*1e3,u=500;for(;Date.now()<l;){if(t.signal?.throwIfAborted(),a)throw a;if(!s.connected)break;let f=Date.now()-o,b=n*1e3,T=Math.min(95,Math.round(10+f/b*85));t.onProgress?.(T,"streaming"),await new Promise(w=>setTimeout(w,u))}s.connected&&await s.stop(),t.onProgress?.(98,"assembling");let c=Buffer.concat(i),d=Xp(c,48e3,2,16),p=la(Re(),"gemini-music-realtime");Jp(p,{recursive:!0});let m=`lyria-rt-${Yp()}.wav`,g=la(p,m);return Kp(g,d),t.onProgress?.(100,"completed"),{filePath:`file://${g}`,durationMs:Date.now()-o}}finally{s.close()}}function Xp(r,e,t,n){let o=e*t*(n/8),s=t*(n/8),i=r.length,a=Buffer.alloc(44);return a.write("RIFF",0),a.writeUInt32LE(36+i,4),a.write("WAVE",8),a.write("fmt ",12),a.writeUInt32LE(16,16),a.writeUInt16LE(1,20),a.writeUInt16LE(t,22),a.writeUInt32LE(e,24),a.writeUInt32LE(o,28),a.writeUInt16LE(s,30),a.writeUInt16LE(n,32),a.write("data",36),a.writeUInt32LE(i,40),Buffer.concat([a,r])}var Qp=18e4,Zp=1e4,mr=6e5,Lt=class{supportedTypes=["image","video","music","music_realtime","tts","embedding"];apiBase;timeoutMs;constructor(e){this.apiBase=e.baseUrl.replace(/\/openai\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??Qp}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"video":return this.generateVideo(e,t,n);case"music":return this.generateMusic(e,t,n);case"music_realtime":return this.generateMusicRealtime(e,t,n);case"tts":return this.generateTTS(e,t,n);case"embedding":return this.generateEmbedding(e,t,n);default:throw new Error(`GeminiMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async deleteVideoTask(e,t,n){throw new Error("Gemini does not support deleting video generation tasks")}async listVideoTasks(e,t,n){return{data:[]}}async getTaskStatus(e,t,n){let o=`${this.apiBase}/${e}`,s=await fetch(o,{method:"GET",headers:{"x-goog-api-key":t},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let l=await s.text().catch(()=>"");throw new Error(`Gemini operation query error ${s.status}: ${l}`)}let i=await s.json();return{status:i.done?"completed":"running",task:i}}async generateImage(e,t,n){let o=Date.now(),s=`${this.apiBase}/models/${e.model}:generateContent`,i={responseModalities:["TEXT","IMAGE"]};e.aspectRatio&&(i.aspectRatio=e.aspectRatio);let a={contents:[{parts:[{text:e.prompt}]}],generationConfig:i},l=await this.postJson(s,a,t,n);return{mediaUrls:this.extractInlineImages(l),model:e.model,durationMs:Date.now()-o}}async generateVideo(e,t,n){let o=Date.now(),s=`${this.apiBase}/models/${e.model}:predictLongRunning`,i={prompt:e.prompt};e.imageUrl&&(i.image={inlineData:await this.resolveImageData(e.imageUrl)}),e.referenceImages?.length&&(i.referenceImages=await Promise.all(e.referenceImages.map(async b=>({image:{inlineData:await this.resolveImageData(b)},referenceType:"asset"}))));let a={};e.aspectRatio&&(a.aspectRatio=e.aspectRatio),e.resolution&&(a.resolution=e.resolution),e.duration&&(a.durationSeconds=String(e.duration)),e.n&&(a.numberOfVideos=e.n),e.seed!==void 0&&(a.seed=e.seed);let l={instances:[i]};Object.keys(a).length>0&&(l.parameters=a);let c=(await this.postJson(s,l,t,n)).name;if(!c)throw new Error("Gemini video submit: no operation name in response");let d=c;e.onProgress?.(5,"submitted",d);let g=(await this.pollOperation(c,t,n,e.onProgress,d)).response?.generateVideoResponse?.generatedSamples??[],f=[];for(let b of g)b.video?.uri&&f.push(b.video.uri);return{mediaUrls:f,model:e.model,durationMs:Date.now()-o,taskId:d}}async generateMusic(e,t,n){let o=Date.now(),s=`${this.apiBase}/models/${e.model}:generateContent`,i=[{text:e.prompt}],a={};e.audioFormat==="wav"&&(a.responseModalities=["AUDIO","TEXT"],a.responseFormat={audio:{mimeType:"audio/wav"}});let l={contents:[{parts:i}]};Object.keys(a).length>0&&(l.generationConfig=a);let u=await this.postJson(s,l,t,n);return{mediaUrls:this.extractInlineAudio(u,"gemini-music"),model:e.model,durationMs:Date.now()-o}}async generateMusicRealtime(e,t,n){let o=await pr(t,{baseUrl:this.apiBase},{prompts:[{text:e.prompt,weight:1}],durationSeconds:e.duration??30,musicConfig:{audioFormat:e.audioFormat==="wav"?"pcm16":void 0,sampleRateHz:48e3},model:e.model,signal:n,onProgress:e.onProgress});return{mediaUrls:[o.filePath],model:e.model,durationMs:o.durationMs}}async generateTTS(e,t,n){let o=Date.now(),s=`${this.apiBase}/models/${e.model}:generateContent`,i={responseModalities:["AUDIO"]};e.voice&&(i.speechConfig={voiceConfig:{prebuiltVoiceConfig:{voiceName:e.voice}}});let a={contents:[{parts:[{text:e.text??e.prompt}]}],generationConfig:i},l=await this.postJson(s,a,t,n);return{mediaUrls:this.extractInlineAudio(l,"gemini-tts"),model:e.model,durationMs:Date.now()-o}}async generateEmbedding(e,t,n){let o=Date.now(),s=`${this.apiBase}/models/${e.model}:embedContent`,i={content:{parts:[{text:e.text??e.prompt}]}},a=e.metadata?.outputDimensionality;a!==void 0&&(i.output_dimensionality=a);let u=(await this.postJson(s,i,t,n)).embeddings?.[0]?.values??[];return{mediaUrls:[],model:e.model,durationMs:Date.now()-o,metadata:{embedding:u,dimensions:u.length}}}async postJson(e,t,n,o){let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json","x-goog-api-key":n},body:JSON.stringify(t),signal:o??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Gemini API error ${s.status}: ${i}`)}return s.json()}async pollOperation(e,t,n,o,s){let i=Date.now()+mr;for(;Date.now()<i;){n?.throwIfAborted();let a=`${this.apiBase}/${e}`,l=await fetch(a,{method:"GET",headers:{"x-goog-api-key":t},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let p=await l.text().catch(()=>"");throw new Error(`Gemini operation poll error ${l.status}: ${p}`)}let u=await l.json();if(u.done===!0)return o?.(100,"completed",s),u;if(u.error){let p=u.error;throw new Error(`Gemini video generation failed: ${p.message??JSON.stringify(p)}`)}let c=Date.now()-(i-mr),d=Math.min(95,Math.round(c/mr*100));o?.(d,"running",s),await new Promise(p=>setTimeout(p,Zp))}throw new Error("Gemini video generation timed out after polling")}async resolveImageData(e){if(e.startsWith("data:")){let s=e.match(/^data:([^;]+);base64,(.+)$/);if(s)return{mimeType:s[1],data:s[2]}}if(e.startsWith("file://")){let{readFileSync:s}=await import("node:fs"),i=e.replace(/^file:\/\//,""),a=s(i).toString("base64"),l=i.split(".").pop()?.toLowerCase()??"png";return{mimeType:l==="jpg"||l==="jpeg"?"image/jpeg":l==="webp"?"image/webp":"image/png",data:a}}let t=await fetch(e,{signal:AbortSignal.timeout(6e4)});if(!t.ok)throw new Error(`Failed to fetch image ${e}: ${t.status}`);let n=Buffer.from(await t.arrayBuffer());return{mimeType:t.headers.get("content-type")??"image/png",data:n.toString("base64")}}extractInlineImages(e){let t=[],n=wn(Re(),"gemini-images");ua(n,{recursive:!0});for(let o of e.candidates??[])for(let s of o.content?.parts??[])if(s.inlineData?.data){let i=s.inlineData.mimeType==="image/png"?"png":s.inlineData.mimeType==="image/webp"?"webp":"jpg",a=`gemini-${da()}.${i}`,l=wn(n,a);ca(l,Buffer.from(s.inlineData.data,"base64")),t.push(`file://${l}`)}return t}extractInlineAudio(e,t){let n=[],o=wn(Re(),t);ua(o,{recursive:!0});for(let s of e.candidates??[])for(let i of s.content?.parts??[])if(i.inlineData?.data&&i.inlineData.mimeType?.startsWith("audio/")){let a=i.inlineData.mimeType.includes("wav")?"wav":i.inlineData.mimeType.includes("mpeg")||i.inlineData.mimeType.includes("mp3")?"mp3":"pcm",l=Buffer.from(i.inlineData.data,"base64"),u=a==="pcm"?em(l,24e3,1,16):l,c=`gemini-${da()}.${a==="pcm"?"wav":a}`,d=wn(o,c);ca(d,u),n.push(`file://${d}`)}return n}};function em(r,e,t,n){let o=e*t*(n/8),s=t*(n/8),i=r.length,a=Buffer.alloc(44);return a.write("RIFF",0),a.writeUInt32LE(36+i,4),a.write("WAVE",8),a.write("fmt ",12),a.writeUInt32LE(16,16),a.writeUInt16LE(1,20),a.writeUInt16LE(t,22),a.writeUInt32LE(e,24),a.writeUInt32LE(o,28),a.writeUInt16LE(s,30),a.writeUInt16LE(n,32),a.write("data",36),a.writeUInt32LE(i,40),Buffer.concat([a,r])}var vn=class{supportedTypes=["tts","video"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/apps\/anthropic\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??3e4}async generate(e,t,n){if(e.mediaType==="video")return this.generateVideo(e,t,n);if(e.mediaType!=="tts")throw new Error(`QwenMediaTransport: unsupported mediaType "${e.mediaType}"`);let o=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("QwenMediaTransport: text or prompt is required for TTS");let i=`${this.baseUrl}/api/v1/services/aigc/text2audio/generation`,a={format:e.audioFormat??"mp3",sample_rate:24e3},l={text:s};e.voice&&(l.voice=e.voice),e.speed!==void 0&&(a.speech_rate=e.speed);let u={model:e.model||"qwen3-tts-voicedesign",input:l,parameters:a},c=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`,"X-DashScope-Async":"enable"},body:JSON.stringify(u),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let g=await c.text().catch(()=>"");throw new Error(`DashScope TTS submit error ${c.status}: ${g}`)}let d=await c.json();if(d.code)throw new Error(`DashScope TTS submit rejected: ${d.code} \u2014 ${d.message??""}`);let p=d.output?.task_id;if(!p)throw new Error("DashScope TTS submit: no task_id in response");if(d.output?.task_status==="SUCCEEDED"){let g=this.extractMediaUrl(d);return{mediaUrls:g?[g]:[],model:e.model,durationMs:Date.now()-o}}return{mediaUrls:await this.pollTask(p,t,n,e.onProgress),model:e.model,durationMs:Date.now()-o}}async pollTask(e,t,n,o,s=12e4){let i=Date.now()+s,a=`${this.baseUrl}/api/v1/tasks/${e}`;for(;Date.now()<i;){n?.throwIfAborted(),await tm(2e3);let l=await fetch(a,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let p=await l.text().catch(()=>"");throw new Error(`DashScope TTS poll error ${l.status}: ${p}`)}let u=await l.json();if(u.code)throw new Error(`DashScope poll rejected: ${u.code} \u2014 ${u.message??""}`);let c=u.output?.task_status;if(c==="SUCCEEDED"){o?.(100,"completed",e);let p=this.extractMediaUrl(u);return p?[p]:[]}if(c==="FAILED")throw new Error(`DashScope task failed: ${u.message??"unknown error"}`);let d=Date.now()-(i-s);o?.(Math.min(95,Math.round(d/s*100)),c??"running",e)}throw new Error("DashScope task timed out")}async generateVideo(e,t,n){let o=Date.now(),s=e.model||"wan2.1-t2v-turbo",i={prompt:e.prompt};if(e.imageUrl)i.img_url=e.imageUrl;else if(e.referenceImages?.length)if(e.imageRoles){let g=e.imageRoles.indexOf("first_frame"),f=e.imageRoles.indexOf("last_frame");g>=0&&(i.img_url=e.referenceImages[g]),f>=0&&(i.tail_image_url=e.referenceImages[f]);let b=e.imageRoles.map((T,w)=>T==="reference_image"?w:-1).filter(T=>T>=0);b.length>0&&(i.ref_image_url=e.referenceImages[b[0]])}else i.img_url=e.referenceImages[0];let a={};e.duration&&(a.duration=e.duration),e.resolution&&(a.resolution=e.resolution),e.aspectRatio&&(a.ratio=e.aspectRatio),e.metadata?.size&&(a.size=e.metadata.size);let l=`${this.baseUrl}/api/v1/services/aigc/generation/generation`,u={model:s,input:i};Object.keys(a).length>0&&(u.parameters=a);let c=await fetch(l,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`,"X-DashScope-Async":"enable"},body:JSON.stringify(u),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let g=await c.text().catch(()=>"");throw new Error(`DashScope video submit error ${c.status}: ${g}`)}let d=await c.json();if(d.code)throw new Error(`DashScope video submit rejected: ${d.code} \u2014 ${d.message??""}`);let p=d.output?.task_id;if(!p)throw new Error("DashScope video submit: no task_id in response");return{mediaUrls:await this.pollTask(p,t,n,e.onProgress,6e5),model:s,durationMs:Date.now()-o,taskId:p}}async getTaskStatus(e,t,n){let o=`${this.baseUrl}/api/v1/tasks/${e}`,s=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let c=await s.text().catch(()=>"");throw new Error(`DashScope task status error ${s.status}: ${c}`)}let i=await s.json(),l=i.output?.task_status??"unknown";return{status:l==="SUCCEEDED"?"succeeded":l==="FAILED"?"failed":l.toLowerCase(),task:i}}async listVideoTasks(e,t,n){let o=new URLSearchParams;o.set("page_size",String(t?.limit??20)),t?.status&&o.set("status",t.status.toUpperCase());let s=`${this.baseUrl}/api/v1/tasks?${o.toString()}`,i=await fetch(s,{method:"GET",headers:{Authorization:`Bearer ${e}`},signal:n??AbortSignal.timeout(this.timeoutMs)});return i.ok?await i.json():{data:[]}}async deleteVideoTask(e,t,n){throw new Error("DashScope does not support task cancellation.")}extractMediaUrl(e){if(e.output?.video_url)return e.output.video_url;if(e.output?.audio_url)return e.output.audio_url;if(e.output?.results?.[0]?.url)return e.output.results[0].url}};function tm(r){return new Promise(e=>setTimeout(e,r))}import{writeFileSync as nm,mkdirSync as om}from"node:fs";import{join as pa}from"node:path";import{randomUUID as rm}from"node:crypto";var sm=18e4,im=3e3,xn=6e5,am=new Set(["glm-image"]),$t=class{supportedTypes=["image","video","tts","stt","embedding","voice_clone","document_parsing","rerank"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??sm}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"video":return this.generateVideo(e,t,n);case"tts":return this.generateTTS(e,t,n);case"stt":return this.generateSTT(e,t,n);case"embedding":return this.generateEmbedding(e,t,n);case"voice_clone":return this.generateVoiceClone(e,t,n);case"document_parsing":return this.generateDocumentParsing(e,t,n);case"rerank":return this.generateRerank(e,t,n);default:throw new Error(`ZhipuMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateImage(e,t,n){return am.has(e.model)?this.generateImageAsync(e,t,n):this.generateImageSync(e,t,n)}async generateImageSync(e,t,n){let o=Date.now(),s=`${this.baseUrl}/images/generations`,i={model:e.model,prompt:e.prompt};return e.size&&(i.size=e.size),e.quality&&e.model.startsWith("cogview-4")&&(i.quality=e.quality),{mediaUrls:((await this.postJSON(s,i,t,n)).data??[]).map(c=>c.url).filter(c=>!!c),model:e.model,size:e.size,durationMs:Date.now()-o}}async generateImageAsync(e,t,n){let o=Date.now(),s=`${this.baseUrl}/async/images/generations`,i={model:e.model,prompt:e.prompt};e.size&&(i.size=e.size),e.quality&&(i.quality=e.quality);let l=(await this.postJSON(s,i,t,n)).id;if(!l)throw new Error("Zhipu async image: no task id in response");return{mediaUrls:((await this.pollAsyncResult(l,t,n,e.onProgress)).data??[]).map(p=>p.url).filter(p=>!!p),model:e.model,size:e.size,durationMs:Date.now()-o}}async generateVideo(e,t,n){let o=Date.now(),s=`${this.baseUrl}/videos/generations`,i={model:e.model,prompt:e.prompt};e.imageUrl&&(i.image_url=e.imageUrl),e.size&&(i.size=e.size),e.duration&&(i.duration=e.duration);let l=(await this.postJSON(s,i,t,n)).id;if(!l)throw new Error("Zhipu video generation: no task id in response");return{mediaUrls:((await this.pollAsyncResult(l,t,n,e.onProgress)).video_result??[]).map(p=>p.url).filter(p=>!!p),model:e.model,durationMs:Date.now()-o}}async generateTTS(e,t,n){let o=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("ZhipuMediaTransport: text or prompt required for TTS");let i=`${this.baseUrl}/audio/speech`,a={model:e.model||"glm-tts",input:s};e.voice&&(a.voice=e.voice),e.speed!==void 0&&(a.speed=e.speed),e.audioFormat&&(a.response_format=e.audioFormat);let l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(a),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let g=await l.text().catch(()=>"");throw new Error(`Zhipu TTS API error ${l.status}: ${g}`)}let u=Buffer.from(await l.arrayBuffer()),c=pa(Re(),"tts");om(c,{recursive:!0});let d=e.audioFormat??"wav",p=`zhipu-tts-${rm()}.${d}`,m=pa(c,p);return nm(m,u),{mediaUrls:[`file://${m}`],model:e.model||"glm-tts",durationMs:Date.now()-o,billingUnit:"per_character",billingQuantity:s.length}}async generateSTT(e,t,n){let o=Date.now();if(!e.audioUrl)throw new Error("ZhipuMediaTransport: audioUrl required for STT");let s=`${this.baseUrl}/audio/transcriptions`,i=await fetch(e.audioUrl,{headers:{"User-Agent":"qlogicagent/1.0"},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!i.ok)throw new Error(`Failed to fetch audio from ${e.audioUrl}`);let a=await i.blob(),l=new FormData;l.append("model",e.model||"glm-asr-2512"),l.append("file",a,"audio.wav");let u=await fetch(s,{method:"POST",headers:{Authorization:`Bearer ${t}`},body:l,signal:n??AbortSignal.timeout(this.timeoutMs)});if(!u.ok){let d=await u.text().catch(()=>"");throw new Error(`Zhipu STT API error ${u.status}: ${d}`)}let c=await u.json();return{mediaUrls:[],model:e.model||"glm-asr-2512",durationMs:Date.now()-o,metadata:{transcription:c.text??""}}}async generateEmbedding(e,t,n){let o=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("ZhipuMediaTransport: text or prompt required for embedding");let i=`${this.baseUrl}/embeddings`,a={model:e.model||"embedding-3",input:s},u=(await this.postJSON(i,a,t,n)).data??[];return{mediaUrls:[],model:e.model||"embedding-3",durationMs:Date.now()-o,metadata:{embeddings:u.map(c=>c.embedding).filter(Boolean)}}}async generateVoiceClone(e,t,n){let o=Date.now();if(!e.audioUrl)throw new Error("ZhipuMediaTransport: audioUrl required for voice_clone (sample audio)");let s=await fetch(e.audioUrl,{signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok)throw new Error(`Failed to fetch audio sample from ${e.audioUrl}`);let i=await s.blob(),a=new FormData;a.append("model",e.model||"glm-tts-clone"),a.append("file",i,"sample.wav"),(e.text||e.prompt)&&a.append("text",e.text||e.prompt||"");let l=`${this.baseUrl}/voice/clone`,u=await fetch(l,{method:"POST",headers:{Authorization:`Bearer ${t}`},body:a,signal:n??AbortSignal.timeout(this.timeoutMs)});if(!u.ok){let p=await u.text().catch(()=>"");throw new Error(`Zhipu Voice Clone API error ${u.status}: ${p}`)}let c=await u.json();return{mediaUrls:(c.data??[]).map(p=>p.url).filter(p=>!!p),model:e.model||"glm-tts-clone",durationMs:Date.now()-o,metadata:{voiceId:c.voice_id}}}async generateDocumentParsing(e,t,n){let o=Date.now(),s=e.imageUrl||e.audioUrl;if(!s&&!e.prompt)throw new Error("ZhipuMediaTransport: imageUrl/audioUrl (file URL) or prompt (base64) required for document_parsing");let i=`${this.baseUrl}/layout_parsing`,a={model:e.model||"glm-ocr"};s?a.file_url=s:e.prompt&&(a.content=e.prompt);let c=(await this.postJSON(i,a,t,n)).pages??[];return{mediaUrls:[],model:e.model||"glm-ocr",durationMs:Date.now()-o,metadata:{pages:c.map(d=>({pageNum:d.page_num,content:d.content,layouts:d.layouts}))}}}async generateRerank(e,t,n){let o=Date.now(),s=e.prompt;if(!s)throw new Error("ZhipuMediaTransport: prompt (query) required for rerank");if(!e.metadata?.documents)throw new Error("ZhipuMediaTransport: metadata.documents required for rerank");let i=`${this.baseUrl}/rerank`,a={model:e.model||"rerank",query:s,documents:e.metadata.documents};e.metadata.topN!==void 0&&(a.top_n=e.metadata.topN);let l=await this.postJSON(i,a,t,n);return{mediaUrls:[],model:e.model||"rerank",durationMs:Date.now()-o,metadata:{results:(l.results??[]).map(u=>({index:u.index,relevanceScore:u.relevance_score,document:u.document}))}}}async postJSON(e,t,n,o){let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(t),signal:o??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Zhipu API error ${s.status}: ${i}`)}return s.json()}async pollAsyncResult(e,t,n,o){let s=Date.now()+xn,i=`${this.baseUrl}/async-result/${encodeURIComponent(e)}`;for(;Date.now()<s;){n?.throwIfAborted();let a=await fetch(i,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`Zhipu async-result error ${a.status}: ${c}`)}let l=await a.json();if(l.task_status==="SUCCESS")return o?.(100,"completed",e),l;if(l.task_status==="FAIL")throw new Error("Zhipu async task failed");let u=Date.now()-(s-xn);o?.(Math.min(95,Math.round(u/xn*100)),l.task_status??"running",e),await new Promise(c=>setTimeout(c,im))}throw new Error(`Zhipu async task timed out after ${xn/1e3}s`)}async getTaskStatus(e,t,n){let o=`${this.baseUrl}/async-result/${encodeURIComponent(e)}`,s=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let u=await s.text().catch(()=>"");throw new Error(`Zhipu task query error ${s.status}: ${u}`)}let i=await s.json(),a=i.task_status??"unknown";return{status:a==="SUCCESS"?"succeeded":a==="FAIL"?"failed":a==="PROCESSING"?"running":a.toLowerCase(),task:i}}async listVideoTasks(e,t,n){return{data:[]}}async deleteVideoTask(e,t,n){throw new Error("Zhipu does not support task cancellation. Tasks complete or timeout automatically.")}async listVoices(e,t){let n=`${this.baseUrl}/voice/`,o=await fetch(n,{method:"GET",headers:{Authorization:`Bearer ${e}`},signal:t??AbortSignal.timeout(this.timeoutMs)});if(!o.ok){let i=await o.text().catch(()=>"");throw new Error(`Zhipu voice list error ${o.status}: ${i}`)}return(await o.json()).data??[]}async deleteVoice(e,t,n){let o=`${this.baseUrl}/voice/${encodeURIComponent(e)}`,s=await fetch(o,{method:"DELETE",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Zhipu voice delete error ${s.status}: ${i}`)}}};var Dt=class{registry;transports=new Map;constructor(e){this.registry=e.registry}resolveModelById(e,t,n){let o=this.registry.getProvider(e);if(!o)return;let i=this.registry.listModels(e).find(a=>a.id===t&&a.mediaType===n);if(i)return{providerId:e,providerDef:o,modelInfo:i,mediaType:n}}getTransport(e){let t=this.transports.get(e);if(t)return t;let n=this.registry.getProvider(e);if(!n)return;let o=um(n);if(o)return this.transports.set(e,o),o}listMediaModels(e){let t=[];for(let n of this.registry.listProviders()){let o=this.registry.listModels(n.id);for(let s of o)s.mediaType&&(!e||s.mediaType===e)&&t.push({providerId:n.id,providerDef:n,modelInfo:s,mediaType:s.mediaType})}return t}findModelInProvider(e,t,n){let o=this.registry.getProvider(e);if(!o)return;let s=this.registry.listModels(e),i=n?lm(n):void 0,a=s.find(l=>l.mediaType!==t?!1:!i||!l.mediaCapabilities?!0:cm(l.mediaCapabilities,i));if(a)return{providerId:e,providerDef:o,modelInfo:a,mediaType:t}}};function lm(r){switch(r.mediaType){case"video":return r.operation==="merge"?"merge":r.operation==="upscale"?"upscale":r.operation==="edit"?"edit":r.imageUrl?"img2video":"text2video";case"image":return r.operation==="edit"?"inpainting":r.imageUrl?"img2img":"text2image";case"music":return r.audioUrl?"cover":"text2music";case"music_realtime":return"realtime";case"tts":return"text2speech";case"3d":return r.imageUrl?"img2_3d":"text2_3d";default:return}}function cm(r,e){return!("operations"in r)||!r.operations?!0:r.operations.includes(e)}function um(r){let e=r.baseUrl;switch(r.id){case"volcengine":return new _e({baseUrl:e});case"openai":return new Ot({baseUrl:e});case"minimax":return new Ze({baseUrl:e});case"google":return new Lt({baseUrl:e});case"qwen":return new vn({baseUrl:e});case"zhipu":return new $t({baseUrl:e.replace(/\/api\/anthropic\/?$/,"/api/paas/v4")});case"zhipu-openai":case"zhipu-coding":return new $t({baseUrl:e.replace(/\/api\/coding\/paas\/v4\/?$/,"/api/paas/v4")});default:return}}var gr=[{id:"deepseek",name:"DeepSeek",transport:"anthropic-messages",baseUrl:"https://api.deepseek.com/anthropic",apiKeyEnvVars:["DEEPSEEK_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"deepseek-v4-flash",quirks:{useEffortInsteadOfBudget:!0,filterImageBlocks:!0,maxReasoningEffort:"max",supportsPrefixCompletion:!0},models:[{id:"deepseek-v4-flash",name:"DeepSeek V4 Flash",contextWindow:1e6,maxOutput:384e3,toolCall:!0,reasoning:!0,vision:!1,costInput:.14,costOutput:.28,costCacheRead:.003},{id:"deepseek-v4-pro",name:"DeepSeek V4 Pro",contextWindow:1e6,maxOutput:384e3,toolCall:!0,reasoning:!0,vision:!1,costInput:1.74,costOutput:3.48,costCacheRead:.014}]},{id:"qwen",name:"Alibaba Qwen (DashScope)",transport:"anthropic-messages",baseUrl:"https://dashscope.aliyuncs.com/apps/anthropic",apiKeyEnvVars:["DASHSCOPE_API_KEY","QWEN_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"qwen3.6-plus",models:[{id:"qwen3.6-max-preview",name:"Qwen3.6 Max (Preview)",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:2,costOutput:8,costCacheRead:.2,costCacheWrite:2.5},{id:"qwen3.6-plus",name:"Qwen3.6 Plus",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:3,costCacheRead:.05,costCacheWrite:.625},{id:"qwen3.6-flash",name:"Qwen3.6 Flash",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.1,costOutput:.5,costCacheRead:.01,costCacheWrite:.125},{id:"qwq-plus",name:"QwQ Plus",contextWindow:131072,maxOutput:65536,toolCall:!0,reasoning:!0,reasoningRequired:!0,streamRequired:!0,vision:!1,costInput:.5,costOutput:3,costCacheRead:.05,costCacheWrite:.625},{id:"qwen-max",name:"Qwen Max",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:2,costOutput:6,costCacheRead:.2,costCacheWrite:2.5},{id:"qwen-plus",name:"Qwen Plus",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:.85,costCacheRead:.03,costCacheWrite:.375},{id:"qwen-flash",name:"Qwen Flash",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1},{id:"qwen-turbo",name:"Qwen Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!1},{id:"qwen-vl-max",name:"Qwen VL Max",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:3,costOutput:8.5},{id:"qwen3.5-omni-plus",name:"Qwen3.5 Omni Plus",contextWindow:131072,maxOutput:16384,toolCall:!1,reasoning:!1,streamRequired:!0,vision:!0},{id:"qwen-vl-ocr",name:"Qwen VL OCR",contextWindow:131072,maxOutput:4096,toolCall:!1,reasoning:!1,vision:!0,mediaType:"document_parsing",mediaCapabilities:{type:"document_parsing",supportedFormats:["jpg","jpeg","png","bmp","tiff","pdf"],maxFileSizeMB:10}},{id:"qwen3-tts-voicedesign",name:"Qwen3 TTS VoiceDesign",contextWindow:32768,maxOutput:16384,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],maxCharacters:32768,formats:["mp3","wav"]}},{id:"cosyvoice-v2",name:"CosyVoice V2",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],maxCharacters:1e4,formats:["mp3","wav","pcm"]}},{id:"wan2.7-image-pro",name:"Wan 2.7 Image Pro",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","1280x720","720x1280","2048x2048","3840x2160"]}},{id:"wanx2.1-t2i-turbo",name:"Wan 2.1 Text-to-Image Turbo",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","720x1280","1280x720"]}},{id:"wan2.7-t2v-plus",name:"Wan 2.7 Text/Image-to-Video Plus",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:15,resolutions:["720P","1080P"]}},{id:"wanx2.1-t2v-turbo",name:"Wan 2.1 Text/Image-to-Video Turbo",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:5,resolutions:["480P","720P"]}},{id:"text-embedding-v4",name:"Text Embedding V4",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:1024,maxTokens:8192}},{id:"wanx-background-generation-v2",name:"Wan Background Generation V2",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["inpainting"],sizes:["1024x1024","1280x720","720x1280"]}},{id:"qwen3-rerank",name:"Qwen3 Rerank",contextWindow:32768,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"rerank",mediaCapabilities:{type:"rerank",maxDocuments:100}}]},{id:"zhipu",name:"\u667A\u8C31 GLM (Zhipu)",group:"zhipu",transport:"anthropic-messages",baseUrl:"https://open.bigmodel.cn/api/anthropic",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"glm-5.1",quirks:{filterThinkingBlocks:!0},models:[{id:"glm-5.1",name:"GLM-5.1",contextWindow:2e5,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:6,costOutput:24,costCacheRead:1.3},{id:"glm-5",name:"GLM-5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-5-turbo",name:"GLM-5 Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1,costCacheRead:.1},{id:"glm-4.7",name:"GLM-4.7",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.6",name:"GLM-4.6",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.5-air",name:"GLM-4.5 Air",contextWindow:131072,maxOutput:98304,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1.5,costCacheRead:.1},{id:"glm-4-long",name:"GLM-4 Long",contextWindow:1e6,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.1},{id:"glm-4.7-flash",name:"GLM-4.7 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-4.5-flash",name:"GLM-4.5 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-5v-turbo",name:"GLM-5V Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:1},{id:"glm-4.6v",name:"GLM-4.6V",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:3.2},{id:"glm-4.6v-flash",name:"GLM-4.6V Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:0,costOutput:0},{id:"cogview-4-250304",name:"CogView-4",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","768x1344","864x1152","1344x768","1152x864","1440x720","720x1440"]}},{id:"cogview-3-flash",name:"CogView-3 Flash (Free)",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","768x1344","864x1152","1344x768","1152x864","1440x720","720x1440"]}},{id:"glm-image",name:"GLM-Image",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1280x1280","1568x1056","1056x1568","1472x1088","1088x1472","1728x960","960x1728"]}},{id:"cogvideox-3",name:"CogVideoX-3",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["1080p"]}},{id:"cogvideox-flash",name:"CogVideoX Flash (Free)",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:6}},{id:"glm-tts",name:"GLM-TTS",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech"],voices:["tongtong","chuichui","xiaochen","jam","kazi","douji","luodo"],maxCharacters:1024,formats:["wav","pcm"]}},{id:"glm-tts-clone",name:"GLM-TTS Clone",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"voice_clone",mediaCapabilities:{type:"voice_clone",maxSampleDurationSeconds:30,maxSampleSizeMB:10,formats:["wav","mp3"]}},{id:"glm-asr-2512",name:"GLM-ASR-2512",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"stt",mediaCapabilities:{type:"stt",languages:["zh","en"],maxDurationSeconds:30,formats:["wav","mp3"]}},{id:"embedding-3",name:"Embedding-3",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:2048,maxTokens:3072}},{id:"embedding-2",name:"Embedding-2",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:1024,maxTokens:512}},{id:"rerank",name:"GLM Rerank",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"rerank",mediaCapabilities:{type:"rerank",maxDocuments:128,maxQueryLength:4096,maxDocumentLength:4096}},{id:"glm-ocr",name:"GLM-OCR",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"document_parsing",mediaCapabilities:{type:"document_parsing",supportedFormats:["pdf","jpg","png"],maxPageCount:100,maxFileSizeMB:50}}]},{id:"zhipu-openai",name:"\u667A\u8C31 GLM OpenAI (Zhipu)",group:"zhipu",transport:"openai-chat",baseUrl:"https://open.bigmodel.cn/api/paas/v4",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"glm-5.1",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,supportsToolStream:!0,builtinWebSearch:!0,builtinCodeInterpreter:!0},models:[{id:"glm-5.1",name:"GLM-5.1",contextWindow:2e5,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:6,costOutput:24,costCacheRead:1.3},{id:"glm-5",name:"GLM-5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-5-turbo",name:"GLM-5 Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1,costCacheRead:.1},{id:"glm-4.7",name:"GLM-4.7",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.6",name:"GLM-4.6",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.5-air",name:"GLM-4.5 Air",contextWindow:131072,maxOutput:98304,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1.5,costCacheRead:.1},{id:"glm-4-long",name:"GLM-4 Long",contextWindow:1e6,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.1},{id:"glm-4.7-flash",name:"GLM-4.7 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-4.5-flash",name:"GLM-4.5 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-5v-turbo",name:"GLM-5V Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:1},{id:"glm-4.6v",name:"GLM-4.6V",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:3.2},{id:"glm-4.6v-flash",name:"GLM-4.6V Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:0,costOutput:0}]},{id:"zhipu-coding",name:"\u667A\u8C31 GLM Coding (Zhipu)",group:"zhipu",transport:"openai-chat",baseUrl:"https://open.bigmodel.cn/api/coding/paas/v4",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"codegeex-4",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,supportsToolStream:!0},models:[{id:"codegeex-4",name:"CodeGeeX-4",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.1,costOutput:.1}]},{id:"minimax",name:"MiniMax",group:"minimax",transport:"anthropic-messages",baseUrl:"https://api.minimaxi.com/anthropic",apiKeyEnvVars:["MINIMAX_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"MiniMax-M2.7",omitZeroTemperature:!0,quirks:{filterImageBlocks:!0},models:[{id:"MiniMax-M2.7",name:"MiniMax M2.7",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2,costCacheRead:.06,costCacheWrite:.375},{id:"MiniMax-M2.7-highspeed",name:"MiniMax M2.7 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2,costCacheRead:.06,costCacheWrite:.375},{id:"MiniMax-M2.5",name:"MiniMax M2.5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6,costCacheRead:.03,costCacheWrite:.19},{id:"MiniMax-M2.5-highspeed",name:"MiniMax M2.5 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6,costCacheRead:.03,costCacheWrite:.19},{id:"MiniMax-M2.1",name:"MiniMax M2.1 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1-highspeed",name:"MiniMax M2.1 Highspeed (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2",name:"MiniMax M2 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.4},{id:"music-2.6",name:"MiniMax Music 2.6",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:300,formats:["mp3","wav"]}},{id:"music-cover",name:"MiniMax Music Cover",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"music",mediaCapabilities:{type:"music",operations:["cover"],maxDurationSeconds:300,formats:["mp3","wav"]}},{id:"MiniMax-Hailuo-2.3",name:"Hailuo 2.3",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["768P","1080P"]}},{id:"MiniMax-Hailuo-2.3-Fast",name:"Hailuo 2.3 Fast",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["768P","1080P"]}},{id:"MiniMax-Hailuo-02",name:"Hailuo 02",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["512P","768P","1080P"]}},{id:"image-01",name:"MiniMax Image 01",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["512x512","1024x1024","2048x2048"]}},{id:"image-01-live",name:"MiniMax Image 01 Live",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024"]}},{id:"speech-2.8-hd",name:"MiniMax Speech 2.8 HD",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],formats:["mp3","pcm","flac","wav","opus"]}},{id:"speech-2.8-turbo",name:"MiniMax Speech 2.8 Turbo",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],formats:["mp3","pcm","flac","wav","opus"]}}]},{id:"minimax-openai",name:"MiniMax (OpenAI)",group:"minimax",transport:"openai-chat",baseUrl:"https://api.minimaxi.com/v1",apiKeyEnvVars:["MINIMAX_API_KEY"],authType:"bearer",isAggregator:!1,omitZeroTemperature:!0,defaultModel:"MiniMax-M2.7",quirks:{supportsReasoningSplit:!0},models:[{id:"MiniMax-M2.7",name:"MiniMax M2.7",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2},{id:"MiniMax-M2.7-highspeed",name:"MiniMax M2.7 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2},{id:"MiniMax-M2.5",name:"MiniMax M2.5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.5-highspeed",name:"MiniMax M2.5 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1",name:"MiniMax M2.1 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1-highspeed",name:"MiniMax M2.1 Highspeed (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6}]},{id:"moonshot",name:"Moonshot (Kimi)",transport:"openai-chat",baseUrl:"https://api.moonshot.cn",apiKeyEnvVars:["MOONSHOT_API_KEY"],authType:"bearer",isAggregator:!1,omitZeroTemperature:!0,defaultModel:"kimi-k2.6",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,builtinWebSearch:!0},models:[{id:"kimi-k2.6",name:"Kimi K2.6",contextWindow:262144,maxOutput:262144,toolCall:!0,reasoning:!0,vision:!0,costInput:.95,costOutput:4,costCacheRead:.16},{id:"kimi-k2.5",name:"Kimi K2.5",contextWindow:262144,maxOutput:262144,toolCall:!0,reasoning:!0,vision:!0,costInput:.8,costOutput:4,costCacheRead:.2},{id:"moonshot-v1-128k",name:"Moonshot V1 128K",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.84,costOutput:.84}]},{id:"volcengine",name:"\u8C46\u5305 (Doubao/Volcengine)",transport:"volcengine-responses",baseUrl:"https://ark.cn-beijing.volces.com/api",apiKeyEnvVars:["ARK_API_KEY","DOUBAO_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"doubao-seed-2-0-lite-260215",models:[{id:"doubao-seed-2-0-pro-260215",name:"Doubao Seed 2.0 Pro",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-lite-260428",name:"Doubao Seed 2.0 Lite (0428)",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-lite-260215",name:"Doubao Seed 2.0 Lite",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-mini-260428",name:"Doubao Seed 2.0 Mini (0428)",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-mini-260215",name:"Doubao Seed 2.0 Mini",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-code-preview-260215",name:"Doubao Seed 2.0 Code Preview",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-1-8-251228",name:"Doubao Seed 1.8",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seedance-2-0-260128",name:"Doubao Seedance 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video","video2video","edit","merge","upscale"],maxDurationSeconds:15,resolutions:["480p","720p","1080p"],aspectRatios:["16:9","9:16","1:1"],fps:[24]}},{id:"doubao-seedance-2-0-fast-260128",name:"Doubao Seedance 2.0 Fast",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video","video2video","edit","merge","upscale"],maxDurationSeconds:15,resolutions:["480p","720p"],aspectRatios:["16:9","9:16","1:1"],fps:[24]}},{id:"doubao-seedream-5-0-260128",name:"Doubao Seedream 5.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["512x512","1024x1024","2K"]}},{id:"doubao-seedream-4-5-251128",name:"Doubao Seedream 4.5",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["512x512","1024x1024","2K"]}},{id:"doubao-seed3d-2-0-260328",name:"Doubao Seed3D 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["img2_3d"],outputFormats:["glb","obj","usd","usdz"]}},{id:"hyper3d-gen2-260112",name:"Hyper3D Gen2",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["text2_3d","img2_3d"],outputFormats:["glb","obj"]}},{id:"hitem3d-2-0-251223",name:"HiTem3D 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["img2_3d"],outputFormats:["glb","obj","usd"]}}]},{id:"openai",name:"OpenAI",transport:"openai-responses",baseUrl:"https://api.openai.com",apiKeyEnvVars:["OPENAI_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"gpt-5.5",quirks:{builtinWebSearch:!0,builtinCodeInterpreter:!0,builtinFileSearch:!0},models:[{id:"gpt-5.5",name:"GPT-5.5",contextWindow:105e4,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:30,costCacheRead:.5},{id:"gpt-5.4",name:"GPT-5.4",contextWindow:105e4,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:2.5,costOutput:15,costCacheRead:.25},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini",contextWindow:4e5,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:.75,costOutput:4.5,costCacheRead:.075},{id:"gpt-5.4-nano",name:"GPT-5.4 Nano",contextWindow:4e5,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:.2,costOutput:1.25,costCacheRead:.02},{id:"gpt-image-2",name:"GPT Image 2",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img","inpainting"],sizes:["1024x1024","1536x1024","1024x1536","auto"],transparentBackground:!0}},{id:"gpt-realtime-2",name:"GPT Realtime 2",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!0,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}},{id:"gpt-realtime-translate",name:"GPT Realtime Translate",contextWindow:128e3,maxOutput:16e3,toolCall:!1,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!1}},{id:"gpt-realtime-1.5",name:"GPT Realtime 1.5",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}},{id:"gpt-realtime-mini",name:"GPT Realtime Mini",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}}]},{id:"anthropic",name:"Anthropic",transport:"anthropic-messages",baseUrl:"https://api.anthropic.com",apiKeyEnvVars:["ANTHROPIC_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"claude-opus-4-7",models:[{id:"claude-opus-4-7",name:"Claude Opus 4.7",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5,costCacheWrite:6.25},{id:"claude-opus-4-6",name:"Claude Opus 4.6",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5,costCacheWrite:6.25},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",contextWindow:1e6,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:3,costOutput:15,costCacheRead:.3,costCacheWrite:3.75},{id:"claude-sonnet-4-5",name:"Claude Sonnet 4.5",contextWindow:2e5,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:3,costOutput:15,costCacheRead:.3,costCacheWrite:3.75},{id:"claude-haiku-4-5",name:"Claude Haiku 4.5",contextWindow:2e5,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:5,costCacheRead:.1,costCacheWrite:1.25}]},{id:"google",name:"Google Gemini",transport:"gemini-generatecontent",baseUrl:"https://generativelanguage.googleapis.com/v1beta",apiKeyEnvVars:["GOOGLE_API_KEY","GEMINI_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"gemini-3-flash-preview",quirks:{builtinWebSearch:!0,builtinCodeInterpreter:!0,builtinUrlContext:!0,builtinMapsGrounding:!0,builtinFileSearch:!0},models:[{id:"gemini-3.1-pro-preview",name:"Gemini 3.1 Pro",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,reasoningRequired:!0,vision:!0,costInput:2,costOutput:12},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:3},{id:"gemini-3.1-flash-lite",name:"Gemini 3.1 Flash-Lite",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.25,costOutput:1.5},{id:"gemini-3.1-flash-image-preview",name:"Gemini 3.1 Flash Image (Nano Banana 2)",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["1024x1024"]}},{id:"gemini-3-pro-image-preview",name:"Gemini 3 Pro Image (Nano Banana Pro)",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["1024x1024"]}},{id:"veo-3.1-generate-preview",name:"Veo 3.1 Standard",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P","4K"]}},{id:"veo-3.1-fast-generate-preview",name:"Veo 3.1 Fast",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P","4K"]}},{id:"veo-3.1-lite-generate-preview",name:"Veo 3.1 Lite",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P"]}},{id:"lyria-3-pro-preview",name:"Lyria 3 Pro",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:300,formats:["mp3"]}},{id:"lyria-3-clip-preview",name:"Lyria 3 Clip",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:30,formats:["mp3"]}},{id:"lyria-realtime-exp",name:"Lyria RealTime (Experimental)",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music_realtime",mediaCapabilities:{type:"music",operations:["realtime"],formats:["wav"]}},{id:"gemini-3.1-flash-tts-preview",name:"Gemini 3.1 Flash TTS",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:1,costOutput:20,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech"],maxCharacters:8e3,formats:["mp3","wav"]}},{id:"gemini-embedding-2",name:"Gemini Embedding 2 (Multimodal)",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:.2,costOutput:0,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:3072,maxTokens:8192}}]},{id:"openrouter",name:"OpenRouter",transport:"openai-chat",baseUrl:"https://openrouter.ai/api",apiKeyEnvVars:["OPENROUTER_API_KEY"],authType:"bearer",isAggregator:!0,defaultModel:"anthropic/claude-opus-4.7",extraHeaders:{"HTTP-Referer":"https://claw.bot","X-Title":"XiaozhiClaw"},models:[{id:"anthropic/claude-opus-4.7",name:"Claude Opus 4.7 (via OpenRouter)",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5},{id:"anthropic/claude-opus-4.6",name:"Claude Opus 4.6 (via OpenRouter)",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5},{id:"deepseek/deepseek-v4-flash",name:"DeepSeek V4 Flash (via OpenRouter)",contextWindow:1048576,maxOutput:393216,toolCall:!0,reasoning:!0,vision:!1,costInput:.14,costOutput:.28,costCacheRead:.028}]},{id:"qwen-coding",name:"Alibaba Qwen (Coding Plan)",transport:"anthropic-messages",baseUrl:"https://coding.dashscope.aliyuncs.com/apps/anthropic",apiKeyEnvVars:["DASHSCOPE_API_KEY","QWEN_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"qwen3-coder-plus",models:[{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus (Coding Plan)",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!1},{id:"qwen3-coder-flash",name:"Qwen3 Coder Flash (Coding Plan)",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!1}]}];import{existsSync as dm,mkdirSync as pm,readFileSync as mm,writeFileSync as gm}from"node:fs";import{join as fm}from"node:path";var hm="https://models.dev/api.json",ym=3e4,bm=1440*60*1e3,km=300*1e3,Tm={deepseek:"deepseek",qwen:"qwen","qwen-coding-plan":"qwen-coding","alibaba-cn":"qwen",zhipuai:"zhipu",minimax:"minimax",moonshot:"moonshot",moonshotai:"moonshot",doubao:"volcengine","bytedance-seed":"volcengine",volcengine:"volcengine",openai:"openai",anthropic:"anthropic",google:"google",openrouter:"openrouter"},Ut=class{cache=null;cacheDir;cacheFile;ttlMs;fetching=!1;lastFetchAttempt=0;constructor(e){this.cacheDir=e?.cacheDir??Re(),this.cacheFile=fm(this.cacheDir,"model_catalog.json"),this.ttlMs=e?.ttlMs??bm}getModels(e){this.ensureLoaded();let t=this.cache?.providers.get(e);return t?[...t.models.values()]:[]}getModel(e,t){return this.ensureLoaded(),this.cache?.providers.get(e)?.models.get(t)}listProviderIds(){return this.ensureLoaded(),this.cache?[...this.cache.providers.keys()]:[]}async refreshCatalog(){return this.fetchRemote()}ensureLoaded(){this.cache&&!this.isStale()||(this.cache||this.loadFromDisk(),(!this.cache||this.isStale())&&this.backgroundFetch())}isStale(){return this.cache?Date.now()-this.cache.fetchedAt>this.ttlMs:!0}loadFromDisk(){try{if(!dm(this.cacheFile))return;let e=mm(this.cacheFile,"utf8"),t=JSON.parse(e);if(!t.fetchedAt||!t.data)return;this.cache={fetchedAt:t.fetchedAt,providers:ma(t.data)}}catch{}}saveToDisk(e){try{pm(this.cacheDir,{recursive:!0});let t=JSON.stringify({fetchedAt:Date.now(),data:e},null,0);gm(this.cacheFile,t,"utf8")}catch{}}backgroundFetch(){this.fetching||Date.now()-this.lastFetchAttempt<km||(this.fetching=!0,this.fetchRemote().finally(()=>{this.fetching=!1}))}async fetchRemote(){this.lastFetchAttempt=Date.now();try{let e=await fetch(hm,{signal:AbortSignal.timeout(ym),headers:{Accept:"application/json"}});if(!e.ok)return!1;let t=await e.json(),n=ma(t);return n.size===0?!1:(this.cache={fetchedAt:Date.now(),providers:n},this.saveToDisk(t),!0)}catch{return!1}}};function ma(r){let e=new Map;if(!r||typeof r!="object")return e;for(let[t,n]of Object.entries(r)){let o=Tm[t];if(!o||!n||typeof n!="object")continue;let i=n.models;if(!i||typeof i!="object")continue;let a=e.get(o);a||(a={models:new Map},e.set(o,a));for(let[l,u]of Object.entries(i)){if(!u||typeof u!="object"||a.models.has(l))continue;let c=u,d=c.cost??{},p=c.limit??{},m=c.modalities??{},g=Array.isArray(m.input)?m.input:[],f=Array.isArray(m.output)?m.output:[],b=wm(f,g,l);a.models.set(l,{id:l,name:typeof c.name=="string"?c.name:l,contextWindow:typeof p.context=="number"?p.context:2e5,maxOutput:typeof p.output=="number"?p.output:8192,toolCall:c.tool_call===!0,reasoning:c.reasoning===!0,vision:c.attachment===!0||g.includes("image"),costInput:typeof d.input=="number"?d.input:void 0,costOutput:typeof d.output=="number"?d.output:void 0,costCacheRead:typeof d.cache_read=="number"?d.cache_read:void 0,costCacheWrite:typeof d.cache_write=="number"?d.cache_write:void 0,mediaType:b})}}return e}function wm(r,e,t){if(r.includes("video"))return"video";if(r.includes("image")&&!r.includes("text"))return"image";if(r.includes("audio")&&!r.includes("text"))return"tts";if(r.includes("3d"))return"3d";let n=t.toLowerCase();if(n.includes("tts")||n.includes("speech")||n.includes("cosyvoice"))return"tts";if(n.includes("music")||n.includes("suno"))return"music";if(n.includes("seedream")||n.includes("image")||n.includes("dall"))return"image";if(n.includes("seedance")||n.includes("video"))return"video"}var vm={claude:"anthropic",gemini:"google",doubao:"volcengine"},mt=class{builtins=new Map;catalog;overrides=new Map;constructor(e){for(let t of gr)this.builtins.set(t.id,t);this.catalog=e?.catalog??new Ut}applyOverride(e,t){this.overrides.set(e,{...this.overrides.get(e),...t})}getProvider(e){let t=vm[e]??e,n=this.builtins.get(t),o=this.overrides.get(t);if(!(!n&&!o))return!n&&o?!o.id||!o.transport||!o.baseUrl?void 0:{id:o.id,name:o.name??o.id,transport:o.transport,baseUrl:o.baseUrl,apiKeyEnvVars:o.apiKeyEnvVars??[],authType:o.authType??"bearer",isAggregator:o.isAggregator??!1,defaultModel:o.defaultModel,models:o.models}:n&&!o?n:{...n,...o,models:o.models??n.models}}listProviders(){let e=new Map;for(let[t,n]of this.builtins)e.set(t,n);for(let[t]of this.overrides){let n=this.getProvider(t);n&&e.set(t,n)}return[...e.values()]}listModels(e){let n=this.getProvider(e)?.models??[],o=this.catalog.getModels(e);if(o.length===0)return n;let s=new Map;for(let i of o)s.set(i.id,i);for(let i of n)s.set(i.id,i);return[...s.values()]}getModelInfo(e,t){return this.listModels(e).find(n=>n.id===t)}async refreshCatalog(){return this.catalog.refreshCatalog()}resolveApiKey(e,t){if(t)return t;let n=this.getProvider(e);if(n)for(let o of n.apiKeyEnvVars){let s=process.env[o];if(s?.trim())return s.trim()}}};var fr=new Set([429,529,502,503,504]),Ae=9e4;function Me(r){let e=Math.min(1e3*Math.pow(2,r-1),3e4),t=Math.random()*.25*e;return e+t}function Le(r){return r!=null&&fr.has(r)}function Pe(r,e){return new Promise((t,n)=>{if(e?.aborted){n(new Error("Request aborted"));return}let o=setTimeout(t,r);e&&e.addEventListener("abort",()=>{clearTimeout(o),n(new Error("Request aborted"))},{once:!0})})}function $e(r){if(r&&typeof r=="object"){let e=r;if(typeof e.status=="number")return e.status;if(typeof e.statusCode=="number")return e.statusCode;if(e.response&&typeof e.response.status=="number")return e.response.status}return null}function Sn(r){return r.toLowerCase().startsWith("gpt-5")}function _n(r){return r.toLowerCase().includes("5.4-nano")}function Nt(r){return/^o[1-4](-|$)/.test(r.toLowerCase())}var gt=class{baseUrl;extraHeaders;timeoutMs;supportsStreamOptions;omitZeroTemperature;quirks;cumulativeReasoningLen=0;cumulativeContentLen=0;constructor(e){if(!e.baseUrl)throw new Error("OpenAIChatTransport: baseUrl is required (got empty or undefined)");this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.extraHeaders=e.extraHeaders??{},this.timeoutMs=e.timeoutMs??18e4,this.supportsStreamOptions=e.supportsStreamOptions??!0,this.omitZeroTemperature=e.omitZeroTemperature??!1,this.quirks=e.quirks??{}}async*stream(e,t,n){this.cumulativeReasoningLen=0,this.cumulativeContentLen=0;let o=e.prefixMessage&&this.quirks.supportsPrefixCompletion,s=/\/v\d+$/.test(this.baseUrl),i;o?i=`${this.baseUrl}/beta/v1/chat/completions`:s?i=`${this.baseUrl}/chat/completions`:i=`${this.baseUrl}/v1/chat/completions`;let a={model:e.model,messages:Sm(e.messages,this.quirks),stream:!0};this.supportsStreamOptions&&(a.stream_options={include_usage:!0}),e.tools&&e.tools.length>0&&(a.tools=e.tools,e.toolChoice&&(a.tool_choice=e.toolChoice));let l=!e.disableBuiltinTools,u=!1;if(l&&this.quirks.builtinWebSearch&&a.tools){let f=a.tools;this.quirks.builtinCodeInterpreter?f.push({type:"web_search",web_search:{enable:!0,search_result:!0}}):(f.push({type:"builtin_function",function:{name:"$web_search"}}),u=!0)}l&&this.quirks.builtinCodeInterpreter&&a.tools&&a.tools.push({type:"code_interpreter",code_interpreter:{sandbox:"none"}}),this.quirks.supportsToolStream&&a.tools&&(a.tool_stream=!0);let c=this.quirks.useEffortInsteadOfBudget&&!!e.reasoning,d=e.model.startsWith("kimi-k2.6"),p=Sn(e.model);if(e.temperature!==void 0&&(this.omitZeroTemperature&&e.temperature===0||(p||!Nt(e.model)&&!c&&!d)&&(a.temperature=e.temperature)),e.topP!==void 0&&(p||!Nt(e.model)&&!c&&!d)&&(a.top_p=e.topP),e.maxTokens!==void 0&&(p||Nt(e.model)||e.model.startsWith("kimi-k2")?a.max_completion_tokens=e.maxTokens:a.max_tokens=e.maxTokens),e.reasoning)if(p){let f=e.reasoning.effort==="minimal"?"none":e.reasoning.effort;_n(e.model)&&(f==="high"||f==="xhigh")&&(f="medium"),a.reasoning={effort:f}}else if(Nt(e.model))a.reasoning_effort=e.reasoning.effort;else if(this.quirks.useEffortInsteadOfBudget){a.thinking={type:"enabled"};let f=this.quirks.maxReasoningEffort??"high",b=e.reasoning.effort??"high";a.reasoning_effort=b==="low"||b==="medium"?"high":f}else this.quirks.supportsThinkingParam?(u?a.thinking={type:"disabled"}:this.quirks.supportsToolStream?a.thinking={type:"enabled",clear_thinking:!1}:a.thinking={type:"enabled"},this.quirks.supportsReasoningEffort&&(a.reasoning_effort=e.reasoning.effort)):this.quirks.supportsReasoningEffort?a.reasoning_effort=e.reasoning.effort:a.reasoning=e.reasoning;else u&&(a.thinking={type:"disabled"});e.structuredOutput&&(e.structuredOutput.mode==="json_object"?a.response_format={type:"json_object"}:e.structuredOutput.mode==="json_schema"&&(a.response_format={type:"json_schema",json_schema:{name:e.structuredOutput.name,strict:e.structuredOutput.strict??!0,schema:e.structuredOutput.schema}})),this.quirks.supportsReasoningSplit&&e.reasoning&&(a.reasoning_split=!0),e.prediction&&p&&(a.prediction=e.prediction),o&&e.prefixMessage&&a.messages.push({role:"assistant",content:e.prefixMessage,prefix:!0});let m={"Content-Type":"application/json",Authorization:`Bearer ${t}`,...this.extraHeaders},g=null;for(let f=0;f<=3;f++){if(n?.aborted)throw new Error("Request aborted");f>0&&g&&await Pe(Me(f),n);try{yield*this.fetchAndStream(i,m,a,n);return}catch(b){g=b instanceof Error?b:new Error(String(b));let T=g.message.includes("Stream idle timeout");if(!Le($e(g))&&!T||f===3)throw g}}}async*fetchAndStream(e,t,n,o){let s=AbortSignal.timeout(this.timeoutMs),i=o?AbortSignal.any([o,s]):s,a=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(n),signal:i});if(!a.ok){let u=await a.text().catch(()=>""),c=new Error(`LLM API error ${a.status}: ${u.slice(0,500)}`);throw c.status=a.status,c}if(!a.body)throw new Error("LLM API returned no response body");let l=a.headers.get("content-type")??"";if(l.includes("application/json")&&!l.includes("text/event-stream")){yield*this.handleNonStreamingResponse(a);return}yield*this.parseSSEStreamWithWatchdog(a.body)}async*handleNonStreamingResponse(e){let t=await e.json();t.usage&&(yield{type:"usage",promptTokens:t.usage.prompt_tokens??0,completionTokens:t.usage.completion_tokens??0,reasoningTokens:t.usage.completion_tokens_details?.reasoning_tokens,cacheReadTokens:t.usage.prompt_tokens_details?.cached_tokens});for(let n of t.choices??[]){let o=n.message;if(o){if(o.reasoning_content&&(yield{type:"reasoning_delta",text:o.reasoning_content}),o.content&&(yield{type:"delta",text:o.content}),o.tool_calls)for(let s=0;s<o.tool_calls.length;s++){let i=o.tool_calls[s];yield{type:"tool_call_delta",index:s,id:i.id,name:i.function.name,arguments:i.function.arguments}}n.finish_reason&&(yield{type:"done",finishReason:n.finish_reason})}}}async*parseSSEStreamWithWatchdog(e){let t=new TextDecoder,n="",o=null,s=new AbortController,i=()=>{o&&clearTimeout(o),o=setTimeout(()=>{s.abort()},Ae)};try{i();let a=e.getReader();try{for(;;){let{done:l,value:u}=await a.read();if(l)break;if(s.signal.aborted)throw new Error("Stream idle timeout");i(),n+=t.decode(u,{stream:!0});let c;for(;(c=n.indexOf(`
32
- `))!==-1;){let d=n.slice(0,c).trim();if(n=n.slice(c+1),!d||d.startsWith(":")||!d.startsWith("data: "))continue;let p=d.slice(6);if(p==="[DONE]")return;let m;try{m=JSON.parse(p)}catch{continue}yield*this.processChunk(m)}}}finally{a.releaseLock()}}finally{o&&clearTimeout(o)}}*processChunk(e){if(e.usage&&(yield{type:"usage",promptTokens:e.usage.prompt_tokens??0,completionTokens:e.usage.completion_tokens??0,reasoningTokens:e.usage.completion_tokens_details?.reasoning_tokens,cacheReadTokens:e.usage.prompt_tokens_details?.cached_tokens}),!(!e.choices||e.choices.length===0))for(let t of e.choices){let n=t.delta;if(n){if(n.reasoning_content&&(yield{type:"reasoning_delta",text:n.reasoning_content}),n.reasoning_details){let o=n.reasoning_details.slice(this.cumulativeReasoningLen);o&&(this.cumulativeReasoningLen=n.reasoning_details.length,yield{type:"reasoning_delta",text:o})}if(n.content)if(this.quirks.supportsReasoningSplit){let o=n.content.slice(this.cumulativeContentLen);o&&(this.cumulativeContentLen=n.content.length,yield{type:"delta",text:o})}else yield{type:"delta",text:n.content};if(n.tool_calls)for(let o of n.tool_calls)yield{type:"tool_call_delta",index:o.index,id:o.id,name:o.function?.name,arguments:o.function?.arguments??""};t.finish_reason&&(yield{type:"done",finishReason:xm(t.finish_reason)})}}}async*complete(e,t,n){if(!this.quirks.supportsPrefixCompletion)throw new Error("FIM completion is not supported by this provider");let s=/\/v\d+$/.test(this.baseUrl)?`${this.baseUrl}/beta/completions`:`${this.baseUrl}/beta/v1/completions`,i={model:e.model,prompt:e.prompt,stream:!0,max_tokens:e.maxTokens??4096};e.suffix&&(i.suffix=e.suffix),e.temperature!==void 0&&(i.temperature=e.temperature),e.stop&&(i.stop=e.stop);let a={"Content-Type":"application/json",Authorization:`Bearer ${t}`,...this.extraHeaders},l=AbortSignal.timeout(this.timeoutMs),u=n?AbortSignal.any([n,l]):l,c=await fetch(s,{method:"POST",headers:a,body:JSON.stringify(i),signal:u});if(!c.ok){let g=await c.text().catch(()=>"");throw new Error(`FIM API error ${c.status}: ${g.slice(0,500)}`)}if(!c.body)throw new Error("FIM API returned no response body");let d=new TextDecoder,p="",m=c.body.getReader();try{for(;;){let{done:g,value:f}=await m.read();if(g)break;p+=d.decode(f,{stream:!0});let b;for(;(b=p.indexOf(`
33
- `))!==-1;){let T=p.slice(0,b).trim();if(p=p.slice(b+1),!T||T.startsWith(":")||!T.startsWith("data: "))continue;let w=T.slice(6);if(w==="[DONE]")return;let _;try{_=JSON.parse(w)}catch{continue}for(let y of _.choices??[])y.text&&(yield{type:"delta",text:y.text}),y.finish_reason&&(yield{type:"done",finishReason:y.finish_reason})}}}finally{m.releaseLock()}}async uploadFile(e,t,n,o,s){let a=/\/v\d+$/.test(this.baseUrl)?`${this.baseUrl}/files`:`${this.baseUrl}/v1/files`,l=new FormData;l.append("file",e,t),l.append("purpose",n);let u=await fetch(a,{method:"POST",headers:{Authorization:`Bearer ${o}`,...this.extraHeaders},body:l,signal:s??AbortSignal.timeout(this.timeoutMs)});if(!u.ok){let d=await u.text().catch(()=>"");throw new Error(`File upload error ${u.status}: ${d}`)}let c=await u.json();return{fileId:c.id??"",filename:c.filename??t,bytes:c.bytes??0}}async getFileInfo(e,t,n){let s=/\/v\d+$/.test(this.baseUrl)?`${this.baseUrl}/files/${encodeURIComponent(e)}`:`${this.baseUrl}/v1/files/${encodeURIComponent(e)}`,i=await fetch(s,{method:"GET",headers:{Authorization:`Bearer ${t}`,...this.extraHeaders},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!i.ok){let l=await i.text().catch(()=>"");throw new Error(`File info error ${i.status}: ${l}`)}let a=await i.json();return{id:a.id??e,filename:a.filename??"",bytes:a.bytes??0,status:a.status??"unknown"}}};function xm(r){switch(r){case"sensitive":return"content_filter";case"model_context_window_exceeded":return"length";case"network_error":return"error";default:return r}}function Sm(r,e){return r.map(t=>{if(t.role==="user"){let n=t.imageUrls&&t.imageUrls.length>0&&!e.filterImageBlocks,o=t.videoUrls&&t.videoUrls.length>0,s=t.audioUrls&&t.audioUrls.length>0,i=t.fileIds&&t.fileIds.length>0;if(n||o||s||i){let l=[];if(t.content&&l.push({type:"text",text:t.content}),n)for(let u of t.imageUrls){let c={url:u};t.imageDetail&&(c.detail=t.imageDetail),l.push({type:"image_url",image_url:c})}if(o)for(let u of t.videoUrls)l.push({type:"video_url",video_url:{url:u}});if(s)for(let u of t.audioUrls)l.push({type:"input_audio",input_audio:{data:u,format:t.audioFormat??"mp3"}});if(i)for(let u of t.fileIds)l.push({type:"file",file:{file_id:u.id}});return{role:"user",content:l}}return{role:"user",content:t.content??""}}if(t.role==="assistant"){let n={role:"assistant"};return t.thinkingBlocks&&t.thinkingBlocks.length>0&&(n.reasoning_content=t.thinkingBlocks.map(o=>o.thinking).join("")),n.content=t.content??null,t.tool_calls&&t.tool_calls.length>0&&(n.tool_calls=t.tool_calls.map(o=>({id:o.id,type:o.type,function:{name:o.function.name,arguments:o.function.arguments}}))),n}return t.role==="tool"?{role:"tool",content:t.content??"",tool_call_id:t.tool_call_id??""}:{role:t.role,content:t.content??""}})}var Rn=class{baseUrl;extraHeaders;timeoutMs;quirks;constructor(e){if(!e.baseUrl)throw new Error("OpenAIResponsesTransport: baseUrl is required");this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.extraHeaders=e.extraHeaders??{},this.timeoutMs=e.timeoutMs??18e4,this.quirks=e.quirks??{}}async*stream(e,t,n){let s=/\/v\d+$/.test(this.baseUrl)?`${this.baseUrl}/responses`:`${this.baseUrl}/v1/responses`,i=this.buildRequestBody(e),a={"Content-Type":"application/json",Authorization:`Bearer ${t}`,...this.extraHeaders},l=null;for(let u=0;u<=3;u++){if(n?.aborted)throw new Error("Request aborted");u>0&&l&&await Pe(Me(u),n);try{yield*this.fetchAndStream(s,a,i,n);return}catch(c){l=c instanceof Error?c:new Error(String(c));let d=l.message.includes("Stream idle timeout");if(!Le($e(l))&&!d||u===3)throw l}}}buildRequestBody(e){let t={model:e.model,input:_m(e.messages),stream:!0};if(e.conversationId?t.conversation=e.conversationId:e.previousResponseId&&(t.previous_response_id=e.previousResponseId),e.store!==void 0&&(t.store=e.store),e.instructions&&(t.instructions=e.instructions),e.structuredOutput&&(e.structuredOutput.mode==="json_object"?t.text={format:{type:"json_object"}}:t.text={format:{type:"json_schema",name:e.structuredOutput.name,strict:e.structuredOutput.strict??!0,schema:e.structuredOutput.schema}}),e.tools&&e.tools.length>0&&(t.tools=e.tools.map(n=>({type:"function",name:n.function.name,description:n.function.description,parameters:n.function.parameters,strict:!0}))),e.toolChoice!==void 0&&(typeof e.toolChoice=="string"?t.tool_choice=e.toolChoice:t.tool_choice={type:e.toolChoice.type,name:e.toolChoice.name}),e.temperature!==void 0&&(t.temperature=e.temperature),e.topP!==void 0&&(t.top_p=e.topP),e.maxTokens!==void 0&&(t.max_output_tokens=e.maxTokens),e.reasoning){let n=e.reasoning.effort==="minimal"?"none":e.reasoning.effort;_n(e.model)&&(n==="high"||n==="xhigh")&&(n="medium");let o={effort:n};o.summary="auto",o.generate_summary="auto",t.reasoning=o}if(e.prediction&&Sn(e.model)&&(t.prediction=e.prediction),t.truncation="auto",e.promptCacheKey&&(t.prompt_cache_key=e.promptCacheKey),e.promptCacheRetention&&(t.prompt_cache_retention=e.promptCacheRetention),e.serviceTier&&(t.service_tier=e.serviceTier),e.reasoning?.includeEncryptedReasoning&&(e.store===void 0&&(t.store=!1),t.include=["reasoning.encrypted_content"]),e.contextManagement&&(t.context_management=e.contextManagement.edits.map(n=>{let o={type:n.type};return n.type==="clear_thinking"&&n.keep!==void 0?o.keep=n.keep:n.type==="clear_tool_uses"&&(n.trigger&&(o.trigger=n.trigger),n.keep&&(o.keep=n.keep),n.excludeTools&&(o.exclude_tools=n.excludeTools),n.clearToolInput!==void 0&&(o.clear_tool_input=n.clearToolInput)),o})),!e.disableBuiltinTools){let n=t.tools??[],o=t.include??[];if(e.openaiBuiltinTools&&e.openaiBuiltinTools.length>0){for(let i of e.openaiBuiltinTools)n.push({...i});let s=new Set(e.openaiBuiltinTools.map(i=>i.type));s.has("web_search_preview")&&o.push("web_search_call.action.sources"),s.has("file_search")&&o.push("file_search_call.results"),s.has("code_interpreter")&&o.push("code_interpreter_call.outputs"),s.has("computer_use_preview")&&o.push("computer_call_output.output.image_url")}else this.quirks.builtinWebSearch&&(n.push({type:"web_search_preview"}),o.push("web_search_call.action.sources")),this.quirks.builtinCodeInterpreter&&(n.push({type:"code_interpreter"}),o.push("code_interpreter_call.outputs")),this.quirks.builtinFileSearch&&(n.push({type:"file_search"}),o.push("file_search_call.results"));n.length>0&&(t.tools=n),o.length>0&&(t.include=o)}if(e.maxToolCalls!==void 0&&(t.max_tool_calls=e.maxToolCalls),e.parallelToolCalls!==void 0&&(t.parallel_tool_calls=e.parallelToolCalls),e.textVerbosity){let n=t.text??{};n.verbosity=e.textVerbosity,t.text=n}return t}async*fetchAndStream(e,t,n,o){let s=AbortSignal.timeout(this.timeoutMs),i=o?AbortSignal.any([o,s]):s,a=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(n),signal:i});if(!a.ok){let u=await a.text().catch(()=>""),c=new Error(`OpenAI Responses API error ${a.status}: ${u.slice(0,500)}`);throw c.status=a.status,c}if(!a.body)throw new Error("OpenAI Responses API returned no response body");let l=a.headers.get("content-type")??"";if(l.includes("application/json")&&!l.includes("text/event-stream")){yield*this.handleNonStreamingResponse(a);return}yield*this.parseSSEStream(a.body)}async*handleNonStreamingResponse(e){let t=await e.json();if(t.id&&(yield{type:"response_id",id:t.id}),t.usage&&(yield{type:"usage",promptTokens:t.usage.input_tokens??0,completionTokens:t.usage.output_tokens??0,reasoningTokens:t.usage.output_tokens_details?.reasoning_tokens,cacheReadTokens:t.usage.input_tokens_details?.cached_tokens}),t.output)for(let n of t.output){if(n.type==="message"&&n.content)for(let o of n.content)o.type==="output_text"&&(yield{type:"delta",text:o.text??""},o.annotations&&o.annotations.length>0&&(yield{type:"annotations",annotations:o.annotations.map(s=>({...s,type:s.type??"url_citation",url:s.url,title:s.title}))}));if(n.type==="reasoning"&&n.summary)for(let o of n.summary)o.type==="summary_text"&&(yield{type:"reasoning_delta",text:o.text??""});n.type==="function_call"&&(yield{type:"tool_call_delta",index:0,id:n.call_id,name:n.name,arguments:n.arguments??""})}yield{type:"done",finishReason:t.status==="completed"?"stop":t.status??"stop"}}async*parseSSEStream(e){let t=new TextDecoder,n="",o="",s=null,i=new AbortController,a=0,l=new Map,u=()=>{s&&clearTimeout(s),s=setTimeout(()=>{i.abort()},Ae)};try{u();let c=e.getReader();try{for(;;){let{done:d,value:p}=await c.read();if(d)break;if(i.signal.aborted)throw new Error("Stream idle timeout");u(),n+=t.decode(p,{stream:!0});let m;for(;(m=n.indexOf(`
34
- `))!==-1;){let g=n.slice(0,m).trim();if(n=n.slice(m+1),!g){o="";continue}if(!g.startsWith(":")){if(g.startsWith("event:")){o=g.slice(6).trim();continue}if(g.startsWith("data:")){let f=g.slice(5).trim();if(f==="[DONE]")return;let b;try{b=JSON.parse(f)}catch{continue}yield*this.processEvent(o,b,l,()=>a++)}}}}}finally{c.releaseLock()}}finally{s&&clearTimeout(s)}}*processEvent(e,t,n,o){switch(e){case"response.output_text.delta":{let s=t.delta;s&&(yield{type:"delta",text:s});break}case"response.reasoning_summary_text.delta":{let s=t.delta;s&&(yield{type:"reasoning_delta",text:s});break}case"response.function_call_arguments.delta":{let s=t.delta,i=t.call_id,a=t.name;if(s!==void 0&&i){let l=n.get(i);l===void 0&&(l=o(),n.set(i,l)),yield{type:"tool_call_delta",index:l,id:i,name:a,arguments:s}}break}case"response.output_item.added":{let s=t.item;if(s&&s.type==="function_call"){let i=s.call_id,a=s.name;if(i&&!n.has(i)){let l=o();n.set(i,l),yield{type:"tool_call_delta",index:l,id:i,name:a,arguments:""}}}break}case"response.function_call_arguments.done":break;case"response.content_part.done":{let s=t.part;if(s?.type==="output_text"){let i=s.annotations;i&&i.length>0&&(yield{type:"annotations",annotations:i.map(a=>({type:a.type??"url_citation",url:a.url,title:a.title,...a}))})}break}case"response.output_item.done":{let s=t.item;if(s?.type==="message"){let i=s.content;if(i)for(let a of i){let l=a.annotations;l&&l.length>0&&(yield{type:"annotations",annotations:l.map(u=>({type:u.type??"url_citation",url:u.url,title:u.title,...u}))})}}break}case"response.completed":{let s=t.response;if(s){let i=s.id;i&&(yield{type:"response_id",id:i});let a=s.usage;if(a){let u=a.input_tokens_details,c=a.output_tokens_details;yield{type:"usage",promptTokens:a.input_tokens??0,completionTokens:a.output_tokens??0,reasoningTokens:c?.reasoning_tokens,cacheReadTokens:u?.cached_tokens}}yield{type:"done",finishReason:s.status==="incomplete"?"tool_calls":"stop"}}else yield{type:"done",finishReason:"stop"};break}case"response.failed":{yield{type:"error",message:t.response?.error?.message??"Unknown error"},yield{type:"done",finishReason:"error"};break}default:{e.startsWith("response.web_search_call")&&(yield{type:"builtin_tool_status",toolType:"web_search",event:e,data:t});break}}}};function _m(r){let e=[];for(let t of r){if(t.role==="system"){e.push({role:"developer",content:t.content??""});continue}if(t.role==="user"){let n=t.imageUrls&&t.imageUrls.length>0,o=t.videoUrls&&t.videoUrls.length>0,s=t.audioUrls&&t.audioUrls.length>0,i=t.fileIds&&t.fileIds.length>0;if(n||o||s||i){let l=[];if(n)for(let u of t.imageUrls){let c={type:"input_image",image_url:u};t.imageDetail&&(c.detail=t.imageDetail),l.push(c)}if(s)for(let u of t.audioUrls)l.push({type:"input_audio",data:u,format:t.audioFormat??"mp3"});if(i)for(let u of t.fileIds)l.push({type:"input_file",file_id:u.id});t.content&&l.push({type:"input_text",text:t.content}),e.push({role:"user",content:l})}else e.push({role:"user",content:t.content??""});continue}if(t.role==="assistant"){if(t.content&&e.push({role:"assistant",content:t.content}),t.tool_calls&&t.tool_calls.length>0)for(let n of t.tool_calls)e.push({type:"function_call",call_id:n.id,name:n.function.name,arguments:n.function.arguments});continue}if(t.role==="tool"){if(!t.tool_call_id)continue;e.push({type:"function_call_output",call_id:t.tool_call_id,output:t.content??""});continue}}return e}var Rm=18e4,Cm=3e5,Am=64e3,Mm="[Tool execution failed; output not available during conversation recovery]",Pm="interleaved-thinking-2025-05-14",Im="context-1m-2025-08-07",Em="token-efficient-tools-2026-03-28",Om="prompt-caching-scope-2026-01-05",Lm="pdfs-2024-09-25";function $m(r){let e=r.toLowerCase();return e.includes("opus-4-6")||e.includes("opus-4-7")||e.includes("sonnet-4-6")}function Dm(r,e,t){let n=[],o=r.toLowerCase();(o.includes("opus-4-6")||o.includes("opus-4-7")||o.includes("sonnet-4-6"))&&n.push(Im),n.push(Lm),e&&!o.includes("haiku")&&n.push(Pm),t&&n.push(Em),n.push(Om);let i=process.env.ANTHROPIC_BETAS;if(i)for(let a of i.split(",").map(l=>l.trim()).filter(Boolean))n.includes(a)||n.push(a);return n}var jt=class{baseUrl;apiVersion;timeoutMs;streamIdleTimeoutMs;enablePromptCaching;maxRetries;omitZeroTemperature;quirks;constructor(e){if(!e.baseUrl)throw new Error("AnthropicMessagesTransport: baseUrl is required (got empty or undefined)");this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.apiVersion=e.apiVersion??"2023-06-01",this.timeoutMs=e.timeoutMs??Rm,this.streamIdleTimeoutMs=e.streamIdleTimeoutMs??Ae,this.enablePromptCaching=e.enablePromptCaching??!0,this.maxRetries=e.maxRetries??3,this.omitZeroTemperature=e.omitZeroTemperature??!1,this.quirks=e.quirks??{}}async*stream(e,t,n){let o=`${this.baseUrl}/v1/messages`,s=Fm(e.messages),{system:i,messages:a}=Bm(s,this.quirks,e.model),l=jm(i,this.enablePromptCaching),u=!!e.reasoning,c=e.maxTokens??8192,d={model:e.model,messages:a,max_tokens:c,stream:!0};if(l&&(d.system=l),e.tools&&e.tools.length>0){let f=e.tools.map(Wm);this.enablePromptCaching&&f.length>0&&(f[f.length-1].cache_control={type:"ephemeral"}),d.tools=f,e.toolChoice&&(d.tool_choice=e.toolChoice==="auto"?{type:"auto"}:e.toolChoice==="required"?{type:"any"}:{type:"none"})}if(!u&&e.temperature!==void 0&&(this.omitZeroTemperature&&e.temperature===0||(d.temperature=e.temperature)),!u&&e.topP!==void 0&&(d.top_p=e.topP),u)if(this.quirks.useEffortInsteadOfBudget){d.thinking={type:"enabled"};let f=this.quirks.maxReasoningEffort??"high",b=e.reasoning?.effort??"high",T=b==="low"||b==="medium"?"high":f;if(d.output_config={effort:T},i){let w=2166136261;for(let _=0;_<i.length;_++)w^=i.charCodeAt(_),w=Math.imul(w,16777619);d.metadata={user_id:`qa-${(w>>>0).toString(36)}`}}}else if($m(e.model))d.thinking={type:"adaptive"};else{let f=Nm(e.reasoning.effort,e.maxTokens);d.thinking={type:"enabled",budget_tokens:Math.min(c-1,f)}}let p=Dm(e.model,u,(e.tools?.length??0)>0),m={"Content-Type":"application/json","x-api-key":t,"anthropic-version":this.apiVersion};p.length>0&&(m["anthropic-beta"]=p.join(","));let g=null;for(let f=0;f<=this.maxRetries;f++){if(n?.aborted)throw new Error("Request aborted");f>0&&g&&await Pe(Me(f),n);try{yield*this.streamWithWatchdog(o,m,d,n);return}catch(b){g=b instanceof Error?b:new Error(String(b));let T=Gm(g.message),w=T!==null&&fr.has(T),_=g.message.includes("Stream idle timeout");if(g.message.includes("model_context_window_exceeded")||g.message.includes("context_length_exceeded")||!w&&!_)throw g;if(f===this.maxRetries){if((_||w)&&!e.streamRequired)try{yield*this.nonStreamingFallback(o,m,d,n);return}catch{throw g}throw g}}}if(g)throw g}async*streamWithWatchdog(e,t,n,o){let s=AbortSignal.timeout(this.timeoutMs),i=o?AbortSignal.any([o,s]):s,a=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(n),signal:i});if(!a.ok){let p=await a.text().catch(()=>""),m=new Error(`Anthropic API error ${a.status}: ${p.slice(0,500)}`);throw m.status=a.status,m}if(!a.body)throw new Error("Anthropic API returned no response body");let l=null,u=!1,c=()=>{l!==null&&clearTimeout(l),l=setTimeout(()=>{u=!0},this.streamIdleTimeoutMs)},d=()=>{l!==null&&(clearTimeout(l),l=null)};c();try{yield*this.parseSSEStream(a.body,c,()=>u)}finally{d()}if(u)throw new Error("Stream idle timeout - no chunks received")}async*nonStreamingFallback(e,t,n,o){let s=Hm({...n,stream:!1}),i=AbortSignal.timeout(Cm),a=o?AbortSignal.any([o,i]):i,l=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(s),signal:a});if(!l.ok){let c=await l.text().catch(()=>""),d=new Error(`Anthropic API error ${l.status}: ${c.slice(0,500)}`);throw d.status=l.status,d}let u=await l.json();yield*this.mapNonStreamingResponse(u)}*mapNonStreamingResponse(e){let t=e.usage;t&&(yield{type:"usage",promptTokens:t.input_tokens??0,completionTokens:t.output_tokens??0,cacheReadTokens:t.cache_read_input_tokens>0?t.cache_read_input_tokens:void 0,cacheCreationTokens:t.cache_creation_input_tokens>0?t.cache_creation_input_tokens:void 0,reasoningTokens:t.reasoning_input_tokens>0?t.reasoning_input_tokens:void 0});let n=e.content;if(Array.isArray(n)){let s=0;for(let i of n){let a=i.type;a==="text"?yield{type:"delta",text:i.text}:a==="thinking"?yield{type:"reasoning_delta",text:i.thinking}:a==="tool_use"&&(yield{type:"tool_call_delta",index:s++,id:i.id,name:i.name,arguments:JSON.stringify(i.input??{})})}}let o=e.stop_reason;o&&(yield{type:"done",finishReason:fa(o)})}async*parseSSEStream(e,t,n){let o=new TextDecoder,s="",i="",a=new Map,l={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheCreationTokens:0,reasoningTokens:0};for await(let u of e){if(t(),n())break;s+=o.decode(u,{stream:!0});let c;for(;(c=s.indexOf(`
35
- `))!==-1;){let d=s.slice(0,c).trim();if(s=s.slice(c+1),!d){i="";continue}if(d.startsWith("event:")){i=d.slice(6).trimStart();continue}if(!d.startsWith("data:"))continue;let p=d.slice(5).trimStart(),m;try{m=JSON.parse(p)}catch{continue}yield*this.mapEvent(i,m,a,l)}}}*mapEvent(e,t,n,o){switch(e){case"message_start":{let i=t.message?.usage;i&&(ga(o,i),yield{type:"usage",promptTokens:o.inputTokens,completionTokens:o.outputTokens,cacheReadTokens:o.cacheReadTokens>0?o.cacheReadTokens:void 0,cacheCreationTokens:o.cacheCreationTokens>0?o.cacheCreationTokens:void 0,reasoningTokens:o.reasoningTokens>0?o.reasoningTokens:void 0});break}case"content_block_start":{let s=t.index,i=t.content_block;if(!i)break;let a=i.type;n.set(s,{type:a,id:i.id,name:i.name,signature:a==="thinking"?"":void 0}),a==="tool_use"&&(yield{type:"tool_call_delta",index:s,id:i.id,name:i.name,arguments:""});break}case"content_block_delta":{let s=t.index,i=t.delta;if(!i)break;let a=i.type;if(a==="text_delta")yield{type:"delta",text:i.text};else if(a==="input_json_delta")yield{type:"tool_call_delta",index:s,arguments:i.partial_json};else if(a==="thinking_delta")yield{type:"reasoning_delta",text:i.thinking};else if(a==="signature_delta"){let l=n.get(s);l&&typeof i.signature=="string"&&(l.signature=i.signature)}break}case"content_block_stop":{let s=t.index,i=n.get(s);i?.type==="thinking"&&typeof i.signature=="string"&&(yield{type:"reasoning_block_complete",thinking:"",signature:i.signature}),n.delete(s);break}case"message_delta":{let s=t.delta,i=t.usage;i&&(ga(o,i),yield{type:"usage",promptTokens:o.inputTokens,completionTokens:o.outputTokens,cacheReadTokens:o.cacheReadTokens>0?o.cacheReadTokens:void 0,cacheCreationTokens:o.cacheCreationTokens>0?o.cacheCreationTokens:void 0,reasoningTokens:o.reasoningTokens>0?o.reasoningTokens:void 0}),s?.stop_reason&&(yield{type:"done",finishReason:fa(s.stop_reason)});break}case"message_stop":break;case"error":{let s=t.error;throw new Error(`Anthropic stream error: ${s?.message??JSON.stringify(t)}`)}}}};function ga(r,e){e.input_tokens>0&&(r.inputTokens=e.input_tokens),r.outputTokens=e.output_tokens??r.outputTokens,e.cache_read_input_tokens>0&&(r.cacheReadTokens=e.cache_read_input_tokens),e.cache_creation_input_tokens>0&&(r.cacheCreationTokens=e.cache_creation_input_tokens),e.reasoning_input_tokens>0&&(r.reasoningTokens=e.reasoning_input_tokens)}function fa(r){switch(r){case"end_turn":case"stop_sequence":return"stop";case"tool_use":return"tool_calls";case"max_tokens":return"length";default:return r}}function Um(r){return!/haiku/i.test(r)}var hr={high:16e3,medium:8e3,low:4e3};function Nm(r,e){if(e&&e>16384)switch(r){case"high":return Math.min(e-1,Math.max(16e3,Math.floor(e*.5)));case"medium":return Math.min(e-1,Math.max(8e3,Math.floor(e*.25)));case"low":return Math.min(e-1,4e3);default:return hr.high}return hr[r]??hr.high}function jm(r,e){if(r)return e?[{type:"text",text:r,cache_control:{type:"ephemeral"}}]:r}function Fm(r){let e=[],t=new Set;for(let n=0;n<r.length;n++){let o=r[n];if(o.role==="assistant"&&o.tool_calls&&o.tool_calls.length>0){let s=o.tool_calls.filter(c=>t.has(c.id)?!1:(t.add(c.id),!0)),i=new Set(s.map(c=>c.id)),a=new Set,l=r.slice(n+1);for(let c of l){if(c.role!=="tool")break;c.tool_call_id&&a.add(c.tool_call_id)}s.length!==o.tool_calls.length?e.push({...o,tool_calls:s}):e.push(o);let u=[...i].filter(c=>!a.has(c));for(let c of u){let d=s.find(p=>p.id===c);e.push({role:"tool",tool_call_id:c,name:d?.function.name,content:"[Tool execution failed; output not available during conversation recovery]"})}}else o.role==="tool"?t.has(o.tool_call_id??"")&&e.push(o):e.push(o)}return e}function Bm(r,e={},t){let n,o=[];for(let s of r){if(s.role==="system"){n=n?`${n}
36
-
37
- ${s.content??""}`:s.content??"";continue}if(s.role==="user")if(s.imageUrls&&s.imageUrls.length>0&&!e.filterImageBlocks){let a=[];s.content&&a.push({type:"text",text:s.content});for(let l of s.imageUrls)if(l.startsWith("data:")){let u=/^data:([^;]+);base64,(.+)$/.exec(l);if(u){let c=u[1];c==="application/pdf"?a.push({type:"document",source:{type:"base64",media_type:c,data:u[2]}}):a.push({type:"image",source:{type:"base64",media_type:c,data:u[2]}})}}else l.endsWith(".pdf")||l.includes(".pdf?")?a.push({type:"document",source:{type:"url",url:l}}):a.push({type:"image",source:{type:"url",url:l}});o.push({role:"user",content:a})}else o.push({role:"user",content:s.content??""});else if(s.role==="assistant"){let i=e.filterThinkingBlocks?void 0:s.thinkingBlocks;if(s.tool_calls&&s.tool_calls.length>0){let a=[];if(i)for(let l of i)l.signature&&a.push({type:"thinking",thinking:l.thinking,signature:l.signature});s.content&&a.push({type:"text",text:s.content});for(let l of s.tool_calls){let u;try{u=JSON.parse(l.function.arguments)}catch{u={}}a.push({type:"tool_use",id:l.id,name:l.function.name,input:u})}o.push({role:"assistant",content:a})}else if(i&&i.length>0){let a=[];for(let l of i)l.signature&&a.push({type:"thinking",thinking:l.thinking,signature:l.signature});s.content&&a.push({type:"text",text:s.content}),o.push({role:"assistant",content:a})}else o.push({role:"assistant",content:s.content??""})}else if(s.role==="tool"){let i=s.content??"",a=i.startsWith("Error:")||i===Mm,l=s.toolReferences,c=l&&l.length>0&&!a&&(!t||Um(t))?l.map(m=>({type:"tool_reference",tool_name:m})):i,d={type:"tool_result",tool_use_id:s.tool_call_id??"",content:c,...a&&{is_error:!0}},p=o[o.length-1];p&&p.role==="user"&&Array.isArray(p.content)?p.content.push(d):o.push({role:"user",content:[d]})}}return{system:n,messages:o}}function Wm(r){return{name:r.function.name,description:r.function.description,input_schema:r.function.parameters??{type:"object",properties:{}}}}function Gm(r){let e=/Anthropic API error (\d{3})/.exec(r);return e?parseInt(e[1],10):null}function Hm(r){let e=typeof r.max_tokens=="number"?r.max_tokens:8192,t=Math.min(e,Am),n={...r,max_tokens:t},o=n.thinking;return o?.type==="enabled"&&o.budget_tokens&&(n.thinking={...o,budget_tokens:Math.min(o.budget_tokens,t-1)}),n}var Cn=class{baseUrl;extraHeaders;timeoutMs;quirks;constructor(e){if(!e.baseUrl)throw new Error("VolcengineResponsesTransport: baseUrl is required");this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.extraHeaders=e.extraHeaders??{},this.timeoutMs=e.timeoutMs??18e4,this.quirks=e.quirks??{}}async*stream(e,t,n){let s=`${this.baseUrl.replace(/\/v\d+$/,"")}/v3/responses`,i=this.buildRequestBody(e),a={"Content-Type":"application/json",Authorization:`Bearer ${t}`,...this.extraHeaders};if(e.builtinTools&&!e.disableBuiltinTools&&e.builtinTools.length>0)for(let u of e.builtinTools)u.type==="builtin_web_search"?a["ark-beta-web-search"]="true":u.type==="builtin_image_process"?a["ark-beta-image-process"]="true":u.type==="builtin_knowledge_search"?a["ark-beta-knowledge-search"]="true":u.type==="builtin_doubao_app"&&(a["ark-beta-doubao-app"]="true");let l=null;for(let u=0;u<=3;u++){if(n?.aborted)throw new Error("Request aborted");u>0&&l&&await Pe(Me(u),n);try{yield*this.fetchAndStream(s,a,i,n);return}catch(c){l=c instanceof Error?c:new Error(String(c));let d=l.message.includes("Stream idle timeout");if(!Le($e(l))&&!d||u===3)throw l}}}resolveConstraints(e){let t=e;if(t.caching&&t.caching.type==="enabled"){if(t.instructions)return t={...t,caching:void 0},t;if(t.structuredOutput&&t.structuredOutput.mode==="json_schema"&&(t={...t,structuredOutput:{mode:"json_object"}}),t.builtinTools&&t.builtinTools.length>0){let o=t.builtinTools.filter(s=>s.type!=="builtin_web_search"&&s.type!=="builtin_image_process");o.length!==t.builtinTools.length&&(t={...t,builtinTools:o.length>0?o:void 0})}}return t}buildRequestBody(e){let t=this.resolveConstraints(e),n={model:t.model,input:Vm(t.messages),stream:!0};if(t.previousResponseId&&(n.previous_response_id=t.previousResponseId),t.store!==void 0&&(n.store=t.store),t.storeExpireAt!==void 0&&(n.expire_at=t.storeExpireAt),t.instructions&&(n.instructions=t.instructions),t.structuredOutput)if(t.structuredOutput.mode==="json_object")n.text={format:{type:"json_object"}};else{let s={type:"json_schema",name:t.structuredOutput.name,schema:t.structuredOutput.schema};t.structuredOutput.strict!==void 0&&(s.strict=t.structuredOutput.strict),n.text={format:s}}if(t.caching){let s={type:t.caching.type};t.caching.prefix!==void 0&&(s.prefix=t.caching.prefix),n.caching=s,t.caching.prefix&&(n.stream=!1)}if(t.contextManagement){let s=t.contextManagement.edits.map(i=>{let a={type:i.type};return i.type==="clear_thinking"&&i.keep!==void 0?a.keep=i.keep:i.type==="clear_tool_uses"&&(i.trigger&&(a.trigger=i.trigger),i.keep&&(a.keep=i.keep),i.excludeTools&&(a.exclude_tools=i.excludeTools),i.clearToolInput!==void 0&&(a.clear_tool_input=i.clearToolInput)),a});n.context_management={edits:s}}let o=[];if(t.tools&&t.tools.length>0)for(let s of t.tools)o.push({type:"function",name:s.function.name,description:s.function.description,parameters:s.function.parameters});if(t.builtinTools&&!t.disableBuiltinTools&&t.builtinTools.length>0)for(let s of t.builtinTools){let a={type:s.type.replace(/^builtin_/,"")};s.config&&Object.assign(a,s.config),o.push(a)}if(o.length>0&&(n.tools=o),t.maxToolCalls!==void 0&&(n.max_tool_calls=t.maxToolCalls),t.toolChoice!==void 0&&(typeof t.toolChoice=="string"?n.tool_choice=t.toolChoice:n.tool_choice={type:t.toolChoice.type,name:t.toolChoice.name}),t.temperature!==void 0&&(n.temperature=t.temperature),t.topP!==void 0&&(n.top_p=t.topP),t.maxTokens!==void 0&&(n.max_output_tokens=t.maxTokens),t.reasoning){let s=t.reasoning.effort??"high";s==="minimal"?n.thinking={type:"disabled"}:(n.thinking={type:"enabled"},n.reasoning={effort:s}),t.reasoning.includeEncryptedReasoning&&(n.include=["reasoning.encrypted_content"])}return t.prefixMessage&&n.input.push({role:"assistant",content:t.prefixMessage,partial:!0}),n}async*fetchAndStream(e,t,n,o){let s=AbortSignal.timeout(this.timeoutMs),i=o?AbortSignal.any([o,s]):s,a=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(n),signal:i});if(!a.ok){let u=await a.text().catch(()=>""),c=new Error(`Volcengine Responses API error ${a.status}: ${u.slice(0,500)}`);throw c.status=a.status,c}if(!a.body)throw new Error("Volcengine Responses API returned no response body");let l=a.headers.get("content-type")??"";if(l.includes("application/json")&&!l.includes("text/event-stream")){yield*this.handleNonStreamingResponse(a);return}yield*this.parseSSEStream(a.body)}async*handleNonStreamingResponse(e){let t=await e.json();if(t.id&&(yield{type:"response_id",id:t.id}),t.usage&&(yield{type:"usage",promptTokens:t.usage.input_tokens??0,completionTokens:t.usage.output_tokens??0,reasoningTokens:t.usage.output_tokens_details?.reasoning_tokens,cacheReadTokens:t.usage.input_tokens_details?.cached_tokens}),t.output)for(let n of t.output){if(n.type==="message"&&n.content)for(let o of n.content)o.type==="output_text"&&(yield{type:"delta",text:o.text??""});if(n.type==="reasoning"&&n.summary)for(let o of n.summary)o.type==="summary_text"&&(yield{type:"reasoning_delta",text:o.text??""});n.type==="function_call"&&(yield{type:"tool_call_delta",index:0,id:n.call_id,name:n.name,arguments:n.arguments??""})}yield{type:"done",finishReason:t.status==="completed"?"stop":t.status??"stop"}}async*parseSSEStream(e){let t=new TextDecoder,n="",o="",s=null,i=new AbortController,a=0,l=new Map,u=()=>{s&&clearTimeout(s),s=setTimeout(()=>{i.abort()},Ae)};try{u();let c=e.getReader();try{for(;;){let{done:d,value:p}=await c.read();if(d)break;if(i.signal.aborted)throw new Error("Stream idle timeout");u(),n+=t.decode(p,{stream:!0});let m;for(;(m=n.indexOf(`
38
- `))!==-1;){let g=n.slice(0,m).trim();if(n=n.slice(m+1),!g){o="";continue}if(!g.startsWith(":")){if(g.startsWith("event:")){o=g.slice(6).trim();continue}if(g.startsWith("data:")){let f=g.slice(5).trim();if(f==="[DONE]")return;let b;try{b=JSON.parse(f)}catch{continue}yield*this.processEvent(o,b,l,()=>a++)}}}}}finally{c.releaseLock()}}finally{s&&clearTimeout(s)}}*processEvent(e,t,n,o){switch(e){case"response.output_text.delta":{let s=t.delta;s&&(yield{type:"delta",text:s});break}case"response.reasoning_summary_text.delta":{let s=t.delta;s&&(yield{type:"reasoning_delta",text:s});break}case"response.function_call_arguments.delta":{let s=t.delta,i=t.call_id,a=t.name;if(s!==void 0&&i){let l=n.get(i);l===void 0&&(l=o(),n.set(i,l)),yield{type:"tool_call_delta",index:l,id:i,name:a,arguments:s}}break}case"response.output_item.added":{let s=t.item;if(s&&s.type==="function_call"){let i=s.call_id,a=s.name;if(i&&!n.has(i)){let l=o();n.set(i,l),yield{type:"tool_call_delta",index:l,id:i,name:a,arguments:""}}}break}case"response.function_call_arguments.done":break;case"response.output_item.done":{let s=t.item;if(s?.type==="message"){let i=s.content;if(i)for(let a of i){let l=a.annotations;l&&l.length>0&&(yield{type:"annotations",annotations:l.map(u=>({type:u.type??"url_citation",url:u.url,title:u.title,...u}))})}}break}case"response.completed":{let s=t.response;if(s){let i=s.id;i&&(yield{type:"response_id",id:i});let a=s.usage;if(a){let u=a.input_tokens_details,c=a.output_tokens_details;yield{type:"usage",promptTokens:a.input_tokens??0,completionTokens:a.output_tokens??0,reasoningTokens:c?.reasoning_tokens,cacheReadTokens:u?.cached_tokens}}yield{type:"done",finishReason:s.status==="incomplete"?"tool_calls":"stop"}}else yield{type:"done",finishReason:"stop"};break}case"response.failed":{yield{type:"error",message:t.response?.error?.message??"Unknown error"},yield{type:"done",finishReason:"error"};break}default:{e.startsWith("response.web_search_call")?yield{type:"builtin_tool_status",toolType:"web_search",event:e,data:t}:e.startsWith("response.image_process")&&(yield{type:"builtin_tool_status",toolType:"image_process",event:e,data:t});break}}}};function Vm(r){let e=[];for(let t of r){if(t.role==="system"){e.push({role:"system",content:t.content??""});continue}if(t.role==="user"){let n=t.imageUrls&&t.imageUrls.length>0,o=t.videoUrls&&t.videoUrls.length>0,s=t.audioUrls&&t.audioUrls.length>0,i=t.fileIds&&t.fileIds.length>0;if(n||o||s||i){let l=[];if(n)for(let u of t.imageUrls){let c={type:"input_image",image_url:u};t.imageDetail&&(c.detail=t.imageDetail),t.imagePixelLimit&&(c.image_pixel_limit=t.imagePixelLimit),l.push(c)}if(o)for(let u of t.videoUrls){let c={type:"input_video",video_url:u};t.videoFps!==void 0&&(c.fps=t.videoFps),l.push(c)}if(s)for(let u of t.audioUrls){let c={type:"input_audio",audio_url:u};t.audioFormat&&(c.format=t.audioFormat),l.push(c)}if(i)for(let u of t.fileIds)l.push({type:"input_file",file_id:u.id});t.content&&l.push({type:"input_text",text:t.content}),e.push({role:"user",content:l})}else e.push({role:"user",content:t.content??""});continue}if(t.role==="assistant"){e.push({role:"assistant",content:t.content??""});continue}if(t.role==="tool"){if(!t.tool_call_id)continue;e.push({type:"function_call_output",call_id:t.tool_call_id,output:t.content??""});continue}}return e}wo();var zm=[{category:"HARM_CATEGORY_HARASSMENT",threshold:"BLOCK_ONLY_HIGH"},{category:"HARM_CATEGORY_HATE_SPEECH",threshold:"BLOCK_ONLY_HIGH"},{category:"HARM_CATEGORY_SEXUALLY_EXPLICIT",threshold:"BLOCK_ONLY_HIGH"},{category:"HARM_CATEGORY_DANGEROUS_CONTENT",threshold:"BLOCK_ONLY_HIGH"},{category:"HARM_CATEGORY_CIVIC_INTEGRITY",threshold:"BLOCK_ONLY_HIGH"}];function qm(r){switch(r){case"minimal":return"MINIMAL";case"low":return"LOW";case"medium":return"MEDIUM";case"high":return"HIGH";default:return"HIGH"}}var Ft=class{baseUrl;timeoutMs;quirks;constructor(e){if(!e.baseUrl)throw new Error("GeminiGenerateContentTransport: baseUrl is required");this.baseUrl=e.baseUrl.replace(/\/openai\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??18e4,this.quirks=e.quirks??{}}async*stream(e,t,n){let o=`${this.baseUrl}/models/${encodeURIComponent(e.model)}:streamGenerateContent?alt=sse`,s=this.buildRequestBody(e),i={"Content-Type":"application/json","x-goog-api-key":t},a=null;for(let l=0;l<=3;l++){if(n?.aborted)throw new Error("Request aborted");l>0&&a&&await Pe(Me(l),n);try{yield*this.fetchAndStream(o,i,s,n);return}catch(u){a=u instanceof Error?u:new Error(String(u));let c=a.message.includes("Stream idle timeout");if(!Le($e(a))&&!c)throw a;if(l===3){if((c||Le($e(a)))&&!e.streamRequired)try{yield*this.nonStreamingFallback(e,t,n);return}catch{throw a}throw a}}}}buildRequestBody(e){let{systemInstruction:t,contents:n}=Km(e.messages),o={contents:n};t&&(o.system_instruction=t);let s=this.buildTools(e);s.length>0&&(o.tools=s),e.tools&&e.tools.length>0&&e.toolChoice&&(o.toolConfig=this.buildToolConfig(e.toolChoice));let i=this.buildGenerationConfig(e);return Object.keys(i).length>0&&(o.generationConfig=i),o.safetySettings=zm,e.cachedContent&&(o.cachedContent=e.cachedContent),o}buildTools(e){let t=[];if(e.tools&&e.tools.length>0){let n=e.tools.map(Jm);t.push({functionDeclarations:n})}return e.disableBuiltinTools||(this.quirks.builtinWebSearch&&t.push({googleSearch:{}}),this.quirks.builtinCodeInterpreter&&t.push({codeExecution:{}}),this.quirks.builtinUrlContext&&t.push({urlContext:{}}),this.quirks.builtinMapsGrounding&&t.push({googleMaps:{}}),this.quirks.builtinFileSearch&&t.push({fileSearch:{}})),t}buildToolConfig(e){return typeof e=="string"?{functionCallingConfig:{mode:{auto:"AUTO",none:"NONE",required:"ANY"}[e]??"AUTO"}}:{functionCallingConfig:{mode:"ANY",allowedFunctionNames:[e.name]}}}buildGenerationConfig(e){let t={};if(e.temperature!==void 0&&(t.temperature=e.temperature),e.topP!==void 0&&(t.topP=e.topP),e.maxTokens!==void 0&&(t.maxOutputTokens=e.maxTokens),e.reasoning){let n=qm(e.reasoning.effort);n==="MINIMAL"&&e.model.includes("pro")&&(n="LOW"),t.thinkingConfig={thinkingLevel:n,includeThoughts:!0}}return e.structuredOutput&&(e.structuredOutput.mode==="json_object"?t.responseMimeType="application/json":e.structuredOutput.mode==="json_schema"&&(t.responseMimeType="application/json",t.responseSchema=e.structuredOutput.schema)),t}async*fetchAndStream(e,t,n,o){let s=AbortSignal.timeout(this.timeoutMs),i=o?AbortSignal.any([o,s]):s,a=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(n),signal:i});if(!a.ok){let u=await a.text().catch(()=>""),c=new Error(`Gemini API error ${a.status}: ${u.slice(0,500)}`);throw c.status=a.status,c}if(!a.body)throw new Error("Gemini API returned no response body");let l=a.headers.get("content-type")??"";if(l.includes("application/json")&&!l.includes("text/event-stream")){let u=await a.json();yield*this.processResponse(u);return}yield*this.parseSSEStreamWithWatchdog(a.body)}async*parseSSEStreamWithWatchdog(e){let t=new TextDecoder,n="",o=null,s=new AbortController,i=()=>{o&&clearTimeout(o),o=setTimeout(()=>{s.abort()},Ae)};try{i();let a=e.getReader();try{for(;;){let{done:l,value:u}=await a.read();if(l)break;if(s.signal.aborted)throw new Error("Stream idle timeout");i(),n+=t.decode(u,{stream:!0});let c;for(;(c=n.indexOf(`
39
- `))!==-1;){let d=n.slice(0,c).trim();if(n=n.slice(c+1),!d||d.startsWith(":")||!d.startsWith("data: "))continue;let p=d.slice(6);if(p==="[DONE]")return;let m;try{m=JSON.parse(p)}catch{continue}yield*this.processResponse(m)}}}finally{a.releaseLock()}}finally{o&&clearTimeout(o)}}*processResponse(e){if(e.error){yield{type:"error",message:`Gemini error ${e.error.code}: ${e.error.message}`};return}if(e.usageMetadata){let t=e.usageMetadata;yield{type:"usage",promptTokens:t.promptTokenCount??0,completionTokens:t.candidatesTokenCount??0,reasoningTokens:t.thoughtsTokenCount,cacheReadTokens:t.cachedContentTokenCount}}if(!(!e.candidates||e.candidates.length===0))for(let t of e.candidates){if(t.finishReason==="SAFETY"){yield{type:"error",message:"Response blocked by Gemini safety filters"},yield{type:"done",finishReason:"content_filter"};return}let n=t.content?.parts??[],o=0;for(let s of n){if(s.thought&&s.text){yield{type:"reasoning_delta",text:s.text},s.thoughtSignature&&(yield{type:"reasoning_block_complete",thinking:s.text,signature:s.thoughtSignature});continue}if(s.text&&!s.thought){yield{type:"delta",text:s.text};continue}if(s.functionCall){let i=s.functionCall;yield{type:"tool_call_delta",index:o,id:i.id??`gemini-tc-${o}`,name:i.name,arguments:JSON.stringify(i.args??{})},s.thoughtSignature&&(yield{type:"reasoning_block_complete",thinking:"",signature:s.thoughtSignature}),o++;continue}if(s.codeExecutionResult){yield{type:"delta",text:`
24
+ `)}`}function Ap(){return Lo(new tt(fr),new ze(20,nt),new mt(nt))}function ji(r,e){let t=Do(new tt(fr),new ze(20,nt),new Mt({protectedHeadExchanges:1,protectedTailMessages:8,summarize:r,estimateTokens:nt}),new mt(nt));return new It({inner:t,estimateTokens:nt,onCacheInvalidated:e?.onCacheInvalidated})}function Gi(r,e){let t=e?.budget??Tn({modelContextWindow:Fi(e?.model)}),o=(e?.pipeline??Ap()).compress(r,t);if(o.droppedCount>0){let s=ot(r),i=ot(o.messages);Bi.record({timestamp:Date.now(),strategy:o.strategy,tokensBefore:s,tokensAfter:i,droppedCount:o.droppedCount,latencyMs:o.metrics?.latencyMs??0,usedLlm:!1,cacheInvalidated:o.metrics?.cacheInvalidated??!1,tier:Dt(s,t)})}return o.droppedCount>0&&hr?.(o.droppedCount,ot(o.messages)),o}async function Pp(r,e,t){let n=t??Tn({modelContextWindow:Fi(e.model)}),o=ot(r),s=Dt(o,n),i;switch(s){case"none":i={messages:r,droppedCount:0,strategy:"none"};break;case"trim-only":i=new tt(fr).compress(r,n);break;case"sliding-window":{i=await ji(e.summarize).compressAsync(r,n);break}case"llm-summarize":{let a=e.pipeline??ji(e.summarize);i=Lt(a)?await a.compressAsync(r,n):a.compress(r,n);break}}return i.droppedCount>0&&(i={...i,messages:await No(i.messages,r,{maxFiles:5,maxTokenBudget:5e4,readFile:async a=>{try{return await _p(a,"utf-8")}catch{return null}}})}),Mp(r,i,n),i}function Mp(r,e,t){if(e.droppedCount>0||e.metrics?.usedLlm){let n=e.metrics?.tokensBefore||ot(r),o=e.metrics?.tokensAfter||ot(e.messages);Bi.record({timestamp:Date.now(),strategy:e.strategy,tokensBefore:n,tokensAfter:o,droppedCount:e.droppedCount,latencyMs:e.metrics?.latencyMs??0,usedLlm:e.metrics?.usedLlm??!1,cacheInvalidated:e.metrics?.cacheInvalidated??!1,tier:Dt(n,t)})}if(e.droppedCount>0){let n=e.metrics?.tokensAfter||ot(e.messages);hr?.(e.droppedCount,n)}}function Ip(r,e){let t=Cp(r,e),n={id:"builtin-compressor",label:"4-Layer Compression Funnel (built-in)",async compressAsync(o,s,i){return Pp(o,{budget:s,model:i?.model,sessionId:i?.sessionId,summarize:t},s)}};Ui.register(n),Ui.activate(n.id),r.info(`[context-compression] registered context engine: ${n.id}`)}function Wi(r,e,t){Ip(e,t),r.register({point:"context.before_compact",priority:50,label:"context-compression-bridge",handler:(n,o)=>{let s=o.messageCount;return s&&s>0&&e.debug(`[context-compression] before_compact: ${s} messages entering compression`),{action:"continue"}}}),hr=(n,o)=>{e.debug(`[context-compression] after_compact: removed ${n}, ${o} tokens remaining`),r.invoke("context.after_compact",{sessionId:"",turnId:"",removedCount:n,tokenCount:o}).catch(()=>{})}}var mr,fr,Rp,Bi,Ui,hr,yr=J(()=>{"use strict";ft();mr={"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};fr=8e3,Rp="deepseek-v4-flash",Bi=new Et(200),Ui=new Ot;hr=null});function Hi(r,e,t){let n=t-e;return`[Budget] ${Math.round(r)}% used (${e.toLocaleString()} / ${t.toLocaleString()} tokens). ${n.toLocaleString()} tokens remaining. `+(r>=90?"Wrap up your current task \u2014 you are near the token limit.":"Continue working \u2014 do not summarize prematurely.")}var zi=J(()=>{"use strict"});var Vi={};Ws(Vi,{resolveToolEligibility:()=>$p});function Op(r,e){if(Ep.some(t=>t.test(r)))return!0;if(e)for(let t of e)try{if(new RegExp(t,"i").test(r))return!0}catch{}return!1}function Lp(r,e){let t=r.function.name,n=r.meta,o=[];return e.blockedToolNames?.includes(t)?(o.push("policy_blocked"),{level:5,reasons:o}):n?.isReadOnly?(o.push("always_allowed"),{level:1,reasons:o}):n?.requiresApproval?(o.push("approval_required"),{level:4,reasons:o}):n?.isDangerous||Op(t,e.dangerousPatterns)?(o.push("dangerous_tool"),{level:3,reasons:o}):{level:2,reasons:o}}function Dp(r){switch(r){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 $p(r,e={}){let t=new Map,n=[],o=[],s=[];for(let i of r){let a=i.function.name,{level:c,reasons:d}=Lp(i,e),l=Dp(c),u={toolName:a,status:l,permissionLevel:c,approvalRequired:c===4,reasonCodes:d};t.set(a,u),c===5?o.push(u):(n.push(i),c===4&&s.push(u))}return{eligibleTools:n,blockedTools:o,approvalRequiredTools:s,eligibilityByName:t}}var Ep,qi=J(()=>{"use strict";Ep=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:write_file|delete_file|move_file|create_directory)$/i,/^(?:git_push|git_reset|git_force)$/i]});function Fp(r){let e=r.split(".").pop()?.toLowerCase()??"";return["png","jpg","jpeg","gif","webp","svg","bmp","ico"].includes(e)?"image":["md","txt","pdf","doc","docx","rtf","html"].includes(e)?"document":["mermaid","mmd","dot","puml","plantuml"].includes(e)?"diagram":["csv","tsv","xlsx","xls"].includes(e)?"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(e)?"code":"file"}function Bp(r){let e=r.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"}[e]}function Gp(r){return typeof r=="number"&&Number.isFinite(r)&&r>=1?Math.min(Math.round(r),100):fi}function Ki(r){let e=r.message.toLowerCase();return r.status===413||e.includes("prompt_too_long")||e.includes("context_length_exceeded")||e.includes("maximum context length")}function Wp(r){return r==="length"||r==="max_tokens"}function Ji(r){let e=r.message.toLowerCase();return(e.includes("image")||e.includes("media")||e.includes("file too large")||e.includes("payload too large"))&&(r.status===413||e.includes("too large")||e.includes("size"))}function Hp(r){let e=r.headers;if(!e)return null;let t=e["retry-after"]??e["Retry-After"];if(!t)return null;let n=parseInt(t,10);return!isNaN(n)&&n>0?n*1e3:null}function zp(r){if(r.status!==400)return null;let e=r.message.match(/input length and `max_tokens` exceed context limit: (\d+) \+ (\d+) > (\d+)/);if(!e?.[1]||!e?.[3])return null;let t=parseInt(e[1],10),n=parseInt(e[3],10);if(isNaN(t)||isNaN(n))return null;let o=n-t-1e3;return o>=3e3?o:null}function Vp(r){return r.filter(e=>e.role!=="assistant"?!0:!(typeof e.content=="string"&&e.content.trim()===""))}async function*Yi(r,e,t,n){let{turnId:o,sessionId:s,messages:i,tools:a,model:c,apiKey:d,temperature:l=0,hooks:u,signal:p}=r,m={sessionId:s,turnId:o},g=r.maxTurns??0,f=r.querySource,{resolveToolEligibility:b}=await Promise.resolve().then(()=>(qi(),Vi)),w=b(a,r.toolEligibilityContext),T=w.eligibleTools;for(let j of w.blockedTools)yield{type:"tool_blocked",turnId:o,callId:"",name:j.toolName,reason:"blocked-by-policy"};if(!T.length){yield*qp(o,c,i,d,l,p,e,n);return}let _=Gp(r.maxRounds),R={contextWindowTokens:r.contextWindowTokens??yi,responseBufferTokens:bi,maxOutputTokens:r.maxOutputTokens??ki,abortSignal:p,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},y=new Set,I=0,O=T,$,v={messages:[...i],maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:1,transition:void 0,guardState:nr(R),reactiveCompactState:ar(),toolLoopState:vn({maxRounds:_,replayMessages:[...i]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{prompt:0,completion:0},collapseStore:Fo(),currentModel:c,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:void 0,lastResponseId:void 0,snipRemovedIds:new Set,contentReplacementState:Mi(),budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0},pe=Math.max(g*5,200),F=0;for(;;){if(F++,F>pe){n.info(`hard iteration cap reached (${pe}), forcing completion`);let S=v.finalText||jt(v.messages,n);yield{type:"end",turnId:o,content:S,usage:v.totalUsage,model:v.currentModel};return}let{messages:j,maxOutputTokensRecoveryCount:oe,hasAttemptedReactiveCompact:re,maxOutputTokensOverride:me,turnCount:V,guardState:B,reactiveCompactState:ye,collapseStore:De}=v,{toolLoopState:be}=v;if($){try{let S=await $;S&&(yield{type:"tool_use_summary",turnId:o,summary:S})}catch{}$=void 0}if(r.refreshTools&&V>1){let S=r.refreshTools();S!==O&&(O=S,n.debug(`tools refreshed: ${S.length} tools`))}if(ir(B,R)){n.info(`turn aborted by guard at turn ${V}`),yield{type:"error",turnId:o,error:"Turn aborted",code:"ABORTED",usage:v.totalUsage};return}let h=or(B,R);if(h.level==="blocking"){h.reason==="prompt_too_long"&&gt(ye)&&(ye.attemptedThisTurn=!0,B.hasAttemptedReactiveCompact=!0,n.info(`token budget blocking (${h.reason}), reactive compact needed`),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"token budget pre-check"}),n.info(`token budget blocking (${h.reason}), ending tool loop`);break}h.level==="warning"&&n.info(`token budget warning: ${h.usagePercent}% used, ${h.remainingTokens} remaining`);let k;{let S=await $i(j,v.contentReplacementState,s);k=S.messages,S.newlyReplacedCount>0&&(n.info(`tool-result-budget: persisted ${S.newlyReplacedCount} oversized tool results`),yield{type:"recovery",turnId:o,action:"tool_result_budget",detail:`${S.newlyReplacedCount} persisted`})}{let S=Uo(k,v.snipRemovedIds);k=S.messages,S.removedCount>0&&(n.info(`snip: removed ${S.removedCount} messages, freed ~${S.tokensFreed} tokens`),yield{type:"recovery",turnId:o,action:"snip",detail:`${S.removedCount} messages`})}{let M=new ze().compress(k,0);M.droppedCount>0&&(k=M.messages,n.info(`microcompact: cleared ${M.droppedCount} old tool results`))}if(k=Bo(k,De).messages,B.promptTokens>0){let S=Gi(k,{budget:R.contextWindowTokens*.75,model:v.currentModel});S.droppedCount>0&&(k=S.messages,n.info(`autocompact: ${S.strategy}, dropped ${S.droppedCount}`),yield{type:"recovery",turnId:o,action:"autocompact",detail:`${S.strategy}: ${S.droppedCount} dropped`},v.hasAttemptedReactiveCompact=!1,u?.invoke("context.after_compact",{...m,removedCount:S.droppedCount}).catch(()=>{}))}k=Vp(k);let x=Wo({tools:O,toolChoice:r.toolChoice??"auto"}),C=vn({maxRounds:_,replayMessages:k,lastStopReason:be.lastStopReason,options:{stopReason:be.lastStopReason}}),A=x.extraSystemPrompt?[{role:"system",content:x.extraSystemPrompt},...C.state.replayMessages]:C.state.replayMessages;be=C.state,C.recoveryActions.length>0&&n.debug(`tool loop recovery: ${C.recoveryActions.map(S=>S.detail??S.kind).join("; ")}`),n.debug(`turn ${V}, messages: ${A.length}`),u?.invoke("turn.before_inference",{...m,model:v.currentModel}).catch(()=>{});let L=!1,K=[],G=new Map,ce="stop",Z,E=null,se=!1,Xe=[],X=[];try{for await(let S of e.stream({model:v.currentModel,messages:A,tools:x.tools,toolChoice:x.normalizedToolChoice??"auto",temperature:l,maxTokens:(me??B.currentMaxOutputTokens)||void 0,streamRequired:r.streamRequired,previousResponseId:v.lastResponseId,reasoning:r.reasoning,promptCacheKey:r.promptCacheKey,promptCacheRetention:r.promptCacheRetention,serviceTier:r.serviceTier,openaiBuiltinTools:r.openaiBuiltinTools,maxToolCalls:r.maxToolCalls,parallelToolCalls:r.parallelToolCalls,textVerbosity:r.textVerbosity},d,p))switch(S.type){case"delta":K.push(S.text),L||(yield{type:"delta",turnId:o,text:S.text});break;case"tool_call_delta":L=!0,lr(G,S);break;case"reasoning_delta":Xe.push(S.text);break;case"reasoning_block_complete":S.signature&&X.push({thinking:Xe.join(""),signature:S.signature}),Xe.length=0;break;case"usage":Z={prompt:S.promptTokens,completion:S.completionTokens,reasoning:S.reasoningTokens,cacheRead:S.cacheReadTokens,cacheCreation:S.cacheCreationTokens};break;case"response_id":v.lastResponseId=S.id;break;case"annotations":yield{type:"annotations",turnId:o,annotations:S.annotations};break;case"builtin_tool_status":yield{type:"heartbeat",turnId:o,message:`${S.toolType}: ${S.event}`};break;case"done":ce=S.finishReason;break}if(L||u?.invoke("turn.after_inference",{...m,model:v.currentModel}).catch(()=>{}),r.postSamplingHooks&&r.postSamplingHooks.length>0){let S=v.currentModel;for(let M of r.postSamplingHooks)try{M({messages:[...k],model:S,sessionId:s})}catch{}}}catch(S){if(S instanceof Nt&&r.fallbackModel){n.info(`model fallback triggered: ${S.originalModel} \u2192 ${S.fallbackModel}`),yield{type:"recovery",turnId:o,action:"model_fallback",detail:`${S.originalModel} \u2192 ${S.fallbackModel}`},v={...v,currentModel:S.fallbackModel,consecutive529Errors:0,consecutiveApiRetries:0,transition:void 0};continue}let M=S instanceof Error?S.message:String(S),D=typeof S?.status=="number"?S.status:void 0;if(!D&&M&&(M.includes("ECONNRESET")||M.includes("EPIPE"))){let Q=(v.consecutiveApiRetries??0)+1;if(Q>Ut){n.info(`stale connection retry limit reached (${Ut}), aborting`),yield{type:"error",turnId:o,error:M,code:"RETRIES_EXHAUSTED",usage:v.totalUsage};return}n.info(`stale connection (${M.includes("ECONNRESET")?"ECONNRESET":"EPIPE"}): retrying`),yield{type:"recovery",turnId:o,action:"stale_connection_retry",detail:M.slice(0,80)},v={...v,consecutiveApiRetries:Q,transition:void 0};continue}let H=zp({status:D,message:M});if(H!==null){n.info(`max_tokens overflow: adjusting to ${H}`),B.currentMaxOutputTokens=H,v={...v,maxOutputTokensOverride:H,transition:void 0};continue}if(Xo(D)){if(v.consecutive529Errors++,v.consecutive529Errors>=Si&&r.fallbackModel&&v.currentModel!==r.fallbackModel){n.info(`529 \xD7 ${v.consecutive529Errors}: triggering fallback to ${r.fallbackModel}`),yield{type:"recovery",turnId:o,action:"model_fallback",detail:`529 \xD7 ${v.consecutive529Errors}`},v={...v,currentModel:r.fallbackModel,consecutive529Errors:0,transition:void 0};continue}if(Qo()){let Q=xn(v.consecutive529Errors);n.info(`persistent retry: waiting ${Q}ms (attempt ${v.consecutive529Errors})`);let q=Q;for(;q>0;){if(p?.aborted){yield{type:"error",turnId:o,error:"Aborted during retry wait",code:"ABORTED",usage:v.totalUsage};return}yield{type:"heartbeat",turnId:o,message:`Retrying in ${Math.ceil(q/1e3)}s (${D})`};let de=Math.min(q,xi);await new Promise(Po=>setTimeout(Po,de)),q-=de}v={...v,transition:void 0};continue}if(Yo(f)){let q=Hp({status:D,message:M})??xn(v.consecutive529Errors);n.info(`transient ${D}: retry in ${q}ms`),yield{type:"recovery",turnId:o,action:"retry",detail:`${D} retry in ${q}ms`},await new Promise(de=>setTimeout(de,q)),v={...v,transition:void 0};continue}n.info(`background source ${f}: not retrying ${D}`)}E={status:D,message:M}}if(E&&u?.invoke("turn.after_inference",{...m,model:v.currentModel,response:{error:E.message}}).catch(()=>{}),E)if(Ki(E))se=!0,n.info(`withheld prompt_too_long error (status=${E.status})`);else if(Ji(E))se=!0,n.info(`withheld media_size error (status=${E.status})`);else{let S=rr({status:E.status??500,message:E.message},B,R);if(S.action==="reactive_compact"&&gt(ye)&&(ye.attemptedThisTurn=!0,B.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:o,action:"reactive_compact",detail:`API ${E.status??500}: ${E.message}`}),S.action==="retry"){let D=(v.consecutiveApiRetries??0)+1;if(D>Ut){n.info(`API retry limit reached (${Ut}), aborting`);let H=pt(E.status,E.message);yield{type:"error",turnId:o,error:E.message,code:H,usage:v.totalUsage};return}yield{type:"recovery",turnId:o,action:"retry",detail:S.reason},v={...v,consecutiveApiRetries:D,transition:void 0};continue}let M=pt(E.status,E.message);u?.invoke("stop.failure",{sessionId:s,reason:M,error:E.message}).catch(()=>{}),yield{type:"error",turnId:o,error:E.message,code:M,usage:v.totalUsage};return}Z&&(v.totalUsage.prompt+=Z.prompt,v.totalUsage.completion+=Z.completion,Z.reasoning&&(v.totalUsage.reasoning=(v.totalUsage.reasoning??0)+Z.reasoning),Z.cacheRead&&(v.totalUsage.cacheRead=(v.totalUsage.cacheRead??0)+Z.cacheRead),Z.cacheCreation&&(v.totalUsage.cacheCreation=(v.totalUsage.cacheCreation??0)+Z.cacheCreation)),Z?.prompt&&(B.promptTokens=Z.prompt);let bn=K.join("");bn&&(v.finalText=bn);let _e=[...G.values()].map(S=>({id:S.id||`tc_${o}_${V}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:S.name,arguments:S.arguments}}));if(_e.length===0&&!L){if(se&&E&&Ki(E)){if(v.transition?.reason!=="collapse_drain_retry"){let D=Go(k,De);if(D.committed>0){n.info(`collapse drain: committed ${D.committed} stages`),yield{type:"recovery",turnId:o,action:"collapse_drain",detail:`${D.committed} stages committed`},v={...v,messages:D.messages,transition:{reason:"collapse_drain_retry",committed:D.committed}};continue}}if(gt(ye)){ye.attemptedThisTurn=!0,B.hasAttemptedReactiveCompact=!0,n.info("withheld 413: reactive compact attempt"),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"withheld prompt_too_long"},v={...v,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}n.info("withheld 413: recovery exhausted, surfacing error"),u?.invoke("stop.failure",{sessionId:s,reason:"prompt_too_long",error:E.message}).catch(()=>{}),yield{type:"error",turnId:o,error:E.message,code:"PROMPT_TOO_LONG",usage:v.totalUsage};return}if(se&&E&&Ji(E)){if(gt(ye)){ye.attemptedThisTurn=!0,B.hasAttemptedReactiveCompact=!0,n.info("withheld media error: reactive compact strip-retry"),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"media error strip-retry"},v={...v,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}n.info("withheld media error: recovery exhausted"),u?.invoke("stop.failure",{sessionId:s,reason:"media_error",error:E.message}).catch(()=>{}),yield{type:"error",turnId:o,error:E.message,code:"IMAGE_ERROR",usage:v.totalUsage};return}if(Wp(ce)){B.consecutiveTruncations+=1;let D=r.modelMaxOutputTokens??Ti,H=sr(B,R,D);if(H.shouldEscalate&&me===void 0){B.currentMaxOutputTokens=H.newMax,n.info(`max_output_tokens escalate: ${H.newMax} tokens`),yield{type:"recovery",turnId:o,action:"output_escalation",detail:`${H.newMax} tokens`},v={...v,maxOutputTokensOverride:vi,transition:{reason:"max_output_tokens_escalate"}};continue}if(oe<wi){let Q={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 #${oe+1}`),yield{type:"recovery",turnId:o,action:"max_output_tokens_recovery",detail:`attempt ${oe+1}`},v={...v,messages:[...k,Q],maxOutputTokensRecoveryCount:oe+1,maxOutputTokensOverride:void 0,transition:{reason:"max_output_tokens_recovery",attempt:oe+1}};continue}n.info("max_output_tokens recovery exhausted, completing with partial content")}else B.consecutiveTruncations=0;if(be=wn(be,{replayMessages:j,lastStopReason:"completed"}),u){let D=await u.invoke("stop",{sessionId:s,reason:"completed"});if(D.action==="prevent"){n.info(`stop hook prevented continuation: ${D.reason??"no reason"}`),yield{type:"end",turnId:o,content:v.finalText,usage:v.totalUsage,model:v.currentModel};return}if(D.action==="abort"){let H=D.reason??"Stop hook requested continuation";n.info(`stop hook blocking: ${H}`);let Q={role:"user",content:H},q={role:"assistant",content:v.finalText,...X.length>0&&{thinkingBlocks:[...X]}};v={...v,messages:[...j,q,Q],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(r.tokenBudget&&r.tokenBudget>0&&v.budgetContinuationCount<5){let D=v.totalUsage.prompt+v.totalUsage.completion+(v.totalUsage.reasoning??0),H=D/r.tokenBudget*100,Q=D-v.lastBudgetGlobalTokens,q=v.budgetContinuationCount>=_i&&Q<dr&&v.lastBudgetDeltaTokens<dr;if(q&&n.info(`token budget early stop: diminishing returns at ${Math.round(H)}% (delta=${Q})`),!q&&H<90){let de=v.budgetContinuationCount+1,Po={role:"user",content:Hi(H,D,r.tokenBudget)};n.info(`token budget continuation #${de}: ${Math.round(H)}% used`),yield{type:"recovery",turnId:o,action:"budget_continuation",detail:`${Math.round(H)}% used (#${de})`};let ou={role:"assistant",content:v.finalText,...X.length>0&&{thinkingBlocks:[...X]}};v={...v,messages:[...j,ou,Po],budgetContinuationCount:de,lastBudgetDeltaTokens:Q,lastBudgetGlobalTokens:D,transition:{reason:"token_budget_continuation"}};continue}}if(I>0){let D={ok:!0,toolCallCount:I,distinctToolCount:y.size,multiStep:I>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},H=$t(D,{tools:[...y]});H&&(yield{type:"skill_instruction",turnId:o,instruction:H})}let M=v.finalText||jt(j,n);yield{type:"end",turnId:o,content:M,usage:v.totalUsage,model:v.currentModel};return}for(let S of _e){let M=S.function.arguments,D=O.find(H=>H.function.name===S.function.name);if(D?.backfillObservableInput)try{let H=JSON.parse(S.function.arguments),Q={...H};D.backfillObservableInput(Q),Object.keys(Q).some(de=>!(de in H))&&(M=JSON.stringify(Q))}catch{}yield{type:"tool_call",turnId:o,callId:S.id,name:S.function.name,arguments:M}}let tu=X.length===0&&Xe.length>0?Xe.join(""):void 0;j.push(Io(_e,v.finalText||void 0,X.length>0?X:void 0,tu)),be=Jo(be,{replayMessages:j,pendingToolCallIds:_e.map(S=>S.id),completedToolCallIds:be.completedToolCallIds,lastStopReason:"tool_calls"});let Bs=[];try{let S=new Rn({toolInvoker:t,hooks:u,sessionId:s,turnId:o,log:n,signal:p,maxConcurrentTools:r?.maxConcurrentTools});for(let M of _e)S.addTool(M);for await(let M of S.getRemainingResults()){M.blocked&&(yield{type:"tool_blocked",turnId:o,callId:M.callId,name:M.toolName,reason:M.blockReason??"blocked"}),j.push(M.message),Bs.push(M.callId),y.add(M.toolName),I++;let D=typeof M.message?.content=="string"?M.message.content:"",H=M.ok&&D?D.slice(0,2e3):void 0;if(yield{type:"tool_result",turnId:o,callId:M.callId,name:M.toolName,ok:M.ok,error:M.error,outputPreview:H},M.ok){let Q=_e.find(q=>q.id===M.callId);if(Q){if(M.toolName==="plan_mode")try{let q=JSON.parse(Q.function.arguments);q.action==="exit"&&typeof q.plan=="string"&&q.plan.length>0&&(yield{type:"plan_update",turnId:o,slug:"approved-plan",content:q.plan})}catch{}if(jp.has(M.toolName))try{let q=JSON.parse(Q.function.arguments),de=typeof q.file_path=="string"?q.file_path:typeof q.filePath=="string"?q.filePath:typeof q.path=="string"?q.path:void 0;de&&(yield{type:"artifact",turnId:o,artifactId:`artifact-${M.callId}`,artifactType:Fp(de),title:de.split(/[\\/]/).pop()||de,filePath:de,language:Bp(de)})}catch{}}}}}catch(S){let M=S instanceof Error?S.message:String(S);yield{type:"error",turnId:o,error:M,code:"TOOL_EXECUTION_ERROR",usage:v.totalUsage};return}if(be=wn(be,{replayMessages:j,completedToolCallIds:[...be.completedToolCallIds,...Bs],lastStopReason:"tool_calls"}),r.generateToolUseSummary&&_e.length>0){let S=_e.map(M=>({name:M.function.name,arguments:M.function.arguments}));$=r.generateToolUseSummary(S).catch(()=>null)}let Gs=j.slice(-_e.length),nu=Gs.length>0&&Gs.every(S=>{let M=S?.content;return typeof M!="string"?!1:M.startsWith("Error: ")}),At=v.consecutiveFailedRounds;if(nu){if(At+=1,At>=hi){let S=v.finalText||jt(j,n);n.info(`early exit: ${At} consecutive failed rounds, returning ${v.finalText?"partial":"fallback"} response`),yield{type:"end",turnId:o,content:S,usage:v.totalUsage,model:v.currentModel};return}}else At=0;let Ao=V+1;if(g>0&&Ao>g){if(n.info(`max turns reached (${g}), completing`),u){let M=await u.invoke("stop",{sessionId:s,reason:"max_turns"});if(M.action==="abort"){let D=M.reason??"Stop hook requested continuation after max_turns",H={role:"assistant",content:v.finalText,...X.length>0&&{thinkingBlocks:[...X]}};v={...v,messages:[...j,H,{role:"user",content:D}],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}let S=v.finalText||jt(j,n);yield{type:"end",turnId:o,content:S,usage:v.totalUsage,model:v.currentModel};return}if(Ao>_){if(n.info(`tool loop budget exhausted (${_} rounds), returning`),I>0){let M={ok:!0,toolCallCount:I,distinctToolCount:y.size,multiStep:I>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},D=$t(M,{tools:[...y]});D&&(yield{type:"skill_instruction",turnId:o,instruction:D})}let S=v.finalText||jt(j,n);yield{type:"end",turnId:o,content:S,usage:v.totalUsage,model:v.currentModel};return}v={messages:j,maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:Ao,transition:{reason:"next_turn"},guardState:B,reactiveCompactState:ye,toolLoopState:be,consecutiveFailedRounds:At,finalText:v.finalText,totalUsage:v.totalUsage,collapseStore:De,currentModel:v.currentModel,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:v.stopHookActive,lastResponseId:v.lastResponseId,snipRemovedIds:v.snipRemovedIds,contentReplacementState:v.contentReplacementState,budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0}}}function jt(r,e){let t=[];for(let n=r.length-1;n>=0;n--){let o=r[n];if(o.role==="tool"&&typeof o.content=="string")t.unshift(o.content.slice(0,500));else if(o.role==="assistant"){if(typeof o.content=="string"&&o.content.trim())return e.info("synthesizeFallbackContent: found assistant text, using it"),o.content;break}else break}return t.length>0?(e.info(`synthesizeFallbackContent: synthesized from ${t.length} tool result(s)`),t.join(`
25
+
26
+ `)):""}async function*qp(r,e,t,n,o,s,i,a){let c=[],d;a.debug(`single LLM round, messages: ${t.length}`);for await(let l of i.stream({model:e,messages:t,temperature:o},n,s))switch(l.type){case"delta":c.push(l.text),yield{type:"delta",turnId:r,text:l.text};break;case"usage":d={prompt:l.promptTokens,completion:l.completionTokens,reasoning:l.reasoningTokens,cacheRead:l.cacheReadTokens,cacheCreation:l.cacheCreationTokens};break;case"done":break}yield{type:"end",turnId:r,content:c.join(""),usage:d??{prompt:0,completion:0},model:e}}var jp,Xi=J(()=>{"use strict";cr();ft();Ni();yr();zi();pr();_n();jp=new Set(["write","edit","patch","apply_patch"])});var Zi={};Ws(Zi,{Agent:()=>ht});var ht,Cn=J(()=>{"use strict";ft();Xi();_n();ht=class{transport;apiKey;toolInvoker;log;hooks;maxRounds;constructor(e){this.transport=e.llmTransport,this.apiKey=e.apiKey,this.toolInvoker=e.toolInvoker,this.log=e.log,this.hooks=e.hooks,this.maxRounds=Math.min(e.maxRounds??25,100)}async*run(e,t){let{turnId:n,messages:o,tools:s,systemPrompt:i,config:a}=e,c={sessionId:e.sessionId,turnId:n};yield{type:"start",turnId:n},this.hooks?.invoke("turn.submitted",{...c,prompt:o[o.length-1]?.content??void 0}).catch(()=>{});let d=qo(o),l=[];if(i&&l.push({role:"system",content:i}),l.push(...d),this.hooks){let m=d.filter(f=>f.role==="user").pop(),g=typeof m?.content=="string"?m.content.slice(0,500):void 0;if(g)try{let f=await this.hooks.invoke("memory.before_recall",{sessionId:e.sessionId,turnId:n,query:g}),b=f?.context?.recalledMemories;if(b&&b.length>0){let w=b.map(T=>`- ${T.text}`).join(`
27
+ `);l.splice(i?1:0,0,{role:"system",content:`[Recalled from long-term memory]
28
+ ${w}`})}this.hooks.invoke("memory.after_recall",{sessionId:e.sessionId,turnId:n,blockCount:f?.context?.recalledMemories?.length??0}).catch(()=>{})}catch{}}let u=a?.model??"",p=Math.min(a?.maxRounds??this.maxRounds,100);try{let m=a?.summaryModel?async b=>{try{let w=b.map(R=>`${R.name}(${R.arguments.slice(0,200)})`).join(", "),T=this.transport.stream({model:a.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:w}],tools:[],maxTokens:60},a.apiKey??this.apiKey),_="";for await(let R of T)R.type==="delta"&&(_+=R.text);return _.trim()||null}catch{return null}}:void 0,g={turnId:n,sessionId:e.sessionId,messages:l,tools:s,model:u,apiKey:a?.apiKey??this.apiKey,temperature:a?.temperature,maxRounds:p,contextWindowTokens:a?.contextWindowTokens,maxOutputTokens:a?.maxOutputTokens,modelMaxOutputTokens:a?.modelMaxOutputTokens,toolChoice:a?.toolChoice,parentDepth:a?.parentDepth,hooks:this.hooks,fallbackModel:a?.fallbackModel,maxTurns:a?.maxTurns,tokenBudget:a?.tokenBudget,maxConcurrentTools:a?.maxConcurrentTools,streamRequired:a?.streamRequired,reasoning:a?.reasoning,promptCacheKey:a?.promptCacheKey,promptCacheRetention:a?.promptCacheRetention,serviceTier:a?.serviceTier,openaiBuiltinTools:a?.openaiBuiltinTools,maxToolCalls:a?.maxToolCalls,parallelToolCalls:a?.parallelToolCalls,textVerbosity:a?.textVerbosity,generateToolUseSummary:m,signal:t},f;for await(let b of Yi(g,this.transport,this.toolInvoker,this.log))f=b,yield b;f?.type==="end"?this.hooks?.invoke("turn.completed",{...c}).catch(()=>{}):f?.type==="error"&&this.hooks?.invoke("turn.failed",{...c,code:f.code,error:f.error}).catch(()=>{})}catch(m){if(t?.aborted)this.hooks?.invoke("turn.failed",{...c,code:"ABORTED",error:"Turn aborted"}).catch(()=>{}),yield{type:"error",turnId:n,error:"Turn aborted",code:"ABORTED"};else{let g=m instanceof Error?m.message:String(m),f=typeof m?.status=="number"?m.status:void 0,b=pt(f,g);this.log.error(`turn ${n} error [${b}, retryable=${Oo(b)}]: ${g}`),this.hooks?.invoke("turn.failed",{...c,code:b,error:g}).catch(()=>{}),yield{type:"error",turnId:n,error:g,code:b}}}}}});Cn();function Jp(r){let e={verbose:!1};for(let t of r.slice(2))(t==="--verbose"||t==="-v")&&(e.verbose=!0);return e}import{createInterface as Yp}from"node:readline";var Ft=class{messageHandler=null;closeHandler=null;verbose;constructor(e){this.verbose=e?.verbose??!1}onMessage(e){this.messageHandler=e}onClose(e){this.closeHandler=e}send(e){process.stdout.write(`${JSON.stringify(e)}
29
+ `)}start(){process.stdin.on("data",t=>{process.stderr.write(`[transport] raw stdin data (${t.length} bytes): ${t.toString().slice(0,300)}
30
+ `)});let e=Yp({input:process.stdin,crlfDelay:Number.POSITIVE_INFINITY});e.on("line",t=>{let n=t.trim();if(n){process.stderr.write(`[transport] line: ${n.slice(0,300)}
31
+ `);try{let o=JSON.parse(n);this.messageHandler?.(o)}catch{this.log(`invalid JSON on stdin: ${n.slice(0,200)}`)}}}),e.on("close",()=>{this.closeHandler?.()})}close(){}log(e){this.verbose&&process.stderr.write(`[transport] ${e}
32
+ `)}};import{randomUUID as le}from"node:crypto";Cn();cr();var Re=class{supportedTypes=["image","video","3d"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??18e4}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"video":return this.generateVideo(e,t,n);case"3d":return this.generate3D(e,t,n);default:throw new Error(`VolcengineMediaTransport: unsupported mediaType "${e.mediaType}"`)}}canHandle(e){return!!this.supportedTypes.includes(e.mediaType)}async generateImage(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v3/images/generations`,i={model:e.model,prompt:e.prompt,size:e.size??"2K",n:e.n??1,response_format:"url",sequential_image_generation:"disabled",watermark:!0};e.imageUrl&&(i.image=e.imageUrl),e.referenceImages&&e.referenceImages.length>0&&(i.image_urls=e.referenceImages),e.style&&(i.style=e.style),e.quality&&(i.quality=e.quality),e.seed!==void 0&&(i.seed=e.seed),e.guidanceScale!==void 0&&(i.guidance_scale=e.guidanceScale),e.enhancePrompt!==void 0&&(i.enhance_prompt=e.enhancePrompt),e.streamImage&&(i.stream=!0);let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let l=await a.text().catch(()=>"");throw new Error(`Volcengine image API error ${a.status}: ${l}`)}return e.streamImage&&a.body?this.parseStreamingImage(a.body,e,o):{mediaUrls:((await a.json()).data??[]).map(l=>l.url).filter(l=>!!l),model:e.model,size:e.size??"1024x1024",durationMs:Date.now()-o}}async parseStreamingImage(e,t,n){let o=new TextDecoder,s="",i="",a=e.getReader();try{for(;;){let{done:c,value:d}=await a.read();if(c)break;s+=o.decode(d,{stream:!0});let l;for(;(l=s.indexOf(`
33
+ `))!==-1;){let u=s.slice(0,l).trim();if(s=s.slice(l+1),!u||u.startsWith(":")||!u.startsWith("data:"))continue;let p=u.slice(5).trim();if(p==="[DONE]")break;try{let g=JSON.parse(p).data?.[0]?.url;g&&(i=g,t.onProgress?.(50,"streaming"))}catch{}}}}finally{a.releaseLock()}return t.onProgress?.(100,"completed"),{mediaUrls:i?[i]:[],model:t.model,size:t.size??"1024x1024",durationMs:Date.now()-n}}async generateVideo(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v3/contents/generations/tasks`,i=e.referenceVideos?.length??0,a=e.referenceAudios?.length??0,c=e.referenceImages?.length??0,d=!!(e.imageUrl||c>0);if(i>3)throw new Error(`Seedance 2.0: max 3 reference videos (got ${i}). Total duration must be \u226415s.`);if(a>3)throw new Error(`Seedance 2.0: max 3 reference audios (got ${a}). Total duration must be \u226415s.`);if(a>0&&!d&&i===0)throw new Error("Seedance 2.0: reference audio cannot be used alone. Provide at least one reference image or video.");if(e.operation==="edit"&&c>9)throw new Error(`Seedance 2.0 video edit: max 9 reference images (got ${c}).`);let l=[];switch(e.draftTaskId&&l.push({type:"draft_task",id:e.draftTaskId}),e.operation){case"multimodal_reference":{if(e.prompt&&l.push({type:"text",text:e.prompt}),e.referenceImages?.length)for(let w=0;w<e.referenceImages.length;w++){let T=e.imageRoles?.[w]??"reference_image";l.push({type:"image_url",image_url:{url:e.referenceImages[w]},role:T})}if(e.referenceVideos?.length)for(let w of e.referenceVideos)l.push({type:"video_url",video_url:{url:w},role:"reference_video"});if(e.referenceAudios?.length)for(let w of e.referenceAudios)l.push({type:"audio_url",audio_url:{url:w},role:"reference_audio"});break}case"extend":{if(e.sourceVideos?.length)for(let w of e.sourceVideos)l.push({type:"video_url",video_url:{url:w},role:"reference_video"});e.prompt&&l.push({type:"text",text:e.prompt});break}case"merge":for(let w of e.sourceVideos??[])l.push({type:"video_url",video_url:{url:w}});e.prompt&&l.push({type:"text",text:e.prompt});break;case"upscale":e.sourceVideos?.[0]&&l.push({type:"video_url",video_url:{url:e.sourceVideos[0]}}),l.push({type:"text",text:e.prompt||"upscale"});break;case"edit":for(let w of e.sourceVideos??[])l.push({type:"video_url",video_url:{url:w},role:"reference_video"});if(e.referenceImages?.length)for(let w of e.referenceImages)l.push({type:"image_url",image_url:{url:w},role:"reference_image"});e.prompt&&l.push({type:"text",text:e.prompt});break;default:{let w=(e.referenceVideos?.length??0)>0,T=(e.referenceAudios?.length??0)>0,_=(e.imageRoles?.length??0)>0;if(w||T||_){if(e.prompt&&l.push({type:"text",text:e.prompt}),e.referenceImages?.length)for(let R=0;R<e.referenceImages.length;R++){let y=e.imageRoles?.[R]??"reference_image";l.push({type:"image_url",image_url:{url:e.referenceImages[R]},role:y})}if(w)for(let R of e.referenceVideos)l.push({type:"video_url",video_url:{url:R},role:"reference_video"});if(T)for(let R of e.referenceAudios)l.push({type:"audio_url",audio_url:{url:R},role:"reference_audio"})}else if(e.referenceImages?.length){for(let R of e.referenceImages)l.push({type:"image_url",image_url:{url:R}});e.prompt&&l.push({type:"text",text:e.prompt})}else e.imageUrl?(l.push({type:"image_url",image_url:{url:e.imageUrl}}),e.prompt&&l.push({type:"text",text:e.prompt})):e.prompt&&l.push({type:"text",text:e.prompt});break}}let u={model:e.model,content:l};e.duration&&(u.duration=e.duration),e.aspectRatio&&(u.ratio=e.aspectRatio),e.resolution&&(u.resolution=e.resolution),e.seed!==void 0&&(u.seed=e.seed),e.fps&&(u.fps=e.fps),e.generateAudio!==void 0&&(u.generate_audio=e.generateAudio),e.watermark!==void 0&&(u.watermark=e.watermark),e.enhancePrompt!==void 0&&(u.enhance_prompt=e.enhancePrompt),e.cameraFixed!==void 0&&(u.camera_fixed=e.cameraFixed),e.returnLastFrame!==void 0&&(u.return_last_frame=e.returnLastFrame),e.serviceTier&&(u.service_tier=e.serviceTier),e.executionExpiresAfterSeconds!==void 0&&(u.execution_expires_after=e.executionExpiresAfterSeconds),e.draft!==void 0&&(u.draft=e.draft),e.safetyIdentifier&&(u.safety_identifier=e.safetyIdentifier),e.callbackUrl&&(u.callback_url=e.callbackUrl),e.videoTools?.length&&(u.tools=e.videoTools.map(w=>({type:w})));let p=await this.submitTask(s,u,t,n),m=await this.pollTask(`${this.baseUrl}/v3/contents/generations/tasks/${p}`,t,n,e.onProgress,p),g=[],f=m.content;typeof f?.video_url=="string"&&g.push(f.video_url);let b=typeof f?.last_frame_url=="string"?f.last_frame_url:void 0;return{mediaUrls:g,model:e.model,durationMs:Date.now()-o,lastFrameUrl:b,taskId:p}}async generate3D(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v3/contents/generations/tasks`,i=[],a=[];e.outputFormat&&a.push(`--fileformat ${e.outputFormat}`),e.prompt&&a.push(e.prompt),a.length>0&&i.push({type:"text",text:a.join(" ")}),e.imageUrl&&i.push({type:"image_url",image_url:{url:e.imageUrl}});let c={model:e.model,content:i},d=await this.submitTask(s,c,t,n),l=await this.pollTask(`${this.baseUrl}/v3/contents/generations/tasks/${d}`,t,n,e.onProgress,d),u=[],p=l.content;if(typeof p?.video_url=="string"&&u.push(p.video_url),u.length===0&&p)for(let[,g]of Object.entries(p))typeof g=="string"&&/^https?:\/\//.test(g)&&u.push(g);let m=l.output;if(m?.model_urls){let g=m.model_urls;for(let f of Object.values(g))f&&!u.includes(f)&&u.push(f)}if(u.length===0){let g=Object.keys(l),f=p?Object.keys(p):[],b=m?Object.keys(m):[];console.error(`[volcengine-3d] No media URLs found. Response keys: [${g}], content keys: [${f}], output keys: [${b}]`);let w=l.data;if(w?.content){let T=w.content;for(let[,_]of Object.entries(T))typeof _=="string"&&/^https?:\/\//.test(_)&&u.push(_)}}return{mediaUrls:u,model:e.model,durationMs:Date.now()-o,metadata:u.length===0?{debugResponseKeys:Object.keys(l),debugContentKeys:p?Object.keys(p):null,debugContentSample:p?JSON.stringify(p).slice(0,500):null,debugOutputKeys:m?Object.keys(m):null,debugResultSample:JSON.stringify(l).slice(0,800)}:void 0}}async getTaskStatus(e,t,n){let o=`${this.baseUrl}/v3/contents/generations/tasks/${e}`,s=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let c=await s.text().catch(()=>"");throw new Error(`Volcengine task status error ${s.status}: ${c}`)}let i=await s.json();return{status:i.status??"unknown",task:i}}async listVideoTasks(e,t,n){let o=new URLSearchParams;t?.after&&o.set("after",t.after),t?.limit&&o.set("limit",String(t.limit)),t?.status&&o.set("status",t.status);let s=o.toString(),i=`${this.baseUrl}/v3/contents/generations/tasks${s?`?${s}`:""}`,a=await fetch(i,{method:"GET",headers:{Authorization:`Bearer ${e}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`Volcengine list tasks error ${a.status}: ${c}`)}return await a.json()}async deleteVideoTask(e,t,n){let o=`${this.baseUrl}/v3/contents/generations/tasks/${e}`,s=await fetch(o,{method:"DELETE",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Volcengine delete task error ${s.status}: ${i}`)}}async uploadFile(e,t,n,o){let s=`${this.baseUrl}/v3/files`,i=new FormData;i.append("file",e instanceof Blob?e:new Blob([e]),n?.filename??"upload"),i.append("purpose",n?.purpose??"user_data");let a=await fetch(s,{method:"POST",headers:{Authorization:`Bearer ${t}`},body:i,signal:o??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let d=await a.text().catch(()=>"");throw new Error(`Volcengine file upload error ${a.status}: ${d}`)}let c=await a.json();return{id:String(c.id??""),status:String(c.status??"")}}async getFile(e,t,n){let o=`${this.baseUrl}/v3/files/${e}`,s=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Volcengine get file error ${s.status}: ${i}`)}return await s.json()}async listFiles(e,t,n){let o=new URLSearchParams;t?.after&&o.set("after",t.after),t?.limit&&o.set("limit",String(t.limit)),t?.purpose&&o.set("purpose",t.purpose),t?.order&&o.set("order",t.order);let s=o.toString(),i=`${this.baseUrl}/v3/files${s?`?${s}`:""}`,a=await fetch(i,{method:"GET",headers:{Authorization:`Bearer ${e}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`Volcengine list files error ${a.status}: ${c}`)}return await a.json()}async deleteFile(e,t,n){let o=`${this.baseUrl}/v3/files/${e}`,s=await fetch(o,{method:"DELETE",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Volcengine delete file error ${s.status}: ${i}`)}}async submitTask(e,t,n,o){let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(t),signal:o??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let c=await s.text().catch(()=>"");throw new Error(`Volcengine task submit error ${s.status}: ${c}`)}let i=await s.json(),a=i.id??i.task_id;if(!a)throw new Error("Volcengine task submit: no task_id in response");return a}async pollTask(e,t,n,o,s){let i=Date.now()+6e5,a=0;for(;Date.now()<i;){n?.throwIfAborted();let c=await fetch(e,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let m=await c.text().catch(()=>"");throw new Error(`Volcengine task poll error ${c.status}: ${m}`)}let d=await c.json(),l=d.status;if(l==="succeeded"||l==="complete")return o?.(100,"completed",s),d;if(l==="failed"||l==="cancelled"){let m=d.error?.message??"Task failed";throw new Error(`Volcengine task failed: ${m}`)}a++;let u=Date.now()-(i-6e5),p=Math.min(95,Math.round(u/6e5*100));o?.(p,l??"running",s),await new Promise(m=>setTimeout(m,3e3))}throw new Error("Volcengine task timed out after polling")}};import{writeFileSync as Qp,mkdirSync as Zp}from"node:fs";import{join as ga}from"node:path";import{randomUUID as em}from"node:crypto";import{homedir as Xp}from"node:os";import{join as ee}from"node:path";var ke=".qlogicagent";function W(){return process.env.QLOGICAGENT_HOME||ee(Xp(),ke)}function br(){return ee(W(),"sessions")}function ea(r){return ee(br(),r)}function ta(){return ee(W(),"plugins")}function kr(){return ee(W(),"skills")}function yt(){return ee(W(),"settings.json")}function Ce(){return ee(W(),"cache")}function na(){return ee(W(),"debug-logs")}function oa(r){let e=ee(W(),"checkpoints");return r?ee(e,r):e}function ra(){return ee(W(),"plugin-cache")}function sa(){return ee(W(),"mcp.json")}function ia(){return ee(W(),"marketplace.json")}function aa(){return ee(W(),"workflows")}function la(){return ee(W(),"rules")}function Ve(r){return ee(r??process.cwd(),ke)}function ca(r){return ee(Ve(r),"workflows")}function da(r){return ee(Ve(r),"INSTRUCTIONS.md")}function ua(r){return ee(Ve(r),"rules")}function pa(r){return ee(Ve(r),"sessions")}function ma(r){return ee(r,ke,"hooks")}var tm=18e4,Bt=class{supportedTypes=["image","tts"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??tm}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"tts":return this.generateTTS(e,t,n);default:throw new Error(`OpenAIMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateImage(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v1/images/generations`,i={model:e.model,prompt:e.prompt,n:e.n??1,size:e.size??"1024x1024",response_format:"url"};e.quality&&(i.quality=e.quality),e.style&&(i.style=e.style),e.background&&(i.background=e.background);let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let l=await a.text().catch(()=>"");throw new Error(`OpenAI images API error ${a.status}: ${l}`)}return{mediaUrls:((await a.json()).data??[]).map(l=>l.url).filter(l=>!!l),model:e.model,size:e.size??"1024x1024",durationMs:Date.now()-o}}async generateTTS(e,t,n){let o=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("OpenAIMediaTransport: text or prompt is required for TTS");let i=`${this.baseUrl}/v1/audio/speech`,a={model:e.model||"tts-1",input:s,voice:e.voice??"alloy",response_format:e.audioFormat??"mp3"};e.speed!==void 0&&(a.speed=e.speed);let c=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(a),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let m=await c.text().catch(()=>"");throw new Error(`OpenAI TTS API error ${c.status}: ${m}`)}let d=Buffer.from(await c.arrayBuffer()),l=ga(Ce(),"tts");Zp(l,{recursive:!0});let u=`openai-tts-${em()}.mp3`,p=ga(l,u);return Qp(p,d),{mediaUrls:[`file://${p}`],model:e.model||"tts-1",durationMs:Date.now()-o,billingUnit:"per_character",billingQuantity:s.length}}};var rt=class{supportedTypes=["music","video"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/anthropic\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??6e4}async generate(e,t,n){switch(e.mediaType){case"music":return this.generateMusic(e,t,n);case"video":return this.generateVideo(e,t,n);default:throw new Error(`MiniMaxMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateMusic(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v1/music_generation`,i={model:e.model,prompt:e.prompt,output_format:"url"};e.lyrics&&(i.lyrics=e.lyrics),e.duration&&(i.duration=e.duration),(e.isInstrumental||!e.lyrics)&&(i.is_instrumental=!0),e.audioUrl&&(i.audio_url=e.audioUrl),e.lyricsOptimizer&&(i.lyrics_optimizer=!0),(e.audioFormat||e.voice)&&(i.audio_setting={sample_rate:44100,bitrate:256e3,format:e.audioFormat??"mp3"});let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(6e5)});if(!a.ok){let m=await a.text().catch(()=>"");throw new Error(`MiniMax music error ${a.status}: ${m}`)}let c=await a.json();if(c.base_resp?.status_code&&c.base_resp.status_code!==0)throw new Error(`MiniMax music rejected: ${c.base_resp.status_msg??"unknown"}`);let d=c.data?.audio??c.audio_file;if(d)return{mediaUrls:[d],model:e.model,durationMs:Date.now()-o};let l=c.task_id;if(!l)throw new Error("MiniMax music: no audio_file or task_id in response");let u=`${this.baseUrl}/v1/music_generation/${l}`;return{mediaUrls:(await this.pollTask(u,t,n,e.onProgress,l)).audioUrls,model:e.model,durationMs:Date.now()-o}}async pollTask(e,t,n,o,s){let i=Date.now()+6e5;for(;Date.now()<i;){n?.throwIfAborted();let a=await fetch(e,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let u=await a.text().catch(()=>"");throw new Error(`MiniMax music poll error ${a.status}: ${u}`)}let c=await a.json(),d=c.status;if(d==="Success"||d==="Finished"){o?.(100,"completed",s);let u=[];return c.audio_file&&u.push(c.audio_file),{audioUrls:u}}if(d==="Failed"||d==="Cancelled")throw new Error(`MiniMax music task failed: ${c.base_resp?.status_msg??"unknown"}`);let l=Date.now()-(i-6e5);o?.(Math.min(95,Math.round(l/6e5*100)),d??"running",s),await new Promise(u=>setTimeout(u,3e3))}throw new Error("MiniMax music task timed out after polling")}async generateLyrics(e,t,n){let o=`${this.baseUrl}/v1/lyrics_generation`,s=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({prompt:e}),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let a=await s.text().catch(()=>"");throw new Error(`MiniMax lyrics API error ${s.status}: ${a}`)}let i=await s.json();if(i.base_resp?.status_code&&i.base_resp.status_code!==0)throw new Error(`MiniMax lyrics error: ${i.base_resp.status_msg??"unknown"}`);return i.data?.lyrics??""}async generateVideo(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v1/video_generation`,i={model:e.model||"S2V-01",prompt:e.prompt};if(e.referenceImages?.length&&e.imageRoles){let u=e.imageRoles.includes("first_frame"),p=e.imageRoles.includes("last_frame");if(u&&p){let m=e.imageRoles.indexOf("first_frame"),g=e.imageRoles.indexOf("last_frame");i.first_frame_image=e.referenceImages[m],i.last_frame_image=e.referenceImages[g]}else if(u){let m=e.imageRoles.indexOf("first_frame");i.first_frame_image=e.referenceImages[m]}else i.subject_reference=e.referenceImages.map((m,g)=>({type:"character",image:m}))}else e.imageUrl&&(i.first_frame_image=e.imageUrl);e.callbackUrl&&(i.callback_url=e.callbackUrl);let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let u=await a.text().catch(()=>"");throw new Error(`MiniMax video submit error ${a.status}: ${u}`)}let c=await a.json();if(c.base_resp?.status_code&&c.base_resp.status_code!==0)throw new Error(`MiniMax video rejected: ${c.base_resp.status_msg??"unknown"}`);let d=c.task_id;if(!d)throw new Error("MiniMax video: no task_id in response");let l=await this.pollVideoTask(d,t,n,e.onProgress);return{mediaUrls:l.downloadUrl?[l.downloadUrl]:[],model:e.model||"S2V-01",durationMs:Date.now()-o,taskId:d,metadata:{fileId:l.fileId,width:l.width,height:l.height}}}async pollVideoTask(e,t,n,o){let s=Date.now()+6e5;for(;Date.now()<s;){n?.throwIfAborted();let i=`${this.baseUrl}/v1/query/video_generation?task_id=${encodeURIComponent(e)}`,a=await fetch(i,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let m=await a.text().catch(()=>"");throw new Error(`MiniMax video poll error ${a.status}: ${m}`)}let c=await a.json();if(c.base_resp?.status_code&&c.base_resp.status_code!==0)throw new Error(`MiniMax video task error ${c.base_resp.status_code}: ${c.base_resp.status_msg??""}`);let d=c.status;if(d==="Success"){o?.(100,"completed",e);let m;if(c.file_id)try{m=await this.getFileDownloadUrl(c.file_id,t,n)}catch{}return{fileId:c.file_id,downloadUrl:m,width:c.video_width,height:c.video_height}}if(d==="Fail")throw new Error(`MiniMax video task failed: ${c.base_resp?.status_msg??"unknown"}`);let l=d??"running",u=Date.now()-(s-6e5),p=Math.min(95,Math.round(u/6e5*100));o?.(p,l,e),await new Promise(m=>setTimeout(m,3e3))}throw new Error("MiniMax video task timed out after polling")}async getFileDownloadUrl(e,t,n){let o=`${this.baseUrl}/v1/files/retrieve?file_id=${encodeURIComponent(e)}`,s=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let c=await s.text().catch(()=>"");throw new Error(`MiniMax file retrieve error ${s.status}: ${c}`)}let a=(await s.json()).file?.download_url;if(!a)throw new Error("MiniMax file retrieve: no download_url in response");return a}async getTaskStatus(e,t,n){let o=`${this.baseUrl}/v1/query/video_generation?task_id=${encodeURIComponent(e)}`,s=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let d=await s.text().catch(()=>"");throw new Error(`MiniMax task status error ${s.status}: ${d}`)}let i=await s.json(),a=i.status??"unknown";return{status:a==="Success"?"succeeded":a==="Fail"?"failed":a.toLowerCase(),task:i}}async listVideoTasks(e,t,n){return{data:[]}}async deleteVideoTask(e,t,n){throw new Error("MiniMax does not support video task cancellation.")}};import{writeFileSync as ha,mkdirSync as ya}from"node:fs";import{join as Pn}from"node:path";import{randomUUID as ba}from"node:crypto";import{writeFileSync as nm,mkdirSync as om}from"node:fs";import{join as fa}from"node:path";import{randomUUID as rm}from"node:crypto";var An=class{ws=null;wsUrl;model="models/lyria-realtime-exp";onAudioChunk=null;onFilteredPrompt=null;onError=null;onClose=null;constructor(e){let t=e.baseUrl.replace(/\/+$/,""),n=new URL(t).origin.replace(/^http/,"ws");this.wsUrl=`${n}/ws/google.ai.generativelanguage.v1alpha.GenerativeService.BidiGenerateContent`}async connect(e,t){t.model&&(this.model=t.model.startsWith("models/")?t.model:`models/${t.model}`);let n=`${this.wsUrl}?key=${encodeURIComponent(e)}`,o=new WebSocket(n);this.ws=o,await new Promise((s,i)=>{let a=()=>{o.removeEventListener("error",c),s()},c=()=>{o.removeEventListener("open",a),i(new Error("Lyria RealTime WebSocket connection failed"))};o.addEventListener("open",a,{once:!0}),o.addEventListener("error",c,{once:!0})}),o.addEventListener("message",s=>this.handleMessage(s)),o.addEventListener("error",()=>{this.onError?.(new Error("Lyria RealTime WebSocket error"))}),o.addEventListener("close",()=>{this.ws=null,this.onClose?.()}),this.send({setup:{model:this.model}}),await new Promise(s=>setTimeout(s,100)),await this.setWeightedPrompts(t.prompts),t.config&&await this.setMusicGenerationConfig(t.config)}async setWeightedPrompts(e){this.send({musicInput:{weightedPrompts:e.map(t=>({text:t.text,weight:t.weight}))}})}async setMusicGenerationConfig(e){let t={};e.bpm!==void 0&&(t.bpm=e.bpm),e.density!==void 0&&(t.density=e.density),e.brightness!==void 0&&(t.brightness=e.brightness),e.guidance!==void 0&&(t.guidance=e.guidance),e.scale!==void 0&&(t.scale=e.scale),e.temperature!==void 0&&(t.temperature=e.temperature),e.topK!==void 0&&(t.top_k=e.topK),e.seed!==void 0&&(t.seed=e.seed),e.muteBass!==void 0&&(t.mute_bass=e.muteBass),e.muteDrums!==void 0&&(t.mute_drums=e.muteDrums),e.onlyBassAndDrums!==void 0&&(t.only_bass_and_drums=e.onlyBassAndDrums),e.musicGenerationMode!==void 0&&(t.music_generation_mode=e.musicGenerationMode),e.audioFormat!==void 0&&(t.audio_format=e.audioFormat),e.sampleRateHz!==void 0&&(t.sample_rate_hz=e.sampleRateHz),this.send({musicInput:{musicGenerationConfig:t}})}async play(){this.send({musicInput:{playbackControl:"PLAY"}})}async pause(){this.send({musicInput:{playbackControl:"PAUSE"}})}async stop(){this.send({musicInput:{playbackControl:"STOP"}})}async resetContext(){this.send({musicInput:{playbackControl:"RESET_CONTEXT"}})}close(){this.ws&&this.ws.readyState!==WebSocket.CLOSED&&this.ws.close(),this.ws=null}get connected(){return this.ws!==null&&this.ws.readyState===WebSocket.OPEN}send(e){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("Lyria RealTime session not connected");this.ws.send(JSON.stringify(e))}handleMessage(e){let t;try{t=JSON.parse(typeof e.data=="string"?e.data:e.data.toString())}catch{return}let n=t.serverContent;if(!n)return;let o=n.audioChunks;if(o&&this.onAudioChunk)for(let i of o)i.data&&this.onAudioChunk({data:Buffer.from(i.data,"base64")});let s=n.filteredPrompt;s&&this.onFilteredPrompt?.(s)}};async function Tr(r,e,t){let n=t.durationSeconds??30,o=Date.now(),s=new An(e),i=[];s.onAudioChunk=c=>{i.push(c.data)};let a=null;s.onError=c=>{a=c};try{await s.connect(r,{model:t.model??"lyria-realtime-exp",prompts:t.prompts,config:t.musicConfig}),t.onProgress?.(5,"connected"),await s.play(),t.onProgress?.(10,"streaming");let c=Date.now()+n*1e3,d=500;for(;Date.now()<c;){if(t.signal?.throwIfAborted(),a)throw a;if(!s.connected)break;let f=Date.now()-o,b=n*1e3,w=Math.min(95,Math.round(10+f/b*85));t.onProgress?.(w,"streaming"),await new Promise(T=>setTimeout(T,d))}s.connected&&await s.stop(),t.onProgress?.(98,"assembling");let l=Buffer.concat(i),u=sm(l,48e3,2,16),p=fa(Ce(),"gemini-music-realtime");om(p,{recursive:!0});let m=`lyria-rt-${rm()}.wav`,g=fa(p,m);return nm(g,u),t.onProgress?.(100,"completed"),{filePath:`file://${g}`,durationMs:Date.now()-o}}finally{s.close()}}function sm(r,e,t,n){let o=e*t*(n/8),s=t*(n/8),i=r.length,a=Buffer.alloc(44);return a.write("RIFF",0),a.writeUInt32LE(36+i,4),a.write("WAVE",8),a.write("fmt ",12),a.writeUInt32LE(16,16),a.writeUInt16LE(1,20),a.writeUInt16LE(t,22),a.writeUInt32LE(e,24),a.writeUInt32LE(o,28),a.writeUInt16LE(s,30),a.writeUInt16LE(n,32),a.write("data",36),a.writeUInt32LE(i,40),Buffer.concat([a,r])}var im=18e4,am=1e4,wr=6e5,Gt=class{supportedTypes=["image","video","music","music_realtime","tts","embedding"];apiBase;timeoutMs;constructor(e){this.apiBase=e.baseUrl.replace(/\/openai\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??im}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"video":return this.generateVideo(e,t,n);case"music":return this.generateMusic(e,t,n);case"music_realtime":return this.generateMusicRealtime(e,t,n);case"tts":return this.generateTTS(e,t,n);case"embedding":return this.generateEmbedding(e,t,n);default:throw new Error(`GeminiMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async deleteVideoTask(e,t,n){throw new Error("Gemini does not support deleting video generation tasks")}async listVideoTasks(e,t,n){return{data:[]}}async getTaskStatus(e,t,n){let o=`${this.apiBase}/${e}`,s=await fetch(o,{method:"GET",headers:{"x-goog-api-key":t},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let c=await s.text().catch(()=>"");throw new Error(`Gemini operation query error ${s.status}: ${c}`)}let i=await s.json();return{status:i.done?"completed":"running",task:i}}async generateImage(e,t,n){let o=Date.now(),s=`${this.apiBase}/models/${e.model}:generateContent`,i={responseModalities:["TEXT","IMAGE"]};e.aspectRatio&&(i.aspectRatio=e.aspectRatio);let a={contents:[{parts:[{text:e.prompt}]}],generationConfig:i},c=await this.postJson(s,a,t,n);return{mediaUrls:this.extractInlineImages(c),model:e.model,durationMs:Date.now()-o}}async generateVideo(e,t,n){let o=Date.now(),s=`${this.apiBase}/models/${e.model}:predictLongRunning`,i={prompt:e.prompt};e.imageUrl&&(i.image={inlineData:await this.resolveImageData(e.imageUrl)}),e.referenceImages?.length&&(i.referenceImages=await Promise.all(e.referenceImages.map(async b=>({image:{inlineData:await this.resolveImageData(b)},referenceType:"asset"}))));let a={};e.aspectRatio&&(a.aspectRatio=e.aspectRatio),e.resolution&&(a.resolution=e.resolution),e.duration&&(a.durationSeconds=String(e.duration)),e.n&&(a.numberOfVideos=e.n),e.seed!==void 0&&(a.seed=e.seed);let c={instances:[i]};Object.keys(a).length>0&&(c.parameters=a);let l=(await this.postJson(s,c,t,n)).name;if(!l)throw new Error("Gemini video submit: no operation name in response");let u=l;e.onProgress?.(5,"submitted",u);let g=(await this.pollOperation(l,t,n,e.onProgress,u)).response?.generateVideoResponse?.generatedSamples??[],f=[];for(let b of g)b.video?.uri&&f.push(b.video.uri);return{mediaUrls:f,model:e.model,durationMs:Date.now()-o,taskId:u}}async generateMusic(e,t,n){let o=Date.now(),s=`${this.apiBase}/models/${e.model}:generateContent`,i=[{text:e.prompt}],a={};e.audioFormat==="wav"&&(a.responseModalities=["AUDIO","TEXT"],a.responseFormat={audio:{mimeType:"audio/wav"}});let c={contents:[{parts:i}]};Object.keys(a).length>0&&(c.generationConfig=a);let d=await this.postJson(s,c,t,n);return{mediaUrls:this.extractInlineAudio(d,"gemini-music"),model:e.model,durationMs:Date.now()-o}}async generateMusicRealtime(e,t,n){let o=await Tr(t,{baseUrl:this.apiBase},{prompts:[{text:e.prompt,weight:1}],durationSeconds:e.duration??30,musicConfig:{audioFormat:e.audioFormat==="wav"?"pcm16":void 0,sampleRateHz:48e3},model:e.model,signal:n,onProgress:e.onProgress});return{mediaUrls:[o.filePath],model:e.model,durationMs:o.durationMs}}async generateTTS(e,t,n){let o=Date.now(),s=`${this.apiBase}/models/${e.model}:generateContent`,i={responseModalities:["AUDIO"]};e.voice&&(i.speechConfig={voiceConfig:{prebuiltVoiceConfig:{voiceName:e.voice}}});let a={contents:[{parts:[{text:e.text??e.prompt}]}],generationConfig:i},c=await this.postJson(s,a,t,n);return{mediaUrls:this.extractInlineAudio(c,"gemini-tts"),model:e.model,durationMs:Date.now()-o}}async generateEmbedding(e,t,n){let o=Date.now(),s=`${this.apiBase}/models/${e.model}:embedContent`,i={content:{parts:[{text:e.text??e.prompt}]}},a=e.metadata?.outputDimensionality;a!==void 0&&(i.output_dimensionality=a);let d=(await this.postJson(s,i,t,n)).embeddings?.[0]?.values??[];return{mediaUrls:[],model:e.model,durationMs:Date.now()-o,metadata:{embedding:d,dimensions:d.length}}}async postJson(e,t,n,o){let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json","x-goog-api-key":n},body:JSON.stringify(t),signal:o??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Gemini API error ${s.status}: ${i}`)}return s.json()}async pollOperation(e,t,n,o,s){let i=Date.now()+wr;for(;Date.now()<i;){n?.throwIfAborted();let a=`${this.apiBase}/${e}`,c=await fetch(a,{method:"GET",headers:{"x-goog-api-key":t},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let p=await c.text().catch(()=>"");throw new Error(`Gemini operation poll error ${c.status}: ${p}`)}let d=await c.json();if(d.done===!0)return o?.(100,"completed",s),d;if(d.error){let p=d.error;throw new Error(`Gemini video generation failed: ${p.message??JSON.stringify(p)}`)}let l=Date.now()-(i-wr),u=Math.min(95,Math.round(l/wr*100));o?.(u,"running",s),await new Promise(p=>setTimeout(p,am))}throw new Error("Gemini video generation timed out after polling")}async resolveImageData(e){if(e.startsWith("data:")){let s=e.match(/^data:([^;]+);base64,(.+)$/);if(s)return{mimeType:s[1],data:s[2]}}if(e.startsWith("file://")){let{readFileSync:s}=await import("node:fs"),i=e.replace(/^file:\/\//,""),a=s(i).toString("base64"),c=i.split(".").pop()?.toLowerCase()??"png";return{mimeType:c==="jpg"||c==="jpeg"?"image/jpeg":c==="webp"?"image/webp":"image/png",data:a}}let t=await fetch(e,{signal:AbortSignal.timeout(6e4)});if(!t.ok)throw new Error(`Failed to fetch image ${e}: ${t.status}`);let n=Buffer.from(await t.arrayBuffer());return{mimeType:t.headers.get("content-type")??"image/png",data:n.toString("base64")}}extractInlineImages(e){let t=[],n=Pn(Ce(),"gemini-images");ya(n,{recursive:!0});for(let o of e.candidates??[])for(let s of o.content?.parts??[])if(s.inlineData?.data){let i=s.inlineData.mimeType==="image/png"?"png":s.inlineData.mimeType==="image/webp"?"webp":"jpg",a=`gemini-${ba()}.${i}`,c=Pn(n,a);ha(c,Buffer.from(s.inlineData.data,"base64")),t.push(`file://${c}`)}return t}extractInlineAudio(e,t){let n=[],o=Pn(Ce(),t);ya(o,{recursive:!0});for(let s of e.candidates??[])for(let i of s.content?.parts??[])if(i.inlineData?.data&&i.inlineData.mimeType?.startsWith("audio/")){let a=i.inlineData.mimeType.includes("wav")?"wav":i.inlineData.mimeType.includes("mpeg")||i.inlineData.mimeType.includes("mp3")?"mp3":"pcm",c=Buffer.from(i.inlineData.data,"base64"),d=a==="pcm"?lm(c,24e3,1,16):c,l=`gemini-${ba()}.${a==="pcm"?"wav":a}`,u=Pn(o,l);ha(u,d),n.push(`file://${u}`)}return n}};function lm(r,e,t,n){let o=e*t*(n/8),s=t*(n/8),i=r.length,a=Buffer.alloc(44);return a.write("RIFF",0),a.writeUInt32LE(36+i,4),a.write("WAVE",8),a.write("fmt ",12),a.writeUInt32LE(16,16),a.writeUInt16LE(1,20),a.writeUInt16LE(t,22),a.writeUInt32LE(e,24),a.writeUInt32LE(o,28),a.writeUInt16LE(s,30),a.writeUInt16LE(n,32),a.write("data",36),a.writeUInt32LE(i,40),Buffer.concat([a,r])}var Mn=class{supportedTypes=["tts","video"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/apps\/anthropic\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??3e4}async generate(e,t,n){if(e.mediaType==="video")return this.generateVideo(e,t,n);if(e.mediaType!=="tts")throw new Error(`QwenMediaTransport: unsupported mediaType "${e.mediaType}"`);let o=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("QwenMediaTransport: text or prompt is required for TTS");let i=`${this.baseUrl}/api/v1/services/aigc/text2audio/generation`,a={format:e.audioFormat??"mp3",sample_rate:24e3},c={text:s};e.voice&&(c.voice=e.voice),e.speed!==void 0&&(a.speech_rate=e.speed);let d={model:e.model||"qwen3-tts-voicedesign",input:c,parameters:a},l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`,"X-DashScope-Async":"enable"},body:JSON.stringify(d),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let g=await l.text().catch(()=>"");throw new Error(`DashScope TTS submit error ${l.status}: ${g}`)}let u=await l.json();if(u.code)throw new Error(`DashScope TTS submit rejected: ${u.code} \u2014 ${u.message??""}`);let p=u.output?.task_id;if(!p)throw new Error("DashScope TTS submit: no task_id in response");if(u.output?.task_status==="SUCCEEDED"){let g=this.extractMediaUrl(u);return{mediaUrls:g?[g]:[],model:e.model,durationMs:Date.now()-o}}return{mediaUrls:await this.pollTask(p,t,n,e.onProgress),model:e.model,durationMs:Date.now()-o}}async pollTask(e,t,n,o,s=12e4){let i=Date.now()+s,a=`${this.baseUrl}/api/v1/tasks/${e}`;for(;Date.now()<i;){n?.throwIfAborted(),await cm(2e3);let c=await fetch(a,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let p=await c.text().catch(()=>"");throw new Error(`DashScope TTS poll error ${c.status}: ${p}`)}let d=await c.json();if(d.code)throw new Error(`DashScope poll rejected: ${d.code} \u2014 ${d.message??""}`);let l=d.output?.task_status;if(l==="SUCCEEDED"){o?.(100,"completed",e);let p=this.extractMediaUrl(d);return p?[p]:[]}if(l==="FAILED")throw new Error(`DashScope task failed: ${d.message??"unknown error"}`);let u=Date.now()-(i-s);o?.(Math.min(95,Math.round(u/s*100)),l??"running",e)}throw new Error("DashScope task timed out")}async generateVideo(e,t,n){let o=Date.now(),s=e.model||"wan2.1-t2v-turbo",i={prompt:e.prompt};if(e.imageUrl)i.img_url=e.imageUrl;else if(e.referenceImages?.length)if(e.imageRoles){let g=e.imageRoles.indexOf("first_frame"),f=e.imageRoles.indexOf("last_frame");g>=0&&(i.img_url=e.referenceImages[g]),f>=0&&(i.tail_image_url=e.referenceImages[f]);let b=e.imageRoles.map((w,T)=>w==="reference_image"?T:-1).filter(w=>w>=0);b.length>0&&(i.ref_image_url=e.referenceImages[b[0]])}else i.img_url=e.referenceImages[0];let a={};e.duration&&(a.duration=e.duration),e.resolution&&(a.resolution=e.resolution),e.aspectRatio&&(a.ratio=e.aspectRatio),e.metadata?.size&&(a.size=e.metadata.size);let c=`${this.baseUrl}/api/v1/services/aigc/generation/generation`,d={model:s,input:i};Object.keys(a).length>0&&(d.parameters=a);let l=await fetch(c,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`,"X-DashScope-Async":"enable"},body:JSON.stringify(d),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let g=await l.text().catch(()=>"");throw new Error(`DashScope video submit error ${l.status}: ${g}`)}let u=await l.json();if(u.code)throw new Error(`DashScope video submit rejected: ${u.code} \u2014 ${u.message??""}`);let p=u.output?.task_id;if(!p)throw new Error("DashScope video submit: no task_id in response");return{mediaUrls:await this.pollTask(p,t,n,e.onProgress,6e5),model:s,durationMs:Date.now()-o,taskId:p}}async getTaskStatus(e,t,n){let o=`${this.baseUrl}/api/v1/tasks/${e}`,s=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let l=await s.text().catch(()=>"");throw new Error(`DashScope task status error ${s.status}: ${l}`)}let i=await s.json(),c=i.output?.task_status??"unknown";return{status:c==="SUCCEEDED"?"succeeded":c==="FAILED"?"failed":c.toLowerCase(),task:i}}async listVideoTasks(e,t,n){let o=new URLSearchParams;o.set("page_size",String(t?.limit??20)),t?.status&&o.set("status",t.status.toUpperCase());let s=`${this.baseUrl}/api/v1/tasks?${o.toString()}`,i=await fetch(s,{method:"GET",headers:{Authorization:`Bearer ${e}`},signal:n??AbortSignal.timeout(this.timeoutMs)});return i.ok?await i.json():{data:[]}}async deleteVideoTask(e,t,n){throw new Error("DashScope does not support task cancellation.")}extractMediaUrl(e){if(e.output?.video_url)return e.output.video_url;if(e.output?.audio_url)return e.output.audio_url;if(e.output?.results?.[0]?.url)return e.output.results[0].url}};function cm(r){return new Promise(e=>setTimeout(e,r))}import{writeFileSync as dm,mkdirSync as um}from"node:fs";import{join as ka}from"node:path";import{randomUUID as pm}from"node:crypto";var mm=18e4,gm=3e3,In=6e5,fm=new Set(["glm-image"]),Wt=class{supportedTypes=["image","video","tts","stt","embedding","voice_clone","document_parsing","rerank"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??mm}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"video":return this.generateVideo(e,t,n);case"tts":return this.generateTTS(e,t,n);case"stt":return this.generateSTT(e,t,n);case"embedding":return this.generateEmbedding(e,t,n);case"voice_clone":return this.generateVoiceClone(e,t,n);case"document_parsing":return this.generateDocumentParsing(e,t,n);case"rerank":return this.generateRerank(e,t,n);default:throw new Error(`ZhipuMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateImage(e,t,n){return fm.has(e.model)?this.generateImageAsync(e,t,n):this.generateImageSync(e,t,n)}async generateImageSync(e,t,n){let o=Date.now(),s=`${this.baseUrl}/images/generations`,i={model:e.model,prompt:e.prompt};return e.size&&(i.size=e.size),e.quality&&e.model.startsWith("cogview-4")&&(i.quality=e.quality),{mediaUrls:((await this.postJSON(s,i,t,n)).data??[]).map(l=>l.url).filter(l=>!!l),model:e.model,size:e.size,durationMs:Date.now()-o}}async generateImageAsync(e,t,n){let o=Date.now(),s=`${this.baseUrl}/async/images/generations`,i={model:e.model,prompt:e.prompt};e.size&&(i.size=e.size),e.quality&&(i.quality=e.quality);let c=(await this.postJSON(s,i,t,n)).id;if(!c)throw new Error("Zhipu async image: no task id in response");return{mediaUrls:((await this.pollAsyncResult(c,t,n,e.onProgress)).data??[]).map(p=>p.url).filter(p=>!!p),model:e.model,size:e.size,durationMs:Date.now()-o}}async generateVideo(e,t,n){let o=Date.now(),s=`${this.baseUrl}/videos/generations`,i={model:e.model,prompt:e.prompt};e.imageUrl&&(i.image_url=e.imageUrl),e.size&&(i.size=e.size),e.duration&&(i.duration=e.duration);let c=(await this.postJSON(s,i,t,n)).id;if(!c)throw new Error("Zhipu video generation: no task id in response");return{mediaUrls:((await this.pollAsyncResult(c,t,n,e.onProgress)).video_result??[]).map(p=>p.url).filter(p=>!!p),model:e.model,durationMs:Date.now()-o}}async generateTTS(e,t,n){let o=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("ZhipuMediaTransport: text or prompt required for TTS");let i=`${this.baseUrl}/audio/speech`,a={model:e.model||"glm-tts",input:s};e.voice&&(a.voice=e.voice),e.speed!==void 0&&(a.speed=e.speed),e.audioFormat&&(a.response_format=e.audioFormat);let c=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(a),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let g=await c.text().catch(()=>"");throw new Error(`Zhipu TTS API error ${c.status}: ${g}`)}let d=Buffer.from(await c.arrayBuffer()),l=ka(Ce(),"tts");um(l,{recursive:!0});let u=e.audioFormat??"wav",p=`zhipu-tts-${pm()}.${u}`,m=ka(l,p);return dm(m,d),{mediaUrls:[`file://${m}`],model:e.model||"glm-tts",durationMs:Date.now()-o,billingUnit:"per_character",billingQuantity:s.length}}async generateSTT(e,t,n){let o=Date.now();if(!e.audioUrl)throw new Error("ZhipuMediaTransport: audioUrl required for STT");let s=`${this.baseUrl}/audio/transcriptions`,i=await fetch(e.audioUrl,{headers:{"User-Agent":"qlogicagent/1.0"},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!i.ok)throw new Error(`Failed to fetch audio from ${e.audioUrl}`);let a=await i.blob(),c=new FormData;c.append("model",e.model||"glm-asr-2512"),c.append("file",a,"audio.wav");let d=await fetch(s,{method:"POST",headers:{Authorization:`Bearer ${t}`},body:c,signal:n??AbortSignal.timeout(this.timeoutMs)});if(!d.ok){let u=await d.text().catch(()=>"");throw new Error(`Zhipu STT API error ${d.status}: ${u}`)}let l=await d.json();return{mediaUrls:[],model:e.model||"glm-asr-2512",durationMs:Date.now()-o,metadata:{transcription:l.text??""}}}async generateEmbedding(e,t,n){let o=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("ZhipuMediaTransport: text or prompt required for embedding");let i=`${this.baseUrl}/embeddings`,a={model:e.model||"embedding-3",input:s},d=(await this.postJSON(i,a,t,n)).data??[];return{mediaUrls:[],model:e.model||"embedding-3",durationMs:Date.now()-o,metadata:{embeddings:d.map(l=>l.embedding).filter(Boolean)}}}async generateVoiceClone(e,t,n){let o=Date.now();if(!e.audioUrl)throw new Error("ZhipuMediaTransport: audioUrl required for voice_clone (sample audio)");let s=await fetch(e.audioUrl,{signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok)throw new Error(`Failed to fetch audio sample from ${e.audioUrl}`);let i=await s.blob(),a=new FormData;a.append("model",e.model||"glm-tts-clone"),a.append("file",i,"sample.wav"),(e.text||e.prompt)&&a.append("text",e.text||e.prompt||"");let c=`${this.baseUrl}/voice/clone`,d=await fetch(c,{method:"POST",headers:{Authorization:`Bearer ${t}`},body:a,signal:n??AbortSignal.timeout(this.timeoutMs)});if(!d.ok){let p=await d.text().catch(()=>"");throw new Error(`Zhipu Voice Clone API error ${d.status}: ${p}`)}let l=await d.json();return{mediaUrls:(l.data??[]).map(p=>p.url).filter(p=>!!p),model:e.model||"glm-tts-clone",durationMs:Date.now()-o,metadata:{voiceId:l.voice_id}}}async generateDocumentParsing(e,t,n){let o=Date.now(),s=e.imageUrl||e.audioUrl;if(!s&&!e.prompt)throw new Error("ZhipuMediaTransport: imageUrl/audioUrl (file URL) or prompt (base64) required for document_parsing");let i=`${this.baseUrl}/layout_parsing`,a={model:e.model||"glm-ocr"};s?a.file_url=s:e.prompt&&(a.content=e.prompt);let l=(await this.postJSON(i,a,t,n)).pages??[];return{mediaUrls:[],model:e.model||"glm-ocr",durationMs:Date.now()-o,metadata:{pages:l.map(u=>({pageNum:u.page_num,content:u.content,layouts:u.layouts}))}}}async generateRerank(e,t,n){let o=Date.now(),s=e.prompt;if(!s)throw new Error("ZhipuMediaTransport: prompt (query) required for rerank");if(!e.metadata?.documents)throw new Error("ZhipuMediaTransport: metadata.documents required for rerank");let i=`${this.baseUrl}/rerank`,a={model:e.model||"rerank",query:s,documents:e.metadata.documents};e.metadata.topN!==void 0&&(a.top_n=e.metadata.topN);let c=await this.postJSON(i,a,t,n);return{mediaUrls:[],model:e.model||"rerank",durationMs:Date.now()-o,metadata:{results:(c.results??[]).map(d=>({index:d.index,relevanceScore:d.relevance_score,document:d.document}))}}}async postJSON(e,t,n,o){let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(t),signal:o??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Zhipu API error ${s.status}: ${i}`)}return s.json()}async pollAsyncResult(e,t,n,o){let s=Date.now()+In,i=`${this.baseUrl}/async-result/${encodeURIComponent(e)}`;for(;Date.now()<s;){n?.throwIfAborted();let a=await fetch(i,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let l=await a.text().catch(()=>"");throw new Error(`Zhipu async-result error ${a.status}: ${l}`)}let c=await a.json();if(c.task_status==="SUCCESS")return o?.(100,"completed",e),c;if(c.task_status==="FAIL")throw new Error("Zhipu async task failed");let d=Date.now()-(s-In);o?.(Math.min(95,Math.round(d/In*100)),c.task_status??"running",e),await new Promise(l=>setTimeout(l,gm))}throw new Error(`Zhipu async task timed out after ${In/1e3}s`)}async getTaskStatus(e,t,n){let o=`${this.baseUrl}/async-result/${encodeURIComponent(e)}`,s=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let d=await s.text().catch(()=>"");throw new Error(`Zhipu task query error ${s.status}: ${d}`)}let i=await s.json(),a=i.task_status??"unknown";return{status:a==="SUCCESS"?"succeeded":a==="FAIL"?"failed":a==="PROCESSING"?"running":a.toLowerCase(),task:i}}async listVideoTasks(e,t,n){return{data:[]}}async deleteVideoTask(e,t,n){throw new Error("Zhipu does not support task cancellation. Tasks complete or timeout automatically.")}async listVoices(e,t){let n=`${this.baseUrl}/voice/`,o=await fetch(n,{method:"GET",headers:{Authorization:`Bearer ${e}`},signal:t??AbortSignal.timeout(this.timeoutMs)});if(!o.ok){let i=await o.text().catch(()=>"");throw new Error(`Zhipu voice list error ${o.status}: ${i}`)}return(await o.json()).data??[]}async deleteVoice(e,t,n){let o=`${this.baseUrl}/voice/${encodeURIComponent(e)}`,s=await fetch(o,{method:"DELETE",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Zhipu voice delete error ${s.status}: ${i}`)}}};var Ht=class{registry;transports=new Map;constructor(e){this.registry=e.registry}resolveModelById(e,t,n){let o=this.registry.getProvider(e);if(!o)return;let i=this.registry.listModels(e).find(a=>a.id===t&&a.mediaType===n);if(i)return{providerId:e,providerDef:o,modelInfo:i,mediaType:n}}getTransport(e){let t=this.transports.get(e);if(t)return t;let n=this.registry.getProvider(e);if(!n)return;let o=bm(n);if(o)return this.transports.set(e,o),o}listMediaModels(e){let t=[];for(let n of this.registry.listProviders()){let o=this.registry.listModels(n.id);for(let s of o)s.mediaType&&(!e||s.mediaType===e)&&t.push({providerId:n.id,providerDef:n,modelInfo:s,mediaType:s.mediaType})}return t}findModelInProvider(e,t,n){let o=this.registry.getProvider(e);if(!o)return;let s=this.registry.listModels(e),i=n?hm(n):void 0,a=s.find(c=>c.mediaType!==t?!1:!i||!c.mediaCapabilities?!0:ym(c.mediaCapabilities,i));if(a)return{providerId:e,providerDef:o,modelInfo:a,mediaType:t}}};function hm(r){switch(r.mediaType){case"video":return r.operation==="merge"?"merge":r.operation==="upscale"?"upscale":r.operation==="edit"?"edit":r.imageUrl?"img2video":"text2video";case"image":return r.operation==="edit"?"inpainting":r.imageUrl?"img2img":"text2image";case"music":return r.audioUrl?"cover":"text2music";case"music_realtime":return"realtime";case"tts":return"text2speech";case"3d":return r.imageUrl?"img2_3d":"text2_3d";default:return}}function ym(r,e){return!("operations"in r)||!r.operations?!0:r.operations.includes(e)}function bm(r){let e=r.baseUrl;switch(r.id){case"volcengine":return new Re({baseUrl:e});case"openai":return new Bt({baseUrl:e});case"minimax":return new rt({baseUrl:e});case"google":return new Gt({baseUrl:e});case"qwen":return new Mn({baseUrl:e});case"zhipu":return new Wt({baseUrl:e.replace(/\/api\/anthropic\/?$/,"/api/paas/v4")});case"zhipu-openai":case"zhipu-coding":return new Wt({baseUrl:e.replace(/\/api\/coding\/paas\/v4\/?$/,"/api/paas/v4")});default:return}}var vr=[{id:"deepseek",name:"DeepSeek",transport:"anthropic-messages",baseUrl:"https://api.deepseek.com/anthropic",apiKeyEnvVars:["DEEPSEEK_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"deepseek-v4-flash",quirks:{useEffortInsteadOfBudget:!0,filterImageBlocks:!0,maxReasoningEffort:"max",supportsPrefixCompletion:!0},models:[{id:"deepseek-v4-flash",name:"DeepSeek V4 Flash",contextWindow:1e6,maxOutput:384e3,toolCall:!0,reasoning:!0,vision:!1,costInput:.14,costOutput:.28,costCacheRead:.003},{id:"deepseek-v4-pro",name:"DeepSeek V4 Pro",contextWindow:1e6,maxOutput:384e3,toolCall:!0,reasoning:!0,vision:!1,costInput:1.74,costOutput:3.48,costCacheRead:.014}]},{id:"qwen",name:"Alibaba Qwen (DashScope)",transport:"anthropic-messages",baseUrl:"https://dashscope.aliyuncs.com/apps/anthropic",apiKeyEnvVars:["DASHSCOPE_API_KEY","QWEN_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"qwen3.6-plus",models:[{id:"qwen3.6-max-preview",name:"Qwen3.6 Max (Preview)",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:2,costOutput:8,costCacheRead:.2,costCacheWrite:2.5},{id:"qwen3.6-plus",name:"Qwen3.6 Plus",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:3,costCacheRead:.05,costCacheWrite:.625},{id:"qwen3.6-flash",name:"Qwen3.6 Flash",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.1,costOutput:.5,costCacheRead:.01,costCacheWrite:.125},{id:"qwq-plus",name:"QwQ Plus",contextWindow:131072,maxOutput:65536,toolCall:!0,reasoning:!0,reasoningRequired:!0,streamRequired:!0,vision:!1,costInput:.5,costOutput:3,costCacheRead:.05,costCacheWrite:.625},{id:"qwen-max",name:"Qwen Max",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:2,costOutput:6,costCacheRead:.2,costCacheWrite:2.5},{id:"qwen-plus",name:"Qwen Plus",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:.85,costCacheRead:.03,costCacheWrite:.375},{id:"qwen-flash",name:"Qwen Flash",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1},{id:"qwen-turbo",name:"Qwen Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!1},{id:"qwen-vl-max",name:"Qwen VL Max",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:3,costOutput:8.5},{id:"qwen3.5-omni-plus",name:"Qwen3.5 Omni Plus",contextWindow:131072,maxOutput:16384,toolCall:!1,reasoning:!1,streamRequired:!0,vision:!0},{id:"qwen-vl-ocr",name:"Qwen VL OCR",contextWindow:131072,maxOutput:4096,toolCall:!1,reasoning:!1,vision:!0,mediaType:"document_parsing",mediaCapabilities:{type:"document_parsing",supportedFormats:["jpg","jpeg","png","bmp","tiff","pdf"],maxFileSizeMB:10}},{id:"qwen3-tts-voicedesign",name:"Qwen3 TTS VoiceDesign",contextWindow:32768,maxOutput:16384,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],maxCharacters:32768,formats:["mp3","wav"]}},{id:"cosyvoice-v2",name:"CosyVoice V2",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],maxCharacters:1e4,formats:["mp3","wav","pcm"]}},{id:"wan2.7-image-pro",name:"Wan 2.7 Image Pro",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","1280x720","720x1280","2048x2048","3840x2160"]}},{id:"wanx2.1-t2i-turbo",name:"Wan 2.1 Text-to-Image Turbo",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","720x1280","1280x720"]}},{id:"wan2.7-t2v-plus",name:"Wan 2.7 Text/Image-to-Video Plus",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:15,resolutions:["720P","1080P"]}},{id:"wanx2.1-t2v-turbo",name:"Wan 2.1 Text/Image-to-Video Turbo",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:5,resolutions:["480P","720P"]}},{id:"text-embedding-v4",name:"Text Embedding V4",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:1024,maxTokens:8192}},{id:"wanx-background-generation-v2",name:"Wan Background Generation V2",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["inpainting"],sizes:["1024x1024","1280x720","720x1280"]}},{id:"qwen3-rerank",name:"Qwen3 Rerank",contextWindow:32768,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"rerank",mediaCapabilities:{type:"rerank",maxDocuments:100}}]},{id:"zhipu",name:"\u667A\u8C31 GLM (Zhipu)",group:"zhipu",transport:"anthropic-messages",baseUrl:"https://open.bigmodel.cn/api/anthropic",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"glm-5.1",quirks:{filterThinkingBlocks:!0},models:[{id:"glm-5.1",name:"GLM-5.1",contextWindow:2e5,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:6,costOutput:24,costCacheRead:1.3},{id:"glm-5",name:"GLM-5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-5-turbo",name:"GLM-5 Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1,costCacheRead:.1},{id:"glm-4.7",name:"GLM-4.7",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.6",name:"GLM-4.6",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.5-air",name:"GLM-4.5 Air",contextWindow:131072,maxOutput:98304,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1.5,costCacheRead:.1},{id:"glm-4-long",name:"GLM-4 Long",contextWindow:1e6,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.1},{id:"glm-4.7-flash",name:"GLM-4.7 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-4.5-flash",name:"GLM-4.5 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-5v-turbo",name:"GLM-5V Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:1},{id:"glm-4.6v",name:"GLM-4.6V",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:3.2},{id:"glm-4.6v-flash",name:"GLM-4.6V Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:0,costOutput:0},{id:"cogview-4-250304",name:"CogView-4",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","768x1344","864x1152","1344x768","1152x864","1440x720","720x1440"]}},{id:"cogview-3-flash",name:"CogView-3 Flash (Free)",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","768x1344","864x1152","1344x768","1152x864","1440x720","720x1440"]}},{id:"glm-image",name:"GLM-Image",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1280x1280","1568x1056","1056x1568","1472x1088","1088x1472","1728x960","960x1728"]}},{id:"cogvideox-3",name:"CogVideoX-3",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["1080p"]}},{id:"cogvideox-flash",name:"CogVideoX Flash (Free)",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:6}},{id:"glm-tts",name:"GLM-TTS",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech"],voices:["tongtong","chuichui","xiaochen","jam","kazi","douji","luodo"],maxCharacters:1024,formats:["wav","pcm"]}},{id:"glm-tts-clone",name:"GLM-TTS Clone",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"voice_clone",mediaCapabilities:{type:"voice_clone",maxSampleDurationSeconds:30,maxSampleSizeMB:10,formats:["wav","mp3"]}},{id:"glm-asr-2512",name:"GLM-ASR-2512",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"stt",mediaCapabilities:{type:"stt",languages:["zh","en"],maxDurationSeconds:30,formats:["wav","mp3"]}},{id:"embedding-3",name:"Embedding-3",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:2048,maxTokens:3072}},{id:"embedding-2",name:"Embedding-2",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:1024,maxTokens:512}},{id:"rerank",name:"GLM Rerank",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"rerank",mediaCapabilities:{type:"rerank",maxDocuments:128,maxQueryLength:4096,maxDocumentLength:4096}},{id:"glm-ocr",name:"GLM-OCR",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"document_parsing",mediaCapabilities:{type:"document_parsing",supportedFormats:["pdf","jpg","png"],maxPageCount:100,maxFileSizeMB:50}}]},{id:"zhipu-openai",name:"\u667A\u8C31 GLM OpenAI (Zhipu)",group:"zhipu",transport:"openai-chat",baseUrl:"https://open.bigmodel.cn/api/paas/v4",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"glm-5.1",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,supportsToolStream:!0,builtinWebSearch:!0,builtinCodeInterpreter:!0},models:[{id:"glm-5.1",name:"GLM-5.1",contextWindow:2e5,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:6,costOutput:24,costCacheRead:1.3},{id:"glm-5",name:"GLM-5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-5-turbo",name:"GLM-5 Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1,costCacheRead:.1},{id:"glm-4.7",name:"GLM-4.7",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.6",name:"GLM-4.6",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.5-air",name:"GLM-4.5 Air",contextWindow:131072,maxOutput:98304,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1.5,costCacheRead:.1},{id:"glm-4-long",name:"GLM-4 Long",contextWindow:1e6,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.1},{id:"glm-4.7-flash",name:"GLM-4.7 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-4.5-flash",name:"GLM-4.5 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-5v-turbo",name:"GLM-5V Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:1},{id:"glm-4.6v",name:"GLM-4.6V",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:3.2},{id:"glm-4.6v-flash",name:"GLM-4.6V Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:0,costOutput:0}]},{id:"zhipu-coding",name:"\u667A\u8C31 GLM Coding (Zhipu)",group:"zhipu",transport:"openai-chat",baseUrl:"https://open.bigmodel.cn/api/coding/paas/v4",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"codegeex-4",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,supportsToolStream:!0},models:[{id:"codegeex-4",name:"CodeGeeX-4",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.1,costOutput:.1}]},{id:"minimax",name:"MiniMax",group:"minimax",transport:"anthropic-messages",baseUrl:"https://api.minimaxi.com/anthropic",apiKeyEnvVars:["MINIMAX_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"MiniMax-M2.7",omitZeroTemperature:!0,quirks:{filterImageBlocks:!0},models:[{id:"MiniMax-M2.7",name:"MiniMax M2.7",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2,costCacheRead:.06,costCacheWrite:.375},{id:"MiniMax-M2.7-highspeed",name:"MiniMax M2.7 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2,costCacheRead:.06,costCacheWrite:.375},{id:"MiniMax-M2.5",name:"MiniMax M2.5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6,costCacheRead:.03,costCacheWrite:.19},{id:"MiniMax-M2.5-highspeed",name:"MiniMax M2.5 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6,costCacheRead:.03,costCacheWrite:.19},{id:"MiniMax-M2.1",name:"MiniMax M2.1 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1-highspeed",name:"MiniMax M2.1 Highspeed (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2",name:"MiniMax M2 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.4},{id:"music-2.6",name:"MiniMax Music 2.6",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:300,formats:["mp3","wav"]}},{id:"music-cover",name:"MiniMax Music Cover",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"music",mediaCapabilities:{type:"music",operations:["cover"],maxDurationSeconds:300,formats:["mp3","wav"]}},{id:"MiniMax-Hailuo-2.3",name:"Hailuo 2.3",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["768P","1080P"]}},{id:"MiniMax-Hailuo-2.3-Fast",name:"Hailuo 2.3 Fast",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["768P","1080P"]}},{id:"MiniMax-Hailuo-02",name:"Hailuo 02",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["512P","768P","1080P"]}},{id:"image-01",name:"MiniMax Image 01",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["512x512","1024x1024","2048x2048"]}},{id:"image-01-live",name:"MiniMax Image 01 Live",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024"]}},{id:"speech-2.8-hd",name:"MiniMax Speech 2.8 HD",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],formats:["mp3","pcm","flac","wav","opus"]}},{id:"speech-2.8-turbo",name:"MiniMax Speech 2.8 Turbo",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],formats:["mp3","pcm","flac","wav","opus"]}}]},{id:"minimax-openai",name:"MiniMax (OpenAI)",group:"minimax",transport:"openai-chat",baseUrl:"https://api.minimaxi.com/v1",apiKeyEnvVars:["MINIMAX_API_KEY"],authType:"bearer",isAggregator:!1,omitZeroTemperature:!0,defaultModel:"MiniMax-M2.7",quirks:{supportsReasoningSplit:!0},models:[{id:"MiniMax-M2.7",name:"MiniMax M2.7",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2},{id:"MiniMax-M2.7-highspeed",name:"MiniMax M2.7 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2},{id:"MiniMax-M2.5",name:"MiniMax M2.5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.5-highspeed",name:"MiniMax M2.5 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1",name:"MiniMax M2.1 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1-highspeed",name:"MiniMax M2.1 Highspeed (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6}]},{id:"moonshot",name:"Moonshot (Kimi)",transport:"openai-chat",baseUrl:"https://api.moonshot.cn",apiKeyEnvVars:["MOONSHOT_API_KEY"],authType:"bearer",isAggregator:!1,omitZeroTemperature:!0,defaultModel:"kimi-k2.6",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,builtinWebSearch:!0},models:[{id:"kimi-k2.6",name:"Kimi K2.6",contextWindow:262144,maxOutput:262144,toolCall:!0,reasoning:!0,vision:!0,costInput:.95,costOutput:4,costCacheRead:.16},{id:"kimi-k2.5",name:"Kimi K2.5",contextWindow:262144,maxOutput:262144,toolCall:!0,reasoning:!0,vision:!0,costInput:.8,costOutput:4,costCacheRead:.2},{id:"moonshot-v1-128k",name:"Moonshot V1 128K",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.84,costOutput:.84}]},{id:"volcengine",name:"\u8C46\u5305 (Doubao/Volcengine)",transport:"volcengine-responses",baseUrl:"https://ark.cn-beijing.volces.com/api",apiKeyEnvVars:["ARK_API_KEY","DOUBAO_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"doubao-seed-2-0-lite-260215",models:[{id:"doubao-seed-2-0-pro-260215",name:"Doubao Seed 2.0 Pro",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-lite-260428",name:"Doubao Seed 2.0 Lite (0428)",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-lite-260215",name:"Doubao Seed 2.0 Lite",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-mini-260428",name:"Doubao Seed 2.0 Mini (0428)",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-mini-260215",name:"Doubao Seed 2.0 Mini",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-code-preview-260215",name:"Doubao Seed 2.0 Code Preview",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-1-8-251228",name:"Doubao Seed 1.8",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seedance-2-0-260128",name:"Doubao Seedance 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video","video2video","edit","merge","upscale"],maxDurationSeconds:15,resolutions:["480p","720p","1080p"],aspectRatios:["16:9","9:16","1:1"],fps:[24]}},{id:"doubao-seedance-2-0-fast-260128",name:"Doubao Seedance 2.0 Fast",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video","video2video","edit","merge","upscale"],maxDurationSeconds:15,resolutions:["480p","720p"],aspectRatios:["16:9","9:16","1:1"],fps:[24]}},{id:"doubao-seedream-5-0-260128",name:"Doubao Seedream 5.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["512x512","1024x1024","2K"]}},{id:"doubao-seedream-4-5-251128",name:"Doubao Seedream 4.5",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["512x512","1024x1024","2K"]}},{id:"doubao-seed3d-2-0-260328",name:"Doubao Seed3D 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["img2_3d"],outputFormats:["glb","obj","usd","usdz"]}},{id:"hyper3d-gen2-260112",name:"Hyper3D Gen2",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["text2_3d","img2_3d"],outputFormats:["glb","obj"]}},{id:"hitem3d-2-0-251223",name:"HiTem3D 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["img2_3d"],outputFormats:["glb","obj","usd"]}}]},{id:"openai",name:"OpenAI",transport:"openai-responses",baseUrl:"https://api.openai.com",apiKeyEnvVars:["OPENAI_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"gpt-5.5",quirks:{builtinWebSearch:!0,builtinCodeInterpreter:!0,builtinFileSearch:!0},models:[{id:"gpt-5.5",name:"GPT-5.5",contextWindow:105e4,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:30,costCacheRead:.5},{id:"gpt-5.4",name:"GPT-5.4",contextWindow:105e4,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:2.5,costOutput:15,costCacheRead:.25},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini",contextWindow:4e5,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:.75,costOutput:4.5,costCacheRead:.075},{id:"gpt-5.4-nano",name:"GPT-5.4 Nano",contextWindow:4e5,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:.2,costOutput:1.25,costCacheRead:.02},{id:"gpt-image-2",name:"GPT Image 2",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img","inpainting"],sizes:["1024x1024","1536x1024","1024x1536","auto"],transparentBackground:!0}},{id:"gpt-realtime-2",name:"GPT Realtime 2",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!0,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}},{id:"gpt-realtime-translate",name:"GPT Realtime Translate",contextWindow:128e3,maxOutput:16e3,toolCall:!1,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!1}},{id:"gpt-realtime-1.5",name:"GPT Realtime 1.5",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}},{id:"gpt-realtime-mini",name:"GPT Realtime Mini",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}}]},{id:"anthropic",name:"Anthropic",transport:"anthropic-messages",baseUrl:"https://api.anthropic.com",apiKeyEnvVars:["ANTHROPIC_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"claude-opus-4-7",models:[{id:"claude-opus-4-7",name:"Claude Opus 4.7",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5,costCacheWrite:6.25},{id:"claude-opus-4-6",name:"Claude Opus 4.6",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5,costCacheWrite:6.25},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",contextWindow:1e6,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:3,costOutput:15,costCacheRead:.3,costCacheWrite:3.75},{id:"claude-sonnet-4-5",name:"Claude Sonnet 4.5",contextWindow:2e5,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:3,costOutput:15,costCacheRead:.3,costCacheWrite:3.75},{id:"claude-haiku-4-5",name:"Claude Haiku 4.5",contextWindow:2e5,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:5,costCacheRead:.1,costCacheWrite:1.25}]},{id:"google",name:"Google Gemini",transport:"gemini-generatecontent",baseUrl:"https://generativelanguage.googleapis.com/v1beta",apiKeyEnvVars:["GOOGLE_API_KEY","GEMINI_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"gemini-3-flash-preview",quirks:{builtinWebSearch:!0,builtinCodeInterpreter:!0,builtinUrlContext:!0,builtinMapsGrounding:!0,builtinFileSearch:!0},models:[{id:"gemini-3.1-pro-preview",name:"Gemini 3.1 Pro",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,reasoningRequired:!0,vision:!0,costInput:2,costOutput:12},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:3},{id:"gemini-3.1-flash-lite",name:"Gemini 3.1 Flash-Lite",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.25,costOutput:1.5},{id:"gemini-3.1-flash-image-preview",name:"Gemini 3.1 Flash Image (Nano Banana 2)",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["1024x1024"]}},{id:"gemini-3-pro-image-preview",name:"Gemini 3 Pro Image (Nano Banana Pro)",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["1024x1024"]}},{id:"veo-3.1-generate-preview",name:"Veo 3.1 Standard",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P","4K"]}},{id:"veo-3.1-fast-generate-preview",name:"Veo 3.1 Fast",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P","4K"]}},{id:"veo-3.1-lite-generate-preview",name:"Veo 3.1 Lite",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P"]}},{id:"lyria-3-pro-preview",name:"Lyria 3 Pro",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:300,formats:["mp3"]}},{id:"lyria-3-clip-preview",name:"Lyria 3 Clip",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:30,formats:["mp3"]}},{id:"lyria-realtime-exp",name:"Lyria RealTime (Experimental)",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music_realtime",mediaCapabilities:{type:"music",operations:["realtime"],formats:["wav"]}},{id:"gemini-3.1-flash-tts-preview",name:"Gemini 3.1 Flash TTS",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:1,costOutput:20,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech"],maxCharacters:8e3,formats:["mp3","wav"]}},{id:"gemini-embedding-2",name:"Gemini Embedding 2 (Multimodal)",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:.2,costOutput:0,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:3072,maxTokens:8192}}]},{id:"openrouter",name:"OpenRouter",transport:"openai-chat",baseUrl:"https://openrouter.ai/api",apiKeyEnvVars:["OPENROUTER_API_KEY"],authType:"bearer",isAggregator:!0,defaultModel:"anthropic/claude-opus-4.7",extraHeaders:{"HTTP-Referer":"https://claw.bot","X-Title":"XiaozhiClaw"},models:[{id:"anthropic/claude-opus-4.7",name:"Claude Opus 4.7 (via OpenRouter)",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5},{id:"anthropic/claude-opus-4.6",name:"Claude Opus 4.6 (via OpenRouter)",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5},{id:"deepseek/deepseek-v4-flash",name:"DeepSeek V4 Flash (via OpenRouter)",contextWindow:1048576,maxOutput:393216,toolCall:!0,reasoning:!0,vision:!1,costInput:.14,costOutput:.28,costCacheRead:.028}]},{id:"qwen-coding",name:"Alibaba Qwen (Coding Plan)",transport:"anthropic-messages",baseUrl:"https://coding.dashscope.aliyuncs.com/apps/anthropic",apiKeyEnvVars:["DASHSCOPE_API_KEY","QWEN_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"qwen3-coder-plus",models:[{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus (Coding Plan)",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!1},{id:"qwen3-coder-flash",name:"Qwen3 Coder Flash (Coding Plan)",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!1}]}];import{existsSync as km,mkdirSync as Tm,readFileSync as wm,writeFileSync as vm}from"node:fs";import{join as xm}from"node:path";var Sm="https://models.dev/api.json",_m=3e4,Rm=1440*60*1e3,Cm=300*1e3,Am={deepseek:"deepseek",qwen:"qwen","qwen-coding-plan":"qwen-coding","alibaba-cn":"qwen",zhipuai:"zhipu",minimax:"minimax",moonshot:"moonshot",moonshotai:"moonshot",doubao:"volcengine","bytedance-seed":"volcengine",volcengine:"volcengine",openai:"openai",anthropic:"anthropic",google:"google",openrouter:"openrouter"},zt=class{cache=null;cacheDir;cacheFile;ttlMs;fetching=!1;lastFetchAttempt=0;constructor(e){this.cacheDir=e?.cacheDir??Ce(),this.cacheFile=xm(this.cacheDir,"model_catalog.json"),this.ttlMs=e?.ttlMs??Rm}getModels(e){this.ensureLoaded();let t=this.cache?.providers.get(e);return t?[...t.models.values()]:[]}getModel(e,t){return this.ensureLoaded(),this.cache?.providers.get(e)?.models.get(t)}listProviderIds(){return this.ensureLoaded(),this.cache?[...this.cache.providers.keys()]:[]}async refreshCatalog(){return this.fetchRemote()}ensureLoaded(){this.cache&&!this.isStale()||(this.cache||this.loadFromDisk(),(!this.cache||this.isStale())&&this.backgroundFetch())}isStale(){return this.cache?Date.now()-this.cache.fetchedAt>this.ttlMs:!0}loadFromDisk(){try{if(!km(this.cacheFile))return;let e=wm(this.cacheFile,"utf8"),t=JSON.parse(e);if(!t.fetchedAt||!t.data)return;this.cache={fetchedAt:t.fetchedAt,providers:Ta(t.data)}}catch{}}saveToDisk(e){try{Tm(this.cacheDir,{recursive:!0});let t=JSON.stringify({fetchedAt:Date.now(),data:e},null,0);vm(this.cacheFile,t,"utf8")}catch{}}backgroundFetch(){this.fetching||Date.now()-this.lastFetchAttempt<Cm||(this.fetching=!0,this.fetchRemote().finally(()=>{this.fetching=!1}))}async fetchRemote(){this.lastFetchAttempt=Date.now();try{let e=await fetch(Sm,{signal:AbortSignal.timeout(_m),headers:{Accept:"application/json"}});if(!e.ok)return!1;let t=await e.json(),n=Ta(t);return n.size===0?!1:(this.cache={fetchedAt:Date.now(),providers:n},this.saveToDisk(t),!0)}catch{return!1}}};function Ta(r){let e=new Map;if(!r||typeof r!="object")return e;for(let[t,n]of Object.entries(r)){let o=Am[t];if(!o||!n||typeof n!="object")continue;let i=n.models;if(!i||typeof i!="object")continue;let a=e.get(o);a||(a={models:new Map},e.set(o,a));for(let[c,d]of Object.entries(i)){if(!d||typeof d!="object"||a.models.has(c))continue;let l=d,u=l.cost??{},p=l.limit??{},m=l.modalities??{},g=Array.isArray(m.input)?m.input:[],f=Array.isArray(m.output)?m.output:[],b=Pm(f,g,c);a.models.set(c,{id:c,name:typeof l.name=="string"?l.name:c,contextWindow:typeof p.context=="number"?p.context:2e5,maxOutput:typeof p.output=="number"?p.output:8192,toolCall:l.tool_call===!0,reasoning:l.reasoning===!0,vision:l.attachment===!0||g.includes("image"),costInput:typeof u.input=="number"?u.input:void 0,costOutput:typeof u.output=="number"?u.output:void 0,costCacheRead:typeof u.cache_read=="number"?u.cache_read:void 0,costCacheWrite:typeof u.cache_write=="number"?u.cache_write:void 0,mediaType:b})}}return e}function Pm(r,e,t){if(r.includes("video"))return"video";if(r.includes("image")&&!r.includes("text"))return"image";if(r.includes("audio")&&!r.includes("text"))return"tts";if(r.includes("3d"))return"3d";let n=t.toLowerCase();if(n.includes("tts")||n.includes("speech")||n.includes("cosyvoice"))return"tts";if(n.includes("music")||n.includes("suno"))return"music";if(n.includes("seedream")||n.includes("image")||n.includes("dall"))return"image";if(n.includes("seedance")||n.includes("video"))return"video"}var Mm={claude:"anthropic",gemini:"google",doubao:"volcengine"},bt=class{builtins=new Map;catalog;overrides=new Map;constructor(e){for(let t of vr)this.builtins.set(t.id,t);this.catalog=e?.catalog??new zt}applyOverride(e,t){this.overrides.set(e,{...this.overrides.get(e),...t})}getProvider(e){let t=Mm[e]??e,n=this.builtins.get(t),o=this.overrides.get(t);if(!(!n&&!o))return!n&&o?!o.id||!o.transport||!o.baseUrl?void 0:{id:o.id,name:o.name??o.id,transport:o.transport,baseUrl:o.baseUrl,apiKeyEnvVars:o.apiKeyEnvVars??[],authType:o.authType??"bearer",isAggregator:o.isAggregator??!1,defaultModel:o.defaultModel,models:o.models}:n&&!o?n:{...n,...o,models:o.models??n.models}}listProviders(){let e=new Map;for(let[t,n]of this.builtins)e.set(t,n);for(let[t]of this.overrides){let n=this.getProvider(t);n&&e.set(t,n)}return[...e.values()]}listModels(e){let n=this.getProvider(e)?.models??[],o=this.catalog.getModels(e);if(o.length===0)return n;let s=new Map;for(let i of o)s.set(i.id,i);for(let i of n)s.set(i.id,i);return[...s.values()]}getModelInfo(e,t){return this.listModels(e).find(n=>n.id===t)}async refreshCatalog(){return this.catalog.refreshCatalog()}resolveApiKey(e,t){if(t)return t;let n=this.getProvider(e);if(n)for(let o of n.apiKeyEnvVars){let s=process.env[o];if(s?.trim())return s.trim()}}};var xr=new Set([429,529,502,503,504]),Me=9e4;function Ie(r){let e=Math.min(1e3*Math.pow(2,r-1),3e4),t=Math.random()*.25*e;return e+t}function $e(r){return r!=null&&xr.has(r)}function Ee(r,e){return new Promise((t,n)=>{if(e?.aborted){n(new Error("Request aborted"));return}let o=setTimeout(t,r);e&&e.addEventListener("abort",()=>{clearTimeout(o),n(new Error("Request aborted"))},{once:!0})})}function Ne(r){if(r&&typeof r=="object"){let e=r;if(typeof e.status=="number")return e.status;if(typeof e.statusCode=="number")return e.statusCode;if(e.response&&typeof e.response.status=="number")return e.response.status}return null}function En(r){return r.toLowerCase().startsWith("gpt-5")}function On(r){return r.toLowerCase().includes("5.4-nano")}function Vt(r){return/^o[1-4](-|$)/.test(r.toLowerCase())}var kt=class{baseUrl;extraHeaders;timeoutMs;supportsStreamOptions;omitZeroTemperature;quirks;cumulativeReasoningLen=0;cumulativeContentLen=0;constructor(e){if(!e.baseUrl)throw new Error("OpenAIChatTransport: baseUrl is required (got empty or undefined)");this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.extraHeaders=e.extraHeaders??{},this.timeoutMs=e.timeoutMs??18e4,this.supportsStreamOptions=e.supportsStreamOptions??!0,this.omitZeroTemperature=e.omitZeroTemperature??!1,this.quirks=e.quirks??{}}async*stream(e,t,n){this.cumulativeReasoningLen=0,this.cumulativeContentLen=0;let o=e.prefixMessage&&this.quirks.supportsPrefixCompletion,s=/\/v\d+$/.test(this.baseUrl),i;o?i=`${this.baseUrl}/beta/v1/chat/completions`:s?i=`${this.baseUrl}/chat/completions`:i=`${this.baseUrl}/v1/chat/completions`;let a={model:e.model,messages:Em(e.messages,this.quirks),stream:!0};this.supportsStreamOptions&&(a.stream_options={include_usage:!0}),e.tools&&e.tools.length>0&&(a.tools=e.tools,e.toolChoice&&(a.tool_choice=e.toolChoice));let c=!e.disableBuiltinTools,d=!1;if(c&&this.quirks.builtinWebSearch&&a.tools){let f=a.tools;this.quirks.builtinCodeInterpreter?f.push({type:"web_search",web_search:{enable:!0,search_result:!0}}):(f.push({type:"builtin_function",function:{name:"$web_search"}}),d=!0)}c&&this.quirks.builtinCodeInterpreter&&a.tools&&a.tools.push({type:"code_interpreter",code_interpreter:{sandbox:"none"}}),this.quirks.supportsToolStream&&a.tools&&(a.tool_stream=!0);let l=this.quirks.useEffortInsteadOfBudget&&!!e.reasoning,u=e.model.startsWith("kimi-k2.6"),p=En(e.model);if(e.temperature!==void 0&&(this.omitZeroTemperature&&e.temperature===0||(p||!Vt(e.model)&&!l&&!u)&&(a.temperature=e.temperature)),e.topP!==void 0&&(p||!Vt(e.model)&&!l&&!u)&&(a.top_p=e.topP),e.maxTokens!==void 0&&(p||Vt(e.model)||e.model.startsWith("kimi-k2")?a.max_completion_tokens=e.maxTokens:a.max_tokens=e.maxTokens),e.reasoning)if(p){let f=e.reasoning.effort==="minimal"?"none":e.reasoning.effort;On(e.model)&&(f==="high"||f==="xhigh")&&(f="medium"),a.reasoning={effort:f}}else if(Vt(e.model))a.reasoning_effort=e.reasoning.effort;else if(this.quirks.useEffortInsteadOfBudget){a.thinking={type:"enabled"};let f=this.quirks.maxReasoningEffort??"high",b=e.reasoning.effort??"high";a.reasoning_effort=b==="low"||b==="medium"?"high":f}else this.quirks.supportsThinkingParam?(d?a.thinking={type:"disabled"}:this.quirks.supportsToolStream?a.thinking={type:"enabled",clear_thinking:!1}:a.thinking={type:"enabled"},this.quirks.supportsReasoningEffort&&(a.reasoning_effort=e.reasoning.effort)):this.quirks.supportsReasoningEffort?a.reasoning_effort=e.reasoning.effort:a.reasoning=e.reasoning;else d&&(a.thinking={type:"disabled"});e.structuredOutput&&(e.structuredOutput.mode==="json_object"?a.response_format={type:"json_object"}:e.structuredOutput.mode==="json_schema"&&(a.response_format={type:"json_schema",json_schema:{name:e.structuredOutput.name,strict:e.structuredOutput.strict??!0,schema:e.structuredOutput.schema}})),this.quirks.supportsReasoningSplit&&e.reasoning&&(a.reasoning_split=!0),e.prediction&&p&&(a.prediction=e.prediction),o&&e.prefixMessage&&a.messages.push({role:"assistant",content:e.prefixMessage,prefix:!0});let m={"Content-Type":"application/json",Authorization:`Bearer ${t}`,...this.extraHeaders},g=null;for(let f=0;f<=3;f++){if(n?.aborted)throw new Error("Request aborted");f>0&&g&&await Ee(Ie(f),n);try{yield*this.fetchAndStream(i,m,a,n);return}catch(b){g=b instanceof Error?b:new Error(String(b));let w=g.message.includes("Stream idle timeout");if(!$e(Ne(g))&&!w||f===3)throw g}}}async*fetchAndStream(e,t,n,o){let s=AbortSignal.timeout(this.timeoutMs),i=o?AbortSignal.any([o,s]):s,a=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(n),signal:i});if(!a.ok){let d=await a.text().catch(()=>""),l=new Error(`LLM API error ${a.status}: ${d.slice(0,500)}`);throw l.status=a.status,l}if(!a.body)throw new Error("LLM API returned no response body");let c=a.headers.get("content-type")??"";if(c.includes("application/json")&&!c.includes("text/event-stream")){yield*this.handleNonStreamingResponse(a);return}yield*this.parseSSEStreamWithWatchdog(a.body)}async*handleNonStreamingResponse(e){let t=await e.json();t.usage&&(yield{type:"usage",promptTokens:t.usage.prompt_tokens??0,completionTokens:t.usage.completion_tokens??0,reasoningTokens:t.usage.completion_tokens_details?.reasoning_tokens,cacheReadTokens:t.usage.prompt_tokens_details?.cached_tokens});for(let n of t.choices??[]){let o=n.message;if(o){if(o.reasoning_content&&(yield{type:"reasoning_delta",text:o.reasoning_content}),o.content&&(yield{type:"delta",text:o.content}),o.tool_calls)for(let s=0;s<o.tool_calls.length;s++){let i=o.tool_calls[s];yield{type:"tool_call_delta",index:s,id:i.id,name:i.function.name,arguments:i.function.arguments}}n.finish_reason&&(yield{type:"done",finishReason:n.finish_reason})}}}async*parseSSEStreamWithWatchdog(e){let t=new TextDecoder,n="",o=null,s=new AbortController,i=()=>{o&&clearTimeout(o),o=setTimeout(()=>{s.abort()},Me)};try{i();let a=e.getReader();try{for(;;){let{done:c,value:d}=await a.read();if(c)break;if(s.signal.aborted)throw new Error("Stream idle timeout");i(),n+=t.decode(d,{stream:!0});let l;for(;(l=n.indexOf(`
34
+ `))!==-1;){let u=n.slice(0,l).trim();if(n=n.slice(l+1),!u||u.startsWith(":")||!u.startsWith("data: "))continue;let p=u.slice(6);if(p==="[DONE]")return;let m;try{m=JSON.parse(p)}catch{continue}yield*this.processChunk(m)}}}finally{a.releaseLock()}}finally{o&&clearTimeout(o)}}*processChunk(e){if(e.usage&&(yield{type:"usage",promptTokens:e.usage.prompt_tokens??0,completionTokens:e.usage.completion_tokens??0,reasoningTokens:e.usage.completion_tokens_details?.reasoning_tokens,cacheReadTokens:e.usage.prompt_tokens_details?.cached_tokens}),!(!e.choices||e.choices.length===0))for(let t of e.choices){let n=t.delta;if(n){if(n.reasoning_content&&(yield{type:"reasoning_delta",text:n.reasoning_content}),n.reasoning_details){let o=n.reasoning_details.slice(this.cumulativeReasoningLen);o&&(this.cumulativeReasoningLen=n.reasoning_details.length,yield{type:"reasoning_delta",text:o})}if(n.content)if(this.quirks.supportsReasoningSplit){let o=n.content.slice(this.cumulativeContentLen);o&&(this.cumulativeContentLen=n.content.length,yield{type:"delta",text:o})}else yield{type:"delta",text:n.content};if(n.tool_calls)for(let o of n.tool_calls)yield{type:"tool_call_delta",index:o.index,id:o.id,name:o.function?.name,arguments:o.function?.arguments??""};t.finish_reason&&(yield{type:"done",finishReason:Im(t.finish_reason)})}}}async*complete(e,t,n){if(!this.quirks.supportsPrefixCompletion)throw new Error("FIM completion is not supported by this provider");let s=/\/v\d+$/.test(this.baseUrl)?`${this.baseUrl}/beta/completions`:`${this.baseUrl}/beta/v1/completions`,i={model:e.model,prompt:e.prompt,stream:!0,max_tokens:e.maxTokens??4096};e.suffix&&(i.suffix=e.suffix),e.temperature!==void 0&&(i.temperature=e.temperature),e.stop&&(i.stop=e.stop);let a={"Content-Type":"application/json",Authorization:`Bearer ${t}`,...this.extraHeaders},c=AbortSignal.timeout(this.timeoutMs),d=n?AbortSignal.any([n,c]):c,l=await fetch(s,{method:"POST",headers:a,body:JSON.stringify(i),signal:d});if(!l.ok){let g=await l.text().catch(()=>"");throw new Error(`FIM API error ${l.status}: ${g.slice(0,500)}`)}if(!l.body)throw new Error("FIM API returned no response body");let u=new TextDecoder,p="",m=l.body.getReader();try{for(;;){let{done:g,value:f}=await m.read();if(g)break;p+=u.decode(f,{stream:!0});let b;for(;(b=p.indexOf(`
35
+ `))!==-1;){let w=p.slice(0,b).trim();if(p=p.slice(b+1),!w||w.startsWith(":")||!w.startsWith("data: "))continue;let T=w.slice(6);if(T==="[DONE]")return;let _;try{_=JSON.parse(T)}catch{continue}for(let R of _.choices??[])R.text&&(yield{type:"delta",text:R.text}),R.finish_reason&&(yield{type:"done",finishReason:R.finish_reason})}}}finally{m.releaseLock()}}async uploadFile(e,t,n,o,s){let a=/\/v\d+$/.test(this.baseUrl)?`${this.baseUrl}/files`:`${this.baseUrl}/v1/files`,c=new FormData;c.append("file",e,t),c.append("purpose",n);let d=await fetch(a,{method:"POST",headers:{Authorization:`Bearer ${o}`,...this.extraHeaders},body:c,signal:s??AbortSignal.timeout(this.timeoutMs)});if(!d.ok){let u=await d.text().catch(()=>"");throw new Error(`File upload error ${d.status}: ${u}`)}let l=await d.json();return{fileId:l.id??"",filename:l.filename??t,bytes:l.bytes??0}}async getFileInfo(e,t,n){let s=/\/v\d+$/.test(this.baseUrl)?`${this.baseUrl}/files/${encodeURIComponent(e)}`:`${this.baseUrl}/v1/files/${encodeURIComponent(e)}`,i=await fetch(s,{method:"GET",headers:{Authorization:`Bearer ${t}`,...this.extraHeaders},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!i.ok){let c=await i.text().catch(()=>"");throw new Error(`File info error ${i.status}: ${c}`)}let a=await i.json();return{id:a.id??e,filename:a.filename??"",bytes:a.bytes??0,status:a.status??"unknown"}}};function Im(r){switch(r){case"sensitive":return"content_filter";case"model_context_window_exceeded":return"length";case"network_error":return"error";default:return r}}function Em(r,e){return r.map(t=>{if(t.role==="user"){let n=t.imageUrls&&t.imageUrls.length>0&&!e.filterImageBlocks,o=t.videoUrls&&t.videoUrls.length>0,s=t.audioUrls&&t.audioUrls.length>0,i=t.fileIds&&t.fileIds.length>0;if(n||o||s||i){let c=[];if(t.content&&c.push({type:"text",text:t.content}),n)for(let d of t.imageUrls){let l={url:d};t.imageDetail&&(l.detail=t.imageDetail),c.push({type:"image_url",image_url:l})}if(o)for(let d of t.videoUrls)c.push({type:"video_url",video_url:{url:d}});if(s)for(let d of t.audioUrls)c.push({type:"input_audio",input_audio:{data:d,format:t.audioFormat??"mp3"}});if(i)for(let d of t.fileIds)c.push({type:"file",file:{file_id:d.id}});return{role:"user",content:c}}return{role:"user",content:t.content??""}}if(t.role==="assistant"){let n={role:"assistant"};return t.thinkingBlocks&&t.thinkingBlocks.length>0&&(n.reasoning_content=t.thinkingBlocks.map(o=>o.thinking).join("")),n.content=t.content??null,t.tool_calls&&t.tool_calls.length>0&&(n.tool_calls=t.tool_calls.map(o=>({id:o.id,type:o.type,function:{name:o.function.name,arguments:o.function.arguments}}))),n}return t.role==="tool"?{role:"tool",content:t.content??"",tool_call_id:t.tool_call_id??""}:{role:t.role,content:t.content??""}})}var Ln=class{baseUrl;extraHeaders;timeoutMs;quirks;constructor(e){if(!e.baseUrl)throw new Error("OpenAIResponsesTransport: baseUrl is required");this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.extraHeaders=e.extraHeaders??{},this.timeoutMs=e.timeoutMs??18e4,this.quirks=e.quirks??{}}async*stream(e,t,n){let s=/\/v\d+$/.test(this.baseUrl)?`${this.baseUrl}/responses`:`${this.baseUrl}/v1/responses`,i=this.buildRequestBody(e),a={"Content-Type":"application/json",Authorization:`Bearer ${t}`,...this.extraHeaders},c=null;for(let d=0;d<=3;d++){if(n?.aborted)throw new Error("Request aborted");d>0&&c&&await Ee(Ie(d),n);try{yield*this.fetchAndStream(s,a,i,n);return}catch(l){c=l instanceof Error?l:new Error(String(l));let u=c.message.includes("Stream idle timeout");if(!$e(Ne(c))&&!u||d===3)throw c}}}buildRequestBody(e){let t={model:e.model,input:Om(e.messages),stream:!0};if(e.conversationId?t.conversation=e.conversationId:e.previousResponseId&&(t.previous_response_id=e.previousResponseId),e.store!==void 0&&(t.store=e.store),e.instructions&&(t.instructions=e.instructions),e.structuredOutput&&(e.structuredOutput.mode==="json_object"?t.text={format:{type:"json_object"}}:t.text={format:{type:"json_schema",name:e.structuredOutput.name,strict:e.structuredOutput.strict??!0,schema:e.structuredOutput.schema}}),e.tools&&e.tools.length>0&&(t.tools=e.tools.map(n=>({type:"function",name:n.function.name,description:n.function.description,parameters:n.function.parameters,strict:!0}))),e.toolChoice!==void 0&&(typeof e.toolChoice=="string"?t.tool_choice=e.toolChoice:t.tool_choice={type:e.toolChoice.type,name:e.toolChoice.name}),e.temperature!==void 0&&(t.temperature=e.temperature),e.topP!==void 0&&(t.top_p=e.topP),e.maxTokens!==void 0&&(t.max_output_tokens=e.maxTokens),e.reasoning){let n=e.reasoning.effort==="minimal"?"none":e.reasoning.effort;On(e.model)&&(n==="high"||n==="xhigh")&&(n="medium");let o={effort:n};o.summary="auto",o.generate_summary="auto",t.reasoning=o}if(e.prediction&&En(e.model)&&(t.prediction=e.prediction),t.truncation="auto",e.promptCacheKey&&(t.prompt_cache_key=e.promptCacheKey),e.promptCacheRetention&&(t.prompt_cache_retention=e.promptCacheRetention),e.serviceTier&&(t.service_tier=e.serviceTier),e.reasoning?.includeEncryptedReasoning&&(e.store===void 0&&(t.store=!1),t.include=["reasoning.encrypted_content"]),e.contextManagement&&(t.context_management=e.contextManagement.edits.map(n=>{let o={type:n.type};return n.type==="clear_thinking"&&n.keep!==void 0?o.keep=n.keep:n.type==="clear_tool_uses"&&(n.trigger&&(o.trigger=n.trigger),n.keep&&(o.keep=n.keep),n.excludeTools&&(o.exclude_tools=n.excludeTools),n.clearToolInput!==void 0&&(o.clear_tool_input=n.clearToolInput)),o})),!e.disableBuiltinTools){let n=t.tools??[],o=t.include??[];if(e.openaiBuiltinTools&&e.openaiBuiltinTools.length>0){for(let i of e.openaiBuiltinTools)n.push({...i});let s=new Set(e.openaiBuiltinTools.map(i=>i.type));s.has("web_search_preview")&&o.push("web_search_call.action.sources"),s.has("file_search")&&o.push("file_search_call.results"),s.has("code_interpreter")&&o.push("code_interpreter_call.outputs"),s.has("computer_use_preview")&&o.push("computer_call_output.output.image_url")}else this.quirks.builtinWebSearch&&(n.push({type:"web_search_preview"}),o.push("web_search_call.action.sources")),this.quirks.builtinCodeInterpreter&&(n.push({type:"code_interpreter"}),o.push("code_interpreter_call.outputs")),this.quirks.builtinFileSearch&&(n.push({type:"file_search"}),o.push("file_search_call.results"));n.length>0&&(t.tools=n),o.length>0&&(t.include=o)}if(e.maxToolCalls!==void 0&&(t.max_tool_calls=e.maxToolCalls),e.parallelToolCalls!==void 0&&(t.parallel_tool_calls=e.parallelToolCalls),e.textVerbosity){let n=t.text??{};n.verbosity=e.textVerbosity,t.text=n}return t}async*fetchAndStream(e,t,n,o){let s=AbortSignal.timeout(this.timeoutMs),i=o?AbortSignal.any([o,s]):s,a=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(n),signal:i});if(!a.ok){let d=await a.text().catch(()=>""),l=new Error(`OpenAI Responses API error ${a.status}: ${d.slice(0,500)}`);throw l.status=a.status,l}if(!a.body)throw new Error("OpenAI Responses API returned no response body");let c=a.headers.get("content-type")??"";if(c.includes("application/json")&&!c.includes("text/event-stream")){yield*this.handleNonStreamingResponse(a);return}yield*this.parseSSEStream(a.body)}async*handleNonStreamingResponse(e){let t=await e.json();if(t.id&&(yield{type:"response_id",id:t.id}),t.usage&&(yield{type:"usage",promptTokens:t.usage.input_tokens??0,completionTokens:t.usage.output_tokens??0,reasoningTokens:t.usage.output_tokens_details?.reasoning_tokens,cacheReadTokens:t.usage.input_tokens_details?.cached_tokens}),t.output)for(let n of t.output){if(n.type==="message"&&n.content)for(let o of n.content)o.type==="output_text"&&(yield{type:"delta",text:o.text??""},o.annotations&&o.annotations.length>0&&(yield{type:"annotations",annotations:o.annotations.map(s=>({...s,type:s.type??"url_citation",url:s.url,title:s.title}))}));if(n.type==="reasoning"&&n.summary)for(let o of n.summary)o.type==="summary_text"&&(yield{type:"reasoning_delta",text:o.text??""});n.type==="function_call"&&(yield{type:"tool_call_delta",index:0,id:n.call_id,name:n.name,arguments:n.arguments??""})}yield{type:"done",finishReason:t.status==="completed"?"stop":t.status??"stop"}}async*parseSSEStream(e){let t=new TextDecoder,n="",o="",s=null,i=new AbortController,a=0,c=new Map,d=()=>{s&&clearTimeout(s),s=setTimeout(()=>{i.abort()},Me)};try{d();let l=e.getReader();try{for(;;){let{done:u,value:p}=await l.read();if(u)break;if(i.signal.aborted)throw new Error("Stream idle timeout");d(),n+=t.decode(p,{stream:!0});let m;for(;(m=n.indexOf(`
36
+ `))!==-1;){let g=n.slice(0,m).trim();if(n=n.slice(m+1),!g){o="";continue}if(!g.startsWith(":")){if(g.startsWith("event:")){o=g.slice(6).trim();continue}if(g.startsWith("data:")){let f=g.slice(5).trim();if(f==="[DONE]")return;let b;try{b=JSON.parse(f)}catch{continue}yield*this.processEvent(o,b,c,()=>a++)}}}}}finally{l.releaseLock()}}finally{s&&clearTimeout(s)}}*processEvent(e,t,n,o){switch(e){case"response.output_text.delta":{let s=t.delta;s&&(yield{type:"delta",text:s});break}case"response.reasoning_summary_text.delta":{let s=t.delta;s&&(yield{type:"reasoning_delta",text:s});break}case"response.function_call_arguments.delta":{let s=t.delta,i=t.call_id,a=t.name;if(s!==void 0&&i){let c=n.get(i);c===void 0&&(c=o(),n.set(i,c)),yield{type:"tool_call_delta",index:c,id:i,name:a,arguments:s}}break}case"response.output_item.added":{let s=t.item;if(s&&s.type==="function_call"){let i=s.call_id,a=s.name;if(i&&!n.has(i)){let c=o();n.set(i,c),yield{type:"tool_call_delta",index:c,id:i,name:a,arguments:""}}}break}case"response.function_call_arguments.done":break;case"response.content_part.done":{let s=t.part;if(s?.type==="output_text"){let i=s.annotations;i&&i.length>0&&(yield{type:"annotations",annotations:i.map(a=>({type:a.type??"url_citation",url:a.url,title:a.title,...a}))})}break}case"response.output_item.done":{let s=t.item;if(s?.type==="message"){let i=s.content;if(i)for(let a of i){let c=a.annotations;c&&c.length>0&&(yield{type:"annotations",annotations:c.map(d=>({type:d.type??"url_citation",url:d.url,title:d.title,...d}))})}}break}case"response.completed":{let s=t.response;if(s){let i=s.id;i&&(yield{type:"response_id",id:i});let a=s.usage;if(a){let d=a.input_tokens_details,l=a.output_tokens_details;yield{type:"usage",promptTokens:a.input_tokens??0,completionTokens:a.output_tokens??0,reasoningTokens:l?.reasoning_tokens,cacheReadTokens:d?.cached_tokens}}yield{type:"done",finishReason:s.status==="incomplete"?"tool_calls":"stop"}}else yield{type:"done",finishReason:"stop"};break}case"response.failed":{yield{type:"error",message:t.response?.error?.message??"Unknown error"},yield{type:"done",finishReason:"error"};break}default:{e.startsWith("response.web_search_call")&&(yield{type:"builtin_tool_status",toolType:"web_search",event:e,data:t});break}}}};function Om(r){let e=[];for(let t of r){if(t.role==="system"){e.push({role:"developer",content:t.content??""});continue}if(t.role==="user"){let n=t.imageUrls&&t.imageUrls.length>0,o=t.videoUrls&&t.videoUrls.length>0,s=t.audioUrls&&t.audioUrls.length>0,i=t.fileIds&&t.fileIds.length>0;if(n||o||s||i){let c=[];if(n)for(let d of t.imageUrls){let l={type:"input_image",image_url:d};t.imageDetail&&(l.detail=t.imageDetail),c.push(l)}if(s)for(let d of t.audioUrls)c.push({type:"input_audio",data:d,format:t.audioFormat??"mp3"});if(i)for(let d of t.fileIds)c.push({type:"input_file",file_id:d.id});t.content&&c.push({type:"input_text",text:t.content}),e.push({role:"user",content:c})}else e.push({role:"user",content:t.content??""});continue}if(t.role==="assistant"){if(t.content&&e.push({role:"assistant",content:t.content}),t.tool_calls&&t.tool_calls.length>0)for(let n of t.tool_calls)e.push({type:"function_call",call_id:n.id,name:n.function.name,arguments:n.function.arguments});continue}if(t.role==="tool"){if(!t.tool_call_id)continue;e.push({type:"function_call_output",call_id:t.tool_call_id,output:t.content??""});continue}}return e}var Lm=18e4,Dm=3e5,$m=64e3,Nm="[Tool execution failed; output not available during conversation recovery]",Um="interleaved-thinking-2025-05-14",jm="context-1m-2025-08-07",Fm="token-efficient-tools-2026-03-28",Bm="prompt-caching-scope-2026-01-05",Gm="pdfs-2024-09-25";function Wm(r){let e=r.toLowerCase();return e.includes("opus-4-6")||e.includes("opus-4-7")||e.includes("sonnet-4-6")}function Hm(r,e,t){let n=[],o=r.toLowerCase();(o.includes("opus-4-6")||o.includes("opus-4-7")||o.includes("sonnet-4-6"))&&n.push(jm),n.push(Gm),e&&!o.includes("haiku")&&n.push(Um),t&&n.push(Fm),n.push(Bm);let i=process.env.ANTHROPIC_BETAS;if(i)for(let a of i.split(",").map(c=>c.trim()).filter(Boolean))n.includes(a)||n.push(a);return n}var qt=class{baseUrl;apiVersion;timeoutMs;streamIdleTimeoutMs;enablePromptCaching;maxRetries;omitZeroTemperature;quirks;constructor(e){if(!e.baseUrl)throw new Error("AnthropicMessagesTransport: baseUrl is required (got empty or undefined)");this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.apiVersion=e.apiVersion??"2023-06-01",this.timeoutMs=e.timeoutMs??Lm,this.streamIdleTimeoutMs=e.streamIdleTimeoutMs??Me,this.enablePromptCaching=e.enablePromptCaching??!0,this.maxRetries=e.maxRetries??3,this.omitZeroTemperature=e.omitZeroTemperature??!1,this.quirks=e.quirks??{}}async*stream(e,t,n){let o=`${this.baseUrl}/v1/messages`,s=Km(e.messages),{system:i,messages:a}=Jm(s,this.quirks,e.model),c=qm(i,this.enablePromptCaching),d=!!e.reasoning,l=e.maxTokens??8192,u={model:e.model,messages:a,max_tokens:l,stream:!0};if(c&&(u.system=c),e.tools&&e.tools.length>0){let f=e.tools.map(Ym);this.enablePromptCaching&&f.length>0&&(f[f.length-1].cache_control={type:"ephemeral"}),u.tools=f,e.toolChoice&&(u.tool_choice=e.toolChoice==="auto"?{type:"auto"}:e.toolChoice==="required"?{type:"any"}:{type:"none"})}if(!d&&e.temperature!==void 0&&(this.omitZeroTemperature&&e.temperature===0||(u.temperature=e.temperature)),!d&&e.topP!==void 0&&(u.top_p=e.topP),d)if(this.quirks.useEffortInsteadOfBudget){u.thinking={type:"enabled"};let f=this.quirks.maxReasoningEffort??"high",b=e.reasoning?.effort??"high",w=b==="low"||b==="medium"?"high":f;if(u.output_config={effort:w},i){let T=2166136261;for(let _=0;_<i.length;_++)T^=i.charCodeAt(_),T=Math.imul(T,16777619);u.metadata={user_id:`qa-${(T>>>0).toString(36)}`}}}else if(Wm(e.model))u.thinking={type:"adaptive"};else{let f=Vm(e.reasoning.effort,e.maxTokens);u.thinking={type:"enabled",budget_tokens:Math.min(l-1,f)}}let p=Hm(e.model,d,(e.tools?.length??0)>0),m={"Content-Type":"application/json","x-api-key":t,"anthropic-version":this.apiVersion};p.length>0&&(m["anthropic-beta"]=p.join(","));let g=null;for(let f=0;f<=this.maxRetries;f++){if(n?.aborted)throw new Error("Request aborted");f>0&&g&&await Ee(Ie(f),n);try{yield*this.streamWithWatchdog(o,m,u,n);return}catch(b){g=b instanceof Error?b:new Error(String(b));let w=Xm(g.message),T=w!==null&&xr.has(w),_=g.message.includes("Stream idle timeout");if(g.message.includes("model_context_window_exceeded")||g.message.includes("context_length_exceeded")||!T&&!_)throw g;if(f===this.maxRetries){if((_||T)&&!e.streamRequired)try{yield*this.nonStreamingFallback(o,m,u,n);return}catch{throw g}throw g}}}if(g)throw g}async*streamWithWatchdog(e,t,n,o){let s=AbortSignal.timeout(this.timeoutMs),i=o?AbortSignal.any([o,s]):s,a=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(n),signal:i});if(!a.ok){let p=await a.text().catch(()=>""),m=new Error(`Anthropic API error ${a.status}: ${p.slice(0,500)}`);throw m.status=a.status,m}if(!a.body)throw new Error("Anthropic API returned no response body");let c=null,d=!1,l=()=>{c!==null&&clearTimeout(c),c=setTimeout(()=>{d=!0},this.streamIdleTimeoutMs)},u=()=>{c!==null&&(clearTimeout(c),c=null)};l();try{yield*this.parseSSEStream(a.body,l,()=>d)}finally{u()}if(d)throw new Error("Stream idle timeout - no chunks received")}async*nonStreamingFallback(e,t,n,o){let s=Qm({...n,stream:!1}),i=AbortSignal.timeout(Dm),a=o?AbortSignal.any([o,i]):i,c=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(s),signal:a});if(!c.ok){let l=await c.text().catch(()=>""),u=new Error(`Anthropic API error ${c.status}: ${l.slice(0,500)}`);throw u.status=c.status,u}let d=await c.json();yield*this.mapNonStreamingResponse(d)}*mapNonStreamingResponse(e){let t=e.usage;t&&(yield{type:"usage",promptTokens:t.input_tokens??0,completionTokens:t.output_tokens??0,cacheReadTokens:t.cache_read_input_tokens>0?t.cache_read_input_tokens:void 0,cacheCreationTokens:t.cache_creation_input_tokens>0?t.cache_creation_input_tokens:void 0,reasoningTokens:t.reasoning_input_tokens>0?t.reasoning_input_tokens:void 0});let n=e.content;if(Array.isArray(n)){let s=0;for(let i of n){let a=i.type;a==="text"?yield{type:"delta",text:i.text}:a==="thinking"?yield{type:"reasoning_delta",text:i.thinking}:a==="tool_use"&&(yield{type:"tool_call_delta",index:s++,id:i.id,name:i.name,arguments:JSON.stringify(i.input??{})})}}let o=e.stop_reason;o&&(yield{type:"done",finishReason:va(o)})}async*parseSSEStream(e,t,n){let o=new TextDecoder,s="",i="",a=new Map,c={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheCreationTokens:0,reasoningTokens:0};for await(let d of e){if(t(),n())break;s+=o.decode(d,{stream:!0});let l;for(;(l=s.indexOf(`
37
+ `))!==-1;){let u=s.slice(0,l).trim();if(s=s.slice(l+1),!u){i="";continue}if(u.startsWith("event:")){i=u.slice(6).trimStart();continue}if(!u.startsWith("data:"))continue;let p=u.slice(5).trimStart(),m;try{m=JSON.parse(p)}catch{continue}yield*this.mapEvent(i,m,a,c)}}}*mapEvent(e,t,n,o){switch(e){case"message_start":{let i=t.message?.usage;i&&(wa(o,i),yield{type:"usage",promptTokens:o.inputTokens,completionTokens:o.outputTokens,cacheReadTokens:o.cacheReadTokens>0?o.cacheReadTokens:void 0,cacheCreationTokens:o.cacheCreationTokens>0?o.cacheCreationTokens:void 0,reasoningTokens:o.reasoningTokens>0?o.reasoningTokens:void 0});break}case"content_block_start":{let s=t.index,i=t.content_block;if(!i)break;let a=i.type;n.set(s,{type:a,id:i.id,name:i.name,signature:a==="thinking"?"":void 0}),a==="tool_use"&&(yield{type:"tool_call_delta",index:s,id:i.id,name:i.name,arguments:""});break}case"content_block_delta":{let s=t.index,i=t.delta;if(!i)break;let a=i.type;if(a==="text_delta")yield{type:"delta",text:i.text};else if(a==="input_json_delta")yield{type:"tool_call_delta",index:s,arguments:i.partial_json};else if(a==="thinking_delta")yield{type:"reasoning_delta",text:i.thinking};else if(a==="signature_delta"){let c=n.get(s);c&&typeof i.signature=="string"&&(c.signature=i.signature)}break}case"content_block_stop":{let s=t.index,i=n.get(s);i?.type==="thinking"&&typeof i.signature=="string"&&(yield{type:"reasoning_block_complete",thinking:"",signature:i.signature}),n.delete(s);break}case"message_delta":{let s=t.delta,i=t.usage;i&&(wa(o,i),yield{type:"usage",promptTokens:o.inputTokens,completionTokens:o.outputTokens,cacheReadTokens:o.cacheReadTokens>0?o.cacheReadTokens:void 0,cacheCreationTokens:o.cacheCreationTokens>0?o.cacheCreationTokens:void 0,reasoningTokens:o.reasoningTokens>0?o.reasoningTokens:void 0}),s?.stop_reason&&(yield{type:"done",finishReason:va(s.stop_reason)});break}case"message_stop":break;case"error":{let s=t.error;throw new Error(`Anthropic stream error: ${s?.message??JSON.stringify(t)}`)}}}};function wa(r,e){e.input_tokens>0&&(r.inputTokens=e.input_tokens),r.outputTokens=e.output_tokens??r.outputTokens,e.cache_read_input_tokens>0&&(r.cacheReadTokens=e.cache_read_input_tokens),e.cache_creation_input_tokens>0&&(r.cacheCreationTokens=e.cache_creation_input_tokens),e.reasoning_input_tokens>0&&(r.reasoningTokens=e.reasoning_input_tokens)}function va(r){switch(r){case"end_turn":case"stop_sequence":return"stop";case"tool_use":return"tool_calls";case"max_tokens":return"length";default:return r}}function zm(r){return!/haiku/i.test(r)}var Sr={high:16e3,medium:8e3,low:4e3};function Vm(r,e){if(e&&e>16384)switch(r){case"high":return Math.min(e-1,Math.max(16e3,Math.floor(e*.5)));case"medium":return Math.min(e-1,Math.max(8e3,Math.floor(e*.25)));case"low":return Math.min(e-1,4e3);default:return Sr.high}return Sr[r]??Sr.high}function qm(r,e){if(r)return e?[{type:"text",text:r,cache_control:{type:"ephemeral"}}]:r}function Km(r){let e=[],t=new Set;for(let n=0;n<r.length;n++){let o=r[n];if(o.role==="assistant"&&o.tool_calls&&o.tool_calls.length>0){let s=o.tool_calls.filter(l=>t.has(l.id)?!1:(t.add(l.id),!0)),i=new Set(s.map(l=>l.id)),a=new Set,c=r.slice(n+1);for(let l of c){if(l.role!=="tool")break;l.tool_call_id&&a.add(l.tool_call_id)}s.length!==o.tool_calls.length?e.push({...o,tool_calls:s}):e.push(o);let d=[...i].filter(l=>!a.has(l));for(let l of d){let u=s.find(p=>p.id===l);e.push({role:"tool",tool_call_id:l,name:u?.function.name,content:"[Tool execution failed; output not available during conversation recovery]"})}}else o.role==="tool"?t.has(o.tool_call_id??"")&&e.push(o):e.push(o)}return e}function Jm(r,e={},t){let n,o=[];for(let s of r){if(s.role==="system"){n=n?`${n}
38
+
39
+ ${s.content??""}`:s.content??"";continue}if(s.role==="user")if(s.imageUrls&&s.imageUrls.length>0&&!e.filterImageBlocks){let a=[];s.content&&a.push({type:"text",text:s.content});for(let c of s.imageUrls)if(c.startsWith("data:")){let d=/^data:([^;]+);base64,(.+)$/.exec(c);if(d){let l=d[1];l==="application/pdf"?a.push({type:"document",source:{type:"base64",media_type:l,data:d[2]}}):a.push({type:"image",source:{type:"base64",media_type:l,data:d[2]}})}}else c.endsWith(".pdf")||c.includes(".pdf?")?a.push({type:"document",source:{type:"url",url:c}}):a.push({type:"image",source:{type:"url",url:c}});o.push({role:"user",content:a})}else o.push({role:"user",content:s.content??""});else if(s.role==="assistant"){let i=e.filterThinkingBlocks?void 0:s.thinkingBlocks;if(s.tool_calls&&s.tool_calls.length>0){let a=[];if(i)for(let c of i)c.signature&&a.push({type:"thinking",thinking:c.thinking,signature:c.signature});s.content&&a.push({type:"text",text:s.content});for(let c of s.tool_calls){let d;try{d=JSON.parse(c.function.arguments)}catch{d={}}a.push({type:"tool_use",id:c.id,name:c.function.name,input:d})}o.push({role:"assistant",content:a})}else if(i&&i.length>0){let a=[];for(let c of i)c.signature&&a.push({type:"thinking",thinking:c.thinking,signature:c.signature});s.content&&a.push({type:"text",text:s.content}),o.push({role:"assistant",content:a})}else o.push({role:"assistant",content:s.content??""})}else if(s.role==="tool"){let i=s.content??"",a=i.startsWith("Error:")||i===Nm,c=s.toolReferences,l=c&&c.length>0&&!a&&(!t||zm(t))?c.map(m=>({type:"tool_reference",tool_name:m})):i,u={type:"tool_result",tool_use_id:s.tool_call_id??"",content:l,...a&&{is_error:!0}},p=o[o.length-1];p&&p.role==="user"&&Array.isArray(p.content)?p.content.push(u):o.push({role:"user",content:[u]})}}return{system:n,messages:o}}function Ym(r){return{name:r.function.name,description:r.function.description,input_schema:r.function.parameters??{type:"object",properties:{}}}}function Xm(r){let e=/Anthropic API error (\d{3})/.exec(r);return e?parseInt(e[1],10):null}function Qm(r){let e=typeof r.max_tokens=="number"?r.max_tokens:8192,t=Math.min(e,$m),n={...r,max_tokens:t},o=n.thinking;return o?.type==="enabled"&&o.budget_tokens&&(n.thinking={...o,budget_tokens:Math.min(o.budget_tokens,t-1)}),n}var Dn=class{baseUrl;extraHeaders;timeoutMs;quirks;constructor(e){if(!e.baseUrl)throw new Error("VolcengineResponsesTransport: baseUrl is required");this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.extraHeaders=e.extraHeaders??{},this.timeoutMs=e.timeoutMs??18e4,this.quirks=e.quirks??{}}async*stream(e,t,n){let s=`${this.baseUrl.replace(/\/v\d+$/,"")}/v3/responses`,i=this.buildRequestBody(e),a={"Content-Type":"application/json",Authorization:`Bearer ${t}`,...this.extraHeaders};if(e.builtinTools&&!e.disableBuiltinTools&&e.builtinTools.length>0)for(let d of e.builtinTools)d.type==="builtin_web_search"?a["ark-beta-web-search"]="true":d.type==="builtin_image_process"?a["ark-beta-image-process"]="true":d.type==="builtin_knowledge_search"?a["ark-beta-knowledge-search"]="true":d.type==="builtin_doubao_app"&&(a["ark-beta-doubao-app"]="true");let c=null;for(let d=0;d<=3;d++){if(n?.aborted)throw new Error("Request aborted");d>0&&c&&await Ee(Ie(d),n);try{yield*this.fetchAndStream(s,a,i,n);return}catch(l){c=l instanceof Error?l:new Error(String(l));let u=c.message.includes("Stream idle timeout");if(!$e(Ne(c))&&!u||d===3)throw c}}}resolveConstraints(e){let t=e;if(t.caching&&t.caching.type==="enabled"){if(t.instructions)return t={...t,caching:void 0},t;if(t.structuredOutput&&t.structuredOutput.mode==="json_schema"&&(t={...t,structuredOutput:{mode:"json_object"}}),t.builtinTools&&t.builtinTools.length>0){let o=t.builtinTools.filter(s=>s.type!=="builtin_web_search"&&s.type!=="builtin_image_process");o.length!==t.builtinTools.length&&(t={...t,builtinTools:o.length>0?o:void 0})}}return t}buildRequestBody(e){let t=this.resolveConstraints(e),n={model:t.model,input:Zm(t.messages),stream:!0};if(t.previousResponseId&&(n.previous_response_id=t.previousResponseId),t.store!==void 0&&(n.store=t.store),t.storeExpireAt!==void 0&&(n.expire_at=t.storeExpireAt),t.instructions&&(n.instructions=t.instructions),t.structuredOutput)if(t.structuredOutput.mode==="json_object")n.text={format:{type:"json_object"}};else{let s={type:"json_schema",name:t.structuredOutput.name,schema:t.structuredOutput.schema};t.structuredOutput.strict!==void 0&&(s.strict=t.structuredOutput.strict),n.text={format:s}}if(t.caching){let s={type:t.caching.type};t.caching.prefix!==void 0&&(s.prefix=t.caching.prefix),n.caching=s,t.caching.prefix&&(n.stream=!1)}if(t.contextManagement){let s=t.contextManagement.edits.map(i=>{let a={type:i.type};return i.type==="clear_thinking"&&i.keep!==void 0?a.keep=i.keep:i.type==="clear_tool_uses"&&(i.trigger&&(a.trigger=i.trigger),i.keep&&(a.keep=i.keep),i.excludeTools&&(a.exclude_tools=i.excludeTools),i.clearToolInput!==void 0&&(a.clear_tool_input=i.clearToolInput)),a});n.context_management={edits:s}}let o=[];if(t.tools&&t.tools.length>0)for(let s of t.tools)o.push({type:"function",name:s.function.name,description:s.function.description,parameters:s.function.parameters});if(t.builtinTools&&!t.disableBuiltinTools&&t.builtinTools.length>0)for(let s of t.builtinTools){let a={type:s.type.replace(/^builtin_/,"")};s.config&&Object.assign(a,s.config),o.push(a)}if(o.length>0&&(n.tools=o),t.maxToolCalls!==void 0&&(n.max_tool_calls=t.maxToolCalls),t.toolChoice!==void 0&&(typeof t.toolChoice=="string"?n.tool_choice=t.toolChoice:n.tool_choice={type:t.toolChoice.type,name:t.toolChoice.name}),t.temperature!==void 0&&(n.temperature=t.temperature),t.topP!==void 0&&(n.top_p=t.topP),t.maxTokens!==void 0&&(n.max_output_tokens=t.maxTokens),t.reasoning){let s=t.reasoning.effort??"high";s==="minimal"?n.thinking={type:"disabled"}:(n.thinking={type:"enabled"},n.reasoning={effort:s}),t.reasoning.includeEncryptedReasoning&&(n.include=["reasoning.encrypted_content"])}return t.prefixMessage&&n.input.push({role:"assistant",content:t.prefixMessage,partial:!0}),n}async*fetchAndStream(e,t,n,o){let s=AbortSignal.timeout(this.timeoutMs),i=o?AbortSignal.any([o,s]):s,a=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(n),signal:i});if(!a.ok){let d=await a.text().catch(()=>""),l=new Error(`Volcengine Responses API error ${a.status}: ${d.slice(0,500)}`);throw l.status=a.status,l}if(!a.body)throw new Error("Volcengine Responses API returned no response body");let c=a.headers.get("content-type")??"";if(c.includes("application/json")&&!c.includes("text/event-stream")){yield*this.handleNonStreamingResponse(a);return}yield*this.parseSSEStream(a.body)}async*handleNonStreamingResponse(e){let t=await e.json();if(t.id&&(yield{type:"response_id",id:t.id}),t.usage&&(yield{type:"usage",promptTokens:t.usage.input_tokens??0,completionTokens:t.usage.output_tokens??0,reasoningTokens:t.usage.output_tokens_details?.reasoning_tokens,cacheReadTokens:t.usage.input_tokens_details?.cached_tokens}),t.output)for(let n of t.output){if(n.type==="message"&&n.content)for(let o of n.content)o.type==="output_text"&&(yield{type:"delta",text:o.text??""});if(n.type==="reasoning"&&n.summary)for(let o of n.summary)o.type==="summary_text"&&(yield{type:"reasoning_delta",text:o.text??""});n.type==="function_call"&&(yield{type:"tool_call_delta",index:0,id:n.call_id,name:n.name,arguments:n.arguments??""})}yield{type:"done",finishReason:t.status==="completed"?"stop":t.status??"stop"}}async*parseSSEStream(e){let t=new TextDecoder,n="",o="",s=null,i=new AbortController,a=0,c=new Map,d=()=>{s&&clearTimeout(s),s=setTimeout(()=>{i.abort()},Me)};try{d();let l=e.getReader();try{for(;;){let{done:u,value:p}=await l.read();if(u)break;if(i.signal.aborted)throw new Error("Stream idle timeout");d(),n+=t.decode(p,{stream:!0});let m;for(;(m=n.indexOf(`
40
+ `))!==-1;){let g=n.slice(0,m).trim();if(n=n.slice(m+1),!g){o="";continue}if(!g.startsWith(":")){if(g.startsWith("event:")){o=g.slice(6).trim();continue}if(g.startsWith("data:")){let f=g.slice(5).trim();if(f==="[DONE]")return;let b;try{b=JSON.parse(f)}catch{continue}yield*this.processEvent(o,b,c,()=>a++)}}}}}finally{l.releaseLock()}}finally{s&&clearTimeout(s)}}*processEvent(e,t,n,o){switch(e){case"response.output_text.delta":{let s=t.delta;s&&(yield{type:"delta",text:s});break}case"response.reasoning_summary_text.delta":{let s=t.delta;s&&(yield{type:"reasoning_delta",text:s});break}case"response.function_call_arguments.delta":{let s=t.delta,i=t.call_id,a=t.name;if(s!==void 0&&i){let c=n.get(i);c===void 0&&(c=o(),n.set(i,c)),yield{type:"tool_call_delta",index:c,id:i,name:a,arguments:s}}break}case"response.output_item.added":{let s=t.item;if(s&&s.type==="function_call"){let i=s.call_id,a=s.name;if(i&&!n.has(i)){let c=o();n.set(i,c),yield{type:"tool_call_delta",index:c,id:i,name:a,arguments:""}}}break}case"response.function_call_arguments.done":break;case"response.output_item.done":{let s=t.item;if(s?.type==="message"){let i=s.content;if(i)for(let a of i){let c=a.annotations;c&&c.length>0&&(yield{type:"annotations",annotations:c.map(d=>({type:d.type??"url_citation",url:d.url,title:d.title,...d}))})}}break}case"response.completed":{let s=t.response;if(s){let i=s.id;i&&(yield{type:"response_id",id:i});let a=s.usage;if(a){let d=a.input_tokens_details,l=a.output_tokens_details;yield{type:"usage",promptTokens:a.input_tokens??0,completionTokens:a.output_tokens??0,reasoningTokens:l?.reasoning_tokens,cacheReadTokens:d?.cached_tokens}}yield{type:"done",finishReason:s.status==="incomplete"?"tool_calls":"stop"}}else yield{type:"done",finishReason:"stop"};break}case"response.failed":{yield{type:"error",message:t.response?.error?.message??"Unknown error"},yield{type:"done",finishReason:"error"};break}default:{e.startsWith("response.web_search_call")?yield{type:"builtin_tool_status",toolType:"web_search",event:e,data:t}:e.startsWith("response.image_process")&&(yield{type:"builtin_tool_status",toolType:"image_process",event:e,data:t});break}}}};function Zm(r){let e=[];for(let t of r){if(t.role==="system"){e.push({role:"system",content:t.content??""});continue}if(t.role==="user"){let n=t.imageUrls&&t.imageUrls.length>0,o=t.videoUrls&&t.videoUrls.length>0,s=t.audioUrls&&t.audioUrls.length>0,i=t.fileIds&&t.fileIds.length>0;if(n||o||s||i){let c=[];if(n)for(let d of t.imageUrls){let l={type:"input_image",image_url:d};t.imageDetail&&(l.detail=t.imageDetail),t.imagePixelLimit&&(l.image_pixel_limit=t.imagePixelLimit),c.push(l)}if(o)for(let d of t.videoUrls){let l={type:"input_video",video_url:d};t.videoFps!==void 0&&(l.fps=t.videoFps),c.push(l)}if(s)for(let d of t.audioUrls){let l={type:"input_audio",audio_url:d};t.audioFormat&&(l.format=t.audioFormat),c.push(l)}if(i)for(let d of t.fileIds)c.push({type:"input_file",file_id:d.id});t.content&&c.push({type:"input_text",text:t.content}),e.push({role:"user",content:c})}else e.push({role:"user",content:t.content??""});continue}if(t.role==="assistant"){e.push({role:"assistant",content:t.content??""});continue}if(t.role==="tool"){if(!t.tool_call_id)continue;e.push({type:"function_call_output",call_id:t.tool_call_id,output:t.content??""});continue}}return e}Mo();var eg=[{category:"HARM_CATEGORY_HARASSMENT",threshold:"BLOCK_ONLY_HIGH"},{category:"HARM_CATEGORY_HATE_SPEECH",threshold:"BLOCK_ONLY_HIGH"},{category:"HARM_CATEGORY_SEXUALLY_EXPLICIT",threshold:"BLOCK_ONLY_HIGH"},{category:"HARM_CATEGORY_DANGEROUS_CONTENT",threshold:"BLOCK_ONLY_HIGH"},{category:"HARM_CATEGORY_CIVIC_INTEGRITY",threshold:"BLOCK_ONLY_HIGH"}];function tg(r){switch(r){case"minimal":return"MINIMAL";case"low":return"LOW";case"medium":return"MEDIUM";case"high":return"HIGH";default:return"HIGH"}}var Kt=class{baseUrl;timeoutMs;quirks;constructor(e){if(!e.baseUrl)throw new Error("GeminiGenerateContentTransport: baseUrl is required");this.baseUrl=e.baseUrl.replace(/\/openai\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??18e4,this.quirks=e.quirks??{}}async*stream(e,t,n){let o=`${this.baseUrl}/models/${encodeURIComponent(e.model)}:streamGenerateContent?alt=sse`,s=this.buildRequestBody(e),i={"Content-Type":"application/json","x-goog-api-key":t},a=null;for(let c=0;c<=3;c++){if(n?.aborted)throw new Error("Request aborted");c>0&&a&&await Ee(Ie(c),n);try{yield*this.fetchAndStream(o,i,s,n);return}catch(d){a=d instanceof Error?d:new Error(String(d));let l=a.message.includes("Stream idle timeout");if(!$e(Ne(a))&&!l)throw a;if(c===3){if((l||$e(Ne(a)))&&!e.streamRequired)try{yield*this.nonStreamingFallback(e,t,n);return}catch{throw a}throw a}}}}buildRequestBody(e){let{systemInstruction:t,contents:n}=ng(e.messages),o={contents:n};t&&(o.system_instruction=t);let s=this.buildTools(e);s.length>0&&(o.tools=s),e.tools&&e.tools.length>0&&e.toolChoice&&(o.toolConfig=this.buildToolConfig(e.toolChoice));let i=this.buildGenerationConfig(e);return Object.keys(i).length>0&&(o.generationConfig=i),o.safetySettings=eg,e.cachedContent&&(o.cachedContent=e.cachedContent),o}buildTools(e){let t=[];if(e.tools&&e.tools.length>0){let n=e.tools.map(og);t.push({functionDeclarations:n})}return e.disableBuiltinTools||(this.quirks.builtinWebSearch&&t.push({googleSearch:{}}),this.quirks.builtinCodeInterpreter&&t.push({codeExecution:{}}),this.quirks.builtinUrlContext&&t.push({urlContext:{}}),this.quirks.builtinMapsGrounding&&t.push({googleMaps:{}}),this.quirks.builtinFileSearch&&t.push({fileSearch:{}})),t}buildToolConfig(e){return typeof e=="string"?{functionCallingConfig:{mode:{auto:"AUTO",none:"NONE",required:"ANY"}[e]??"AUTO"}}:{functionCallingConfig:{mode:"ANY",allowedFunctionNames:[e.name]}}}buildGenerationConfig(e){let t={};if(e.temperature!==void 0&&(t.temperature=e.temperature),e.topP!==void 0&&(t.topP=e.topP),e.maxTokens!==void 0&&(t.maxOutputTokens=e.maxTokens),e.reasoning){let n=tg(e.reasoning.effort);n==="MINIMAL"&&e.model.includes("pro")&&(n="LOW"),t.thinkingConfig={thinkingLevel:n,includeThoughts:!0}}return e.structuredOutput&&(e.structuredOutput.mode==="json_object"?t.responseMimeType="application/json":e.structuredOutput.mode==="json_schema"&&(t.responseMimeType="application/json",t.responseSchema=e.structuredOutput.schema)),t}async*fetchAndStream(e,t,n,o){let s=AbortSignal.timeout(this.timeoutMs),i=o?AbortSignal.any([o,s]):s,a=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(n),signal:i});if(!a.ok){let d=await a.text().catch(()=>""),l=new Error(`Gemini API error ${a.status}: ${d.slice(0,500)}`);throw l.status=a.status,l}if(!a.body)throw new Error("Gemini API returned no response body");let c=a.headers.get("content-type")??"";if(c.includes("application/json")&&!c.includes("text/event-stream")){let d=await a.json();yield*this.processResponse(d);return}yield*this.parseSSEStreamWithWatchdog(a.body)}async*parseSSEStreamWithWatchdog(e){let t=new TextDecoder,n="",o=null,s=new AbortController,i=()=>{o&&clearTimeout(o),o=setTimeout(()=>{s.abort()},Me)};try{i();let a=e.getReader();try{for(;;){let{done:c,value:d}=await a.read();if(c)break;if(s.signal.aborted)throw new Error("Stream idle timeout");i(),n+=t.decode(d,{stream:!0});let l;for(;(l=n.indexOf(`
41
+ `))!==-1;){let u=n.slice(0,l).trim();if(n=n.slice(l+1),!u||u.startsWith(":")||!u.startsWith("data: "))continue;let p=u.slice(6);if(p==="[DONE]")return;let m;try{m=JSON.parse(p)}catch{continue}yield*this.processResponse(m)}}}finally{a.releaseLock()}}finally{o&&clearTimeout(o)}}*processResponse(e){if(e.error){yield{type:"error",message:`Gemini error ${e.error.code}: ${e.error.message}`};return}if(e.usageMetadata){let t=e.usageMetadata;yield{type:"usage",promptTokens:t.promptTokenCount??0,completionTokens:t.candidatesTokenCount??0,reasoningTokens:t.thoughtsTokenCount,cacheReadTokens:t.cachedContentTokenCount}}if(!(!e.candidates||e.candidates.length===0))for(let t of e.candidates){if(t.finishReason==="SAFETY"){yield{type:"error",message:"Response blocked by Gemini safety filters"},yield{type:"done",finishReason:"content_filter"};return}let n=t.content?.parts??[],o=0;for(let s of n){if(s.thought&&s.text){yield{type:"reasoning_delta",text:s.text},s.thoughtSignature&&(yield{type:"reasoning_block_complete",thinking:s.text,signature:s.thoughtSignature});continue}if(s.text&&!s.thought){yield{type:"delta",text:s.text};continue}if(s.functionCall){let i=s.functionCall;yield{type:"tool_call_delta",index:o,id:i.id??`gemini-tc-${o}`,name:i.name,arguments:JSON.stringify(i.args??{})},s.thoughtSignature&&(yield{type:"reasoning_block_complete",thinking:"",signature:s.thoughtSignature}),o++;continue}if(s.codeExecutionResult){yield{type:"delta",text:`
40
42
  \`\`\`output
41
43
  ${s.codeExecutionResult.output??""}
42
44
  \`\`\`
@@ -44,8 +46,8 @@ ${s.codeExecutionResult.output??""}
44
46
  \`\`\`${s.executableCode.language??"python"}
45
47
  ${s.executableCode.code}
46
48
  \`\`\`
47
- `};continue}}if(t.groundingMetadata?.groundingChunks){let s=t.groundingMetadata.groundingChunks.filter(i=>i.web?.uri).map(i=>({type:"web_search",url:i.web.uri,title:i.web.title}));s.length>0&&(yield{type:"annotations",annotations:s})}t.finishReason&&(yield{type:"done",finishReason:Ym(t.finishReason)})}}async*nonStreamingFallback(e,t,n){let o=`${this.baseUrl}/models/${encodeURIComponent(e.model)}:generateContent`,s=this.buildRequestBody(e),i=AbortSignal.timeout(this.timeoutMs),a=n?AbortSignal.any([n,i]):i,l=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json","x-goog-api-key":t},body:JSON.stringify(s),signal:a});if(!l.ok){let c=await l.text().catch(()=>"");throw new Error(`Gemini API error ${l.status}: ${c.slice(0,500)}`)}let u=await l.json();yield*this.processResponse(u)}};function Km(r){let e=null,t=[],n=[],o=()=>{n.length>0&&(t.push({role:"user",parts:n}),n=[])};for(let s of r)switch(s.role){case"system":{e={parts:[{text:s.content??""}]};break}case"user":{o();let i=[];if(s.content&&i.push({text:s.content}),s.imageUrls&&s.imageUrls.length>0)for(let a of s.imageUrls)if(a.startsWith("data:")){let l=a.match(/^data:([^;]+);base64,(.+)$/);l&&i.push({inlineData:{mimeType:l[1],data:l[2]}})}else i.push({fileData:{mimeType:"image/jpeg",fileUri:a}});if(s.audioUrls&&s.audioUrls.length>0)for(let a of s.audioUrls){let l=s.audioFormat?`audio/${s.audioFormat==="m4a"?"mp4":s.audioFormat}`:"audio/mp3";i.push({fileData:{mimeType:l,fileUri:a}})}if(s.videoUrls&&s.videoUrls.length>0)for(let a of s.videoUrls)i.push({fileData:{mimeType:"video/mp4",fileUri:a}});i.length>0&&t.push({role:"user",parts:i});break}case"assistant":{o();let i=[];if(s.thinkingBlocks&&s.thinkingBlocks.length>0)for(let a of s.thinkingBlocks){let l={text:a.thinking,thought:!0};a.signature&&(l.thoughtSignature=a.signature),i.push(l)}if(s.content&&i.push({text:s.content}),s.tool_calls&&s.tool_calls.length>0)for(let a of s.tool_calls){let l={};try{l=JSON.parse(a.function.arguments)}catch{}i.push({functionCall:{name:a.function.name,args:l,id:a.id}})}i.length>0&&t.push({role:"model",parts:i});break}case"tool":{let i;try{i=JSON.parse(s.content??"{}")}catch{i={result:s.content??""}}n.push({functionResponse:{name:s.name??"",response:i,id:s.tool_call_id??""}});break}}return o(),{systemInstruction:e,contents:t}}function Jm(r){let e={name:r.function.name,description:r.function.description};return r.function.parameters&&(e.parameters=Ce(r.function.parameters)),e}function Ym(r){switch(r){case"STOP":return"stop";case"MAX_TOKENS":return"length";case"SAFETY":return"content_filter";case"RECITATION":return"content_filter";case"LANGUAGE":return"content_filter";case"FINISH_REASON_UNSPECIFIED":return"stop";default:return r.toLowerCase()}}function An(r,e){r.baseUrl&&e.applyOverride(r.provider,{baseUrl:r.baseUrl});let t=e.getProvider(r.provider);if(!t)throw new Error(`Unknown LLM provider: "${r.provider}". Available: ${e.listProviders().map(s=>s.id).join(", ")}`);let n=r.baseUrl||t.baseUrl;return{transport:Xm(t,n),apiKey:r.apiKey,resolvedModel:r.model,providerDef:t}}function Mn(r){for(let e of r.listProviders()){let t=r.resolveApiKey(e.id);if(t)return{providerId:e.id,apiKey:t,defaultModel:e.defaultModel??e.models?.[0]?.id??""}}}function Xm(r,e){let t;switch(r.transport){case"openai-chat":t=new gt({baseUrl:e,extraHeaders:r.extraHeaders,supportsStreamOptions:r.supportsStreamOptions,omitZeroTemperature:r.omitZeroTemperature,quirks:r.quirks});break;case"openai-responses":t=new Rn({baseUrl:e,extraHeaders:r.extraHeaders,quirks:r.quirks});break;case"anthropic-messages":t=new jt({baseUrl:e,omitZeroTemperature:r.omitZeroTemperature,quirks:r.quirks});break;case"volcengine-responses":t=new Cn({baseUrl:e,extraHeaders:r.extraHeaders,quirks:r.quirks});break;case"gemini-generatecontent":t=new Ft({baseUrl:e,quirks:r.quirks});break;default:throw new Error(`Unsupported transport type: "${r.transport}" for provider "${r.id}"`)}if(r.transport==="anthropic-messages"&&r.quirks?.supportsPrefixCompletion){let n=e.replace(/\/anthropic\/?$/,""),o=new gt({baseUrl:n,quirks:r.quirks});return new yr(t,o)}return t}var yr=class{constructor(e,t){this.primary=e;this.prefixTransport=t}primary;prefixTransport;async*stream(e,t,n){yield*(e.prefixMessage?this.prefixTransport:this.primary).stream(e,t,n)}async*complete(e,t,n){if(this.prefixTransport.complete)yield*this.prefixTransport.complete(e,t,n);else throw new Error("FIM completion is not supported by this transport")}};var Bt=class{baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??3e5}async uploadFile(e,t,n,o){let s=e instanceof Blob?Buffer.from(await e.arrayBuffer()):e,i=n?.mimeType??"application/octet-stream",a=n?.displayName??"upload",l=this.baseUrl.replace(/(\/v1beta)$/,"/upload$1/files"),u=await fetch(l,{method:"POST",headers:{"x-goog-api-key":t,"X-Goog-Upload-Protocol":"resumable","X-Goog-Upload-Command":"start","X-Goog-Upload-Header-Content-Length":String(s.length),"X-Goog-Upload-Header-Content-Type":i,"Content-Type":"application/json"},body:JSON.stringify({file:{display_name:a}}),signal:o??AbortSignal.timeout(this.timeoutMs)});if(!u.ok){let m=await u.text().catch(()=>"");throw new Error(`Gemini file upload init error ${u.status}: ${m.slice(0,500)}`)}let c=u.headers.get("x-goog-upload-url");if(!c)throw new Error("Gemini file upload: missing x-goog-upload-url in response headers");let d=await fetch(c,{method:"PUT",headers:{"Content-Length":String(s.length),"X-Goog-Upload-Offset":"0","X-Goog-Upload-Command":"upload, finalize"},body:s,signal:o??AbortSignal.timeout(this.timeoutMs)});if(!d.ok){let m=await d.text().catch(()=>"");throw new Error(`Gemini file upload error ${d.status}: ${m.slice(0,500)}`)}return(await d.json()).file}async waitForProcessing(e,t,n){let o=n?.pollIntervalMs??2500,s=n?.maxWaitMs??12e4,i=Date.now();for(;Date.now()-i<s;){let a=await this.getFile(e,t);if(a.state==="ACTIVE")return a;if(a.state==="FAILED")throw new Error(`Gemini file processing failed: ${a.error?.message??"unknown error"}`);await new Promise(l=>setTimeout(l,o))}throw new Error(`Gemini file processing timed out after ${s}ms`)}async getFile(e,t,n){let o=`${this.baseUrl}/${e}`,s=await fetch(o,{method:"GET",headers:{"x-goog-api-key":t},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Gemini file get error ${s.status}: ${i.slice(0,500)}`)}return await s.json()}async listFiles(e,t,n){let o=new URLSearchParams;t?.pageSize&&o.set("pageSize",String(t.pageSize)),t?.pageToken&&o.set("pageToken",t.pageToken);let s=`${this.baseUrl}/files?${o.toString()}`,i=await fetch(s,{method:"GET",headers:{"x-goog-api-key":e},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!i.ok){let l=await i.text().catch(()=>"");throw new Error(`Gemini file list error ${i.status}: ${l.slice(0,500)}`)}let a=await i.json();return{files:a.files??[],nextPageToken:a.nextPageToken}}async deleteFile(e,t,n){let o=`${this.baseUrl}/${e}`,s=await fetch(o,{method:"DELETE",headers:{"x-goog-api-key":t},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Gemini file delete error ${s.status}: ${i.slice(0,500)}`)}}};import{join as Qm}from"node:path";import{mkdirSync as Zm,appendFileSync as eg}from"node:fs";var ha=Ji();function br(){return process.env.QLOGICAGENT_DEBUG==="1"}function kr(r,e){let t=Qm(ha,`${e}.jsonl`),n=!1;function o(){n||(Zm(ha,{recursive:!0}),n=!0)}function s(i){try{o(),eg(t,JSON.stringify(i)+`
48
- `,"utf8")}catch{}}return{async*stream(i,a,l){let u=Date.now();s({type:"request",timestamp:new Date(u).toISOString(),model:i.model,messageCount:i.messages.length,toolCount:i.tools?.length??0,toolChoice:i.toolChoice,temperature:i.temperature,maxTokens:i.maxTokens,reasoning:i.reasoning});let c=0,d=0,p=0,m="",g;try{for await(let f of r.stream(i,a,l))f.type==="usage"?(c=f.promptTokens,d=f.completionTokens,p=f.reasoningTokens??0):f.type==="done"&&(m=f.finishReason),yield f}catch(f){throw g=f instanceof Error?f.message:String(f),f}finally{let f=Date.now()-u;s({type:"response",timestamp:new Date().toISOString(),model:i.model,elapsedMs:f,promptTokens:c,completionTokens:d,reasoningTokens:p,finishReason:m,...g?{error:g}:{}})}}}}function Tr(r){return typeof r.deleteVideoTask=="function"&&typeof r.listVideoTasks=="function"}function wr(r){let e=new Map;return{register(t){let n=e.get(t.point)??[],o={handler:t.handler,priority:t.priority??100,label:t.label};return n.push(o),n.sort((s,i)=>s.priority-i.priority),e.set(t.point,n),()=>{let s=n.indexOf(o);s>=0&&n.splice(s,1)}},async invoke(t,n){let o=e.get(t);if(!o||o.length===0)return{action:"continue",context:n};let s=n;for(let i of o)try{let a=await i.handler(t,s);if(!a||a.action==="continue"){a?.context&&(s=a.context);continue}if(a.action==="abort"||a.action==="skip")return r.info({hook:t,label:i.label,action:a.action,reason:a.reason},"hook intercepted"),a}catch(a){r.warn({hook:t,label:i.label,err:a.message},"hook handler failed (non-blocking)")}return{action:"continue",context:s}}}}var Pn={MAX_SESSION_BYTES:61440,LIMIT_PER_RECALL:10,MAX_SURFACED_ENTRIES:100};function Wt(){return{surfacedPaths:new Set,sessionBytes:0}}function ya(r,e,t){let n=[],o=t??Wt(),s,i=[];return n.push(r.register({point:"memory.before_recall",priority:50,label:"qmemory-prefetch",handler:async(a,l)=>{if(!e.memoryProvider||!l.query)return{action:"continue",context:l};if(o.sessionBytes>=Pn.MAX_SESSION_BYTES)return e.log.debug("memory.before_recall: session byte budget exhausted, skipping"),{action:"continue",context:l};try{let u=await e.memoryProvider.search(l.query,e.userId,{limit:Pn.LIMIT_PER_RECALL}),c=u.filter(p=>{let m=p,g=m.path??m.id??"";if(!g)return!0;if(o.surfacedPaths.has(g))return!1;let f=(m.content?.length??0)*2;if(o.sessionBytes+f>Pn.MAX_SESSION_BYTES)return!1;if(o.surfacedPaths.add(g),o.sessionBytes+=f,o.surfacedPaths.size>Pn.MAX_SURFACED_ENTRIES){let b=o.surfacedPaths.values().next().value;b!==void 0&&o.surfacedPaths.delete(b)}return!0});s=l.turnId,i=c,e.log.debug(`memory.before_recall: prefetched ${u.length} \u2192 ${c.length} after dedup (${o.sessionBytes} bytes used)`);let d=c.map(p=>{let m=p;return{text:m.text??m.content??"",score:m.score}}).filter(p=>p.text);return{action:"continue",context:{...l,recalledMemories:d}}}catch(u){e.log.warn(`memory.before_recall: qmemory prefetch failed: ${u instanceof Error?u.message:String(u)}`),i=[]}return{action:"continue",context:l}}})),n.push(r.register({point:"memory.after_recall",priority:50,label:"qmemory-recall-log",handler:(a,l)=>{let u=s===l.turnId?i.length:0;return e.log.debug(`memory.after_recall: ${l.blockCount??0} blocks assembled, ${u} qmemory results (session: ${o.sessionBytes} bytes)`),{action:"continue",context:l}}})),()=>{for(let a of n)a();i=[]}}import{ClawQMemoryAdapter as tg}from"qlogicagent-adapter-claw";var ba="qmemory";function ka(r){let e=new tg({baseUrl:r.baseUrl,apiKey:r.apiKey,timeout:r.timeoutMs??5e3});function t(n){return r.userIdPrefix?`${r.userIdPrefix}:${n}`:n}return{providerId:ba,async search(n,o,s){return((await e.dispatch("memory.search",{q:n,user_id:t(o),limit:s?.limit??10})).memories??[]).filter(a=>a.id&&a.text).map(a=>({blockId:a.id,text:a.text,score:typeof a.importance=="number"?a.importance:0,source:ba,metadata:a.metadata}))},async ingest(n,o,s){await e.dispatch("memory.addKnowledge",{user_id:t(o),messages:n.map(i=>({role:i.role,content:i.content,...i.timestamp?{timestamp:i.timestamp}:{}})),extraction_mode:"none",run_async:!0,...s?.sessionId?{session_id:s.sessionId}:{},...s?.source?{metadata:{source:s.source}}:{}})},async health(){let n=await e.dispatch("memory.health",{});return{status:n.status??"unknown",version:n.version??"",memoryCount:n.memory_count??0,dbSizeBytes:n.db_size_bytes??0,embeddingModel:n.embedding_model??"",uptimeSeconds:n.uptime_seconds??0}},async addText(n,o,s){return{memoriesAdded:(await e.dispatch("memory.addFact",{user_id:t(o),text:n,extraction_mode:"none",...s?.sessionId?{metadata:{session_id:s.sessionId,...s.source?{source:s.source}:{}}}:{}})).memories_added??0}},async ingestExtracted(n,o,s){if(n.length===0)return{memoriesAdded:0};let i=t(o),a=await Promise.allSettled(n.map(u=>e.dispatch("memory.addFact",{user_id:i,text:u.text,extraction_mode:"none",...s?.sessionId?{session_id:s.sessionId}:{},metadata:{...s?.source?{source:s.source}:{},...u.category?{category:u.category}:{},...typeof u.importance=="number"?{importance:u.importance}:{},...u.speaker?{speaker:u.speaker}:{},...u.event_date?{event_date:u.event_date}:{},...u.tags?.length?{tags:u.tags}:{}}}))),l=0;for(let u of a)u.status==="fulfilled"&&(l+=u.value.memories_added??1);return{memoriesAdded:l}},async remove(n){try{return await e.dispatch("memory.forget",{id:n}),!0}catch{return!1}},async feedback(n,o,s){await e.dispatch("memory.feedback",{memory_ids:n,signal:o,...s?{session_id:s}:{}})}}}import{readFile as _a,writeFile as xr,stat as Ea,unlink as ag,mkdir as lg}from"node:fs/promises";import{join as En,resolve as Ra,isAbsolute as Ca,normalize as Aa}from"node:path";import{randomUUID as cg}from"node:crypto";function Ta(){return{toolUseCount:0,latestInputTokens:0,cumulativeOutputTokens:0,recentActivities:[]}}function ng(r){return r.latestInputTokens+r.cumulativeOutputTokens}var og=new Set(["grep","glob","search","Grep","Glob","list_dir","find_files"]),wa=new Set(["read_file","file_read","cat","head","tail","FileRead"]);function rg(r){return{isSearch:og.has(r)||void 0,isRead:wa.has(r)||void 0}}function sg(r,e){let t=e.file_path??e.path??e.filePath;if(typeof t=="string")return`${wa.has(r)?"Reading":r.includes("write")||r.includes("edit")?"Editing":"Using"} ${t}`;let n=e.command??e.cmd;if(typeof n=="string")return`Running: ${n.length>60?n.slice(0,60)+"\u2026":n}`;let o=e.query??e.pattern??e.search;if(typeof o=="string")return`Searching: ${o}`}function va(r,e){r.latestInputTokens=(e.input_tokens??0)+(e.cache_creation_input_tokens??0)+(e.cache_read_input_tokens??0),r.cumulativeOutputTokens+=e.output_tokens??0}function xa(r,e,t,n){r.toolUseCount++;let o=rg(e),s={toolName:e,input:t,activityDescription:n?.(e,t)??sg(e,t),isSearch:o.isSearch,isRead:o.isRead};for(r.recentActivities.push(s);r.recentActivities.length>5;)r.recentActivities.shift()}function vr(r){return{toolUseCount:r.toolUseCount,tokenCount:ng(r),lastActivity:r.recentActivities.length>0?r.recentActivities[r.recentActivities.length-1]:void 0,recentActivities:[...r.recentActivities]}}import{randomUUID as Sa}from"node:crypto";function ig(r){let e=new AbortController;return r&&(r.aborted?e.abort(r.reason):r.addEventListener("abort",()=>{e.abort(r.reason)},{once:!0})),e}async function In(r){let e=Date.now(),t=[],n={prompt:0,completion:0},o=Ta(),{promptMessages:s,systemPrompt:i,tools:a,canUseTool:l,transport:u,toolInvoker:c,apiKey:d,model:p,log:m,hooks:g,forkLabel:f,maxTurns:b,temperature:T,parentSignal:w,onEvent:_,onProgress:y,budgetTokens:C,parentDepth:E}=r,D=ig(w),L=`fork-${f}-${Sa().slice(0,8)}`,v=`fork-session-${Sa().slice(0,8)}`;m.info(`[fork:${f}] starting \u2014 ${s.length} initial messages, model=${p}`);let ce=l?{invoke:async(re,ue,V,B)=>{let fe={};try{fe=JSON.parse(V)}catch{}let Oe=l(ue,fe);return Oe.allowed?c.invoke(re,ue,V,B):(m.info(`[fork:${f}] tool ${ue} denied: ${Oe.reason}`),{result:"",error:Oe.reason})}}:c,F=!0,j;try{let{Agent:re}=await Promise.resolve().then(()=>(kn(),zi)),ue=new re({llmTransport:u,apiKey:d,toolInvoker:ce,log:m,hooks:g,maxRounds:b});for await(let V of ue.run({turnId:L,sessionId:v,messages:s,tools:a,systemPrompt:i,config:{model:p,apiKey:d,temperature:T,maxOutputTokens:r.maxOutputTokens,parentDepth:E}},D.signal)){if(t.push(V),_?.(V),V.type==="end"&&V.usage&&(va(o,{input_tokens:V.usage.prompt,output_tokens:V.usage.completion}),n.prompt+=V.usage.prompt,n.completion+=V.usage.completion,V.usage.cacheRead&&(n.cacheRead=(n.cacheRead??0)+V.usage.cacheRead),V.usage.cacheCreation&&(n.cacheCreation=(n.cacheCreation??0)+V.usage.cacheCreation),C&&C>0)){let B=n.prompt+n.completion+(n.reasoning??0);B>=C&&(m.info(`[fork:${f}] budget exceeded (${B} / ${C} tokens), aborting`),D.abort("budget_exceeded"))}if(V.type==="tool_call"){let B={};try{B=JSON.parse(V.arguments??"{}")}catch{}xa(o,V.name,B),y?.(vr(o))}V.type==="error"&&(F=!1,j=V.error)}}catch(re){F=!1,j=re instanceof Error?re.message:String(re),m.warn(`[fork:${f}] error: ${j}`)}finally{D.signal.aborted||D.abort("fork_complete")}let ne=Date.now()-e;return m.info(`[fork:${f}] finished in ${ne}ms \u2014 ${t.length} events, usage: prompt=${n.prompt} completion=${n.completion}, ok=${F}`),{events:t,totalUsage:n,progress:vr(o),durationMs:ne,ok:F,error:j}}var Oa={minHours:24,minSessions:5,scanIntervalMs:6e5},On=".consolidate-lock",ug=3600*1e3,Ma="CLAUDE.md",dg=100,pg=new Set(["ls","find","grep","cat","stat","wc","head","tail","file","which","whereis","type","echo","printf","test","diff","sort","uniq","tr","cut","awk","sed","du","df","date","pwd","hostname","uname","git"]),mg=new Set(["log","show","diff","status","branch","tag","remote","rev-parse","rev-list","ls-files","ls-tree","describe","blame","shortlog","name-rev","cat-file"]),gg=/[|>&]|>>|>\s|rm\s|mv\s|cp\s|chmod\s|chown\s|mkdir\s|touch\s/;function fg(r){let e=r.trim();if(!e||gg.test(e))return!1;let t=e.split(/\s+/),n=t[0]?.replace(/^(\/usr\/bin\/|\/bin\/|\/usr\/local\/bin\/)/,"")??"";if(!pg.has(n))return!1;if(n==="git"){let o=t[1];if(!o||!mg.has(o))return!1}return!0}function hg(r,e){let{toolName:t,input:n}=e;if(new Set(["read_file","grep","glob","search","list_dir","file_read","Grep","Glob"]).has(t))return{allowed:!0};if(new Set(["qmemory_search","qmemory_store","qmemory_feedback"]).has(t))return{allowed:!0};if(t==="bash"||t==="execute_command"||t==="Bash"){let i=n.command??n.cmd??"";return fg(i)?{allowed:!0}:{allowed:!1,reason:"Only read-only shell commands are permitted during dream consolidation (ls, find, grep, cat, stat, wc, head, tail, and similar)"}}if(t==="file_edit"||t==="file_write"||t==="FileEdit"||t==="FileWrite"){let i=n.file_path??n.path??"";return typeof i=="string"&&La(i,r)?{allowed:!0}:{allowed:!1,reason:`File writes are only allowed within the memory directory: ${r}`}}return{allowed:!1,reason:`Tool "${t}" is not permitted during dream consolidation. Only read_file, grep, glob, read-only bash, and memory-scoped file_edit/file_write are allowed.`}}function La(r,e){let t=Ca(r)?r:Ra(r),n=Ca(e)?e:Ra(e),o=Aa(t),s=Aa(n);return o.startsWith(s)}function $a(r,e,t,n){let o=n?.hasQMemory?`
49
+ `};continue}}if(t.groundingMetadata?.groundingChunks){let s=t.groundingMetadata.groundingChunks.filter(i=>i.web?.uri).map(i=>({type:"web_search",url:i.web.uri,title:i.web.title}));s.length>0&&(yield{type:"annotations",annotations:s})}t.finishReason&&(yield{type:"done",finishReason:rg(t.finishReason)})}}async*nonStreamingFallback(e,t,n){let o=`${this.baseUrl}/models/${encodeURIComponent(e.model)}:generateContent`,s=this.buildRequestBody(e),i=AbortSignal.timeout(this.timeoutMs),a=n?AbortSignal.any([n,i]):i,c=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json","x-goog-api-key":t},body:JSON.stringify(s),signal:a});if(!c.ok){let l=await c.text().catch(()=>"");throw new Error(`Gemini API error ${c.status}: ${l.slice(0,500)}`)}let d=await c.json();yield*this.processResponse(d)}};function ng(r){let e=null,t=[],n=[],o=()=>{n.length>0&&(t.push({role:"user",parts:n}),n=[])};for(let s of r)switch(s.role){case"system":{e={parts:[{text:s.content??""}]};break}case"user":{o();let i=[];if(s.content&&i.push({text:s.content}),s.imageUrls&&s.imageUrls.length>0)for(let a of s.imageUrls)if(a.startsWith("data:")){let c=a.match(/^data:([^;]+);base64,(.+)$/);c&&i.push({inlineData:{mimeType:c[1],data:c[2]}})}else i.push({fileData:{mimeType:"image/jpeg",fileUri:a}});if(s.audioUrls&&s.audioUrls.length>0)for(let a of s.audioUrls){let c=s.audioFormat?`audio/${s.audioFormat==="m4a"?"mp4":s.audioFormat}`:"audio/mp3";i.push({fileData:{mimeType:c,fileUri:a}})}if(s.videoUrls&&s.videoUrls.length>0)for(let a of s.videoUrls)i.push({fileData:{mimeType:"video/mp4",fileUri:a}});i.length>0&&t.push({role:"user",parts:i});break}case"assistant":{o();let i=[];if(s.thinkingBlocks&&s.thinkingBlocks.length>0)for(let a of s.thinkingBlocks){let c={text:a.thinking,thought:!0};a.signature&&(c.thoughtSignature=a.signature),i.push(c)}if(s.content&&i.push({text:s.content}),s.tool_calls&&s.tool_calls.length>0)for(let a of s.tool_calls){let c={};try{c=JSON.parse(a.function.arguments)}catch{}i.push({functionCall:{name:a.function.name,args:c,id:a.id}})}i.length>0&&t.push({role:"model",parts:i});break}case"tool":{let i;try{i=JSON.parse(s.content??"{}")}catch{i={result:s.content??""}}n.push({functionResponse:{name:s.name??"",response:i,id:s.tool_call_id??""}});break}}return o(),{systemInstruction:e,contents:t}}function og(r){let e={name:r.function.name,description:r.function.description};return r.function.parameters&&(e.parameters=Pe(r.function.parameters)),e}function rg(r){switch(r){case"STOP":return"stop";case"MAX_TOKENS":return"length";case"SAFETY":return"content_filter";case"RECITATION":return"content_filter";case"LANGUAGE":return"content_filter";case"FINISH_REASON_UNSPECIFIED":return"stop";default:return r.toLowerCase()}}function $n(r,e){r.baseUrl&&e.applyOverride(r.provider,{baseUrl:r.baseUrl});let t=e.getProvider(r.provider);if(!t)throw new Error(`Unknown LLM provider: "${r.provider}". Available: ${e.listProviders().map(s=>s.id).join(", ")}`);let n=r.baseUrl||t.baseUrl;return{transport:sg(t,n),apiKey:r.apiKey,resolvedModel:r.model,providerDef:t}}function sg(r,e){let t;switch(r.transport){case"openai-chat":t=new kt({baseUrl:e,extraHeaders:r.extraHeaders,supportsStreamOptions:r.supportsStreamOptions,omitZeroTemperature:r.omitZeroTemperature,quirks:r.quirks});break;case"openai-responses":t=new Ln({baseUrl:e,extraHeaders:r.extraHeaders,quirks:r.quirks});break;case"anthropic-messages":t=new qt({baseUrl:e,omitZeroTemperature:r.omitZeroTemperature,quirks:r.quirks});break;case"volcengine-responses":t=new Dn({baseUrl:e,extraHeaders:r.extraHeaders,quirks:r.quirks});break;case"gemini-generatecontent":t=new Kt({baseUrl:e,quirks:r.quirks});break;default:throw new Error(`Unsupported transport type: "${r.transport}" for provider "${r.id}"`)}if(r.transport==="anthropic-messages"&&r.quirks?.supportsPrefixCompletion){let n=e.replace(/\/anthropic\/?$/,""),o=new kt({baseUrl:n,quirks:r.quirks});return new _r(t,o)}return t}var _r=class{constructor(e,t){this.primary=e;this.prefixTransport=t}primary;prefixTransport;async*stream(e,t,n){yield*(e.prefixMessage?this.prefixTransport:this.primary).stream(e,t,n)}async*complete(e,t,n){if(this.prefixTransport.complete)yield*this.prefixTransport.complete(e,t,n);else throw new Error("FIM completion is not supported by this transport")}};var Jt=class{baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??3e5}async uploadFile(e,t,n,o){let s=e instanceof Blob?Buffer.from(await e.arrayBuffer()):e,i=n?.mimeType??"application/octet-stream",a=n?.displayName??"upload",c=this.baseUrl.replace(/(\/v1beta)$/,"/upload$1/files"),d=await fetch(c,{method:"POST",headers:{"x-goog-api-key":t,"X-Goog-Upload-Protocol":"resumable","X-Goog-Upload-Command":"start","X-Goog-Upload-Header-Content-Length":String(s.length),"X-Goog-Upload-Header-Content-Type":i,"Content-Type":"application/json"},body:JSON.stringify({file:{display_name:a}}),signal:o??AbortSignal.timeout(this.timeoutMs)});if(!d.ok){let m=await d.text().catch(()=>"");throw new Error(`Gemini file upload init error ${d.status}: ${m.slice(0,500)}`)}let l=d.headers.get("x-goog-upload-url");if(!l)throw new Error("Gemini file upload: missing x-goog-upload-url in response headers");let u=await fetch(l,{method:"PUT",headers:{"Content-Length":String(s.length),"X-Goog-Upload-Offset":"0","X-Goog-Upload-Command":"upload, finalize"},body:s,signal:o??AbortSignal.timeout(this.timeoutMs)});if(!u.ok){let m=await u.text().catch(()=>"");throw new Error(`Gemini file upload error ${u.status}: ${m.slice(0,500)}`)}return(await u.json()).file}async waitForProcessing(e,t,n){let o=n?.pollIntervalMs??2500,s=n?.maxWaitMs??12e4,i=Date.now();for(;Date.now()-i<s;){let a=await this.getFile(e,t);if(a.state==="ACTIVE")return a;if(a.state==="FAILED")throw new Error(`Gemini file processing failed: ${a.error?.message??"unknown error"}`);await new Promise(c=>setTimeout(c,o))}throw new Error(`Gemini file processing timed out after ${s}ms`)}async getFile(e,t,n){let o=`${this.baseUrl}/${e}`,s=await fetch(o,{method:"GET",headers:{"x-goog-api-key":t},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Gemini file get error ${s.status}: ${i.slice(0,500)}`)}return await s.json()}async listFiles(e,t,n){let o=new URLSearchParams;t?.pageSize&&o.set("pageSize",String(t.pageSize)),t?.pageToken&&o.set("pageToken",t.pageToken);let s=`${this.baseUrl}/files?${o.toString()}`,i=await fetch(s,{method:"GET",headers:{"x-goog-api-key":e},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!i.ok){let c=await i.text().catch(()=>"");throw new Error(`Gemini file list error ${i.status}: ${c.slice(0,500)}`)}let a=await i.json();return{files:a.files??[],nextPageToken:a.nextPageToken}}async deleteFile(e,t,n){let o=`${this.baseUrl}/${e}`,s=await fetch(o,{method:"DELETE",headers:{"x-goog-api-key":t},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Gemini file delete error ${s.status}: ${i.slice(0,500)}`)}}};import{join as ig}from"node:path";import{mkdirSync as ag,appendFileSync as lg}from"node:fs";var xa=na();function Rr(){return process.env.QLOGICAGENT_DEBUG==="1"}function Cr(r,e){let t=ig(xa,`${e}.jsonl`),n=!1;function o(){n||(ag(xa,{recursive:!0}),n=!0)}function s(i){try{o(),lg(t,JSON.stringify(i)+`
50
+ `,"utf8")}catch{}}return{async*stream(i,a,c){let d=Date.now();s({type:"request",timestamp:new Date(d).toISOString(),model:i.model,messageCount:i.messages.length,toolCount:i.tools?.length??0,toolChoice:i.toolChoice,temperature:i.temperature,maxTokens:i.maxTokens,reasoning:i.reasoning});let l=0,u=0,p=0,m="",g;try{for await(let f of r.stream(i,a,c))f.type==="usage"?(l=f.promptTokens,u=f.completionTokens,p=f.reasoningTokens??0):f.type==="done"&&(m=f.finishReason),yield f}catch(f){throw g=f instanceof Error?f.message:String(f),f}finally{let f=Date.now()-d;s({type:"response",timestamp:new Date().toISOString(),model:i.model,elapsedMs:f,promptTokens:l,completionTokens:u,reasoningTokens:p,finishReason:m,...g?{error:g}:{}})}}}}function Ar(r){return typeof r.deleteVideoTask=="function"&&typeof r.listVideoTasks=="function"}function Pr(r){let e=new Map;return{register(t){let n=e.get(t.point)??[],o={handler:t.handler,priority:t.priority??100,label:t.label};return n.push(o),n.sort((s,i)=>s.priority-i.priority),e.set(t.point,n),()=>{let s=n.indexOf(o);s>=0&&n.splice(s,1)}},async invoke(t,n){let o=e.get(t);if(!o||o.length===0)return{action:"continue",context:n};let s=n;for(let i of o)try{let a=await i.handler(t,s);if(!a||a.action==="continue"){a?.context&&(s=a.context);continue}if(a.action==="abort"||a.action==="skip")return r.info({hook:t,label:i.label,action:a.action,reason:a.reason},"hook intercepted"),a}catch(a){r.warn({hook:t,label:i.label,err:a.message},"hook handler failed (non-blocking)")}return{action:"continue",context:s}}}}var Nn={MAX_SESSION_BYTES:61440,LIMIT_PER_RECALL:10,MAX_SURFACED_ENTRIES:100};function Tt(){return{surfacedPaths:new Set,sessionBytes:0}}function Sa(r,e,t){let n=[],o=t??Tt(),s,i=[];return n.push(r.register({point:"memory.before_recall",priority:50,label:"qmemory-prefetch",handler:async(a,c)=>{if(!e.memoryProvider||!c.query)return{action:"continue",context:c};if(o.sessionBytes>=Nn.MAX_SESSION_BYTES)return e.log.debug("memory.before_recall: session byte budget exhausted, skipping"),{action:"continue",context:c};try{let d=await e.memoryProvider.search(c.query,e.userId,{limit:Nn.LIMIT_PER_RECALL}),l=d.filter(p=>{let m=p,g=m.path??m.id??"";if(!g)return!0;if(o.surfacedPaths.has(g))return!1;let f=(m.content?.length??0)*2;if(o.sessionBytes+f>Nn.MAX_SESSION_BYTES)return!1;if(o.surfacedPaths.add(g),o.sessionBytes+=f,o.surfacedPaths.size>Nn.MAX_SURFACED_ENTRIES){let b=o.surfacedPaths.values().next().value;b!==void 0&&o.surfacedPaths.delete(b)}return!0});s=c.turnId,i=l,e.log.debug(`memory.before_recall: prefetched ${d.length} \u2192 ${l.length} after dedup (${o.sessionBytes} bytes used)`);let u=l.map(p=>{let m=p;return{text:m.text??m.content??"",score:m.score}}).filter(p=>p.text);return{action:"continue",context:{...c,recalledMemories:u}}}catch(d){e.log.warn(`memory.before_recall: qmemory prefetch failed: ${d instanceof Error?d.message:String(d)}`),i=[]}return{action:"continue",context:c}}})),n.push(r.register({point:"memory.after_recall",priority:50,label:"qmemory-recall-log",handler:(a,c)=>{let d=s===c.turnId?i.length:0;return e.log.debug(`memory.after_recall: ${c.blockCount??0} blocks assembled, ${d} qmemory results (session: ${o.sessionBytes} bytes)`),{action:"continue",context:c}}})),()=>{for(let a of n)a();i=[]}}import{ClawQMemoryAdapter as cg}from"qlogicagent-adapter-claw";var _a="qmemory";function Ra(r){let e=new cg({baseUrl:r.baseUrl,apiKey:r.apiKey,timeout:r.timeoutMs??5e3});function t(n){return r.userIdPrefix?`${r.userIdPrefix}:${n}`:n}return{providerId:_a,async search(n,o,s){return((await e.dispatch("memory.search",{q:n,user_id:t(o),limit:s?.limit??10})).memories??[]).filter(a=>a.id&&a.text).map(a=>({blockId:a.id,text:a.text,score:typeof a.importance=="number"?a.importance:0,source:_a,metadata:a.metadata}))},async ingest(n,o,s){await e.dispatch("memory.addKnowledge",{user_id:t(o),messages:n.map(i=>({role:i.role,content:i.content,...i.timestamp?{timestamp:i.timestamp}:{}})),extraction_mode:"none",run_async:!0,...s?.sessionId?{session_id:s.sessionId}:{},...s?.source?{metadata:{source:s.source}}:{}})},async health(){let n=await e.dispatch("memory.health",{});return{status:n.status??"unknown",version:n.version??"",memoryCount:n.memory_count??0,dbSizeBytes:n.db_size_bytes??0,embeddingModel:n.embedding_model??"",uptimeSeconds:n.uptime_seconds??0}},async addText(n,o,s){return{memoriesAdded:(await e.dispatch("memory.addFact",{user_id:t(o),text:n,extraction_mode:"none",...s?.sessionId?{metadata:{session_id:s.sessionId,...s.source?{source:s.source}:{}}}:{}})).memories_added??0}},async ingestExtracted(n,o,s){if(n.length===0)return{memoriesAdded:0};let i=t(o),a=await Promise.allSettled(n.map(d=>e.dispatch("memory.addFact",{user_id:i,text:d.text,extraction_mode:"none",...s?.sessionId?{session_id:s.sessionId}:{},metadata:{...s?.source?{source:s.source}:{},...d.category?{category:d.category}:{},...typeof d.importance=="number"?{importance:d.importance}:{},...d.speaker?{speaker:d.speaker}:{},...d.event_date?{event_date:d.event_date}:{},...d.tags?.length?{tags:d.tags}:{}}}))),c=0;for(let d of a)d.status==="fulfilled"&&(c+=d.value.memories_added??1);return{memoriesAdded:c}},async remove(n){try{return await e.dispatch("memory.forget",{id:n}),!0}catch{return!1}},async feedback(n,o,s){await e.dispatch("memory.feedback",{memory_ids:n,signal:o,...s?{session_id:s}:{}})}}}import{readFile as Ea,writeFile as Ir,stat as ja,unlink as fg,mkdir as hg}from"node:fs/promises";import{join as Un,resolve as Oa,isAbsolute as La,normalize as Da}from"node:path";import{randomUUID as yg}from"node:crypto";function Ca(){return{toolUseCount:0,latestInputTokens:0,cumulativeOutputTokens:0,recentActivities:[]}}function dg(r){return r.latestInputTokens+r.cumulativeOutputTokens}var ug=new Set(["grep","glob","search","Grep","Glob","list_dir","find_files"]),Aa=new Set(["read_file","file_read","cat","head","tail","FileRead"]);function pg(r){return{isSearch:ug.has(r)||void 0,isRead:Aa.has(r)||void 0}}function mg(r,e){let t=e.file_path??e.path??e.filePath;if(typeof t=="string")return`${Aa.has(r)?"Reading":r.includes("write")||r.includes("edit")?"Editing":"Using"} ${t}`;let n=e.command??e.cmd;if(typeof n=="string")return`Running: ${n.length>60?n.slice(0,60)+"\u2026":n}`;let o=e.query??e.pattern??e.search;if(typeof o=="string")return`Searching: ${o}`}function Pa(r,e){r.latestInputTokens=(e.input_tokens??0)+(e.cache_creation_input_tokens??0)+(e.cache_read_input_tokens??0),r.cumulativeOutputTokens+=e.output_tokens??0}function Ma(r,e,t,n){r.toolUseCount++;let o=pg(e),s={toolName:e,input:t,activityDescription:n?.(e,t)??mg(e,t),isSearch:o.isSearch,isRead:o.isRead};for(r.recentActivities.push(s);r.recentActivities.length>5;)r.recentActivities.shift()}function Mr(r){return{toolUseCount:r.toolUseCount,tokenCount:dg(r),lastActivity:r.recentActivities.length>0?r.recentActivities[r.recentActivities.length-1]:void 0,recentActivities:[...r.recentActivities]}}import{randomUUID as Ia}from"node:crypto";function gg(r){let e=new AbortController;return r&&(r.aborted?e.abort(r.reason):r.addEventListener("abort",()=>{e.abort(r.reason)},{once:!0})),e}async function Yt(r){let e=Date.now(),t=[],n={prompt:0,completion:0},o=Ca(),{promptMessages:s,systemPrompt:i,tools:a,canUseTool:c,transport:d,toolInvoker:l,apiKey:u,model:p,log:m,hooks:g,forkLabel:f,maxTurns:b,temperature:w,parentSignal:T,onEvent:_,onProgress:R,budgetTokens:y,parentDepth:I}=r,O=gg(T),$=`fork-${f}-${Ia().slice(0,8)}`,v=`fork-session-${Ia().slice(0,8)}`;m.info(`[fork:${f}] starting \u2014 ${s.length} initial messages, model=${p}`);let pe=c?{invoke:async(re,me,V,B)=>{let ye={};try{ye=JSON.parse(V)}catch{}let De=c(me,ye);return De.allowed?l.invoke(re,me,V,B):(m.info(`[fork:${f}] tool ${me} denied: ${De.reason}`),{result:"",error:De.reason})}}:l,F=!0,j;try{let{Agent:re}=await Promise.resolve().then(()=>(Cn(),Zi)),me=new re({llmTransport:d,apiKey:u,toolInvoker:pe,log:m,hooks:g,maxRounds:b});for await(let V of me.run({turnId:$,sessionId:v,messages:s,tools:a,systemPrompt:i,config:{model:p,apiKey:u,temperature:w,maxOutputTokens:r.maxOutputTokens,parentDepth:I}},O.signal)){if(t.push(V),_?.(V),V.type==="end"&&V.usage&&(Pa(o,{input_tokens:V.usage.prompt,output_tokens:V.usage.completion}),n.prompt+=V.usage.prompt,n.completion+=V.usage.completion,V.usage.cacheRead&&(n.cacheRead=(n.cacheRead??0)+V.usage.cacheRead),V.usage.cacheCreation&&(n.cacheCreation=(n.cacheCreation??0)+V.usage.cacheCreation),y&&y>0)){let B=n.prompt+n.completion+(n.reasoning??0);B>=y&&(m.info(`[fork:${f}] budget exceeded (${B} / ${y} tokens), aborting`),O.abort("budget_exceeded"))}if(V.type==="tool_call"){let B={};try{B=JSON.parse(V.arguments??"{}")}catch{}Ma(o,V.name,B),R?.(Mr(o))}V.type==="error"&&(F=!1,j=V.error)}}catch(re){F=!1,j=re instanceof Error?re.message:String(re),m.warn(`[fork:${f}] error: ${j}`)}finally{O.signal.aborted||O.abort("fork_complete")}let oe=Date.now()-e;return m.info(`[fork:${f}] finished in ${oe}ms \u2014 ${t.length} events, usage: prompt=${n.prompt} completion=${n.completion}, ok=${F}`),{events:t,totalUsage:n,progress:Mr(o),durationMs:oe,ok:F,error:j}}var Fa={minHours:24,minSessions:5,scanIntervalMs:6e5},jn=".consolidate-lock",bg=3600*1e3,$a="CLAUDE.md",kg=100,Tg=new Set(["ls","find","grep","cat","stat","wc","head","tail","file","which","whereis","type","echo","printf","test","diff","sort","uniq","tr","cut","awk","sed","du","df","date","pwd","hostname","uname","git"]),wg=new Set(["log","show","diff","status","branch","tag","remote","rev-parse","rev-list","ls-files","ls-tree","describe","blame","shortlog","name-rev","cat-file"]),vg=/[|>&]|>>|>\s|rm\s|mv\s|cp\s|chmod\s|chown\s|mkdir\s|touch\s/;function xg(r){let e=r.trim();if(!e||vg.test(e))return!1;let t=e.split(/\s+/),n=t[0]?.replace(/^(\/usr\/bin\/|\/bin\/|\/usr\/local\/bin\/)/,"")??"";if(!Tg.has(n))return!1;if(n==="git"){let o=t[1];if(!o||!wg.has(o))return!1}return!0}function Sg(r,e){let{toolName:t,input:n}=e;if(new Set(["read_file","grep","glob","search","list_dir","file_read","Grep","Glob"]).has(t))return{allowed:!0};if(new Set(["qmemory_search","qmemory_store","qmemory_feedback"]).has(t))return{allowed:!0};if(t==="bash"||t==="execute_command"||t==="Bash"){let i=n.command??n.cmd??"";return xg(i)?{allowed:!0}:{allowed:!1,reason:"Only read-only shell commands are permitted during dream consolidation (ls, find, grep, cat, stat, wc, head, tail, and similar)"}}if(t==="file_edit"||t==="file_write"||t==="FileEdit"||t==="FileWrite"){let i=n.file_path??n.path??"";return typeof i=="string"&&Ba(i,r)?{allowed:!0}:{allowed:!1,reason:`File writes are only allowed within the memory directory: ${r}`}}return{allowed:!1,reason:`Tool "${t}" is not permitted during dream consolidation. Only read_file, grep, glob, read-only bash, and memory-scoped file_edit/file_write are allowed.`}}function Ba(r,e){let t=La(r)?r:Oa(r),n=La(e)?e:Oa(e),o=Da(t),s=Da(n);return o.startsWith(s)}function Ga(r,e,t,n){let o=n?.hasQMemory?`
49
51
 
50
52
  ## Phase 2.5 \u2014 Long-term memory triage (QMemory)
51
53
 
@@ -80,7 +82,7 @@ Session transcripts: \`${e}\` (large JSONL files \u2014 grep narrowly, don't rea
80
82
  ## Phase 1 \u2014 Orient
81
83
 
82
84
  - \`ls\` the memory directory to see what already exists
83
- - Read \`${Ma}\` to understand the current index
85
+ - Read \`${$a}\` to understand the current index
84
86
  - Skim existing topic files so you improve them rather than creating duplicates
85
87
  - If \`logs/\` or \`sessions/\` subdirectories exist, review recent entries there
86
88
 
@@ -106,7 +108,7 @@ Focus on:
106
108
 
107
109
  ## Phase 4 \u2014 Prune and index
108
110
 
109
- Update \`${Ma}\` so it stays under ${dg} lines AND under ~25KB. It's an **index**, not a dump \u2014 each entry should be one line under ~150 characters: \`- [Title](file.md) \u2014 one-line hook\`. Never write memory content directly into it.
111
+ Update \`${$a}\` so it stays under ${kg} lines AND under ~25KB. It's an **index**, not a dump \u2014 each entry should be one line under ~150 characters: \`- [Title](file.md) \u2014 one-line hook\`. Never write memory content directly into it.
110
112
 
111
113
  - Remove pointers to memories that are now stale, wrong, or superseded
112
114
  - Demote verbose entries: if an index line is over ~200 chars, it's carrying content that belongs in the topic file \u2014 shorten the line, move the detail
@@ -121,162 +123,162 @@ Sessions since last consolidation (${t.length}):
121
123
  ${t.map(s=>`- ${s}`).join(`
122
124
  `)}
123
125
 
124
- Return a brief summary of what you consolidated, updated, or pruned. If nothing changed (memories are already tight), say so.`}var Pa=0;async function yg(r,e={}){let t={...Oa,...e},n;try{n=await Da(r.memoryRoot)}catch{n=0}let o=(Date.now()-n)/36e5;if(!t.force&&o<t.minHours)return null;let s=Date.now()-Pa;if(!t.force&&s<t.scanIntervalMs)return null;Pa=Date.now();let i;try{i=await r.listSessionsSince(n)}catch{return null}return i=i.filter(a=>a!==r.currentSessionId),!t.force&&i.length<t.minSessions?null:{sessionIds:i}}async function Da(r){let e=En(r,On);return(await Ea(e)).mtimeMs}function bg(r){try{return process.kill(r,0),!0}catch{return!1}}async function kg(r){let e=En(r,On),t,n;try{let[s,i]=await Promise.all([Ea(e),_a(e,"utf8")]);t=s.mtimeMs;let a=parseInt(i.trim(),10);n=Number.isFinite(a)?a:void 0}catch{}if(t!==void 0&&Date.now()-t<ug&&n!==void 0&&bg(n))return null;await lg(r,{recursive:!0}),await xr(e,String(process.pid));let o;try{o=await _a(e,"utf8")}catch{return null}return parseInt(o.trim(),10)!==process.pid?null:t??0}async function Ia(r,e){let t=En(r,On);try{if(e===0){await ag(t);return}await xr(t,"");let{utimes:n}=await import("node:fs/promises"),o=e/1e3;await n(t,o,o)}catch{}}async function Tg(r){let e=En(r,On);await xr(e,String(process.pid))}function wg(r){return{taskId:`dream-${cg().slice(0,8)}`,type:"dream",label:"Memory consolidation",permissionRole:"worker",isolation:"shared",lifecycle:"running",depth:1,maxTurns:0,tokenBudget:0,startedAt:Date.now(),parentTaskId:r.parentTaskId,sessionId:r.sessionId,phase:"starting",sessionsReviewing:r.sessionsReviewing,filesTouched:[],turns:[],priorLockMtime:r.priorLockMtime}}async function vg(r,e={}){let t={...Oa,...e},n=await yg(r,t);if(!n)return null;let o;if(t.force)try{o=await Da(r.memoryRoot)}catch{o=0}else if(o=await kg(r.memoryRoot),o===null)return null;let s=$a(r.memoryRoot,r.transcriptDir,n.sessionIds),i=wg({sessionId:r.currentSessionId,sessionsReviewing:n.sessionIds.length,priorLockMtime:o});return{prompt:s,taskState:i,sessionIds:n.sessionIds}}async function Ua(r){let e=Date.now(),t=await vg(r.context,r.triggerConfig);if(!t)return{ok:!0,sessionsReviewed:0,filesTouched:[],turns:[],durationMs:Date.now()-e};let{taskState:n,sessionIds:o}=t,s=!!(r.qmemoryAdapter&&r.qmemoryUserId),i=s?$a(r.context.memoryRoot,r.context.transcriptDir,o,{hasQMemory:!0}):t.prompt;r.log.info(`[dream] starting consolidation \u2014 ${o.length} sessions, memoryRoot=${r.context.memoryRoot}`+(s?", qmemory=enabled":"")),r.hooks?.invoke("subagent.started",{sessionId:r.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream"}).catch(()=>{});let a=(d,p)=>hg(r.context.memoryRoot,{toolName:d,input:p}),l=s?[{type:"function",function:{name:"qmemory_search",description:"Search the user's long-term memory (QMemory). Returns relevant memories sorted by relevance.",parameters:{type:"object",properties:{query:{type:"string",description:"Semantic search query"},limit:{type:"number",description:"Max results (default: 10)"}},required:["query"]}}},{type:"function",function:{name:"qmemory_store",description:"Store a memory to the user's long-term memory (QMemory). Use for user preferences, facts, and cross-project knowledge.",parameters:{type:"object",properties:{text:{type:"string",description:"The memory text to store"},source:{type:"string",description:"Source label (e.g. 'dream-consolidation')"}},required:["text"]}}},{type:"function",function:{name:"qmemory_feedback",description:"Submit feedback on recalled memories (e.g. mark as outdated or wrong).",parameters:{type:"object",properties:{memoryIds:{type:"array",items:{type:"string"},description:"IDs of memories to give feedback on"},signal:{type:"string",enum:["useful","irrelevant","outdated","wrong"],description:"Feedback signal"}},required:["memoryIds","signal"]}}}]:[],u=s?{invoke:async(d,p,m,g)=>{let f=r.qmemoryAdapter,b=r.qmemoryUserId;if(p==="qmemory_search"){let{query:T,limit:w}=JSON.parse(m),_=await f.search(T,b,{limit:w??10});return{result:JSON.stringify(_)}}if(p==="qmemory_store"){if(!f.addText)return{result:"",error:"addText not supported"};let{text:T,source:w}=JSON.parse(m),_=await f.addText(T,b,{sessionId:r.context.currentSessionId,source:w??"dream-consolidation"});return{result:JSON.stringify(_)}}if(p==="qmemory_feedback"){let{memoryIds:T,signal:w}=JSON.parse(m);return f.feedback&&await f.feedback(T,w,r.context.currentSessionId),{result:"Feedback recorded successfully."}}return r.toolInvoker.invoke(d,p,m,g)}}:r.toolInvoker,c=[...r.tools,...l];try{let d=await In({promptMessages:[{role:"user",content:"Begin memory consolidation."}],systemPrompt:i,tools:c,canUseTool:a,transport:r.transport,toolInvoker:u,apiKey:r.apiKey,model:r.model,log:r.log,hooks:r.hooks,forkLabel:"dream-consolidation",parentSignal:r.parentSignal,skipTranscript:!0}),p=[];for(let m of d.events)if(m.type==="tool_call")try{let g=JSON.parse(m.arguments),f=g.file_path??g.path??g.filePath;f&&La(f,r.context.memoryRoot)&&p.push(f)}catch{}return d.ok?(await Tg(r.context.memoryRoot),r.log.info(`[dream] consolidation complete \u2014 ${p.length} files touched, ${d.durationMs}ms`)):(await Ia(r.context.memoryRoot,n.priorLockMtime),r.log.warn(`[dream] consolidation failed: ${d.error}`)),r.hooks?.invoke("subagent.stopped",{sessionId:r.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream",reason:d.ok?"normal":"error",error:d.error}).catch(()=>{}),{ok:d.ok,sessionsReviewed:o.length,filesTouched:[...new Set(p)],turns:[],durationMs:Date.now()-e,error:d.error}}catch(d){await Ia(r.context.memoryRoot,n.priorLockMtime).catch(()=>{});let p=d instanceof Error?d.message:String(d);return r.log.warn(`[dream] consolidation error: ${p}`),r.hooks?.invoke("subagent.stopped",{sessionId:r.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream",reason:"error",error:p}).catch(()=>{}),{ok:!1,sessionsReviewed:0,filesTouched:[],turns:[],durationMs:Date.now()-e,error:p}}}var Gt=class{sessionId;_trustAccepted=!1;_modelUsage=new Map;_totalInputTokens=0;_totalOutputTokens=0;_turnCount=0;_toolCallCount=0;_listeners=new Set;constructor(e){this.sessionId=e}get trustAccepted(){return this._trustAccepted}setTrustAccepted(e){this._trustAccepted=e,this.notifyListeners()}get totalInputTokens(){return this._totalInputTokens}get totalOutputTokens(){return this._totalOutputTokens}get turnCount(){return this._turnCount}get toolCallCount(){return this._toolCallCount}getModelUsage(e){return this._modelUsage.get(e)}getAllModelUsage(){let e={};for(let[t,n]of this._modelUsage)e[t]={...n};return e}addUsage(e,t){this._totalInputTokens+=e.prompt,this._totalOutputTokens+=e.completion;let n=this._modelUsage.get(t);n?(n.inputTokens+=e.prompt,n.outputTokens+=e.completion,n.cacheRead+=e.cacheRead??0,n.cacheCreation+=e.cacheCreation??0):this._modelUsage.set(t,{inputTokens:e.prompt,outputTokens:e.completion,cacheRead:e.cacheRead??0,cacheCreation:e.cacheCreation??0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0}),this.notifyListeners()}addMediaUsage(e,t,n){let o=this._modelUsage.get(e),s=o??{inputTokens:0,outputTokens:0,cacheRead:0,cacheCreation:0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0};switch(o||this._modelUsage.set(e,s),s.mediaCalls+=1,t){case"per_second":s.mediaDurationSeconds+=n;break;case"per_character":s.mediaCharacters+=n;break}this.notifyListeners()}recordToolCall(){this._toolCallCount++}recordTurnCompleted(){this._turnCount++}createSnapshot(){return{sessionId:this.sessionId,modelUsage:this.getAllModelUsage(),totalInputTokens:this._totalInputTokens,totalOutputTokens:this._totalOutputTokens,turnCount:this._turnCount,lastSavedAt:Date.now()}}restoreFromSnapshot(e){if(e.sessionId!==this.sessionId)return!1;this._totalInputTokens=e.totalInputTokens,this._totalOutputTokens=e.totalOutputTokens,this._turnCount=e.turnCount,this._modelUsage.clear();for(let[t,n]of Object.entries(e.modelUsage))this._modelUsage.set(t,{...n});return this.notifyListeners(),!0}onStateChange(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}notifyListeners(){for(let e of this._listeners)try{e()}catch{}}};import*as Te from"node:fs";import*as De from"node:path";var Na="transcript.jsonl",Ht="state.json",xg=50,Sg=50,_g=30;function ja(r){return r?sa(r):ur()}function Ln(r,e){let t=r.replace(/[^a-zA-Z0-9_-]/g,"_");return De.join(ja(e),t)}async function Sr(r,e,t){let n=Ln(r,t);await Te.promises.mkdir(n,{recursive:!0});let o=JSON.stringify({role:e.role,content:e.content,ts:Date.now()})+`
125
- `;await Te.promises.appendFile(De.join(n,Na),o,"utf8")}async function Fa(r,e,t,n){let o=Ln(r,n);await Te.promises.mkdir(o,{recursive:!0});let s={metadata:{sessionId:r,createdAt:t.createdAt??Date.now(),lastActiveAt:Date.now(),model:t.model,cwd:t.cwd,turnCount:e.turnCount,messageCount:t.messageCount??0,title:t.title},costSnapshot:e},i=De.join(o,Ht+".tmp");await Te.promises.writeFile(i,JSON.stringify(s,null,2),"utf8"),await Te.promises.rename(i,De.join(o,Ht))}async function Ba(r,e){let t=Ln(r,e),n=De.join(t,Na),o=De.join(t,Ht),s=[];try{s=(await Te.promises.readFile(n,"utf8")).split(`
126
- `).filter(Boolean).map(c=>{let d=JSON.parse(c);return{role:d.role,content:d.content??null}})}catch{return null}let i={sessionId:r,createdAt:Date.now(),lastActiveAt:Date.now(),turnCount:0,messageCount:s.length},a;try{let u=await Te.promises.readFile(o,"utf8"),c=JSON.parse(u);i=c.metadata,a=c.costSnapshot}catch{}let l=s.filter(u=>u.role!=="system");return{metadata:i,messages:l,costSnapshot:a}}async function Wa(r=xg,e){let t=ja(e),n;try{n=await Te.promises.readdir(t)}catch{return[]}let o=[];for(let s of n){let i=De.join(t,s,Ht);try{let a=await Te.promises.readFile(i,"utf8"),l=JSON.parse(a);o.push({sessionId:l.metadata.sessionId,title:l.metadata.title,lastActiveAt:l.metadata.lastActiveAt,messageCount:l.metadata.messageCount,model:l.metadata.model})}catch{}}return o.sort((s,i)=>i.lastActiveAt-s.lastActiveAt),o.slice(0,r)}function Rg(r){return r.turnCount<Sg?!1:r.taskSummaryGeneratedAt?r.turnCount-(r.taskSummaryGeneratedAt??0)>=_g:!0}async function Ga(r,e,t,n,o){if(!Rg(e))return null;try{let i=t.slice(-20).map(d=>`[${d.role}]: ${typeof d.content=="string"?d.content.slice(0,500):JSON.stringify(d.content).slice(0,500)}`).join(`
127
- `),a=n.transport.stream({model:n.model,messages:[{role:"system",content:"Generate a concise task summary (~100 words) of what the user is working on in this session. Focus on the goal, key decisions, and current progress. Reply with ONLY the summary."},{role:"user",content:i}],tools:[],maxTokens:200},n.apiKey),l="";for await(let d of a)d.type==="delta"&&(l+=d.text);if(l=l.trim(),!l)return null;let u=Ln(r,o),c=De.join(u,Ht);try{let d=await Te.promises.readFile(c,"utf8"),p=JSON.parse(d);p.metadata.taskSummary=l,p.metadata.taskSummaryGeneratedAt=e.turnCount;let m=c+".tmp";await Te.promises.writeFile(m,JSON.stringify(p,null,2),"utf8"),await Te.promises.rename(m,c)}catch{}return l}catch{return null}}cr();import{randomUUID as Ux}from"node:crypto";var Cg=3e4;var Dn=class{tasks=new Map;listeners=new Set;hooks=null;sessionId="";setHooks(e,t){this.hooks=e,this.sessionId=t}onTaskChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}notify(e,t){for(let n of this.listeners)try{n(e,t)}catch{}}registerTask(e){this.tasks.set(e.taskId,e),this.notify(e.taskId,e),this.hooks?.invoke("task.created",{sessionId:this.sessionId,taskId:e.taskId,taskType:e.type,label:e.label}).catch(()=>{})}updateTask(e,t){let n=this.tasks.get(e);if(!n)return;let o=t(n);o!==n&&(this.tasks.set(e,o),this.notify(e,o),!$n(n.lifecycle)&&$n(o.lifecycle)&&this.hooks?.invoke("task.completed",{sessionId:this.sessionId,taskId:o.taskId,taskType:o.type,label:o.label}).catch(()=>{}))}getTask(e){return this.tasks.get(e)}getRunningTasks(){return[...this.tasks.values()].filter(e=>e.lifecycle==="running")}getAllTasks(){return[...this.tasks.values()]}evictTask(e){let t=this.tasks.get(e);t&&$n(t.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=Cg){let t=Date.now();for(let[n,o]of this.tasks)$n(o.lifecycle)&&o.endedAt&&t-o.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function $n(r){return r==="completed"||r==="failed"||r==="cancelled"||r==="timeout"}import{watch as Ag}from"node:fs";import{stat as Mg}from"node:fs/promises";import{join as Ha,relative as Pg,resolve as Ig}from"node:path";var Eg=[`${ye}/settings.json`,"INSTRUCTIONS.md",`${ye}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${ye}/rules`],Og=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${ye}/rules`],_r=class{watchers=new Map;deps;debounceTimers=new Map;_cwd;constructor(e){this.deps=e,this._cwd=e.projectRoot}get cwd(){return this._cwd}async start(){for(let e of Eg){let t=Ha(this.deps.projectRoot,e);this.watchPath(t,e)}this.deps.log?.(`file-watcher: watching ${this.watchers.size} paths`)}watchPath(e,t){if(!this.watchers.has(e))try{let n=Ag(e,{persistent:!1,recursive:t.includes("/")?!1:void 0},(o,s)=>{let i=s?Ha(e,s):e;this.handleChange(i,o==="rename"?"created":"modified")});n.on("error",()=>{this.watchers.delete(e)}),this.watchers.set(e,n)}catch{}}handleChange(e,t){let n=this.debounceTimers.get(e);n&&clearTimeout(n),this.debounceTimers.set(e,setTimeout(async()=>{this.debounceTimers.delete(e);let o=t;try{await Mg(e)}catch{o="deleted"}let s=Pg(this.deps.projectRoot,e);this.deps.log?.(`file-watcher: ${o} ${s}`),this.deps.hooks.invoke("file.changed",{sessionId:this.deps.sessionId,filePath:e,changeType:o}).catch(()=>{}),Og.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let t=Ig(e);if(t===this._cwd)return;let n=this._cwd;this._cwd=t,this.deps.hooks.invoke("cwd.changed",{sessionId:this.deps.sessionId,oldCwd:n,newCwd:t}).catch(()=>{}),this.deps.onInstructionCacheReset?.()}stop(){for(let[,e]of this.watchers)e.close();this.watchers.clear();for(let[,e]of this.debounceTimers)clearTimeout(e);this.debounceTimers.clear()}};async function Va(r){let e=new _r(r);return await e.start(),e}import{readFile as Lg,readdir as $g,stat as Dg}from"node:fs/promises";import{dirname as Un,extname as Ug,isAbsolute as Ng,join as tt,parse as qa,resolve as za}from"node:path";import{homedir as jg}from"node:os";var Fg=5;var Bg="INSTRUCTIONS.md",Wg="INSTRUCTIONS.local.md",Gg="INSTRUCTIONS.md",Hg=[".instructions.md"],Vg=new Set([".md",".txt",".text",".json",".yaml",".yml",".toml",".xml",".csv",".html",".htm",".css",".scss",".sass",".less",".js",".ts",".tsx",".jsx",".mjs",".cjs",".mts",".cts",".py",".pyi",".pyw",".rb",".erb",".rake",".go",".rs",".java",".kt",".kts",".scala",".c",".cpp",".cc",".cxx",".h",".hpp",".hxx",".cs",".swift",".sh",".bash",".zsh",".fish",".ps1",".bat",".cmd",".env",".ini",".cfg",".conf",".config",".properties",".sql",".graphql",".gql",".proto",".vue",".svelte",".astro",".php",".pl",".pm",".lua",".r",".R",".dart",".ex",".exs",".erl",".hrl",".clj",".cljs",".cljc",".edn",".hs",".lhs",".elm",".ml",".mli",".f",".f90",".f95",".for",".cmake",".make",".makefile",".gradle",".sbt",".rst",".adoc",".asciidoc",".org",".tex",".latex",".lock",".log",".diff",".patch"]);async function zg(r){try{return await Lg(r,"utf-8")}catch{return null}}function qg(r){return r.includes("<!--")?r.replace(/^[ \t]*<!--[\s\S]*?-->[ \t]*$/gm,""):r}function Kg(r){let e=r.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);if(!e)return{content:r};let t=e[1],n=r.slice(e[0].length),o=t.match(/^paths:\s*(.+)$/m);if(!o)return{content:n};let s=[],i=o[1].trim();if(i.startsWith("["))try{s=JSON.parse(i)}catch{}else s=i.split(",").map(l=>l.trim()).filter(Boolean);let a=s.map(l=>l.endsWith("/**")?l.slice(0,-3):l).filter(l=>l.length>0&&l!=="**");return{content:n,globs:a.length>0?a:void 0}}function Jg(r,e){let t=new Set,n=/(?:^|\s)@((?:[^\s\\]|\\ )+)/g,s=r.replace(/```[\s\S]*?```/g,"").replace(/`[^`]+`/g,""),i;for(;(i=n.exec(s))!==null;){let a=i[1];if(!a)continue;let l=a.indexOf("#");if(l!==-1&&(a=a.substring(0,l)),!a)continue;a=a.replace(/\\ /g," ");let u;if(a.startsWith("~/"))u=tt(jg(),a.slice(2));else if(Ng(a))u=a;else if(a.startsWith("./"))u=za(Un(e),a);else if(/^[a-zA-Z0-9._-]/.test(a)&&!a.startsWith("@"))u=za(Un(e),a);else continue;t.add(u)}return[...t]}async function et(r,e,t,n=0,o){let s=r.toLowerCase();if(t.has(s)||n>=Fg)return[];let i=Ug(r).toLowerCase();if(i&&!Vg.has(i))return[];t.add(s);let a=await zg(r);if(!a?.trim())return[];let{content:l,globs:u}=Kg(a),c=qg(l);if(!c.trim())return[];let d=[],p={path:r,type:e,content:c.trim()};o&&(p.parent=o),u&&(p.globs=u),d.push(p);let m=Jg(l,r);for(let g of m){let f=await et(g,e,t,n+1,r);d.push(...f)}return d}async function Rr(r,e,t,n,o=new Set){if(o.has(r))return[];o.add(r);let s=[];try{let i=await $g(r,{withFileTypes:!0});for(let a of i){let l=tt(r,a.name);if(a.isDirectory())s.push(...await Rr(l,e,t,n,o));else if(a.isFile()&&a.name.endsWith(".md")){let u=await et(l,e,t);s.push(...u.filter(c=>n?!!c.globs:!c.globs))}}}catch{}return s}async function Yg(r){let e=r,t=qa(e).root;for(;e!==t;){try{let n=tt(e,".git"),o=await Dg(n);if(o.isDirectory()||o.isFile())return e}catch{}e=Un(e)}return null}async function Xg(r,e){let t=[],n=new Set,o=G(),s=tt(o,Gg);t.push(...await et(s,"User",n));let i=ta();t.push(...await Rr(i,"User",n,!1));let l=await Yg(r)??qa(r).root,u=[],c=r;for(;u.push(c),!(c===l&&c!==r);){let d=Un(c);if(d===c)break;c=d}for(let d of u.reverse()){t.push(...await et(tt(d,Bg),"Project",n));for(let p of Hg)t.push(...await et(tt(d,p),"Project",n));t.push(...await et(oa(d),"Project",n)),t.push(...await Rr(ra(d),"Project",n,!1)),t.push(...await et(tt(d,Wg),"Local",n))}return e&&t.length>0&&e.invoke("instructions.loaded",{sessionId:"",source:r,fileCount:t.length}).catch(()=>{}),t}function Ka(r){if(r.length===0)return"";let e="Codebase and user instructions are shown below. Be sure to adhere to these instructions. IMPORTANT: These instructions OVERRIDE any default behavior and you MUST follow them exactly as written.",t=[];for(let n of r){if(!n.content)continue;let o=n.type==="Project"?" (project instructions, checked into the codebase)":n.type==="Local"?" (user's private project instructions, not checked in)":" (user's private global instructions for all projects)";t.push(`Contents of ${n.path}${o}:
126
+ Return a brief summary of what you consolidated, updated, or pruned. If nothing changed (memories are already tight), say so.`}var Na=0;async function _g(r,e={}){let t={...Fa,...e},n;try{n=await Wa(r.memoryRoot)}catch{n=0}let o=(Date.now()-n)/36e5;if(!t.force&&o<t.minHours)return null;let s=Date.now()-Na;if(!t.force&&s<t.scanIntervalMs)return null;Na=Date.now();let i;try{i=await r.listSessionsSince(n)}catch{return null}return i=i.filter(a=>a!==r.currentSessionId),!t.force&&i.length<t.minSessions?null:{sessionIds:i}}async function Wa(r){let e=Un(r,jn);return(await ja(e)).mtimeMs}function Rg(r){try{return process.kill(r,0),!0}catch{return!1}}async function Cg(r){let e=Un(r,jn),t,n;try{let[s,i]=await Promise.all([ja(e),Ea(e,"utf8")]);t=s.mtimeMs;let a=parseInt(i.trim(),10);n=Number.isFinite(a)?a:void 0}catch{}if(t!==void 0&&Date.now()-t<bg&&n!==void 0&&Rg(n))return null;await hg(r,{recursive:!0}),await Ir(e,String(process.pid));let o;try{o=await Ea(e,"utf8")}catch{return null}return parseInt(o.trim(),10)!==process.pid?null:t??0}async function Ua(r,e){let t=Un(r,jn);try{if(e===0){await fg(t);return}await Ir(t,"");let{utimes:n}=await import("node:fs/promises"),o=e/1e3;await n(t,o,o)}catch{}}async function Ag(r){let e=Un(r,jn);await Ir(e,String(process.pid))}function Pg(r){return{taskId:`dream-${yg().slice(0,8)}`,type:"dream",label:"Memory consolidation",permissionRole:"worker",isolation:"shared",lifecycle:"running",depth:1,maxTurns:0,tokenBudget:0,startedAt:Date.now(),parentTaskId:r.parentTaskId,sessionId:r.sessionId,phase:"starting",sessionsReviewing:r.sessionsReviewing,filesTouched:[],turns:[],priorLockMtime:r.priorLockMtime}}async function Mg(r,e={}){let t={...Fa,...e},n=await _g(r,t);if(!n)return null;let o;if(t.force)try{o=await Wa(r.memoryRoot)}catch{o=0}else if(o=await Cg(r.memoryRoot),o===null)return null;let s=Ga(r.memoryRoot,r.transcriptDir,n.sessionIds),i=Pg({sessionId:r.currentSessionId,sessionsReviewing:n.sessionIds.length,priorLockMtime:o});return{prompt:s,taskState:i,sessionIds:n.sessionIds}}async function Ha(r){let e=Date.now(),t=await Mg(r.context,r.triggerConfig);if(!t)return{ok:!0,sessionsReviewed:0,filesTouched:[],turns:[],durationMs:Date.now()-e};let{taskState:n,sessionIds:o}=t,s=!!(r.qmemoryAdapter&&r.qmemoryUserId),i=s?Ga(r.context.memoryRoot,r.context.transcriptDir,o,{hasQMemory:!0}):t.prompt;r.log.info(`[dream] starting consolidation \u2014 ${o.length} sessions, memoryRoot=${r.context.memoryRoot}`+(s?", qmemory=enabled":"")),r.hooks?.invoke("subagent.started",{sessionId:r.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream"}).catch(()=>{});let a=(u,p)=>Sg(r.context.memoryRoot,{toolName:u,input:p}),c=s?[{type:"function",function:{name:"qmemory_search",description:"Search the user's long-term memory (QMemory). Returns relevant memories sorted by relevance.",parameters:{type:"object",properties:{query:{type:"string",description:"Semantic search query"},limit:{type:"number",description:"Max results (default: 10)"}},required:["query"]}}},{type:"function",function:{name:"qmemory_store",description:"Store a memory to the user's long-term memory (QMemory). Use for user preferences, facts, and cross-project knowledge.",parameters:{type:"object",properties:{text:{type:"string",description:"The memory text to store"},source:{type:"string",description:"Source label (e.g. 'dream-consolidation')"}},required:["text"]}}},{type:"function",function:{name:"qmemory_feedback",description:"Submit feedback on recalled memories (e.g. mark as outdated or wrong).",parameters:{type:"object",properties:{memoryIds:{type:"array",items:{type:"string"},description:"IDs of memories to give feedback on"},signal:{type:"string",enum:["useful","irrelevant","outdated","wrong"],description:"Feedback signal"}},required:["memoryIds","signal"]}}}]:[],d=s?{invoke:async(u,p,m,g)=>{let f=r.qmemoryAdapter,b=r.qmemoryUserId;if(p==="qmemory_search"){let{query:w,limit:T}=JSON.parse(m),_=await f.search(w,b,{limit:T??10});return{result:JSON.stringify(_)}}if(p==="qmemory_store"){if(!f.addText)return{result:"",error:"addText not supported"};let{text:w,source:T}=JSON.parse(m),_=await f.addText(w,b,{sessionId:r.context.currentSessionId,source:T??"dream-consolidation"});return{result:JSON.stringify(_)}}if(p==="qmemory_feedback"){let{memoryIds:w,signal:T}=JSON.parse(m);return f.feedback&&await f.feedback(w,T,r.context.currentSessionId),{result:"Feedback recorded successfully."}}return r.toolInvoker.invoke(u,p,m,g)}}:r.toolInvoker,l=[...r.tools,...c];try{let u=await Yt({promptMessages:[{role:"user",content:"Begin memory consolidation."}],systemPrompt:i,tools:l,canUseTool:a,transport:r.transport,toolInvoker:d,apiKey:r.apiKey,model:r.model,log:r.log,hooks:r.hooks,forkLabel:"dream-consolidation",parentSignal:r.parentSignal,skipTranscript:!0}),p=[];for(let m of u.events)if(m.type==="tool_call")try{let g=JSON.parse(m.arguments),f=g.file_path??g.path??g.filePath;f&&Ba(f,r.context.memoryRoot)&&p.push(f)}catch{}return u.ok?(await Ag(r.context.memoryRoot),r.log.info(`[dream] consolidation complete \u2014 ${p.length} files touched, ${u.durationMs}ms`)):(await Ua(r.context.memoryRoot,n.priorLockMtime),r.log.warn(`[dream] consolidation failed: ${u.error}`)),r.hooks?.invoke("subagent.stopped",{sessionId:r.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream",reason:u.ok?"normal":"error",error:u.error}).catch(()=>{}),{ok:u.ok,sessionsReviewed:o.length,filesTouched:[...new Set(p)],turns:[],durationMs:Date.now()-e,error:u.error}}catch(u){await Ua(r.context.memoryRoot,n.priorLockMtime).catch(()=>{});let p=u instanceof Error?u.message:String(u);return r.log.warn(`[dream] consolidation error: ${p}`),r.hooks?.invoke("subagent.stopped",{sessionId:r.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream",reason:"error",error:p}).catch(()=>{}),{ok:!1,sessionsReviewed:0,filesTouched:[],turns:[],durationMs:Date.now()-e,error:p}}}var wt=class{sessionId;_trustAccepted=!1;_modelUsage=new Map;_totalInputTokens=0;_totalOutputTokens=0;_turnCount=0;_toolCallCount=0;_listeners=new Set;constructor(e){this.sessionId=e}get trustAccepted(){return this._trustAccepted}setTrustAccepted(e){this._trustAccepted=e,this.notifyListeners()}get totalInputTokens(){return this._totalInputTokens}get totalOutputTokens(){return this._totalOutputTokens}get turnCount(){return this._turnCount}get toolCallCount(){return this._toolCallCount}getModelUsage(e){return this._modelUsage.get(e)}getAllModelUsage(){let e={};for(let[t,n]of this._modelUsage)e[t]={...n};return e}addUsage(e,t){this._totalInputTokens+=e.prompt,this._totalOutputTokens+=e.completion;let n=this._modelUsage.get(t);n?(n.inputTokens+=e.prompt,n.outputTokens+=e.completion,n.cacheRead+=e.cacheRead??0,n.cacheCreation+=e.cacheCreation??0):this._modelUsage.set(t,{inputTokens:e.prompt,outputTokens:e.completion,cacheRead:e.cacheRead??0,cacheCreation:e.cacheCreation??0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0}),this.notifyListeners()}addMediaUsage(e,t,n){let o=this._modelUsage.get(e),s=o??{inputTokens:0,outputTokens:0,cacheRead:0,cacheCreation:0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0};switch(o||this._modelUsage.set(e,s),s.mediaCalls+=1,t){case"per_second":s.mediaDurationSeconds+=n;break;case"per_character":s.mediaCharacters+=n;break}this.notifyListeners()}recordToolCall(){this._toolCallCount++}recordTurnCompleted(){this._turnCount++}createSnapshot(){return{sessionId:this.sessionId,modelUsage:this.getAllModelUsage(),totalInputTokens:this._totalInputTokens,totalOutputTokens:this._totalOutputTokens,turnCount:this._turnCount,lastSavedAt:Date.now()}}restoreFromSnapshot(e){if(e.sessionId!==this.sessionId)return!1;this._totalInputTokens=e.totalInputTokens,this._totalOutputTokens=e.totalOutputTokens,this._turnCount=e.turnCount,this._modelUsage.clear();for(let[t,n]of Object.entries(e.modelUsage))this._modelUsage.set(t,{...n});return this.notifyListeners(),!0}onStateChange(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}notifyListeners(){for(let e of this._listeners)try{e()}catch{}}};import*as ve from"node:fs";import*as Ue from"node:path";var za="transcript.jsonl",Xt="state.json",Ig=50,Eg=50,Og=30;function Va(r){return r?pa(r):br()}function Fn(r,e){let t=r.replace(/[^a-zA-Z0-9_-]/g,"_");return Ue.join(Va(e),t)}async function Er(r,e,t){let n=Fn(r,t);await ve.promises.mkdir(n,{recursive:!0});let o=JSON.stringify({role:e.role,content:e.content,ts:Date.now()})+`
127
+ `;await ve.promises.appendFile(Ue.join(n,za),o,"utf8")}async function qa(r,e,t,n){let o=Fn(r,n);await ve.promises.mkdir(o,{recursive:!0});let s={metadata:{sessionId:r,createdAt:t.createdAt??Date.now(),lastActiveAt:Date.now(),model:t.model,cwd:t.cwd,turnCount:e.turnCount,messageCount:t.messageCount??0,title:t.title},costSnapshot:e},i=Ue.join(o,Xt+".tmp");await ve.promises.writeFile(i,JSON.stringify(s,null,2),"utf8"),await ve.promises.rename(i,Ue.join(o,Xt))}async function Ka(r,e){let t=Fn(r,e),n=Ue.join(t,za),o=Ue.join(t,Xt),s=[];try{s=(await ve.promises.readFile(n,"utf8")).split(`
128
+ `).filter(Boolean).map(l=>{let u=JSON.parse(l);return{role:u.role,content:u.content??null}})}catch{return null}let i={sessionId:r,createdAt:Date.now(),lastActiveAt:Date.now(),turnCount:0,messageCount:s.length},a;try{let d=await ve.promises.readFile(o,"utf8"),l=JSON.parse(d);i=l.metadata,a=l.costSnapshot}catch{}let c=s.filter(d=>d.role!=="system");return{metadata:i,messages:c,costSnapshot:a}}async function Ja(r=Ig,e){let t=Va(e),n;try{n=await ve.promises.readdir(t)}catch{return[]}let o=[];for(let s of n){let i=Ue.join(t,s,Xt);try{let a=await ve.promises.readFile(i,"utf8"),c=JSON.parse(a);o.push({sessionId:c.metadata.sessionId,title:c.metadata.title,lastActiveAt:c.metadata.lastActiveAt,messageCount:c.metadata.messageCount,model:c.metadata.model})}catch{}}return o.sort((s,i)=>i.lastActiveAt-s.lastActiveAt),o.slice(0,r)}function Lg(r){return r.turnCount<Eg?!1:r.taskSummaryGeneratedAt?r.turnCount-(r.taskSummaryGeneratedAt??0)>=Og:!0}async function Ya(r,e,t,n,o){if(!Lg(e))return null;try{let i=t.slice(-20).map(u=>`[${u.role}]: ${typeof u.content=="string"?u.content.slice(0,500):JSON.stringify(u.content).slice(0,500)}`).join(`
129
+ `),a=n.transport.stream({model:n.model,messages:[{role:"system",content:"Generate a concise task summary (~100 words) of what the user is working on in this session. Focus on the goal, key decisions, and current progress. Reply with ONLY the summary."},{role:"user",content:i}],tools:[],maxTokens:200},n.apiKey),c="";for await(let u of a)u.type==="delta"&&(c+=u.text);if(c=c.trim(),!c)return null;let d=Fn(r,o),l=Ue.join(d,Xt);try{let u=await ve.promises.readFile(l,"utf8"),p=JSON.parse(u);p.metadata.taskSummary=c,p.metadata.taskSummaryGeneratedAt=e.turnCount;let m=l+".tmp";await ve.promises.writeFile(m,JSON.stringify(p,null,2),"utf8"),await ve.promises.rename(m,l)}catch{}return c}catch{return null}}yr();import{randomUUID as nS}from"node:crypto";var Dg=3e4;var Gn=class{tasks=new Map;listeners=new Set;hooks=null;sessionId="";setHooks(e,t){this.hooks=e,this.sessionId=t}onTaskChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}notify(e,t){for(let n of this.listeners)try{n(e,t)}catch{}}registerTask(e){this.tasks.set(e.taskId,e),this.notify(e.taskId,e),this.hooks?.invoke("task.created",{sessionId:this.sessionId,taskId:e.taskId,taskType:e.type,label:e.label}).catch(()=>{})}updateTask(e,t){let n=this.tasks.get(e);if(!n)return;let o=t(n);o!==n&&(this.tasks.set(e,o),this.notify(e,o),!Bn(n.lifecycle)&&Bn(o.lifecycle)&&this.hooks?.invoke("task.completed",{sessionId:this.sessionId,taskId:o.taskId,taskType:o.type,label:o.label}).catch(()=>{}))}getTask(e){return this.tasks.get(e)}getRunningTasks(){return[...this.tasks.values()].filter(e=>e.lifecycle==="running")}getAllTasks(){return[...this.tasks.values()]}evictTask(e){let t=this.tasks.get(e);t&&Bn(t.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=Dg){let t=Date.now();for(let[n,o]of this.tasks)Bn(o.lifecycle)&&o.endedAt&&t-o.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function Bn(r){return r==="completed"||r==="failed"||r==="cancelled"||r==="timeout"}import{watch as $g}from"node:fs";import{stat as Ng}from"node:fs/promises";import{join as Xa,relative as Ug,resolve as jg}from"node:path";var Fg=[`${ke}/settings.json`,"INSTRUCTIONS.md",`${ke}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${ke}/rules`],Bg=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${ke}/rules`],Or=class{watchers=new Map;deps;debounceTimers=new Map;_cwd;constructor(e){this.deps=e,this._cwd=e.projectRoot}get cwd(){return this._cwd}async start(){for(let e of Fg){let t=Xa(this.deps.projectRoot,e);this.watchPath(t,e)}this.deps.log?.(`file-watcher: watching ${this.watchers.size} paths`)}watchPath(e,t){if(!this.watchers.has(e))try{let n=$g(e,{persistent:!1,recursive:t.includes("/")?!1:void 0},(o,s)=>{let i=s?Xa(e,s):e;this.handleChange(i,o==="rename"?"created":"modified")});n.on("error",()=>{this.watchers.delete(e)}),this.watchers.set(e,n)}catch{}}handleChange(e,t){let n=this.debounceTimers.get(e);n&&clearTimeout(n),this.debounceTimers.set(e,setTimeout(async()=>{this.debounceTimers.delete(e);let o=t;try{await Ng(e)}catch{o="deleted"}let s=Ug(this.deps.projectRoot,e);this.deps.log?.(`file-watcher: ${o} ${s}`),this.deps.hooks.invoke("file.changed",{sessionId:this.deps.sessionId,filePath:e,changeType:o}).catch(()=>{}),Bg.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let t=jg(e);if(t===this._cwd)return;let n=this._cwd;this._cwd=t,this.deps.hooks.invoke("cwd.changed",{sessionId:this.deps.sessionId,oldCwd:n,newCwd:t}).catch(()=>{}),this.deps.onInstructionCacheReset?.()}stop(){for(let[,e]of this.watchers)e.close();this.watchers.clear();for(let[,e]of this.debounceTimers)clearTimeout(e);this.debounceTimers.clear()}};async function Qa(r){let e=new Or(r);return await e.start(),e}import{readFile as Gg,readdir as Wg,stat as Hg}from"node:fs/promises";import{dirname as Wn,extname as zg,isAbsolute as Vg,join as it,parse as el,resolve as Za}from"node:path";import{homedir as qg}from"node:os";var Kg=5;var Jg="INSTRUCTIONS.md",Yg="INSTRUCTIONS.local.md",Xg="INSTRUCTIONS.md",Qg=[".instructions.md"],Zg=new Set([".md",".txt",".text",".json",".yaml",".yml",".toml",".xml",".csv",".html",".htm",".css",".scss",".sass",".less",".js",".ts",".tsx",".jsx",".mjs",".cjs",".mts",".cts",".py",".pyi",".pyw",".rb",".erb",".rake",".go",".rs",".java",".kt",".kts",".scala",".c",".cpp",".cc",".cxx",".h",".hpp",".hxx",".cs",".swift",".sh",".bash",".zsh",".fish",".ps1",".bat",".cmd",".env",".ini",".cfg",".conf",".config",".properties",".sql",".graphql",".gql",".proto",".vue",".svelte",".astro",".php",".pl",".pm",".lua",".r",".R",".dart",".ex",".exs",".erl",".hrl",".clj",".cljs",".cljc",".edn",".hs",".lhs",".elm",".ml",".mli",".f",".f90",".f95",".for",".cmake",".make",".makefile",".gradle",".sbt",".rst",".adoc",".asciidoc",".org",".tex",".latex",".lock",".log",".diff",".patch"]);async function ef(r){try{return await Gg(r,"utf-8")}catch{return null}}function tf(r){return r.includes("<!--")?r.replace(/^[ \t]*<!--[\s\S]*?-->[ \t]*$/gm,""):r}function nf(r){let e=r.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);if(!e)return{content:r};let t=e[1],n=r.slice(e[0].length),o=t.match(/^paths:\s*(.+)$/m);if(!o)return{content:n};let s=[],i=o[1].trim();if(i.startsWith("["))try{s=JSON.parse(i)}catch{}else s=i.split(",").map(c=>c.trim()).filter(Boolean);let a=s.map(c=>c.endsWith("/**")?c.slice(0,-3):c).filter(c=>c.length>0&&c!=="**");return{content:n,globs:a.length>0?a:void 0}}function of(r,e){let t=new Set,n=/(?:^|\s)@((?:[^\s\\]|\\ )+)/g,s=r.replace(/```[\s\S]*?```/g,"").replace(/`[^`]+`/g,""),i;for(;(i=n.exec(s))!==null;){let a=i[1];if(!a)continue;let c=a.indexOf("#");if(c!==-1&&(a=a.substring(0,c)),!a)continue;a=a.replace(/\\ /g," ");let d;if(a.startsWith("~/"))d=it(qg(),a.slice(2));else if(Vg(a))d=a;else if(a.startsWith("./"))d=Za(Wn(e),a);else if(/^[a-zA-Z0-9._-]/.test(a)&&!a.startsWith("@"))d=Za(Wn(e),a);else continue;t.add(d)}return[...t]}async function st(r,e,t,n=0,o){let s=r.toLowerCase();if(t.has(s)||n>=Kg)return[];let i=zg(r).toLowerCase();if(i&&!Zg.has(i))return[];t.add(s);let a=await ef(r);if(!a?.trim())return[];let{content:c,globs:d}=nf(a),l=tf(c);if(!l.trim())return[];let u=[],p={path:r,type:e,content:l.trim()};o&&(p.parent=o),d&&(p.globs=d),u.push(p);let m=of(c,r);for(let g of m){let f=await st(g,e,t,n+1,r);u.push(...f)}return u}async function Lr(r,e,t,n,o=new Set){if(o.has(r))return[];o.add(r);let s=[];try{let i=await Wg(r,{withFileTypes:!0});for(let a of i){let c=it(r,a.name);if(a.isDirectory())s.push(...await Lr(c,e,t,n,o));else if(a.isFile()&&a.name.endsWith(".md")){let d=await st(c,e,t);s.push(...d.filter(l=>n?!!l.globs:!l.globs))}}}catch{}return s}async function rf(r){let e=r,t=el(e).root;for(;e!==t;){try{let n=it(e,".git"),o=await Hg(n);if(o.isDirectory()||o.isFile())return e}catch{}e=Wn(e)}return null}async function sf(r,e){let t=[],n=new Set,o=W(),s=it(o,Xg);t.push(...await st(s,"User",n));let i=la();t.push(...await Lr(i,"User",n,!1));let c=await rf(r)??el(r).root,d=[],l=r;for(;d.push(l),!(l===c&&l!==r);){let u=Wn(l);if(u===l)break;l=u}for(let u of d.reverse()){t.push(...await st(it(u,Jg),"Project",n));for(let p of Qg)t.push(...await st(it(u,p),"Project",n));t.push(...await st(da(u),"Project",n)),t.push(...await Lr(ua(u),"Project",n,!1)),t.push(...await st(it(u,Yg),"Local",n))}return e&&t.length>0&&e.invoke("instructions.loaded",{sessionId:"",source:r,fileCount:t.length}).catch(()=>{}),t}function tl(r){if(r.length===0)return"";let e="Codebase and user instructions are shown below. Be sure to adhere to these instructions. IMPORTANT: These instructions OVERRIDE any default behavior and you MUST follow them exactly as written.",t=[];for(let n of r){if(!n.content)continue;let o=n.type==="Project"?" (project instructions, checked into the codebase)":n.type==="Local"?" (user's private project instructions, not checked in)":" (user's private global instructions for all projects)";t.push(`Contents of ${n.path}${o}:
128
130
 
129
131
  ${n.content.trim()}`)}return t.length>0?`${e}
130
132
 
131
133
  ${t.join(`
132
134
 
133
- `)}`:""}var Vt=null,Cr=null;async function Ja(r,e){return Vt&&Cr===r||(Vt=await Xg(r,e),Cr=r),Vt}function Ya(){Vt=null,Cr=null}function Ar(r,e){return{name:r,compute:e,cacheBreak:!1}}function Xa(r,e,t){return{name:r,compute:e,cacheBreak:!0}}var Nn=new Map;async function Qg(r){return(await Promise.all(r.map(async t=>{if(!t.cacheBreak&&Nn.has(t.name))return Nn.get(t.name)??null;let n=await t.compute();return Nn.set(t.name,n),n}))).filter(t=>t!=null)}function Qa(){Nn.clear()}async function Za(r){let e=[];if(r.instructionBlock&&e.push(r.instructionBlock),r.customSystemPrompt?e.push(r.customSystemPrompt):r.basePrompt&&e.push(r.basePrompt),r.sections?.length){let t=await Qg(r.sections);e.push(...t)}return r.appendSystemPrompt&&e.push(r.appendSystemPrompt),e.filter(Boolean).join(`
135
+ `)}`:""}var Qt=null,Dr=null;async function nl(r,e){return Qt&&Dr===r||(Qt=await sf(r,e),Dr=r),Qt}function ol(){Qt=null,Dr=null}function $r(r,e){return{name:r,compute:e,cacheBreak:!1}}function zn(r,e,t){return{name:r,compute:e,cacheBreak:!0}}var Hn=new Map;async function af(r){return(await Promise.all(r.map(async t=>{if(!t.cacheBreak&&Hn.has(t.name))return Hn.get(t.name)??null;let n=await t.compute();return Hn.set(t.name,n),n}))).filter(t=>t!=null)}function rl(){Hn.clear()}async function sl(r){let e=[];if(r.instructionBlock&&e.push(r.instructionBlock),r.customSystemPrompt?e.push(r.customSystemPrompt):r.basePrompt&&e.push(r.basePrompt),r.sections?.length){let t=await af(r.sections);e.push(...t)}return r.appendSystemPrompt&&e.push(r.appendSystemPrompt),e.filter(Boolean).join(`
134
136
 
135
- `)}import{release as Zg,homedir as ef}from"node:os";import{resolve as tf}from"node:path";function nf(){let e=(process.env.SHELL??process.env.ComSpec??"").toLowerCase();return e.includes("zsh")?"zsh":e.includes("bash")?"bash":e.includes("fish")?"fish":e.includes("powershell")||e.includes("pwsh")?"powershell":e.includes("cmd")?"cmd":process.platform==="win32"?"powershell":"bash"}function of(){let r=process.platform,e=Zg();return r==="win32"?e.toLowerCase().includes("microsoft")||e.toLowerCase().includes("wsl")?"Windows (WSL)":`Windows ${e.split(".")[0]??""}`.trim():r==="darwin"?"macOS":r==="linux"?"Linux":r}function el(r){return Ar("environment_context",()=>{let e=nf(),t=of(),n=r??process.cwd(),o=process.version,s=ef(),i=["# Environment","",`- Platform: ${t}`,`- Shell: ${e}`,`- Working directory: ${tf(n)}`,`- Home directory: ${s}`,`- Node.js: ${o}`];return e==="powershell"?i.push("- Note: Use PowerShell syntax (semicolons, not &&; use $env: for env vars)"):e==="cmd"&&i.push("- Note: Use CMD syntax (%VAR%, not $VAR)"),i.join(`
136
- `)})}function jn(){return["## Problem Solving","- If an approach fails, diagnose why before switching tactics \u2014 read the error, check your assumptions, try a focused fix. Don't retry the identical action blindly, but don't abandon a viable approach after a single failure either.","- Report outcomes faithfully: if verification fails, say so with the relevant output; if you did not run a verification step, say that rather than implying it succeeded.","- Do not create files unless they are absolutely necessary for achieving your goal. Prefer editing an existing file to creating a new one.","","## Safety","- Be careful not to introduce security vulnerabilities such as command injection, XSS, SQL injection, and other OWASP top 10 vulnerabilities.","- If you notice that you wrote insecure code, immediately fix it. Prioritize writing safe, secure, and correct code."]}function rf(){return["# Doing Tasks","","You will primarily perform software engineering tasks: solving bugs, adding new functionality, refactoring code, and more.","","## Code Quality","- In general, do not propose changes to code you haven't read. If you need to modify a file, read it first. Understand existing code before suggesting modifications.","","## Implementation Discipline",`- Don't add features, refactor code, or make "improvements" beyond what was asked. A bug fix doesn't need surrounding code cleaned up. A simple feature doesn't need extra configurability.`,"- Don't add error handling, fallbacks, or validation for scenarios that can't happen. Trust internal code and framework guarantees. Only validate at system boundaries (user input, external APIs).","- Don't create helpers, utilities, or abstractions for one-time operations. Don't design for hypothetical future requirements. Three similar lines of code is better than a premature abstraction.","- Default to writing no comments unless the WHY is non-obvious: a hidden constraint, a subtle invariant, a workaround for a specific bug. Don't explain WHAT the code does \u2014 well-named identifiers already do that.",'- Avoid backwards-compatibility hacks like renaming unused _vars, re-exporting types, adding "// removed" comments for removed code. If code is unused, delete it completely.',"","## Completeness and Correctness","- When a task lists multiple constraints or requirements, implement ALL of them explicitly. Do not drop any.","- When refactoring, commit fully to the new pattern. Do NOT mix old and new patterns in the same codebase.","- After making changes, verify you met every requirement from the original request.","- For security fixes, use standard proven patterns (parameterized queries, input validation, etc.)."]}function sf(){return["# Doing Tasks","","You will assist with office and analytical tasks: reports, data analysis, documents, presentations, and more.","","## Accuracy and Rigor","- Verify numerical calculations and statistical claims. When presenting data, ensure totals, percentages, and comparisons are mathematically correct.","- Distinguish clearly between facts, inferences, and assumptions. Label uncertain information explicitly.","- When summarizing source material, preserve the original meaning. Do not introduce information not present in the source.","","## Structure and Formatting","- Use clear headings, bullet points, and tables to organize information. Match the formatting conventions of the document type (report, memo, email, slides).","- For data-heavy outputs, prefer tables over prose. Include units, time periods, and comparison baselines.","- Keep language professional and concise. Avoid filler, hedging, and unnecessary qualifiers.","","## Completeness","- When the task lists multiple sections, data points, or requirements, address ALL of them. Do not silently omit items.","- If source data is insufficient to answer a question, state what is missing rather than guessing."]}function af(){return["# Doing Tasks","","You will assist with creative and content tasks: writing, copywriting, brainstorming, and content strategy.","","## Voice and Style","- Match the requested tone, register, and style. If no style is specified, adapt to the content type (formal for press releases, conversational for blog posts, punchy for ad copy).","- Vary sentence length and structure for rhythm. Avoid monotonous patterns.","- Show, don't tell where appropriate. Use concrete details and vivid language over abstract statements.","","## Audience Awareness","- Write for the intended audience. Consider their knowledge level, interests, and expectations.","- For marketing/copywriting, lead with the benefit. Focus on what matters to the reader, not the feature list.","- Respect cultural context and sensitivity in language choices.","","## Creative Process","- When brainstorming, provide diverse options rather than variations on a single idea. Quantity and variety first, then refine.","- When editing existing text, preserve the author's voice. Make targeted improvements rather than rewriting from scratch.","- If creative constraints are given (word count, format, platform), follow them precisely."]}function tl(r="general"){return Xa("task_guidance",()=>{let e;switch(r){case"coding":e=[...rf(),"",...jn()];break;case"office":e=[...sf(),"",...jn()];break;case"creative":e=[...af(),"",...jn()];break;default:e=["# Doing Tasks","","You are a versatile assistant that handles software engineering, office, and creative tasks.","",...jn(),"","## When Coding","- Read existing code before modifying it. Understand the structure before making changes.","- When refactoring, commit fully to the new pattern. Do NOT mix old and new patterns.","- Implement ALL listed constraints or requirements explicitly. Do not drop any.","- Don't add features or abstractions beyond what was asked.","","## When Writing Documents or Analyzing Data","- Verify numerical calculations and statistical claims for correctness.","- Use clear structure: headings, tables, bullet points as appropriate.","- Distinguish facts from inferences. Label uncertain information.","","## When Creating Content","- Match the requested tone, style, and audience. Adapt if not specified.","- Lead with the benefit for marketing/copywriting tasks.","- Provide diverse options when brainstorming."];break}return e.join(`
137
- `)})}function nl(){return Ar("tool_guidance",()=>["# Tool Usage Guidance","","You have access to specialized tools. Use them appropriately:","","## Agent Delegation","Use the `agent` tool to delegate complex, multi-step tasks to sub-agents:","- Research/exploration tasks that benefit from focused attention","- File analysis across multiple files that need independent reasoning","- Any task the user explicitly asks you to delegate","- **When the user says 'delegate', 'sub-agent', 'fork', or 'hand off', you MUST use the `agent` tool \u2014 never handle it yourself**","Do NOT use `agent` for simple file reads or single-step operations.","","## Skill System","Use `skill_invoke` to run installed skills by name when:","- The user asks to run, invoke, or execute a specific skill","- A matching skill exists in the configured skill paths","- The task matches a skill's trigger pattern","Do NOT search manually for skills \u2014 use `skill_invoke` directly.","","## Checkpoint","Use the `checkpoint` tool (not raw git commands) to:","- Save workspace state before making changes","- Restore to a previous state if changes go wrong","The checkpoint tool manages git shadow history automatically.","","## Ask User","Use `ask_user` to clarify ambiguous requests before proceeding,","especially for expensive operations like media generation."].join(`
138
- `))}import{existsSync as ol,mkdirSync as lf,readFileSync as zt,writeFileSync as rl}from"node:fs";import{join as qt}from"node:path";var Fn=new Set(["coding","office","creative","general"]),sl="settings.yaml";function cf(r){try{let e=qt(r,ye,sl),n=zt(e,"utf-8").match(/^taskDomain\s*:\s*(\w+)/m);if(n){let o=n[1].toLowerCase();if(Fn.has(o))return o}}catch{}try{let e=qt(r,ye,"INSTRUCTIONS.md"),n=zt(e,"utf-8").match(/^---\r?\n[\s\S]*?\r?\n---/);if(n){let o=n[0].match(/^domain\s*:\s*(\w+)/m);if(o){let s=o[1].toLowerCase();if(Fn.has(s))return s}}}catch{}try{let e=qt(r,"INSTRUCTIONS.md"),n=zt(e,"utf-8").match(/^---\r?\n[\s\S]*?\r?\n---/);if(n){let o=n[0].match(/^domain\s*:\s*(\w+)/m);if(o){let s=o[1].toLowerCase();if(Fn.has(s))return s}}}catch{}}var uf=3;function df(r,e){let t=ff(r);return e?t===e||t==="general"?e:(Pr(r)[t]??0)>=uf?t:e:t}var pf=/\b(?:code|coding|bug|debug|fix|refactor|function|class|method|api|compile|build|deploy|test|unittest|lint|git|commit|merge|branch|pull\s*request|PR|npm|pnpm|yarn|pip|docker|k8s|kubernetes|sql|database|migration|endpoint|route|middleware|typescript|javascript|python|java|rust|go(?:lang)?|css|html|react|vue|angular|nextjs|express|fastapi|flask|django|springboot|webpack|vite|rollup|esbuild|CI\/?CD|GitHub\s*Actions|workflow|pipeline|variable|const|let|var|import|export|module|package|dependency|dependencies|node_modules|tsconfig|eslint|prettier|interface|type\b|enum|struct|async|await|promise|callback|exception|error\s*handling|stack\s*trace|breakpoint|源码|代码|编程|编码|调试|重构|修复|Bug|函数|类|方法|接口|模块|依赖|组件|编译|构建|部署|测试|单元测试|提交|合并|分支|数据库|迁移|路由|中间件)\b/i,mf=/\b(?:report|document|spreadsheet|excel|csv|table|chart|graph|data\s*analysis|statistics|slides?|presentation|ppt|powerpoint|email|mail|memo|minutes|meeting|schedule|calendar|summary|summarize|brief|overview|outline|template|format|agenda|invoice|budget|forecast|dashboard|KPI|OKR|metric|analytics|insight|文档|报告|报表|表格|数据分析|统计|幻灯片|PPT|演示|邮件|信件|备忘录|会议纪要|日程|摘要|总结|概要|简报|模板|格式|议程|发票|预算|预测|看板|报表|分析)\b/i,gf=/\b(?:write|writing|essay|article|blog|story|novel|poem|poetry|lyrics|copywriting|copy|slogan|tagline|headline|marketing|campaign|branding|creative|brainstorm|idea|concept|draft|narrative|character|dialogue|script|screenplay|pitch|proposal|content\s*strategy|social\s*media|SEO|newsletter|press\s*release|写作|文章|博客|故事|小说|诗|歌词|文案|标语|营销|策划|品牌|创意|头脑风暴|灵感|构思|草稿|叙事|角色|对话|剧本|策划案|提案|内容策略|自媒体|公众号|推文|软文|种草)\b/i;function ff(r){if(!r||r.trim().length===0)return"general";let e=Pr(r),t=Math.max(e.coding,e.office,e.creative);return t===0||[e.coding,e.office,e.creative].filter(o=>o>=t-1&&o>0).length>=2&&t<=2?"general":e.coding===t?"coding":e.office===t?"office":e.creative===t?"creative":"general"}function Pr(r){return{coding:Mr(r,pf),office:Mr(r,mf),creative:Mr(r,gf),general:0}}function Mr(r,e){let t=new RegExp(e.source,"gi"),n=r.match(t);return n?n.length:0}function il(r){let e=cf(r.cwd);if(e)return{domain:e,source:"project-file"};if(r.hostOverride&&Fn.has(r.hostOverride))return{domain:r.hostOverride,source:"host-override"};let t=df(r.userText,r.sessionDomain);return r.sessionDomain&&t===r.sessionDomain?{domain:t,source:"session-sticky"}:{domain:t,source:"auto-detect"}}var hf=3;function al(r,e){if(e==="general")return!1;try{let t=qt(r,ye),n=qt(t,sl);if(ol(n)){let s=zt(n,"utf-8");if(/^taskDomain\s*:/m.test(s))return!1}lf(t,{recursive:!0});let o=`# Auto-detected task domain for this workspace.
137
+ `)}import{release as lf,homedir as cf}from"node:os";import{resolve as df}from"node:path";function uf(){let e=(process.env.SHELL??process.env.ComSpec??"").toLowerCase();return e.includes("zsh")?"zsh":e.includes("bash")?"bash":e.includes("fish")?"fish":e.includes("powershell")||e.includes("pwsh")?"powershell":e.includes("cmd")?"cmd":process.platform==="win32"?"powershell":"bash"}function pf(){let r=process.platform,e=lf();return r==="win32"?e.toLowerCase().includes("microsoft")||e.toLowerCase().includes("wsl")?"Windows (WSL)":`Windows ${e.split(".")[0]??""}`.trim():r==="darwin"?"macOS":r==="linux"?"Linux":r}function il(r){return $r("environment_context",()=>{let e=uf(),t=pf(),n=r??process.cwd(),o=process.version,s=cf(),i=["# Environment","",`- Platform: ${t}`,`- Shell: ${e}`,`- Working directory: ${df(n)}`,`- Home directory: ${s}`,`- Node.js: ${o}`];return e==="powershell"?i.push("- Note: Use PowerShell syntax (semicolons, not &&; use $env: for env vars)"):e==="cmd"&&i.push("- Note: Use CMD syntax (%VAR%, not $VAR)"),i.join(`
138
+ `)})}function Vn(){return["## Problem Solving","- If an approach fails, diagnose why before switching tactics \u2014 read the error, check your assumptions, try a focused fix. Don't retry the identical action blindly, but don't abandon a viable approach after a single failure either.","- Report outcomes faithfully: if verification fails, say so with the relevant output; if you did not run a verification step, say that rather than implying it succeeded.","- Do not create files unless they are absolutely necessary for achieving your goal. Prefer editing an existing file to creating a new one.","","## Safety","- Be careful not to introduce security vulnerabilities such as command injection, XSS, SQL injection, and other OWASP top 10 vulnerabilities.","- If you notice that you wrote insecure code, immediately fix it. Prioritize writing safe, secure, and correct code."]}function mf(){return["# Doing Tasks","","You will primarily perform software engineering tasks: solving bugs, adding new functionality, refactoring code, and more.","","## Code Quality","- In general, do not propose changes to code you haven't read. If you need to modify a file, read it first. Understand existing code before suggesting modifications.","","## Implementation Discipline",`- Don't add features, refactor code, or make "improvements" beyond what was asked. A bug fix doesn't need surrounding code cleaned up. A simple feature doesn't need extra configurability.`,"- Don't add error handling, fallbacks, or validation for scenarios that can't happen. Trust internal code and framework guarantees. Only validate at system boundaries (user input, external APIs).","- Don't create helpers, utilities, or abstractions for one-time operations. Don't design for hypothetical future requirements. Three similar lines of code is better than a premature abstraction.","- Default to writing no comments unless the WHY is non-obvious: a hidden constraint, a subtle invariant, a workaround for a specific bug. Don't explain WHAT the code does \u2014 well-named identifiers already do that.",'- Avoid backwards-compatibility hacks like renaming unused _vars, re-exporting types, adding "// removed" comments for removed code. If code is unused, delete it completely.',"","## Completeness and Correctness","- When a task lists multiple constraints or requirements, implement ALL of them explicitly. Do not drop any.","- When refactoring, commit fully to the new pattern. Do NOT mix old and new patterns in the same codebase.","- After making changes, verify you met every requirement from the original request.","- For security fixes, use standard proven patterns (parameterized queries, input validation, etc.).","","## Proactive Action","- When asked to fix, change, or improve code, implement the changes directly by writing to the file. Do not merely describe what should be changed.","- When you identify issues (bugs, security vulnerabilities, style problems), fix them immediately using your tools rather than listing recommendations.","- Default to action: read the file, make the fix, write it back. Only describe without acting when explicitly asked for advice or review only."]}function gf(){return["# Doing Tasks","","You will assist with office and analytical tasks: reports, data analysis, documents, presentations, and more.","","## Accuracy and Rigor","- Verify numerical calculations and statistical claims. When presenting data, ensure totals, percentages, and comparisons are mathematically correct.","- Distinguish clearly between facts, inferences, and assumptions. Label uncertain information explicitly.","- When summarizing source material, preserve the original meaning. Do not introduce information not present in the source.","","## Structure and Formatting","- Use clear headings, bullet points, and tables to organize information. Match the formatting conventions of the document type (report, memo, email, slides).","- For data-heavy outputs, prefer tables over prose. Include units, time periods, and comparison baselines.","- Keep language professional and concise. Avoid filler, hedging, and unnecessary qualifiers.","","## Completeness","- When the task lists multiple sections, data points, or requirements, address ALL of them. Do not silently omit items.","- If source data is insufficient to answer a question, state what is missing rather than guessing."]}function ff(){return["# Doing Tasks","","You will assist with creative and content tasks: writing, copywriting, brainstorming, and content strategy.","","## Voice and Style","- Match the requested tone, register, and style. If no style is specified, adapt to the content type (formal for press releases, conversational for blog posts, punchy for ad copy).","- Vary sentence length and structure for rhythm. Avoid monotonous patterns.","- Show, don't tell where appropriate. Use concrete details and vivid language over abstract statements.","","## Audience Awareness","- Write for the intended audience. Consider their knowledge level, interests, and expectations.","- For marketing/copywriting, lead with the benefit. Focus on what matters to the reader, not the feature list.","- Respect cultural context and sensitivity in language choices.","","## Creative Process","- When brainstorming, provide diverse options rather than variations on a single idea. Quantity and variety first, then refine.","- When editing existing text, preserve the author's voice. Make targeted improvements rather than rewriting from scratch.","- If creative constraints are given (word count, format, platform), follow them precisely."]}function al(r="general"){return zn("task_guidance",()=>{let e;switch(r){case"coding":e=[...mf(),"",...Vn()];break;case"office":e=[...gf(),"",...Vn()];break;case"creative":e=[...ff(),"",...Vn()];break;default:e=["# Doing Tasks","","You are a versatile assistant that handles software engineering, office, and creative tasks.","",...Vn(),"","## When Coding","- Read existing code before modifying it. Understand the structure before making changes.","- When refactoring, commit fully to the new pattern. Do NOT mix old and new patterns.","- Implement ALL listed constraints or requirements explicitly. Do not drop any.","- Don't add features or abstractions beyond what was asked.","- When asked to fix or change code, implement changes directly by writing to the file \u2014 do not merely describe what to change.","","## When Writing Documents or Analyzing Data","- Verify numerical calculations and statistical claims for correctness.","- Use clear structure: headings, tables, bullet points as appropriate.","- Distinguish facts from inferences. Label uncertain information.","","## When Creating Content","- Match the requested tone, style, and audience. Adapt if not specified.","- Lead with the benefit for marketing/copywriting tasks.","- Provide diverse options when brainstorming."];break}return e.join(`
139
+ `)})}function ll(){return $r("tool_guidance",()=>["# Tool Usage Guidance","","You have access to specialized tools. Use them appropriately:","","## Agent Delegation","Use the `agent` tool to delegate complex, multi-step tasks to sub-agents:","- Research/exploration tasks that benefit from focused attention","- File analysis across multiple files that need independent reasoning","- Any task the user explicitly asks you to delegate","- **When the user says 'delegate', 'sub-agent', 'fork', or 'hand off', you MUST use the `agent` tool \u2014 never handle it yourself**","Do NOT use `agent` for simple file reads or single-step operations.","","## Skill System","Use `skill_invoke` to run installed skills by name when:","- The user asks to run, invoke, or execute a specific skill","- A matching skill exists in the configured skill paths","- The task matches a skill's trigger pattern","Do NOT search manually for skills \u2014 use `skill_invoke` directly.","","## Checkpoint","Use the `checkpoint` tool (not raw git commands) to:","- Save workspace state before making changes","- Restore to a previous state if changes go wrong","The checkpoint tool manages git shadow history automatically.","","## Ask User","Use `ask_user` to clarify ambiguous requests before proceeding,","especially for expensive operations like media generation."].join(`
140
+ `))}import{existsSync as cl,mkdirSync as hf,readFileSync as Zt,writeFileSync as dl}from"node:fs";import{join as en}from"node:path";var qn=new Set(["coding","office","creative","general"]),ul="settings.yaml";function yf(r){try{let e=en(r,ke,ul),n=Zt(e,"utf-8").match(/^taskDomain\s*:\s*(\w+)/m);if(n){let o=n[1].toLowerCase();if(qn.has(o))return o}}catch{}try{let e=en(r,ke,"INSTRUCTIONS.md"),n=Zt(e,"utf-8").match(/^---\r?\n[\s\S]*?\r?\n---/);if(n){let o=n[0].match(/^domain\s*:\s*(\w+)/m);if(o){let s=o[1].toLowerCase();if(qn.has(s))return s}}}catch{}try{let e=en(r,"INSTRUCTIONS.md"),n=Zt(e,"utf-8").match(/^---\r?\n[\s\S]*?\r?\n---/);if(n){let o=n[0].match(/^domain\s*:\s*(\w+)/m);if(o){let s=o[1].toLowerCase();if(qn.has(s))return s}}}catch{}}var bf=3;function kf(r,e){let t=xf(r);return e?t===e||t==="general"?e:(Ur(r)[t]??0)>=bf?t:e:t}var Tf=/\b(?:code|coding|bug|debug|fix|refactor|function|class|method|api|compile|build|deploy|test|unittest|lint|git|commit|merge|branch|pull\s*request|PR|npm|pnpm|yarn|pip|docker|k8s|kubernetes|sql|database|migration|endpoint|route|middleware|typescript|javascript|python|java|rust|go(?:lang)?|css|html|react|vue|angular|nextjs|express|fastapi|flask|django|springboot|webpack|vite|rollup|esbuild|CI\/?CD|GitHub\s*Actions|workflow|pipeline|variable|const|let|var|import|export|module|package|dependency|dependencies|node_modules|tsconfig|eslint|prettier|interface|type\b|enum|struct|async|await|promise|callback|exception|error\s*handling|stack\s*trace|breakpoint|源码|代码|编程|编码|调试|重构|修复|Bug|函数|类|方法|接口|模块|依赖|组件|编译|构建|部署|测试|单元测试|提交|合并|分支|数据库|迁移|路由|中间件)\b/i,wf=/\b(?:report|document|spreadsheet|excel|csv|table|chart|graph|data\s*analysis|statistics|slides?|presentation|ppt|powerpoint|email|mail|memo|minutes|meeting|schedule|calendar|summary|summarize|brief|overview|outline|template|format|agenda|invoice|budget|forecast|dashboard|KPI|OKR|metric|analytics|insight|文档|报告|报表|表格|数据分析|统计|幻灯片|PPT|演示|邮件|信件|备忘录|会议纪要|日程|摘要|总结|概要|简报|模板|格式|议程|发票|预算|预测|看板|报表|分析)\b/i,vf=/\b(?:write|writing|essay|article|blog|story|novel|poem|poetry|lyrics|copywriting|copy|slogan|tagline|headline|marketing|campaign|branding|creative|brainstorm|idea|concept|draft|narrative|character|dialogue|script|screenplay|pitch|proposal|content\s*strategy|social\s*media|SEO|newsletter|press\s*release|写作|文章|博客|故事|小说|诗|歌词|文案|标语|营销|策划|品牌|创意|头脑风暴|灵感|构思|草稿|叙事|角色|对话|剧本|策划案|提案|内容策略|自媒体|公众号|推文|软文|种草)\b/i;function xf(r){if(!r||r.trim().length===0)return"general";let e=Ur(r),t=Math.max(e.coding,e.office,e.creative);return t===0||[e.coding,e.office,e.creative].filter(o=>o>=t-1&&o>0).length>=2&&t<=2?"general":e.coding===t?"coding":e.office===t?"office":e.creative===t?"creative":"general"}function Ur(r){return{coding:Nr(r,Tf),office:Nr(r,wf),creative:Nr(r,vf),general:0}}function Nr(r,e){let t=new RegExp(e.source,"gi"),n=r.match(t);return n?n.length:0}function pl(r){let e=yf(r.cwd);if(e)return{domain:e,source:"project-file"};if(r.hostOverride&&qn.has(r.hostOverride))return{domain:r.hostOverride,source:"host-override"};let t=kf(r.userText,r.sessionDomain);return r.sessionDomain&&t===r.sessionDomain?{domain:t,source:"session-sticky"}:{domain:t,source:"auto-detect"}}var Sf=3;function ml(r,e){if(e==="general")return!1;try{let t=en(r,ke),n=en(t,ul);if(cl(n)){let s=Zt(n,"utf-8");if(/^taskDomain\s*:/m.test(s))return!1}hf(t,{recursive:!0});let o=`# Auto-detected task domain for this workspace.
139
141
  # Values: coding | office | creative | general
140
- `;if(ol(n)){let s=zt(n,"utf-8");rl(n,s.trimEnd()+`
142
+ `;if(cl(n)){let s=Zt(n,"utf-8");dl(n,s.trimEnd()+`
141
143
 
142
144
  `+o+`taskDomain: ${e}
143
- `,"utf-8")}else rl(n,o+`taskDomain: ${e}
144
- `,"utf-8");return!0}catch{return!1}}function ll(r,e){return e==="general"?!1:(Pr(r)[e]??0)>=hf}import*as U from"node:fs";import*as H from"node:path";import{execFile as $y}from"node:child_process";var Ir=new Set(["gateway","agents_list","session_status","sessions_send","sessions_list","sessions_history","sessions_spawn","cron","config","workflow"]),cl=new Set([...Ir,"agent"]);function Er(r,e){let t=e?Ir:cl;return r.filter(n=>n.function.name.startsWith("mcp__")?!0:!t.has(n.function.name))}var Ue=new Map,Or=new Set;function ul(r){Ue.clear(),Or.clear();for(let e of r)Ue.set(e.name,e)}function me(r){Ue.set(r.name,r)}function Lr(r){for(let e of r)Ue.set(e.name,e)}function Bn(r){return Ue.delete(r)}function we(r){return Ue.get(r)}function Be(){return Array.from(Ue.keys())}function dl(r){let e=Ue.get(r);return!e||e.isEnabled?.()===!1?!1:(Or.add(r),!0)}function We(r=!1){let e=[];for(let t of Ue.values())t.isEnabled?.()!==!1&&(!r&&t.shouldDefer&&!Or.has(t.name)||e.push({type:"function",function:{name:t.name,description:t.description,parameters:t.parameters},meta:{parallelSafe:t.isConcurrencySafe??!1,isReadOnly:t.isReadOnly??!1,isDangerous:!(t.isReadOnly??!1)&&!(t.isConcurrencySafe??!1)}}));return e}var yf="think",bf={type:"object",properties:{thought:{type:"string",description:["Your internal reasoning about the current situation.","Use this to:","\u2022 Analyze what the user really wants (disambiguate vague requests)","\u2022 Plan multi-step approaches before executing","\u2022 Evaluate which tool(s) to use and why","\u2022 Consider edge cases or potential issues","\u2022 Reflect on conversation context and user preferences","This content is never shown to the user."].join(`
145
- `)}},required:["thought"]};function pl(){return{name:yf,label:"Think",shouldDefer:!0,description:["Use this tool to think and reason about the current situation BEFORE taking action.","Call this tool when you need to:","- Analyze an ambiguous or complex user request before deciding what to do","- Plan a multi-step approach (what tools to call and in what order)","- Identify which steps can run in parallel vs. which must be sequential","- Evaluate tradeoffs between different approaches","- Reflect on user preferences from conversation history","- Process new information that changes your understanding","","This tool has NO side effects \u2014 it simply records your reasoning process.","Your thought is NOT shown to the user; it only improves YOUR decision quality.","After thinking, proceed to take the appropriate action.","","When planning multi-step work, be explicit about parallelism:",'- Say "\u8FD9\u4E9B\u53EF\u4EE5\u5E76\u884C\u751F\u6210" or "these can run in parallel" for independent tasks.','- Say "\u5148\u2026\u7136\u540E\u2026" or "step 1 first, then step 2" for sequential dependencies.'].join(`
146
- `),parameters:bf,execute:async(r,e)=>({content:[{type:"text",text:"Thought recorded. Now proceed with the best action based on your reasoning."}],details:{type:"think"}})}}function ft(r){let e=new Set(r.filter(t=>t.status==="completed").map(t=>t.id));return{total:r.length,completed:r.filter(t=>t.status==="completed").length,inProgress:r.filter(t=>t.status==="in-progress").length,notStarted:r.filter(t=>t.status==="not-started").length,blocked:r.filter(t=>t.status!=="completed"&&t.blockedBy?.some(n=>!e.has(n))).length}}var kf="todo",Tf=["create","update","delete","list"],wf={type:"object",properties:{action:{type:"string",enum:[...Tf],description:"create \u2014 add a single new task (auto-assigns id). update \u2014 modify a single task by id (partial). delete \u2014 remove a task by id (cascades block refs). list \u2014 read current task list."},id:{type:"number",description:"[update|delete] Task id to operate on."},title:{type:"string",description:"[create|update] Task title (3-7 words)."},description:{type:"string",description:"[create|update] Detailed task description."},status:{type:"string",enum:["not-started","in-progress","completed"],description:"[create|update] Task status. create defaults to not-started."},owner:{type:"string",description:"[create|update] Owner agent/subagent identifier."},addBlocks:{type:"array",items:{type:"number"},description:"[update] Task IDs that this task should block."},addBlockedBy:{type:"array",items:{type:"number"},description:"[update] Task IDs that should block this task."}},required:["action"]};function ml(r){let e=[],t=0,n=r??{};function o(){let p=e.reduce((m,g)=>Math.max(m,g.id),0);return t=Math.max(t,p)+1,t}function s(p){return{content:[{type:"text",text:JSON.stringify({error:p,todoList:e})}],details:{type:"todo",error:p}}}function i(p){let m=ft(e),g=new Set(e.filter(T=>T.status==="completed").map(T=>T.id)),f=e.map(T=>{let w=T.blockedBy?.filter(_=>!g.has(_));return{...T,...w?.length?{blockedBy:w}:{blockedBy:void 0}}}),b={...m,todoList:f,...p};return{content:[{type:"text",text:JSON.stringify(b)}],details:{type:"todo",...m,agentId:n.agentId}}}function a(p,m,g){let f=e.find(b=>b.id===p);if(f){if(m?.length){f.blocks=[...new Set([...f.blocks??[],...m])];for(let b of m){let T=e.find(w=>w.id===b);T&&(T.blockedBy=[...new Set([...T.blockedBy??[],p])])}}if(g?.length){f.blockedBy=[...new Set([...f.blockedBy??[],...g])];for(let b of g){let T=e.find(w=>w.id===b);T&&(T.blocks=[...new Set([...T.blocks??[],p])])}}}}function l(p){for(let m of e)m.blocks&&(m.blocks=m.blocks.filter(g=>g!==p)),m.blockedBy&&(m.blockedBy=m.blockedBy.filter(g=>g!==p))}function u(p){if(!p.title)return s("title is required for create action.");let m={id:o(),title:p.title,status:"not-started",...p.description!=null&&{description:p.description},...p.owner!=null&&{owner:p.owner}};return e.push(m),a(m.id,void 0,p.addBlockedBy),i({created:{id:m.id,title:m.title}})}function c(p){if(p.id==null)return s("id is required for update action.");let m=e.find(g=>g.id===p.id);if(!m)return s(`Task #${p.id} not found.`);if(p.status==="in-progress"){let g=e.find(f=>f.status==="in-progress"&&f.id!==p.id);if(g)return s(`Cannot set #${p.id} to in-progress: #${g.id} already is.`)}return p.title!=null&&(m.title=p.title),p.description!=null&&(m.description=p.description),p.owner!=null&&(m.owner=p.owner),p.status!=null&&(m.status=p.status),a(m.id,p.addBlocks,p.addBlockedBy),i({updated:{id:m.id,title:m.title}})}function d(p){if(p.id==null)return s("id is required for delete action.");let m=e.findIndex(g=>g.id===p.id);return m===-1?s(`Task #${p.id} not found.`):(t=Math.max(t,p.id),e.splice(m,1),l(p.id),i({deleted:p.id}))}return{name:kf,label:"Todo",description:"Manage a structured todo list to track multi-step task progress. Actions: create (add task), update (modify by id), delete (remove by id), list (read all). Supports dependency tracking (blocks/blockedBy). Use frequently during complex work to plan steps and show progress.",parameters:wf,searchHint:"manage session task checklist progress tracking dependencies",maxResultSizeChars:1e5,execute:async(p,m)=>{let g=m.action;switch(g){case"create":return u(m);case"update":return c(m);case"delete":return d(m);case"list":return i();default:return s(`Unknown action: ${g}. Valid: create, update, delete, list.`)}}}}import{isAbsolute as Gf,resolve as Hf}from"node:path";var gl=new Set(["find","grep","rg","ag","ack","locate","which","whereis"]),fl=new Set(["cat","head","tail","less","more","wc","stat","file","strings","jq","awk","cut","sort","uniq","tr"]),hl=new Set(["ls","tree","du"]);var yl=new Set(["mv","cp","rm","mkdir","rmdir","chmod","chown","chgrp","touch","ln","cd","export","unset","wait"]);function vf(r){let t=r.replace(/\\\n/g," ").trim().split(/[|;&]/).shift()?.trim()??"";if(!t)return null;let n=t.split(/\s+/),o=0;for(;o<n.length&&/^[A-Za-z_]\w*=/.test(n[o]);)o++;let s=/^(?:timeout|time|nice|nohup|stdbuf|command|builtin|exec)$/;for(;o<n.length;){let l=n[o];if(s.test(l)){for(o++;o<n.length&&/^[-+]/.test(n[o]);)o++;o<n.length&&/^\d+(?:\.\d+)?[smhd]?$/.test(n[o])&&o++;continue}break}if(o>=n.length)return null;let i=n[o],a=i.lastIndexOf("/");return a>=0?i.slice(a+1):i}function bl(r){return/(?:^|[;&|])\s*(?:cd|pushd|popd)\b/.test(r)}function $r(r){let e=vf(r),t=e!==null&&gl.has(e),n=e!==null&&fl.has(e),o=e!==null&&hl.has(e),s=e!==null&&yl.has(e),i=/(?:[^2]>|^>|\|>)/.test(r),a=bl(r),l=(t||n||o)&&!i&&!a;return{firstCommand:e,isSearch:t,isRead:n,isList:o,isSilent:s,isConcurrencySafe:l,isReadOnly:l}}function Dr(r){return/(?:^|[;&|])\s*sleep\s+\d/i.test(r)?"sleep command blocks execution \u2014 use run_in_background: true":/\bwhile\s+(?:true|:|\[\s*1\s*\])\b/.test(r)?"infinite loop \u2014 use run_in_background: true or monitor tool":null}import{spawn as $f}from"node:child_process";import{constants as Vn,readFileSync as Df,unlinkSync as Uf}from"node:fs";import{mkdir as Nf,open as jf,realpath as vl}from"node:fs/promises";import{isAbsolute as Ff,resolve as Bf}from"node:path";function Wn(){if(process.platform!=="win32")return!1;let r=process.env.QLOGICAGENT_USE_POWERSHELL;return r==="1"||r==="true"}function Ur(){return Wn()?"powershell":"bash"}function Nr(){return Math.floor(Math.random()*65536).toString(16).padStart(4,"0")}import{mkdir as xf,readFile as Sf,writeFile as _f,unlink as Rf}from"node:fs/promises";import{join as kl}from"node:path";import{tmpdir as Cf}from"node:os";var Af=8*1024*1024,Mf=5*1024*1024*1024;var jr;function Kt(){if(!jr){let r=Math.random().toString(36).slice(2,10);jr=kl(Cf(),"qla-tasks",r)}return jr}function Tl(r){return kl(Kt(),`${r}.output`)}function Ne(r="local_bash"){return`${r}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var Ge=class{taskId;path;stdoutToFile;#e="";#n="";#r=0;#s=0;#t;#i;#o=0;#a=!1;constructor(e,t,n=!1,o=Af){this.taskId=e,this.path=Tl(e),this.stdoutToFile=n,this.#t=o,this.#i=t}writeStdout(e){this.#e+=e,this.#s+=e.length,this.#r+=Pf(e),this.#u()}writeStderr(e){this.#n+=e}async getStdout(){if(this.stdoutToFile)try{let e=await Sf(this.path,"utf-8");return this.#o=Buffer.byteLength(e),e}catch{return""}return this.#e}getStderr(){return this.#n}get outputFileSize(){return this.#o}get outputFileRedundant(){return this.#o<=this.#t}#u(){this.#e.length>this.#t&&this.spillToDisk()}spillToDisk(){this.#e.length!==0&&xf(Kt(),{recursive:!0}).then(()=>_f(this.path,this.#e).catch(()=>{}))}async deleteOutputFile(){try{await Rf(this.path)}catch{}}clear(){this.#a||(this.#a=!0,this.#e="",this.#n="",this.#i=null,this.deleteOutputFile())}};function Pf(r){let e=0;for(let t=0;t<r.length;t++)r.charCodeAt(t)===10&&e++;return e}var Fr=137,wl=143,If=5e3,Br=5*1024*1024*1024,Gn=class{#e;#n;#r;#s=!1;constructor(e,t,n){this.#e=e,this.#n=t,this.#r=n,e.setEncoding("utf-8"),e.on("data",this.#t)}#t=e=>{let t=typeof e=="string"?e:e.toString();this.#r?this.#n.writeStderr(t):this.#n.writeStdout(t)};cleanup(){this.#s||(this.#s=!0,this.#e.removeListener("data",this.#t),this.#e=null,this.#n=null)}},Wr=class r{#e="running";#n;#r;#s;#t;#i=null;#o=null;#a=!1;#u;#l;#d;#g;#b;#p=null;#m=null;#c=null;taskOutput;result;onTimeout;constructor(e,t,n,o,s=!1,i=Br){this.#t=e,this.#l=t,this.#g=n,this.#b=s,this.#u=i,this.taskOutput=o,this.#s=e.stderr?new Gn(e.stderr,o,!0):null,this.#r=e.stdout?new Gn(e.stdout,o,!1):null,s&&(this.onTimeout=a=>{this.#d=a}),this.result=this.#_()}get status(){return this.#e}static#T(e){e.#b&&e.#d?e.#d(e.background.bind(e)):e.#y(wl)}#w(){this.#l.reason!=="interrupt"&&this.kill()}#v(e,t){let n=e??(t==="SIGTERM"?144:1);this.#f(n)}#x(){this.#f(1)}#f(e){this.#m&&(this.#m(e),this.#m=null)}#h(){this.#k(),this.#i&&(clearTimeout(this.#i),this.#i=null),this.#c&&(this.#l.removeEventListener("abort",this.#c),this.#c=null)}#k(){this.#o&&(clearInterval(this.#o),this.#o=null)}#S(){this.#o=setInterval(()=>{import("node:fs/promises").then(({stat:e})=>e(this.taskOutput.path).then(t=>{t.size>this.#u&&this.#e==="backgrounded"&&this.#o!==null&&(this.#a=!0,this.#k(),this.#y(Fr))},()=>{}))},If),this.#o.unref?.()}#_(){this.#c=this.#w.bind(this),this.#l.addEventListener("abort",this.#c,{once:!0}),this.#t.once("exit",this.#v.bind(this)),this.#t.once("error",this.#x.bind(this)),this.#i=setTimeout(r.#T,this.#g,this);let e=new Promise(t=>{this.#m=t});return new Promise(t=>{this.#p=t,e.then(this.#R.bind(this))})}async#R(e){this.#h(),(this.#e==="running"||this.#e==="backgrounded")&&(this.#e="completed");let t=await this.taskOutput.getStdout(),n={code:e,stdout:t,stderr:this.taskOutput.getStderr(),interrupted:e===Fr,backgroundTaskId:this.#n};this.taskOutput.stdoutToFile&&!this.#n&&(this.taskOutput.outputFileRedundant?this.taskOutput.deleteOutputFile():(n.outputFilePath=this.taskOutput.path,n.outputFileSize=this.taskOutput.outputFileSize)),this.#a?n.stderr=`Background command killed: output file exceeded ${Br} bytes. ${n.stderr}`:e===wl&&(n.stderr=`Command timed out after ${this.#g}ms. ${n.stderr}`),this.#p&&(this.#p(n),this.#p=null)}#y(e){this.#e="killed";let t=this.#t.pid;if(t)try{if(process.platform==="win32")import("node:child_process").then(({execSync:n})=>{try{n(`taskkill /PID ${t} /T /F`,{stdio:"ignore"})}catch{}});else try{process.kill(-t,"SIGKILL")}catch{try{process.kill(t,"SIGKILL")}catch{}}}catch{try{this.#t.kill("SIGKILL")}catch{}}this.#f(e??Fr)}kill(){this.#y()}background(e){return this.#e==="running"?(this.#n=e,this.#e="backgrounded",this.#h(),this.taskOutput.stdoutToFile?this.#S():this.taskOutput.spillToDisk(),!0):!1}cleanup(){this.#r?.cleanup(),this.#s?.cleanup(),this.taskOutput.clear(),this.#h(),this.#t=null,this.#l=null,this.#d=void 0}};function Gr(r,e,t,n,o=!1,s=Br){return new Wr(r,e,t,n,o,s)}function Hn(r,e){let t=new Ge(Ne("local_bash"),null);return{status:"killed",result:Promise.resolve({code:e?.code??145,stdout:"",stderr:e?.stderr??"Command aborted before execution",interrupted:!0,backgroundTaskId:r}),taskOutput:t,background:()=>!1,kill:()=>{},cleanup:()=>{}}}function Hr(r){let e=new Ge(Ne("local_bash"),null);return{status:"completed",result:Promise.resolve({code:1,stdout:"",stderr:r,interrupted:!1,preSpawnError:r}),taskOutput:e,background:()=>!1,kill:()=>{},cleanup:()=>{}}}var Ef=new Set(["API_KEY","ANTHROPIC_API_KEY","OPENAI_API_KEY","DEEPSEEK_API_KEY","DOUBAO_API_KEY","MINIMAX_API_KEY","GLM_API_KEY","KIMI_API_KEY","QWEN_API_KEY","MOONSHOT_API_KEY","ZHIPU_API_KEY","BAICHUAN_API_KEY","VOLCENGINE_API_KEY","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","GOOGLE_APPLICATION_CREDENTIALS","AZURE_CLIENT_SECRET","AZURE_CLIENT_ID","AZURE_TENANT_ID","ACTIONS_ID_TOKEN_REQUEST_TOKEN","ACTIONS_RUNTIME_TOKEN","GITHUB_TOKEN","GH_TOKEN","GITLAB_TOKEN","CI_JOB_TOKEN","DATABASE_URL","REDIS_URL","REDIS_PASSWORD"]),Of=["_SECRET","_TOKEN","_PASSWORD","_CREDENTIAL","_API_KEY","SECRET_","TOKEN_","PASSWORD_","CREDENTIAL_","_AUTH_","PRIVATE_KEY"];function Vr(){let r={...process.env};for(let e of Object.keys(r))Lf(e)&&delete r[e];return r}function Lf(r){if(Ef.has(r))return!0;let e=r.toUpperCase();for(let t of Of)if(e.includes(t))return!0;return!1}var Wf=1800*1e3,zn=process.cwd(),xl=process.cwd();function qn(){return zn}function zr(r,e){zn=Ff(r)?r:Bf(e||zn,r)}function Sl(){return xl}function Kn(r){zn=r,xl=r}var qr=null;function Jt(r){qr={provider:r}}function _l(){if(!qr)throw new Error("Shell provider not configured. Call setShellProvider() at startup.");return qr.provider}async function Jn(r,e,t,n){let{timeout:o,onProgress:s,preventCwdChanges:i,shouldAutoBackground:a,onStdout:l,cwd:u}=n??{},c=o||Wf,d=t??Ur(),p=_l(),m=Nr(),{commandString:g,cwdFilePath:f}=await p.buildExecCommand(r,{id:m,useSandbox:!1}),b=g,T=u??qn();try{await vl(T)}catch{let v=Sl();try{await vl(v),zr(v),T=v}catch{return Hr(`Working directory "${T}" no longer exists.`)}}if(e.aborted)return Hn();let w=p.shellPath,_=p.getSpawnArgs(b),y=await p.getEnvironmentOverrides(r),C=!!l,E=Ne("local_bash"),D=new Ge(E,s??null,!C);await Nf(Kt(),{recursive:!0});let L;if(!C){let v=Vn.O_NOFOLLOW??0;L=await jf(D.path,process.platform==="win32"?"w":Vn.O_WRONLY|Vn.O_CREAT|Vn.O_APPEND|v)}try{let v=$f(w,_,{env:{...Vr(),GIT_EDITOR:"true",QLOGICAGENT:"1",...y},cwd:T,stdio:C?["pipe","pipe","pipe"]:["pipe",L?.fd,L?.fd],detached:p.detached,windowsHide:!0}),ce=Gr(v,e,c,D,a);if(L!==void 0)try{await L.close()}catch{}return v.stdout&&l&&v.stdout.on("data",F=>{l(typeof F=="string"?F:F.toString())}),f&&ce.result.then(F=>{if(F&&!i&&!F.backgroundTaskId){try{let j=Df(f,{encoding:"utf8"}).trim();j&&j.normalize("NFC")!==T&&zr(j,T)}catch{}try{Uf(f)}catch{}}}),ce}catch(v){if(L!==void 0)try{await L.close()}catch{}return D.clear(),Hn(void 0,{code:126,stderr:v instanceof Error?v.message:String(v)})}}var Vf="exec",zf={type:"object",properties:{command:{type:"string",description:"Shell command to execute. On Windows uses PowerShell, on Unix uses bash."},description:{type:"string",description:'Clear, concise description of what this command does (e.g. "Install dependencies", "Run unit tests"). Used for UI display and permission logging. For simple commands keep it 5-10 words; for complex piped/flagged commands add enough context to clarify intent.'},workdir:{type:"string",description:"Working directory for the command."},timeout:{type:"number",description:"Timeout in milliseconds (default: 120000). Only applies to foreground commands. Max allowed: 600000 (10 min)."},background:{type:"boolean",description:"If true, start the command in the background and return immediately with a task ID. Use getOutput to check on it later. Good for dev servers, watchers, long builds. Default: false."}},required:["command"]},qf=12e4,Kf=6e5,Yn=3e4;function Kr(r,e){if(r.length<=e)return r;let t=Math.floor(e/2)-50;return`${r.slice(0,t)}
145
+ `,"utf-8")}else dl(n,o+`taskDomain: ${e}
146
+ `,"utf-8");return!0}catch{return!1}}function gl(r,e){return e==="general"?!1:(Ur(r)[e]??0)>=Sf}import*as N from"node:fs";import*as z from"node:path";import{execFile as Wy}from"node:child_process";var jr=new Set(["gateway","agents_list","session_status","sessions_send","sessions_list","sessions_history","sessions_spawn","cron","config","workflow"]),fl=new Set([...jr,"agent"]);function Fr(r,e){let t=e?jr:fl;return r.filter(n=>n.function.name.startsWith("mcp__")?!0:!t.has(n.function.name))}var je=new Map,Br=new Set;function hl(r){je.clear(),Br.clear();for(let e of r)je.set(e.name,e)}function fe(r){je.set(r.name,r)}function Gr(r){for(let e of r)je.set(e.name,e)}function Kn(r){return je.delete(r)}function xe(r){return je.get(r)}function qe(){return Array.from(je.keys())}function yl(r){let e=je.get(r);return!e||e.isEnabled?.()===!1?!1:(Br.add(r),!0)}function Fe(r=!1){let e=[];for(let t of je.values())t.isEnabled?.()!==!1&&(!r&&t.shouldDefer&&!Br.has(t.name)||e.push({type:"function",function:{name:t.name,description:t.description,parameters:t.parameters},meta:{parallelSafe:t.isConcurrencySafe??!1,isReadOnly:t.isReadOnly??!1,isDangerous:!(t.isReadOnly??!1)&&!(t.isConcurrencySafe??!1)}}));return e}var _f="think",Rf={type:"object",properties:{thought:{type:"string",description:["Your internal reasoning about the current situation.","Use this to:","\u2022 Analyze what the user really wants (disambiguate vague requests)","\u2022 Plan multi-step approaches before executing","\u2022 Evaluate which tool(s) to use and why","\u2022 Consider edge cases or potential issues","\u2022 Reflect on conversation context and user preferences","This content is never shown to the user."].join(`
147
+ `)}},required:["thought"]};function bl(){return{name:_f,label:"Think",shouldDefer:!0,description:["Use this tool to think and reason about the current situation BEFORE taking action.","Call this tool when you need to:","- Analyze an ambiguous or complex user request before deciding what to do","- Plan a multi-step approach (what tools to call and in what order)","- Identify which steps can run in parallel vs. which must be sequential","- Evaluate tradeoffs between different approaches","- Reflect on user preferences from conversation history","- Process new information that changes your understanding","","This tool has NO side effects \u2014 it simply records your reasoning process.","Your thought is NOT shown to the user; it only improves YOUR decision quality.","After thinking, proceed to take the appropriate action.","","When planning multi-step work, be explicit about parallelism:",'- Say "\u8FD9\u4E9B\u53EF\u4EE5\u5E76\u884C\u751F\u6210" or "these can run in parallel" for independent tasks.','- Say "\u5148\u2026\u7136\u540E\u2026" or "step 1 first, then step 2" for sequential dependencies.'].join(`
148
+ `),parameters:Rf,execute:async(r,e)=>({content:[{type:"text",text:"Thought recorded. Now proceed with the best action based on your reasoning."}],details:{type:"think"}})}}function vt(r){let e=new Set(r.filter(t=>t.status==="completed").map(t=>t.id));return{total:r.length,completed:r.filter(t=>t.status==="completed").length,inProgress:r.filter(t=>t.status==="in-progress").length,notStarted:r.filter(t=>t.status==="not-started").length,blocked:r.filter(t=>t.status!=="completed"&&t.blockedBy?.some(n=>!e.has(n))).length}}var Cf="todo",Af=["create","update","delete","list"],Pf={type:"object",properties:{action:{type:"string",enum:[...Af],description:"create \u2014 add a single new task (auto-assigns id). update \u2014 modify a single task by id (partial). delete \u2014 remove a task by id (cascades block refs). list \u2014 read current task list."},id:{type:"number",description:"[update|delete] Task id to operate on."},title:{type:"string",description:"[create|update] Task title (3-7 words)."},description:{type:"string",description:"[create|update] Detailed task description."},status:{type:"string",enum:["not-started","in-progress","completed"],description:"[create|update] Task status. create defaults to not-started."},owner:{type:"string",description:"[create|update] Owner agent/subagent identifier."},addBlocks:{type:"array",items:{type:"number"},description:"[update] Task IDs that this task should block."},addBlockedBy:{type:"array",items:{type:"number"},description:"[update] Task IDs that should block this task."}},required:["action"]};function kl(r){let e=[],t=0,n=r??{};function o(){let p=e.reduce((m,g)=>Math.max(m,g.id),0);return t=Math.max(t,p)+1,t}function s(p){return{content:[{type:"text",text:JSON.stringify({error:p,todoList:e})}],details:{type:"todo",error:p}}}function i(p){let m=vt(e),g=new Set(e.filter(w=>w.status==="completed").map(w=>w.id)),f=e.map(w=>{let T=w.blockedBy?.filter(_=>!g.has(_));return{...w,...T?.length?{blockedBy:T}:{blockedBy:void 0}}}),b={...m,todoList:f,...p};return{content:[{type:"text",text:JSON.stringify(b)}],details:{type:"todo",...m,agentId:n.agentId}}}function a(p,m,g){let f=e.find(b=>b.id===p);if(f){if(m?.length){f.blocks=[...new Set([...f.blocks??[],...m])];for(let b of m){let w=e.find(T=>T.id===b);w&&(w.blockedBy=[...new Set([...w.blockedBy??[],p])])}}if(g?.length){f.blockedBy=[...new Set([...f.blockedBy??[],...g])];for(let b of g){let w=e.find(T=>T.id===b);w&&(w.blocks=[...new Set([...w.blocks??[],p])])}}}}function c(p){for(let m of e)m.blocks&&(m.blocks=m.blocks.filter(g=>g!==p)),m.blockedBy&&(m.blockedBy=m.blockedBy.filter(g=>g!==p))}function d(p){if(!p.title)return s("title is required for create action.");let m={id:o(),title:p.title,status:"not-started",...p.description!=null&&{description:p.description},...p.owner!=null&&{owner:p.owner}};return e.push(m),a(m.id,void 0,p.addBlockedBy),i({created:{id:m.id,title:m.title}})}function l(p){if(p.id==null)return s("id is required for update action.");let m=e.find(g=>g.id===p.id);if(!m)return s(`Task #${p.id} not found.`);if(p.status==="in-progress"){let g=e.find(f=>f.status==="in-progress"&&f.id!==p.id);if(g)return s(`Cannot set #${p.id} to in-progress: #${g.id} already is.`)}return p.title!=null&&(m.title=p.title),p.description!=null&&(m.description=p.description),p.owner!=null&&(m.owner=p.owner),p.status!=null&&(m.status=p.status),a(m.id,p.addBlocks,p.addBlockedBy),i({updated:{id:m.id,title:m.title}})}function u(p){if(p.id==null)return s("id is required for delete action.");let m=e.findIndex(g=>g.id===p.id);return m===-1?s(`Task #${p.id} not found.`):(t=Math.max(t,p.id),e.splice(m,1),c(p.id),i({deleted:p.id}))}return{name:Cf,label:"Todo",description:"Manage a structured todo list to track multi-step task progress. Actions: create (add task), update (modify by id), delete (remove by id), list (read all). Supports dependency tracking (blocks/blockedBy). Use frequently during complex work to plan steps and show progress.",parameters:Pf,searchHint:"manage session task checklist progress tracking dependencies",maxResultSizeChars:1e5,execute:async(p,m)=>{let g=m.action;switch(g){case"create":return d(m);case"update":return l(m);case"delete":return u(m);case"list":return i();default:return s(`Unknown action: ${g}. Valid: create, update, delete, list.`)}}}}import{isAbsolute as Xf,resolve as Qf}from"node:path";var Tl=new Set(["find","grep","rg","ag","ack","locate","which","whereis"]),wl=new Set(["cat","head","tail","less","more","wc","stat","file","strings","jq","awk","cut","sort","uniq","tr"]),vl=new Set(["ls","tree","du"]);var xl=new Set(["mv","cp","rm","mkdir","rmdir","chmod","chown","chgrp","touch","ln","cd","export","unset","wait"]);function Mf(r){let t=r.replace(/\\\n/g," ").trim().split(/[|;&]/).shift()?.trim()??"";if(!t)return null;let n=t.split(/\s+/),o=0;for(;o<n.length&&/^[A-Za-z_]\w*=/.test(n[o]);)o++;let s=/^(?:timeout|time|nice|nohup|stdbuf|command|builtin|exec)$/;for(;o<n.length;){let c=n[o];if(s.test(c)){for(o++;o<n.length&&/^[-+]/.test(n[o]);)o++;o<n.length&&/^\d+(?:\.\d+)?[smhd]?$/.test(n[o])&&o++;continue}break}if(o>=n.length)return null;let i=n[o],a=i.lastIndexOf("/");return a>=0?i.slice(a+1):i}function Sl(r){return/(?:^|[;&|])\s*(?:cd|pushd|popd)\b/.test(r)}function Wr(r){let e=Mf(r),t=e!==null&&Tl.has(e),n=e!==null&&wl.has(e),o=e!==null&&vl.has(e),s=e!==null&&xl.has(e),i=/(?:[^2]>|^>|\|>)/.test(r),a=Sl(r),c=(t||n||o)&&!i&&!a;return{firstCommand:e,isSearch:t,isRead:n,isList:o,isSilent:s,isConcurrencySafe:c,isReadOnly:c}}function Hr(r){return/(?:^|[;&|])\s*sleep\s+\d/i.test(r)?"sleep command blocks execution \u2014 use run_in_background: true":/\bwhile\s+(?:true|:|\[\s*1\s*\])\b/.test(r)?"infinite loop \u2014 use run_in_background: true or monitor tool":null}import{spawn as Wf}from"node:child_process";import{constants as Qn,readFileSync as Hf,unlinkSync as zf}from"node:fs";import{mkdir as Vf,open as qf,realpath as Al}from"node:fs/promises";import{isAbsolute as Kf,resolve as Jf}from"node:path";function Jn(){if(process.platform!=="win32")return!1;let r=process.env.QLOGICAGENT_USE_POWERSHELL;return r==="1"||r==="true"}function zr(){return Jn()?"powershell":"bash"}function Vr(){return Math.floor(Math.random()*65536).toString(16).padStart(4,"0")}import{mkdir as If,readFile as Ef,writeFile as Of,unlink as Lf}from"node:fs/promises";import{join as _l}from"node:path";import{tmpdir as Df}from"node:os";var $f=8*1024*1024,Nf=5*1024*1024*1024;var qr;function tn(){if(!qr){let r=Math.random().toString(36).slice(2,10);qr=_l(Df(),"qla-tasks",r)}return qr}function Rl(r){return _l(tn(),`${r}.output`)}function Be(r="local_bash"){return`${r}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var Ke=class{taskId;path;stdoutToFile;#e="";#n="";#r=0;#s=0;#t;#i;#o=0;#a=!1;constructor(e,t,n=!1,o=$f){this.taskId=e,this.path=Rl(e),this.stdoutToFile=n,this.#t=o,this.#i=t}writeStdout(e){this.#e+=e,this.#s+=e.length,this.#r+=Uf(e),this.#d()}writeStderr(e){this.#n+=e}async getStdout(){if(this.stdoutToFile)try{let e=await Ef(this.path,"utf-8");return this.#o=Buffer.byteLength(e),e}catch{return""}return this.#e}getStderr(){return this.#n}get outputFileSize(){return this.#o}get outputFileRedundant(){return this.#o<=this.#t}#d(){this.#e.length>this.#t&&this.spillToDisk()}spillToDisk(){this.#e.length!==0&&If(tn(),{recursive:!0}).then(()=>Of(this.path,this.#e).catch(()=>{}))}async deleteOutputFile(){try{await Lf(this.path)}catch{}}clear(){this.#a||(this.#a=!0,this.#e="",this.#n="",this.#i=null,this.deleteOutputFile())}};function Uf(r){let e=0;for(let t=0;t<r.length;t++)r.charCodeAt(t)===10&&e++;return e}var Kr=137,Cl=143,jf=5e3,Jr=5*1024*1024*1024,Yn=class{#e;#n;#r;#s=!1;constructor(e,t,n){this.#e=e,this.#n=t,this.#r=n,e.setEncoding("utf-8"),e.on("data",this.#t)}#t=e=>{let t=typeof e=="string"?e:e.toString();this.#r?this.#n.writeStderr(t):this.#n.writeStdout(t)};cleanup(){this.#s||(this.#s=!0,this.#e.removeListener("data",this.#t),this.#e=null,this.#n=null)}},Yr=class r{#e="running";#n;#r;#s;#t;#i=null;#o=null;#a=!1;#d;#l;#u;#g;#b;#p=null;#m=null;#c=null;taskOutput;result;onTimeout;constructor(e,t,n,o,s=!1,i=Jr){this.#t=e,this.#l=t,this.#g=n,this.#b=s,this.#d=i,this.taskOutput=o,this.#s=e.stderr?new Yn(e.stderr,o,!0):null,this.#r=e.stdout?new Yn(e.stdout,o,!1):null,s&&(this.onTimeout=a=>{this.#u=a}),this.result=this.#_()}get status(){return this.#e}static#T(e){e.#b&&e.#u?e.#u(e.background.bind(e)):e.#y(Cl)}#w(){this.#l.reason!=="interrupt"&&this.kill()}#v(e,t){let n=e??(t==="SIGTERM"?144:1);this.#f(n)}#x(){this.#f(1)}#f(e){this.#m&&(this.#m(e),this.#m=null)}#h(){this.#k(),this.#i&&(clearTimeout(this.#i),this.#i=null),this.#c&&(this.#l.removeEventListener("abort",this.#c),this.#c=null)}#k(){this.#o&&(clearInterval(this.#o),this.#o=null)}#S(){this.#o=setInterval(()=>{import("node:fs/promises").then(({stat:e})=>e(this.taskOutput.path).then(t=>{t.size>this.#d&&this.#e==="backgrounded"&&this.#o!==null&&(this.#a=!0,this.#k(),this.#y(Kr))},()=>{}))},jf),this.#o.unref?.()}#_(){this.#c=this.#w.bind(this),this.#l.addEventListener("abort",this.#c,{once:!0}),this.#t.once("exit",this.#v.bind(this)),this.#t.once("error",this.#x.bind(this)),this.#i=setTimeout(r.#T,this.#g,this);let e=new Promise(t=>{this.#m=t});return new Promise(t=>{this.#p=t,e.then(this.#R.bind(this))})}async#R(e){this.#h(),(this.#e==="running"||this.#e==="backgrounded")&&(this.#e="completed");let t=await this.taskOutput.getStdout(),n={code:e,stdout:t,stderr:this.taskOutput.getStderr(),interrupted:e===Kr,backgroundTaskId:this.#n};this.taskOutput.stdoutToFile&&!this.#n&&(this.taskOutput.outputFileRedundant?this.taskOutput.deleteOutputFile():(n.outputFilePath=this.taskOutput.path,n.outputFileSize=this.taskOutput.outputFileSize)),this.#a?n.stderr=`Background command killed: output file exceeded ${Jr} bytes. ${n.stderr}`:e===Cl&&(n.stderr=`Command timed out after ${this.#g}ms. ${n.stderr}`),this.#p&&(this.#p(n),this.#p=null)}#y(e){this.#e="killed";let t=this.#t.pid;if(t)try{if(process.platform==="win32")import("node:child_process").then(({execSync:n})=>{try{n(`taskkill /PID ${t} /T /F`,{stdio:"ignore"})}catch{}});else try{process.kill(-t,"SIGKILL")}catch{try{process.kill(t,"SIGKILL")}catch{}}}catch{try{this.#t.kill("SIGKILL")}catch{}}this.#f(e??Kr)}kill(){this.#y()}background(e){return this.#e==="running"?(this.#n=e,this.#e="backgrounded",this.#h(),this.taskOutput.stdoutToFile?this.#S():this.taskOutput.spillToDisk(),!0):!1}cleanup(){this.#r?.cleanup(),this.#s?.cleanup(),this.taskOutput.clear(),this.#h(),this.#t=null,this.#l=null,this.#u=void 0}};function Xr(r,e,t,n,o=!1,s=Jr){return new Yr(r,e,t,n,o,s)}function Xn(r,e){let t=new Ke(Be("local_bash"),null);return{status:"killed",result:Promise.resolve({code:e?.code??145,stdout:"",stderr:e?.stderr??"Command aborted before execution",interrupted:!0,backgroundTaskId:r}),taskOutput:t,background:()=>!1,kill:()=>{},cleanup:()=>{}}}function Qr(r){let e=new Ke(Be("local_bash"),null);return{status:"completed",result:Promise.resolve({code:1,stdout:"",stderr:r,interrupted:!1,preSpawnError:r}),taskOutput:e,background:()=>!1,kill:()=>{},cleanup:()=>{}}}var Ff=new Set(["API_KEY","ANTHROPIC_API_KEY","OPENAI_API_KEY","DEEPSEEK_API_KEY","DOUBAO_API_KEY","MINIMAX_API_KEY","GLM_API_KEY","KIMI_API_KEY","QWEN_API_KEY","MOONSHOT_API_KEY","ZHIPU_API_KEY","BAICHUAN_API_KEY","VOLCENGINE_API_KEY","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","GOOGLE_APPLICATION_CREDENTIALS","AZURE_CLIENT_SECRET","AZURE_CLIENT_ID","AZURE_TENANT_ID","ACTIONS_ID_TOKEN_REQUEST_TOKEN","ACTIONS_RUNTIME_TOKEN","GITHUB_TOKEN","GH_TOKEN","GITLAB_TOKEN","CI_JOB_TOKEN","DATABASE_URL","REDIS_URL","REDIS_PASSWORD"]),Bf=["_SECRET","_TOKEN","_PASSWORD","_CREDENTIAL","_API_KEY","SECRET_","TOKEN_","PASSWORD_","CREDENTIAL_","_AUTH_","PRIVATE_KEY"];function Zr(){let r={...process.env};for(let e of Object.keys(r))Gf(e)&&delete r[e];return r}function Gf(r){if(Ff.has(r))return!0;let e=r.toUpperCase();for(let t of Bf)if(e.includes(t))return!0;return!1}var Yf=1800*1e3,Zn=process.cwd(),Pl=process.cwd();function eo(){return Zn}function es(r,e){Zn=Kf(r)?r:Jf(e||Zn,r)}function Ml(){return Pl}function to(r){Zn=r,Pl=r}var ts=null;function nn(r){ts={provider:r}}function Il(){if(!ts)throw new Error("Shell provider not configured. Call setShellProvider() at startup.");return ts.provider}async function no(r,e,t,n){let{timeout:o,onProgress:s,preventCwdChanges:i,shouldAutoBackground:a,onStdout:c,cwd:d}=n??{},l=o||Yf,u=t??zr(),p=Il(),m=Vr(),{commandString:g,cwdFilePath:f}=await p.buildExecCommand(r,{id:m,useSandbox:!1}),b=g,w=d??eo();try{await Al(w)}catch{let v=Ml();try{await Al(v),es(v),w=v}catch{return Qr(`Working directory "${w}" no longer exists.`)}}if(e.aborted)return Xn();let T=p.shellPath,_=p.getSpawnArgs(b),R=await p.getEnvironmentOverrides(r),y=!!c,I=Be("local_bash"),O=new Ke(I,s??null,!y);await Vf(tn(),{recursive:!0});let $;if(!y){let v=Qn.O_NOFOLLOW??0;$=await qf(O.path,process.platform==="win32"?"w":Qn.O_WRONLY|Qn.O_CREAT|Qn.O_APPEND|v)}try{let v=Wf(T,_,{env:{...Zr(),GIT_EDITOR:"true",QLOGICAGENT:"1",...R},cwd:w,stdio:y?["pipe","pipe","pipe"]:["pipe",$?.fd,$?.fd],detached:p.detached,windowsHide:!0}),pe=Xr(v,e,l,O,a);if($!==void 0)try{await $.close()}catch{}return v.stdout&&c&&v.stdout.on("data",F=>{c(typeof F=="string"?F:F.toString())}),f&&pe.result.then(F=>{if(F&&!i&&!F.backgroundTaskId){try{let j=Hf(f,{encoding:"utf8"}).trim();j&&j.normalize("NFC")!==w&&es(j,w)}catch{}try{zf(f)}catch{}}}),pe}catch(v){if($!==void 0)try{await $.close()}catch{}return O.clear(),Xn(void 0,{code:126,stderr:v instanceof Error?v.message:String(v)})}}var Zf="exec",eh={type:"object",properties:{command:{type:"string",description:"Shell command to execute. On Windows uses PowerShell, on Unix uses bash."},description:{type:"string",description:'Clear, concise description of what this command does (e.g. "Install dependencies", "Run unit tests"). Used for UI display and permission logging. For simple commands keep it 5-10 words; for complex piped/flagged commands add enough context to clarify intent.'},workdir:{type:"string",description:"Working directory for the command."},timeout:{type:"number",description:"Timeout in milliseconds (default: 120000). Only applies to foreground commands. Max allowed: 600000 (10 min)."},background:{type:"boolean",description:"If true, start the command in the background and return immediately with a task ID. Use getOutput to check on it later. Good for dev servers, watchers, long builds. Default: false."}},required:["command"]},th=12e4,nh=6e5,oo=3e4;function ns(r,e){if(r.length<=e)return r;let t=Math.floor(e/2)-50;return`${r.slice(0,t)}
147
149
 
148
150
  ... [truncated ${r.length-e} chars] ...
149
151
 
150
- ${r.slice(-t)}`}function Jf(r){return r==null||r<=0?qf:Math.min(r,Kf)}async function*Yf(r){let{command:e,abortController:t,timeout:n,shouldAutoBackground:o,cwd:s}=r,i="",a=0,l=0,u=Date.now(),c=null;function d(){return new Promise(g=>{c=()=>g(null)})}let p=await Jn(e,t.signal,void 0,{timeout:n,onProgress(g,f,b,T,w){i=f,a=b,l=T,c&&(c(),c=null)},shouldAutoBackground:o,cwd:s});for(p.onTimeout&&o&&p.onTimeout(g=>{let f=Ne("bg");g(f)});p.status==="running"&&await Promise.race([d(),p.result])===null;)yield{type:"exec_progress",output:i.slice(-4096),fullOutput:i,elapsedTimeSeconds:(Date.now()-u)/1e3,totalLines:a,totalBytes:l};let m=await p.result;return p.cleanup(),m}function Rl(r={}){return{name:Vf,label:"Execute Command",description:"Execute a shell command. Supports foreground (blocking, returns output) and background (non-blocking, returns task ID) modes. On Windows uses PowerShell, on Unix uses bash. Commands are classified for safety: search/read commands may run in parallel; silent commands (mv, cp, rm) show 'Done' instead of empty output. Output is truncated and persisted if too long.",searchHint:"execute shell commands",parameters:zf,maxResultSizeChars:Yn,execute:async(e,t)=>{let n=$r(t.command);if(!t.background){let p=Dr(t.command);if(p)return{content:[{type:"text",text:`Command blocked: ${p}`}],details:{type:"exec",error:"blocked_sleep_pattern",classification:n}}}if(r.validateCommand){let p=await r.validateCommand(t.command);if(p)return{content:[{type:"text",text:`Command blocked: ${p}`}],details:{type:"exec",error:"blocked_by_guard",reason:p,classification:n}}}let o=new AbortController,s=Jf(t.timeout),i=t.workdir?Gf(t.workdir)?t.workdir:Hf(qn(),t.workdir):void 0;if(t.background){let p=await Jn(t.command,o.signal,void 0,{shouldAutoBackground:!1,cwd:i}),m=Ne("bg");if(p.background(m))return{content:[{type:"text",text:`Background task started (id: ${m}).
151
- Use getOutput to check on it later.`}],details:{type:"exec_background",backgroundTaskId:m,description:t.description,classification:n}}}let a=Yf({command:t.command,abortController:o,timeout:s,shouldAutoBackground:!0,cwd:i}),l;do l=await a.next(),!l.done&&r.onProgress&&r.onProgress(l.value);while(!l.done);let u=l.value,c=[];if(u.backgroundTaskId)return{content:[{type:"text",text:`Command auto-backgrounded (task: ${u.backgroundTaskId}).`}],details:{type:"exec_background",backgroundTaskId:u.backgroundTaskId,assistantAutoBackgrounded:u.assistantAutoBackgrounded,classification:n}};u.outputFilePath?(c.push(Kr(u.stdout,Yn)),c.push(`[full output: ${u.outputFilePath} (${u.outputFileSize} bytes)]`)):u.stdout&&c.push(Kr(u.stdout,Yn)),u.stderr&&c.push(`[stderr]
152
- ${Kr(u.stderr,Math.floor(Yn/4))}`),u.interrupted&&c.push(`[interrupted \u2014 exit code ${u.code}]`);let d;return u.code!==0&&r.interpretExitCode&&(d=r.interpretExitCode(u.code,u.stderr),d&&c.push(`[exit ${u.code}: ${d}]`)),c.length===0&&c.push(n.isSilent&&u.code===0?"Done":`(exit code ${u.code}, no output)`),{content:[{type:"text",text:c.join(`
153
- `)}],details:{type:"exec",exitCode:u.code,interrupted:u.interrupted,description:t.description,returnCodeInterpretation:d,noOutputExpected:n.isSilent,outputFilePath:u.outputFilePath,classification:n}}}}}import{tmpdir as Xf}from"node:os";import{join as Qf,posix as Jr}from"node:path";function Zf(r){return r.replace(/(\d?)>nul\b/gi,(e,t)=>`${t||""}>/dev/null`)}function eh(r){return!(/(?:^|[;&|])\s*<\s/.test(r)||/<<[-]?\s*['"]?[A-Za-z_]/.test(r))}function th(r,e){return`$'${r.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,"\\n")}'${e?" < /dev/null":""}`}function Cl(r){return process.platform!=="win32"?r:r.replace(/^([A-Za-z]):/,(e,t)=>`/${t.toLowerCase()}`).replace(/\\/g,"/")}function Xn(r,e){let t=e?.snapshotFilePath;return{type:"bash",shellPath:r,detached:!0,async buildExecCommand(n,o){let s=process.platform==="win32",i=Xf(),a=s?Cl(i):i,l=o.useSandbox&&o.sandboxTmpDir?Jr.join(o.sandboxTmpDir,`cwd-${o.id}`):Jr.join(a,`qla-${o.id}-cwd`),u=o.useSandbox&&o.sandboxTmpDir?Jr.join(o.sandboxTmpDir,`cwd-${o.id}`):Qf(i,`qla-${o.id}-cwd`),c=Zf(n),d=eh(c),p=th(c,d),m=[];if(t){let f=s?Cl(t):t;m.push(`source '${f}' 2>/dev/null || true`)}return e?.sessionEnvScript&&m.push(e.sessionEnvScript),m.push(`eval ${p}`),m.push(`pwd -P >| '${l}'`),{commandString:m.join(" && "),cwdFilePath:u}},getSpawnArgs(n){return["-c",...!!t?[]:["-l"],n]},async getEnvironmentOverrides(n){return{GIT_EDITOR:"true",QLOGICAGENT:"1"}}}}import{tmpdir as nh}from"node:os";import{join as oh,posix as rh}from"node:path";function Al(r){return Buffer.from(r,"utf16le").toString("base64")}function sh(r){return["-NoProfile","-NonInteractive","-Command",r]}function Yr(r){return{type:"powershell",shellPath:r,detached:!1,async buildExecCommand(e,t){let n=t.useSandbox&&t.sandboxTmpDir?rh.join(t.sandboxTmpDir,`qla-pwd-ps-${t.id}`):oh(nh(),`qla-pwd-ps-${t.id}`),s=["","$_ec = if ($null -ne $LASTEXITCODE) { $LASTEXITCODE } elseif ($?) { 0 } else { 1 }",`(Get-Location).Path | Out-File -FilePath '${n.replace(/'/g,"''")}' -Encoding utf8 -NoNewline`,"exit $_ec"].join(`
154
- ; `),i=e+s;return{commandString:t.useSandbox?[`'${r.replace(/'/g,"'\\''")}'`,"-NoProfile","-NonInteractive","-EncodedCommand",Al(i)].join(" "):i,cwdFilePath:n}},getSpawnArgs(e){return sh(e)},async getEnvironmentOverrides(e){return{QLOGICAGENT:"1"}}}}var ih=[{pattern:/\bgit\s+reset\s+--hard\b/,warning:"Note: may discard uncommitted changes"},{pattern:/\bgit\s+push\b[^;&|\n]*[ \t](--force|--force-with-lease|-f)\b/,warning:"Note: may overwrite remote history"},{pattern:/\bgit\s+clean\b(?![^;&|\n]*(?:-[a-zA-Z]*n|--dry-run))[^;&|\n]*-[a-zA-Z]*f/,warning:"Note: may permanently delete untracked files"},{pattern:/\bgit\s+checkout\s+(--\s+)?\.[ \t]*($|[;&|\n])/,warning:"Note: may discard all working tree changes"},{pattern:/\bgit\s+restore\s+(--\s+)?\.[ \t]*($|[;&|\n])/,warning:"Note: may discard all working tree changes"},{pattern:/\bgit\s+stash[ \t]+(drop|clear)\b/,warning:"Note: may permanently remove stashed changes"},{pattern:/\bgit\s+branch\s+(-D[ \t]|--delete\s+--force|--force\s+--delete)\b/,warning:"Note: may force-delete a branch"},{pattern:/\bgit\s+(commit|push|merge)\b[^;&|\n]*--no-verify\b/,warning:"Note: may skip safety hooks"},{pattern:/\bgit\s+commit\b[^;&|\n]*--amend\b/,warning:"Note: may rewrite the last commit"},{pattern:/(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*[rR][a-zA-Z]*f|(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*f[a-zA-Z]*[rR]/,warning:"Note: may recursively force-remove files"},{pattern:/(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*[rR]/,warning:"Note: may recursively remove files"},{pattern:/(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*f/,warning:"Note: may force-remove files"},{pattern:/\b(DROP|TRUNCATE)\s+(TABLE|DATABASE|SCHEMA)\b/i,warning:"Note: may drop or truncate database objects"},{pattern:/\bDELETE\s+FROM\s+\w+[ \t]*(;|"|'|\n|$)/i,warning:"Note: may delete all rows from a database table"},{pattern:/\bkubectl\s+delete\b/,warning:"Note: may delete Kubernetes resources"},{pattern:/\bterraform\s+destroy\b/,warning:"Note: may destroy Terraform infrastructure"}],ah=[{pattern:/(?:^|[|;&\n({])\s*(Remove-Item|rm|del|rd|rmdir|ri)\b[^|;&\n}]*-Recurse\b[^|;&\n}]*-Force\b/i,warning:"Note: may recursively force-remove files"},{pattern:/(?:^|[|;&\n({])\s*(Remove-Item|rm|del|rd|rmdir|ri)\b[^|;&\n}]*-Force\b[^|;&\n}]*-Recurse\b/i,warning:"Note: may recursively force-remove files"},{pattern:/(?:^|[|;&\n({])\s*(Remove-Item|rm|del|rd|rmdir|ri)\b[^|;&\n}]*-Recurse\b/i,warning:"Note: may recursively remove files"},{pattern:/(?:^|[|;&\n({])\s*(Remove-Item|rm|del|rd|rmdir|ri)\b[^|;&\n}]*-Force\b/i,warning:"Note: may force-remove files"},{pattern:/\bClear-Content\b[^|;&\n]*\*/i,warning:"Note: may clear content of multiple files"},{pattern:/\bFormat-Volume\b/i,warning:"Note: may format a disk volume"},{pattern:/\bClear-Disk\b/i,warning:"Note: may clear a disk"},{pattern:/\bgit\s+reset\s+--hard\b/i,warning:"Note: may discard uncommitted changes"},{pattern:/\bgit\s+push\b[^|;&\n]*\s+(--force|--force-with-lease|-f)\b/i,warning:"Note: may overwrite remote history"},{pattern:/\bgit\s+clean\b(?![^|;&\n]*(?:-[a-zA-Z]*n|--dry-run))[^|;&\n]*-[a-zA-Z]*f/i,warning:"Note: may permanently delete untracked files"},{pattern:/\bgit\s+stash\s+(drop|clear)\b/i,warning:"Note: may permanently remove stashed changes"},{pattern:/\b(DROP|TRUNCATE)\s+(TABLE|DATABASE|SCHEMA)\b/i,warning:"Note: may drop or truncate database objects"},{pattern:/\bStop-Computer\b/i,warning:"Note: will shut down the computer"},{pattern:/\bRestart-Computer\b/i,warning:"Note: will restart the computer"},{pattern:/\bClear-RecycleBin\b/i,warning:"Note: permanently deletes recycled files"}];function Xr(r){for(let{pattern:e,warning:t}of ih)if(e.test(r))return t;return null}function Qr(r){for(let{pattern:e,warning:t}of ah)if(e.test(r))return t;return null}var lh="read",ch={type:"object",properties:{path:{type:"string",description:"Absolute path to the file to read."},offset:{type:"number",description:"Line number to start reading from (1-indexed). Default: 1."},limit:{type:"number",description:"Maximum number of lines to read. Default/max: 2000."}},required:["path"]};function Ml(r){return{name:lh,label:"Read File",description:"Read the contents of a file. Supports text files and images (jpg, png, gif, webp). For text files, output is truncated to 2000 lines or 50KB. Binary files are rejected with a hint. Use offset/limit for pagination of large files.",parameters:ch,execute:async(n,o)=>{let s=r.resolvePath(o.path);if(r.validatePath){let f=r.validatePath(s);if(f)return{content:[{type:"text",text:`Access denied: ${f}`}],details:{type:"read",path:s,error:"access_denied"}}}let i=await r.readFile(s);if(i.type==="image")return{content:[{type:"image",data:i.base64,mimeType:i.mimeType}],details:{type:"read",path:s,isImage:!0}};if(i.type==="binary")return{content:[{type:"text",text:`Cannot read binary file (${i.mimeType}). Use a specific tool for this file type (e.g. pdf tool for PDFs).`}],details:{type:"read",path:s,error:"binary_file",mimeType:i.mimeType}};let a=i.text.split(`
155
- `),l=Math.max(0,(o.offset??1)-1),u=Math.min(o.limit??2e3,2e3),c=a.slice(l,l+u),d=c.join(`
156
- `);d.length>5e4&&(d=d.slice(0,5e4)+`
157
- ... (truncated)`);let p=a.length,m=l+c.length,g=m<p;return{content:[{type:"text",text:d}],details:{type:"read",path:s,totalLines:p,startLine:l+1,endLine:m,hasMore:g}}}}}var uh="write",dh={type:"object",properties:{path:{type:"string",description:"Absolute path to the file to write."},content:{type:"string",description:"Content to write to the file."}},required:["path","content"]},Pl=5e5;function Il(r){return{name:uh,label:"Write File",description:"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories. Prefer edit/patch for modifying existing files (safer than full overwrite).",parameters:dh,execute:async(e,t)=>{let n=r.resolvePath(t.path);if(r.validatePath){let s=r.validatePath(n);if(s)return{content:[{type:"text",text:`Access denied: ${s}`}],details:{type:"write",path:n,error:"access_denied"}}}if(t.content.length>Pl)return{content:[{type:"text",text:`Content too large (${t.content.length} chars, max ${Pl}). Split into multiple writes or use a different approach.`}],details:{type:"write",path:n,error:"content_too_large"}};if(r.checkReadBeforeWrite){let s=r.checkReadBeforeWrite(n);if(s)return{content:[{type:"text",text:s}],details:{type:"write",path:n,error:"not_read_first"}}}if(r.checkConcurrentModification){let s=r.checkConcurrentModification(n);if(s)return{content:[{type:"text",text:`Concurrent modification detected: ${s}. Re-read the file first.`}],details:{type:"write",path:n,error:"concurrent_modification"}}}await r.writeFile(n,t.content);let o=t.content.split(`
158
- `).length;return{content:[{type:"text",text:`Wrote ${o} lines to ${n}`}],details:{type:"write",path:n,lineCount:o}}}}}var ph="edit",mh={type:"object",properties:{path:{type:"string",description:"Path to the file to edit (relative or absolute)."},oldText:{type:"string",description:"Exact text to find and replace (must match exactly, including whitespace)."},newText:{type:"string",description:"New text to replace the old text with."}},required:["path","oldText","newText"]};function El(r){return{name:ph,label:"Edit File",description:"Edit a file by replacing exact text. The oldText must match exactly (including whitespace). Use this for precise, surgical edits. For multiple edits, call this tool multiple times.",parameters:mh,execute:async(e,t)=>{let n=r.resolvePath(t.path);if(r.checkConcurrentModification){let c=r.checkConcurrentModification(n);if(c)return{content:[{type:"text",text:`Concurrent modification detected: ${c}. Re-read the file first.`}],details:{type:"edit",path:n,success:!1,reason:"concurrent_modification"}}}let o=await r.readFile(n),s=o.indexOf(t.oldText);if(s===-1)return{content:[{type:"text",text:`Error: oldText not found in ${n}. Ensure it matches exactly.`}],details:{type:"edit",path:n,success:!1,reason:"not_found"}};if(o.indexOf(t.oldText,s+1)!==-1)return{content:[{type:"text",text:`Error: oldText matches multiple locations in ${n}. Include more context to make the match unique.`}],details:{type:"edit",path:n,success:!1,reason:"ambiguous"}};let a=o.slice(0,s)+t.newText+o.slice(s+t.oldText.length);await r.writeFile(n,a);let u=o.slice(0,s).split(`
159
- `).length;return{content:[{type:"text",text:`Edited ${n} (line ${u})`}],details:{type:"edit",path:n,success:!0,firstChangedLine:u}}}}}var gh="search",fh={type:"object",properties:{mode:{type:"string",enum:["filename","content","both"],description:'Search mode: "filename" to find files by name pattern (glob), "content" to search within file contents (regex), "both" to match both filename patterns and content simultaneously.'},pattern:{type:"string",description:"The pattern to search for. In filename mode this is a glob pattern (e.g. **/*.ts). In content mode this is a regular expression. In both mode this is treated as a regex for content, and fileGlob filters the filename set."},path:{type:"string",description:"Directory to search in. Defaults to workdir/cwd if omitted."},fileGlob:{type:"string",description:'Glob pattern to filter files (e.g. "*.ts", "*.{js,tsx}"). In content/both modes, only files matching this glob are searched.'},contextLines:{type:"number",description:"Number of context lines to show before and after each match (content/both modes only). Default: 0."},caseInsensitive:{type:"boolean",description:"Case insensitive search (content/both modes). Default: false."},headLimit:{type:"number",description:"Maximum number of result entries to return. Default 100 for filename, 250 for content. Pass 0 for unlimited (use sparingly)."},offset:{type:"number",description:"Skip first N results before applying headLimit. Default: 0."}},required:["mode","pattern"]},Ol=100,Ll=250,Zr=1e5;function $l(r){return{name:gh,label:"Search",description:"Search for files by name, search within file contents by regex, or both. In filename mode, pattern is a glob. In content mode, pattern is a regex. Results are paginated via headLimit + offset.",parameters:fh,execute:async(e,t)=>{let n=t.path?r.resolvePath?r.resolvePath(t.path):t.path:"",o=t.mode;return o==="filename"?hh(r,t,n):o==="content"?yh(r,t,n):bh(r,t,n)}}}async function hh(r,e,t){let n=e.headLimit??Ol,{files:o,truncated:s}=await r.glob(e.pattern,{cwd:t,limit:n===0?1e4:n}),i=e.offset??0,a=i>0?o.slice(i):o,l=n===0?a.length:n,u=a.slice(0,l),c=s||a.length>l;if(u.length===0)return{content:[{type:"text",text:"No files found matching pattern."}],details:{mode:"filename",totalMatches:0,truncated:!1}};let d=u.join(`
160
- `);return c&&(d+=`
152
+ ${r.slice(-t)}`}function oh(r){return r==null||r<=0?th:Math.min(r,nh)}async function*rh(r){let{command:e,abortController:t,timeout:n,shouldAutoBackground:o,cwd:s}=r,i="",a=0,c=0,d=Date.now(),l=null;function u(){return new Promise(g=>{l=()=>g(null)})}let p=await no(e,t.signal,void 0,{timeout:n,onProgress(g,f,b,w,T){i=f,a=b,c=w,l&&(l(),l=null)},shouldAutoBackground:o,cwd:s});for(p.onTimeout&&o&&p.onTimeout(g=>{let f=Be("bg");g(f)});p.status==="running"&&await Promise.race([u(),p.result])===null;)yield{type:"exec_progress",output:i.slice(-4096),fullOutput:i,elapsedTimeSeconds:(Date.now()-d)/1e3,totalLines:a,totalBytes:c};let m=await p.result;return p.cleanup(),m}function El(r={}){return{name:Zf,label:"Execute Command",description:"Execute a shell command. Supports foreground (blocking, returns output) and background (non-blocking, returns task ID) modes. On Windows uses PowerShell, on Unix uses bash. Commands are classified for safety: search/read commands may run in parallel; silent commands (mv, cp, rm) show 'Done' instead of empty output. Output is truncated and persisted if too long.",searchHint:"execute shell commands",parameters:eh,maxResultSizeChars:oo,execute:async(e,t)=>{let n=Wr(t.command);if(!t.background){let p=Hr(t.command);if(p)return{content:[{type:"text",text:`Command blocked: ${p}`}],details:{type:"exec",error:"blocked_sleep_pattern",classification:n}}}if(r.validateCommand){let p=await r.validateCommand(t.command);if(p)return{content:[{type:"text",text:`Command blocked: ${p}`}],details:{type:"exec",error:"blocked_by_guard",reason:p,classification:n}}}let o=new AbortController,s=oh(t.timeout),i=t.workdir?Xf(t.workdir)?t.workdir:Qf(eo(),t.workdir):void 0;if(t.background){let p=await no(t.command,o.signal,void 0,{shouldAutoBackground:!1,cwd:i}),m=Be("bg");if(p.background(m))return{content:[{type:"text",text:`Background task started (id: ${m}).
153
+ Use getOutput to check on it later.`}],details:{type:"exec_background",backgroundTaskId:m,description:t.description,classification:n}}}let a=rh({command:t.command,abortController:o,timeout:s,shouldAutoBackground:!0,cwd:i}),c;do c=await a.next(),!c.done&&r.onProgress&&r.onProgress(c.value);while(!c.done);let d=c.value,l=[];if(d.backgroundTaskId)return{content:[{type:"text",text:`Command auto-backgrounded (task: ${d.backgroundTaskId}).`}],details:{type:"exec_background",backgroundTaskId:d.backgroundTaskId,assistantAutoBackgrounded:d.assistantAutoBackgrounded,classification:n}};d.outputFilePath?(l.push(ns(d.stdout,oo)),l.push(`[full output: ${d.outputFilePath} (${d.outputFileSize} bytes)]`)):d.stdout&&l.push(ns(d.stdout,oo)),d.stderr&&l.push(`[stderr]
154
+ ${ns(d.stderr,Math.floor(oo/4))}`),d.interrupted&&l.push(`[interrupted \u2014 exit code ${d.code}]`);let u;return d.code!==0&&r.interpretExitCode&&(u=r.interpretExitCode(d.code,d.stderr),u&&l.push(`[exit ${d.code}: ${u}]`)),l.length===0&&l.push(n.isSilent&&d.code===0?"Done":`(exit code ${d.code}, no output)`),{content:[{type:"text",text:l.join(`
155
+ `)}],details:{type:"exec",exitCode:d.code,interrupted:d.interrupted,description:t.description,returnCodeInterpretation:u,noOutputExpected:n.isSilent,outputFilePath:d.outputFilePath,classification:n}}}}}import{tmpdir as sh}from"node:os";import{join as ih,posix as os}from"node:path";function ah(r){return r.replace(/(\d?)>nul\b/gi,(e,t)=>`${t||""}>/dev/null`)}function lh(r){return!(/(?:^|[;&|])\s*<\s/.test(r)||/<<[-]?\s*['"]?[A-Za-z_]/.test(r))}function ch(r,e){return`$'${r.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,"\\n")}'${e?" < /dev/null":""}`}function Ol(r){return process.platform!=="win32"?r:r.replace(/^([A-Za-z]):/,(e,t)=>`/${t.toLowerCase()}`).replace(/\\/g,"/")}function ro(r,e){let t=e?.snapshotFilePath;return{type:"bash",shellPath:r,detached:!0,async buildExecCommand(n,o){let s=process.platform==="win32",i=sh(),a=s?Ol(i):i,c=o.useSandbox&&o.sandboxTmpDir?os.join(o.sandboxTmpDir,`cwd-${o.id}`):os.join(a,`qla-${o.id}-cwd`),d=o.useSandbox&&o.sandboxTmpDir?os.join(o.sandboxTmpDir,`cwd-${o.id}`):ih(i,`qla-${o.id}-cwd`),l=ah(n),u=lh(l),p=ch(l,u),m=[];if(t){let f=s?Ol(t):t;m.push(`source '${f}' 2>/dev/null || true`)}return e?.sessionEnvScript&&m.push(e.sessionEnvScript),m.push(`eval ${p}`),m.push(`pwd -P >| '${c}'`),{commandString:m.join(" && "),cwdFilePath:d}},getSpawnArgs(n){return["-c",...!!t?[]:["-l"],n]},async getEnvironmentOverrides(n){return{GIT_EDITOR:"true",QLOGICAGENT:"1"}}}}import{tmpdir as dh}from"node:os";import{join as uh,posix as ph}from"node:path";function Ll(r){return Buffer.from(r,"utf16le").toString("base64")}function mh(r){return["-NoProfile","-NonInteractive","-Command",r]}function rs(r){return{type:"powershell",shellPath:r,detached:!1,async buildExecCommand(e,t){let n=t.useSandbox&&t.sandboxTmpDir?ph.join(t.sandboxTmpDir,`qla-pwd-ps-${t.id}`):uh(dh(),`qla-pwd-ps-${t.id}`),s=["","$_ec = if ($null -ne $LASTEXITCODE) { $LASTEXITCODE } elseif ($?) { 0 } else { 1 }",`(Get-Location).Path | Out-File -FilePath '${n.replace(/'/g,"''")}' -Encoding utf8 -NoNewline`,"exit $_ec"].join(`
156
+ ; `),i=e+s;return{commandString:t.useSandbox?[`'${r.replace(/'/g,"'\\''")}'`,"-NoProfile","-NonInteractive","-EncodedCommand",Ll(i)].join(" "):i,cwdFilePath:n}},getSpawnArgs(e){return mh(e)},async getEnvironmentOverrides(e){return{QLOGICAGENT:"1"}}}}var gh=[{pattern:/\bgit\s+reset\s+--hard\b/,warning:"Note: may discard uncommitted changes"},{pattern:/\bgit\s+push\b[^;&|\n]*[ \t](--force|--force-with-lease|-f)\b/,warning:"Note: may overwrite remote history"},{pattern:/\bgit\s+clean\b(?![^;&|\n]*(?:-[a-zA-Z]*n|--dry-run))[^;&|\n]*-[a-zA-Z]*f/,warning:"Note: may permanently delete untracked files"},{pattern:/\bgit\s+checkout\s+(--\s+)?\.[ \t]*($|[;&|\n])/,warning:"Note: may discard all working tree changes"},{pattern:/\bgit\s+restore\s+(--\s+)?\.[ \t]*($|[;&|\n])/,warning:"Note: may discard all working tree changes"},{pattern:/\bgit\s+stash[ \t]+(drop|clear)\b/,warning:"Note: may permanently remove stashed changes"},{pattern:/\bgit\s+branch\s+(-D[ \t]|--delete\s+--force|--force\s+--delete)\b/,warning:"Note: may force-delete a branch"},{pattern:/\bgit\s+(commit|push|merge)\b[^;&|\n]*--no-verify\b/,warning:"Note: may skip safety hooks"},{pattern:/\bgit\s+commit\b[^;&|\n]*--amend\b/,warning:"Note: may rewrite the last commit"},{pattern:/(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*[rR][a-zA-Z]*f|(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*f[a-zA-Z]*[rR]/,warning:"Note: may recursively force-remove files"},{pattern:/(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*[rR]/,warning:"Note: may recursively remove files"},{pattern:/(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*f/,warning:"Note: may force-remove files"},{pattern:/\b(DROP|TRUNCATE)\s+(TABLE|DATABASE|SCHEMA)\b/i,warning:"Note: may drop or truncate database objects"},{pattern:/\bDELETE\s+FROM\s+\w+[ \t]*(;|"|'|\n|$)/i,warning:"Note: may delete all rows from a database table"},{pattern:/\bkubectl\s+delete\b/,warning:"Note: may delete Kubernetes resources"},{pattern:/\bterraform\s+destroy\b/,warning:"Note: may destroy Terraform infrastructure"}],fh=[{pattern:/(?:^|[|;&\n({])\s*(Remove-Item|rm|del|rd|rmdir|ri)\b[^|;&\n}]*-Recurse\b[^|;&\n}]*-Force\b/i,warning:"Note: may recursively force-remove files"},{pattern:/(?:^|[|;&\n({])\s*(Remove-Item|rm|del|rd|rmdir|ri)\b[^|;&\n}]*-Force\b[^|;&\n}]*-Recurse\b/i,warning:"Note: may recursively force-remove files"},{pattern:/(?:^|[|;&\n({])\s*(Remove-Item|rm|del|rd|rmdir|ri)\b[^|;&\n}]*-Recurse\b/i,warning:"Note: may recursively remove files"},{pattern:/(?:^|[|;&\n({])\s*(Remove-Item|rm|del|rd|rmdir|ri)\b[^|;&\n}]*-Force\b/i,warning:"Note: may force-remove files"},{pattern:/\bClear-Content\b[^|;&\n]*\*/i,warning:"Note: may clear content of multiple files"},{pattern:/\bFormat-Volume\b/i,warning:"Note: may format a disk volume"},{pattern:/\bClear-Disk\b/i,warning:"Note: may clear a disk"},{pattern:/\bgit\s+reset\s+--hard\b/i,warning:"Note: may discard uncommitted changes"},{pattern:/\bgit\s+push\b[^|;&\n]*\s+(--force|--force-with-lease|-f)\b/i,warning:"Note: may overwrite remote history"},{pattern:/\bgit\s+clean\b(?![^|;&\n]*(?:-[a-zA-Z]*n|--dry-run))[^|;&\n]*-[a-zA-Z]*f/i,warning:"Note: may permanently delete untracked files"},{pattern:/\bgit\s+stash\s+(drop|clear)\b/i,warning:"Note: may permanently remove stashed changes"},{pattern:/\b(DROP|TRUNCATE)\s+(TABLE|DATABASE|SCHEMA)\b/i,warning:"Note: may drop or truncate database objects"},{pattern:/\bStop-Computer\b/i,warning:"Note: will shut down the computer"},{pattern:/\bRestart-Computer\b/i,warning:"Note: will restart the computer"},{pattern:/\bClear-RecycleBin\b/i,warning:"Note: permanently deletes recycled files"}];function ss(r){for(let{pattern:e,warning:t}of gh)if(e.test(r))return t;return null}function is(r){for(let{pattern:e,warning:t}of fh)if(e.test(r))return t;return null}var hh="read",yh={type:"object",properties:{path:{type:"string",description:"Absolute path to the file to read."},offset:{type:"number",description:"Line number to start reading from (1-indexed). Default: 1."},limit:{type:"number",description:"Maximum number of lines to read. Default/max: 2000."}},required:["path"]};function Dl(r){return{name:hh,label:"Read File",description:"Read the contents of a file. Supports text files and images (jpg, png, gif, webp). For text files, output is truncated to 2000 lines or 50KB. Binary files are rejected with a hint. Use offset/limit for pagination of large files.",parameters:yh,execute:async(n,o)=>{let s=r.resolvePath(o.path);if(r.validatePath){let f=r.validatePath(s);if(f)return{content:[{type:"text",text:`Access denied: ${f}`}],details:{type:"read",path:s,error:"access_denied"}}}let i=await r.readFile(s);if(i.type==="image")return{content:[{type:"image",data:i.base64,mimeType:i.mimeType}],details:{type:"read",path:s,isImage:!0}};if(i.type==="binary")return{content:[{type:"text",text:`Cannot read binary file (${i.mimeType}). Use a specific tool for this file type (e.g. pdf tool for PDFs).`}],details:{type:"read",path:s,error:"binary_file",mimeType:i.mimeType}};let a=i.text.split(`
157
+ `),c=Math.max(0,(o.offset??1)-1),d=Math.min(o.limit??2e3,2e3),l=a.slice(c,c+d),u=l.join(`
158
+ `);u.length>5e4&&(u=u.slice(0,5e4)+`
159
+ ... (truncated)`);let p=a.length,m=c+l.length,g=m<p;return{content:[{type:"text",text:u}],details:{type:"read",path:s,totalLines:p,startLine:c+1,endLine:m,hasMore:g}}}}}var bh="write",kh={type:"object",properties:{path:{type:"string",description:"Absolute path to the file to write."},content:{type:"string",description:"Content to write to the file."}},required:["path","content"]},$l=5e5;function Nl(r){return{name:bh,label:"Write File",description:"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories. Prefer edit/patch for modifying existing files (safer than full overwrite).",parameters:kh,execute:async(e,t)=>{let n=r.resolvePath(t.path);if(r.validatePath){let s=r.validatePath(n);if(s)return{content:[{type:"text",text:`Access denied: ${s}`}],details:{type:"write",path:n,error:"access_denied"}}}if(t.content.length>$l)return{content:[{type:"text",text:`Content too large (${t.content.length} chars, max ${$l}). Split into multiple writes or use a different approach.`}],details:{type:"write",path:n,error:"content_too_large"}};if(r.checkReadBeforeWrite){let s=r.checkReadBeforeWrite(n);if(s)return{content:[{type:"text",text:s}],details:{type:"write",path:n,error:"not_read_first"}}}if(r.checkConcurrentModification){let s=r.checkConcurrentModification(n);if(s)return{content:[{type:"text",text:`Concurrent modification detected: ${s}. Re-read the file first.`}],details:{type:"write",path:n,error:"concurrent_modification"}}}await r.writeFile(n,t.content);let o=t.content.split(`
160
+ `).length;return{content:[{type:"text",text:`Wrote ${o} lines to ${n}`}],details:{type:"write",path:n,lineCount:o}}}}}var Th="edit",wh={type:"object",properties:{path:{type:"string",description:"Path to the file to edit (relative or absolute)."},oldText:{type:"string",description:"Exact text to find and replace (must match exactly, including whitespace)."},newText:{type:"string",description:"New text to replace the old text with."}},required:["path","oldText","newText"]};function Ul(r){return{name:Th,label:"Edit File",description:"Edit a file by replacing exact text. The oldText must match exactly (including whitespace). Use this for precise, surgical edits. For multiple edits, call this tool multiple times.",parameters:wh,execute:async(e,t)=>{let n=r.resolvePath(t.path);if(r.checkConcurrentModification){let l=r.checkConcurrentModification(n);if(l)return{content:[{type:"text",text:`Concurrent modification detected: ${l}. Re-read the file first.`}],details:{type:"edit",path:n,success:!1,reason:"concurrent_modification"}}}let o=await r.readFile(n),s=o.indexOf(t.oldText);if(s===-1)return{content:[{type:"text",text:`Error: oldText not found in ${n}. Ensure it matches exactly.`}],details:{type:"edit",path:n,success:!1,reason:"not_found"}};if(o.indexOf(t.oldText,s+1)!==-1)return{content:[{type:"text",text:`Error: oldText matches multiple locations in ${n}. Include more context to make the match unique.`}],details:{type:"edit",path:n,success:!1,reason:"ambiguous"}};let a=o.slice(0,s)+t.newText+o.slice(s+t.oldText.length);await r.writeFile(n,a);let d=o.slice(0,s).split(`
161
+ `).length;return{content:[{type:"text",text:`Edited ${n} (line ${d})`}],details:{type:"edit",path:n,success:!0,firstChangedLine:d}}}}}var vh="search",xh={type:"object",properties:{mode:{type:"string",enum:["filename","content","both"],description:'Search mode: "filename" to find files by name pattern (glob), "content" to search within file contents (regex), "both" to match both filename patterns and content simultaneously.'},pattern:{type:"string",description:"The pattern to search for. In filename mode this is a glob pattern (e.g. **/*.ts). In content mode this is a regular expression. In both mode this is treated as a regex for content, and fileGlob filters the filename set."},path:{type:"string",description:"Directory to search in. Defaults to workdir/cwd if omitted."},fileGlob:{type:"string",description:'Glob pattern to filter files (e.g. "*.ts", "*.{js,tsx}"). In content/both modes, only files matching this glob are searched.'},contextLines:{type:"number",description:"Number of context lines to show before and after each match (content/both modes only). Default: 0."},caseInsensitive:{type:"boolean",description:"Case insensitive search (content/both modes). Default: false."},headLimit:{type:"number",description:"Maximum number of result entries to return. Default 100 for filename, 250 for content. Pass 0 for unlimited (use sparingly)."},offset:{type:"number",description:"Skip first N results before applying headLimit. Default: 0."}},required:["mode","pattern"]},jl=100,Fl=250,as=1e5;function Bl(r){return{name:vh,label:"Search",description:"Search for files by name, search within file contents by regex, or both. In filename mode, pattern is a glob. In content mode, pattern is a regex. Results are paginated via headLimit + offset.",parameters:xh,execute:async(e,t)=>{let n=t.path?r.resolvePath?r.resolvePath(t.path):t.path:"",o=t.mode;return o==="filename"?Sh(r,t,n):o==="content"?_h(r,t,n):Rh(r,t,n)}}}async function Sh(r,e,t){let n=e.headLimit??jl,{files:o,truncated:s}=await r.glob(e.pattern,{cwd:t,limit:n===0?1e4:n}),i=e.offset??0,a=i>0?o.slice(i):o,c=n===0?a.length:n,d=a.slice(0,c),l=s||a.length>c;if(d.length===0)return{content:[{type:"text",text:"No files found matching pattern."}],details:{mode:"filename",totalMatches:0,truncated:!1}};let u=d.join(`
162
+ `);return l&&(u+=`
161
163
 
162
- (Results truncated. ${u.length} shown. Use a more specific pattern or increase headLimit.)`),d=es(d,Zr),{content:[{type:"text",text:d}],details:{mode:"filename",totalMatches:u.length,truncated:c}}}async function yh(r,e,t){let n=e.headLimit??Ll,{matches:o,truncated:s}=await r.grep(e.pattern,{cwd:t,fileGlob:e.fileGlob,caseInsensitive:e.caseInsensitive,contextLines:e.contextLines,headLimit:n===0?void 0:n,offset:e.offset});if(o.length===0)return{content:[{type:"text",text:"No matches found."}],details:{mode:"content",totalMatches:0,truncated:!1}};let i=[];for(let l of o){if(l.contextBefore&&l.contextBefore.length>0)for(let u of l.contextBefore)i.push(` ${u}`);if(i.push(`${l.path}:${l.line}: ${l.text}`),l.contextAfter&&l.contextAfter.length>0)for(let u of l.contextAfter)i.push(` ${u}`);e.contextLines&&e.contextLines>0&&i.push("--")}let a=i.join(`
164
+ (Results truncated. ${d.length} shown. Use a more specific pattern or increase headLimit.)`),u=ls(u,as),{content:[{type:"text",text:u}],details:{mode:"filename",totalMatches:d.length,truncated:l}}}async function _h(r,e,t){let n=e.headLimit??Fl,{matches:o,truncated:s}=await r.grep(e.pattern,{cwd:t,fileGlob:e.fileGlob,caseInsensitive:e.caseInsensitive,contextLines:e.contextLines,headLimit:n===0?void 0:n,offset:e.offset});if(o.length===0)return{content:[{type:"text",text:"No matches found."}],details:{mode:"content",totalMatches:0,truncated:!1}};let i=[];for(let c of o){if(c.contextBefore&&c.contextBefore.length>0)for(let d of c.contextBefore)i.push(` ${d}`);if(i.push(`${c.path}:${c.line}: ${c.text}`),c.contextAfter&&c.contextAfter.length>0)for(let d of c.contextAfter)i.push(` ${d}`);e.contextLines&&e.contextLines>0&&i.push("--")}let a=i.join(`
163
165
  `);return s&&(a+=`
164
166
 
165
- (Results truncated at ${o.length} matches. Use offset/headLimit for pagination.)`),a=es(a,Zr),{content:[{type:"text",text:a}],details:{mode:"content",totalMatches:o.length,truncated:s}}}async function bh(r,e,t){let[n,o]=await Promise.all([e.fileGlob?r.glob(e.fileGlob,{cwd:t,limit:Ol}):Promise.resolve({files:[],truncated:!1}),r.grep(e.pattern,{cwd:t,fileGlob:e.fileGlob,caseInsensitive:e.caseInsensitive,contextLines:e.contextLines,headLimit:e.headLimit??Ll,offset:e.offset})]),s=new Set(o.matches.map(c=>c.path)),i=n.files.filter(c=>!s.has(c)),a=[];if(i.length>0&&a.push(`## Files matching glob (${i.length}):
167
+ (Results truncated at ${o.length} matches. Use offset/headLimit for pagination.)`),a=ls(a,as),{content:[{type:"text",text:a}],details:{mode:"content",totalMatches:o.length,truncated:s}}}async function Rh(r,e,t){let[n,o]=await Promise.all([e.fileGlob?r.glob(e.fileGlob,{cwd:t,limit:jl}):Promise.resolve({files:[],truncated:!1}),r.grep(e.pattern,{cwd:t,fileGlob:e.fileGlob,caseInsensitive:e.caseInsensitive,contextLines:e.contextLines,headLimit:e.headLimit??Fl,offset:e.offset})]),s=new Set(o.matches.map(l=>l.path)),i=n.files.filter(l=>!s.has(l)),a=[];if(i.length>0&&a.push(`## Files matching glob (${i.length}):
166
168
  ${i.join(`
167
- `)}`),o.matches.length>0){let c=[];for(let d of o.matches)c.push(`${d.path}:${d.line}: ${d.text}`);a.push(`## Content matches (${o.matches.length}):
168
- ${c.join(`
169
- `)}`)}if(a.length===0)return{content:[{type:"text",text:"No matches found in either filename or content."}],details:{mode:"both",totalMatches:0,truncated:!1}};let l=n.truncated||o.truncated,u=a.join(`
169
+ `)}`),o.matches.length>0){let l=[];for(let u of o.matches)l.push(`${u.path}:${u.line}: ${u.text}`);a.push(`## Content matches (${o.matches.length}):
170
+ ${l.join(`
171
+ `)}`)}if(a.length===0)return{content:[{type:"text",text:"No matches found in either filename or content."}],details:{mode:"both",totalMatches:0,truncated:!1}};let c=n.truncated||o.truncated,d=a.join(`
170
172
 
171
- `);return l&&(u+=`
173
+ `);return c&&(d+=`
172
174
 
173
- (Some results truncated. Use more specific patterns.)`),u=es(u,Zr),{content:[{type:"text",text:u}],details:{mode:"both",totalMatches:i.length+o.matches.length,truncated:l}}}function es(r,e){if(r.length<=e)return r;let t=Math.floor(e/2)-50;return`${r.slice(0,t)}
175
+ (Some results truncated. Use more specific patterns.)`),d=ls(d,as),{content:[{type:"text",text:d}],details:{mode:"both",totalMatches:i.length+o.matches.length,truncated:c}}}function ls(r,e){if(r.length<=e)return r;let t=Math.floor(e/2)-50;return`${r.slice(0,t)}
174
176
 
175
177
  ... [truncated ${r.length-e} chars] ...
176
178
 
177
- ${r.slice(-t)}`}var kh="apply_patch",Th={type:"object",properties:{input:{type:"string",description:"Patch content using the *** Begin Patch / *** End Patch format."}},required:["input"]};function wh(r){let e=r.split(`
178
- `),t=[],n=null,o=null,s=!1;for(let i of e){if(i.startsWith("*** Begin Patch")){s=!0;continue}if(i.startsWith("*** End Patch"))break;if(s){if(i.startsWith("*** Add File: "))n&&t.push(n),n={type:"add",path:i.slice(14).trim(),hunks:[]},o={contextBefore:[],removals:[],additions:[],contextAfter:[]},n.hunks.push(o);else if(i.startsWith("*** Update File: "))n&&t.push(n),n={type:"update",path:i.slice(17).trim(),hunks:[]},o=null;else if(i.startsWith("*** Delete File: "))n&&t.push(n),n={type:"delete",path:i.slice(17).trim(),hunks:[]},o=null;else if(i.startsWith("*** Move to: ")&&n)n.moveTo=i.slice(13).trim();else if(i.startsWith("@@ ")&&n)o={contextBefore:[],removals:[],additions:[],contextAfter:[]},n.hunks.push(o);else if(o)if(i.startsWith("+"))o.additions.push(i.slice(1));else if(i.startsWith("-"))o.removals.push(i.slice(1));else{let a=i.startsWith(" ")?i.slice(1):i;o.additions.length===0&&o.removals.length===0?o.contextBefore.push(a):o.contextAfter.push(a)}}}return n&&t.push(n),t}function vh(r,e){let n=[...r.split(`
179
- `)];for(let o of e){let s=-1;if(o.contextBefore.length>0)for(let i=0;i<=n.length-o.contextBefore.length;i++){let a=!0;for(let l=0;l<o.contextBefore.length;l++)if(n[i+l]!==o.contextBefore[l]){a=!1;break}if(a){s=i+o.contextBefore.length;break}}else s=0;s!==-1&&(o.removals.length>0?n.splice(s,o.removals.length,...o.additions):n.splice(s,0,...o.additions))}return n.join(`
180
- `)}function Dl(r){return{name:kh,label:"Apply Patch",description:"Apply a patch to one or more files using the *** Begin Patch / *** End Patch format. Supports Add File, Update File, Delete File, and Move To operations.",parameters:Th,execute:async(e,t)=>{let n=wh(t.input);if(n.length===0)return{content:[{type:"text",text:"Error: No valid patch operations found. Ensure *** Begin Patch / *** End Patch markers are present."}]};let o={added:[],modified:[],deleted:[]},s=[];for(let a of n){let l=r.resolvePath(a.path);try{switch(a.type){case"add":{let u=a.hunks.flatMap(c=>[...c.additions]).join(`
181
- `);await r.writeFile(l,u),o.added.push(a.path);break}case"update":{let u=await r.readFile(l),c=vh(u,a.hunks);if(a.moveTo){let d=r.resolvePath(a.moveTo);await r.writeFile(d,c),await r.deleteFile(l),o.modified.push(`${a.path} \u2192 ${a.moveTo}`)}else await r.writeFile(l,c),o.modified.push(a.path);break}case"delete":{await r.deleteFile(l),o.deleted.push(a.path);break}}}catch(u){s.push(`${a.type} ${a.path}: ${u instanceof Error?u.message:String(u)}`)}}let i=[];return o.added.length&&i.push(`Added: ${o.added.join(", ")}`),o.modified.length&&i.push(`Modified: ${o.modified.join(", ")}`),o.deleted.length&&i.push(`Deleted: ${o.deleted.join(", ")}`),s.length&&i.push(`Errors: ${s.join("; ")}`),{content:[{type:"text",text:i.join(`
182
- `)||"No changes applied."}],details:{type:"apply_patch",summary:o,errors:s}}}}}var xh="patch",Sh={type:"object",properties:{input:{type:"string",description:`Patch content. Supports two formats:
179
+ ${r.slice(-t)}`}var Ch="apply_patch",Ah={type:"object",properties:{input:{type:"string",description:"Patch content using the *** Begin Patch / *** End Patch format."}},required:["input"]};function Ph(r){let e=r.split(`
180
+ `),t=[],n=null,o=null,s=!1;for(let i of e){if(i.startsWith("*** Begin Patch")){s=!0;continue}if(i.startsWith("*** End Patch"))break;if(s){if(i.startsWith("*** Add File: "))n&&t.push(n),n={type:"add",path:i.slice(14).trim(),hunks:[]},o={contextBefore:[],removals:[],additions:[],contextAfter:[]},n.hunks.push(o);else if(i.startsWith("*** Update File: "))n&&t.push(n),n={type:"update",path:i.slice(17).trim(),hunks:[]},o=null;else if(i.startsWith("*** Delete File: "))n&&t.push(n),n={type:"delete",path:i.slice(17).trim(),hunks:[]},o=null;else if(i.startsWith("*** Move to: ")&&n)n.moveTo=i.slice(13).trim();else if(i.startsWith("@@ ")&&n)o={contextBefore:[],removals:[],additions:[],contextAfter:[]},n.hunks.push(o);else if(o)if(i.startsWith("+"))o.additions.push(i.slice(1));else if(i.startsWith("-"))o.removals.push(i.slice(1));else{let a=i.startsWith(" ")?i.slice(1):i;o.additions.length===0&&o.removals.length===0?o.contextBefore.push(a):o.contextAfter.push(a)}}}return n&&t.push(n),t}function Mh(r,e){let n=[...r.split(`
181
+ `)];for(let o of e){let s=-1;if(o.contextBefore.length>0)for(let i=0;i<=n.length-o.contextBefore.length;i++){let a=!0;for(let c=0;c<o.contextBefore.length;c++)if(n[i+c]!==o.contextBefore[c]){a=!1;break}if(a){s=i+o.contextBefore.length;break}}else s=0;s!==-1&&(o.removals.length>0?n.splice(s,o.removals.length,...o.additions):n.splice(s,0,...o.additions))}return n.join(`
182
+ `)}function Gl(r){return{name:Ch,label:"Apply Patch",description:"Apply a patch to one or more files using the *** Begin Patch / *** End Patch format. Supports Add File, Update File, Delete File, and Move To operations.",parameters:Ah,execute:async(e,t)=>{let n=Ph(t.input);if(n.length===0)return{content:[{type:"text",text:"Error: No valid patch operations found. Ensure *** Begin Patch / *** End Patch markers are present."}]};let o={added:[],modified:[],deleted:[]},s=[];for(let a of n){let c=r.resolvePath(a.path);try{switch(a.type){case"add":{let d=a.hunks.flatMap(l=>[...l.additions]).join(`
183
+ `);await r.writeFile(c,d),o.added.push(a.path);break}case"update":{let d=await r.readFile(c),l=Mh(d,a.hunks);if(a.moveTo){let u=r.resolvePath(a.moveTo);await r.writeFile(u,l),await r.deleteFile(c),o.modified.push(`${a.path} \u2192 ${a.moveTo}`)}else await r.writeFile(c,l),o.modified.push(a.path);break}case"delete":{await r.deleteFile(c),o.deleted.push(a.path);break}}}catch(d){s.push(`${a.type} ${a.path}: ${d instanceof Error?d.message:String(d)}`)}}let i=[];return o.added.length&&i.push(`Added: ${o.added.join(", ")}`),o.modified.length&&i.push(`Modified: ${o.modified.join(", ")}`),o.deleted.length&&i.push(`Deleted: ${o.deleted.join(", ")}`),s.length&&i.push(`Errors: ${s.join("; ")}`),{content:[{type:"text",text:i.join(`
184
+ `)||"No changes applied."}],details:{type:"apply_patch",summary:o,errors:s}}}}}var Ih="patch",Eh={type:"object",properties:{input:{type:"string",description:`Patch content. Supports two formats:
183
185
  1) V4A unified diff (*** Begin Patch / *** End Patch markers)
184
186
  2) Simple find-replace: first line is file path, then <<<< SEARCH / ==== / >>>> REPLACE blocks.
185
- Fuzzy matching automatically handles whitespace/indent/unicode drift in the search text.`},replaceAll:{type:"boolean",description:"Replace all occurrences instead of first only (default: false)."}},required:["input"]};function _h(r){return r.replace(/\\n/g,`
186
- `).replace(/\\t/g," ").replace(/\\'/g,"'").replace(/\\"/g,'"')}function Ul(r){return r.replace(/[\u201c\u201d\u201e\u201f]/g,'"').replace(/[\u2018\u2019\u201a\u201b]/g,"'").replace(/\u2014/g,"--").replace(/\u2013/g,"-").replace(/\u2026/g,"...").replace(/\u00a0/g," ")}function Nl(r,e){if(r===e||Math.max(r.length,e.length)===0)return 1;let n=0,o=r.length,s=e.length,i=Math.max(o,s);for(let a=0;a<Math.min(o,s);a++)r[a]!==e[a]&&n++;return n+=Math.abs(o-s),1-n/i}function Hl(r,e,t){let n=[],o=r.indexOf(e);if(o!==-1){if(t){let f=0;for(;(o=r.indexOf(e,f))!==-1;)n.push({start:o,end:o+e.length,strategy:"exact"}),f=o+e.length}else n.push({start:o,end:o+e.length,strategy:"exact"});return n}let s=e.split(`
187
+ Fuzzy matching automatically handles whitespace/indent/unicode drift in the search text.`},replaceAll:{type:"boolean",description:"Replace all occurrences instead of first only (default: false)."}},required:["input"]};function Oh(r){return r.replace(/\\n/g,`
188
+ `).replace(/\\t/g," ").replace(/\\'/g,"'").replace(/\\"/g,'"')}function Wl(r){return r.replace(/[\u201c\u201d\u201e\u201f]/g,'"').replace(/[\u2018\u2019\u201a\u201b]/g,"'").replace(/\u2014/g,"--").replace(/\u2013/g,"-").replace(/\u2026/g,"...").replace(/\u00a0/g," ")}function Hl(r,e){if(r===e||Math.max(r.length,e.length)===0)return 1;let n=0,o=r.length,s=e.length,i=Math.max(o,s);for(let a=0;a<Math.min(o,s);a++)r[a]!==e[a]&&n++;return n+=Math.abs(o-s),1-n/i}function Yl(r,e,t){let n=[],o=r.indexOf(e);if(o!==-1){if(t){let f=0;for(;(o=r.indexOf(e,f))!==-1;)n.push({start:o,end:o+e.length,strategy:"exact"}),f=o+e.length}else n.push({start:o,end:o+e.length,strategy:"exact"});return n}let s=e.split(`
187
189
  `).map(f=>f.trim()),i=r.split(`
188
- `),a=jl(i,s,(f,b)=>f.trim()===b);if(a)return[{...Fl(r,i,a),strategy:"line_trimmed"}];let l=e.replace(/[ \t]+/g," "),u=r.replace(/[ \t]+/g," ");if(o=u.indexOf(l),o!==-1){let f=Bl(r,u,o,l.length);if(f)return[{...f,strategy:"whitespace_normalized"}]}let c=jl(i,s,(f,b)=>f.trimStart()===b.trimStart());if(c)return[{...Fl(r,i,c),strategy:"indentation_flexible"}];let d=_h(e);if(d!==e&&(o=r.indexOf(d),o!==-1))return[{start:o,end:o+d.length,strategy:"escape_normalized"}];let p=e.split(`
190
+ `),a=zl(i,s,(f,b)=>f.trim()===b);if(a)return[{...Vl(r,i,a),strategy:"line_trimmed"}];let c=e.replace(/[ \t]+/g," "),d=r.replace(/[ \t]+/g," ");if(o=d.indexOf(c),o!==-1){let f=ql(r,d,o,c.length);if(f)return[{...f,strategy:"whitespace_normalized"}]}let l=zl(i,s,(f,b)=>f.trimStart()===b.trimStart());if(l)return[{...Vl(r,i,l),strategy:"indentation_flexible"}];let u=Oh(e);if(u!==e&&(o=r.indexOf(u),o!==-1))return[{start:o,end:o+u.length,strategy:"escape_normalized"}];let p=e.split(`
189
191
  `);if(p.length>=3){let f=p.slice(1,-1).join(`
190
- `),b=p[0].trim(),T=p[p.length-1].trim();for(let w=0;w<i.length;w++)if(i[w].trim()===b){let _=i.slice(0,w+1).join(`
191
- `).length+1,y=r.indexOf(f,_);if(y!==-1){let C=y+f.length,E=r.indexOf(`
192
- `,C);if((E===-1?r.slice(C):r.slice(C,E)).trim()===T||E!==-1&&r.slice(C+1,r.indexOf(`
193
- `,C+1)===-1?void 0:r.indexOf(`
194
- `,C+1)).trim()===T){let L=i.slice(0,w).join(`
195
- `).length+(w>0?1:0),v=w,ce=p.length;if(w+ce<=i.length){v=w+ce;let F=i.slice(0,v).join(`
196
- `).length;return[{start:L,end:F,strategy:"trimmed_boundary"}]}}}}}let m=Ul(e),g=Ul(r);if((m!==e||g!==r)&&(o=g.indexOf(m),o!==-1)){let f=Bl(r,g,o,m.length);if(f)return[{...f,strategy:"unicode_normalized"}]}if(p.length>=3){let f=p[0],b=p[p.length-1];for(let T=0;T<i.length;T++)if(i[T]===f){for(let w=T+p.length-1;w<Math.min(T+p.length+2,i.length);w++)if(i[w]===b){let _=w-T+1,y=i.slice(T+1,w),C=p.slice(1,-1),E=C.filter(L=>y.some(v=>Nl(v,L)>=.7)).length;if((C.length>0?E/C.length:1)>=.5&&_<=p.length+2){let L=i.slice(0,T).join(`
197
- `).length+(T>0?1:0),v=i.slice(0,w+1).join(`
198
- `).length;return[{start:L,end:v,strategy:"block_anchor"}]}}}}if(p.length>=2)for(let f=0;f<=i.length-p.length;f++){let b=i.slice(f,f+p.length);if(p.map((_,y)=>Nl(_,b[y])).filter(_=>_>=.8).length/p.length>=.5){let _=i.slice(0,f).join(`
199
- `).length+(f>0?1:0),y=i.slice(0,f+p.length).join(`
200
- `).length;return[{start:_,end:y,strategy:"context_aware"}]}}return[]}function jl(r,e,t){for(let n=0;n<=r.length-e.length;n++){let o=!0;for(let s=0;s<e.length;s++)if(!t(r[n+s],e[s])){o=!1;break}if(o)return{startIdx:n,endIdx:n+e.length}}return null}function Fl(r,e,t){let n=e.slice(0,t.startIdx).join(`
192
+ `),b=p[0].trim(),w=p[p.length-1].trim();for(let T=0;T<i.length;T++)if(i[T].trim()===b){let _=i.slice(0,T+1).join(`
193
+ `).length+1,R=r.indexOf(f,_);if(R!==-1){let y=R+f.length,I=r.indexOf(`
194
+ `,y);if((I===-1?r.slice(y):r.slice(y,I)).trim()===w||I!==-1&&r.slice(y+1,r.indexOf(`
195
+ `,y+1)===-1?void 0:r.indexOf(`
196
+ `,y+1)).trim()===w){let $=i.slice(0,T).join(`
197
+ `).length+(T>0?1:0),v=T,pe=p.length;if(T+pe<=i.length){v=T+pe;let F=i.slice(0,v).join(`
198
+ `).length;return[{start:$,end:F,strategy:"trimmed_boundary"}]}}}}}let m=Wl(e),g=Wl(r);if((m!==e||g!==r)&&(o=g.indexOf(m),o!==-1)){let f=ql(r,g,o,m.length);if(f)return[{...f,strategy:"unicode_normalized"}]}if(p.length>=3){let f=p[0],b=p[p.length-1];for(let w=0;w<i.length;w++)if(i[w]===f){for(let T=w+p.length-1;T<Math.min(w+p.length+2,i.length);T++)if(i[T]===b){let _=T-w+1,R=i.slice(w+1,T),y=p.slice(1,-1),I=y.filter($=>R.some(v=>Hl(v,$)>=.7)).length;if((y.length>0?I/y.length:1)>=.5&&_<=p.length+2){let $=i.slice(0,w).join(`
199
+ `).length+(w>0?1:0),v=i.slice(0,T+1).join(`
200
+ `).length;return[{start:$,end:v,strategy:"block_anchor"}]}}}}if(p.length>=2)for(let f=0;f<=i.length-p.length;f++){let b=i.slice(f,f+p.length);if(p.map((_,R)=>Hl(_,b[R])).filter(_=>_>=.8).length/p.length>=.5){let _=i.slice(0,f).join(`
201
+ `).length+(f>0?1:0),R=i.slice(0,f+p.length).join(`
202
+ `).length;return[{start:_,end:R,strategy:"context_aware"}]}}return[]}function zl(r,e,t){for(let n=0;n<=r.length-e.length;n++){let o=!0;for(let s=0;s<e.length;s++)if(!t(r[n+s],e[s])){o=!1;break}if(o)return{startIdx:n,endIdx:n+e.length}}return null}function Vl(r,e,t){let n=e.slice(0,t.startIdx).join(`
201
203
  `).length+(t.startIdx>0?1:0),o=e.slice(0,t.endIdx).join(`
202
- `).length;return{start:n,end:o}}function Bl(r,e,t,n){let o=0,s=0,i=-1,a=-1;for(;o<=r.length&&s<=e.length;){if(s===t&&i===-1&&(i=o),s===t+n){a=o;break}if(s>=e.length||o>=r.length)break;for(s++,o++;o<r.length&&s<e.length&&r[o]!==e[s];)o++}return i!==-1&&a===-1&&(a=r.length),i===-1?null:{start:i,end:a}}function Wl(r){let e=r.split(`
203
- `),t=[],n=null,o=null,s=!1;for(let i of e){if(i.startsWith("*** Begin Patch")){s=!0;continue}if(i.startsWith("*** End Patch"))break;if(s)if(i.startsWith("*** Add File: "))n&&t.push(n),n={type:"add",path:i.slice(14).trim(),hunks:[]},o={lines:[]},n.hunks.push(o);else if(i.startsWith("*** Update File: "))n&&t.push(n),n={type:"update",path:i.slice(17).trim(),hunks:[]},o=null;else if(i.startsWith("*** Delete File: "))n&&t.push(n),n={type:"delete",path:i.slice(17).trim(),hunks:[]},o=null;else if(i.startsWith("*** Move File: ")){n&&t.push(n);let a=i.slice(15).trim().split(" -> ");n={type:"move",path:a[0].trim(),newPath:a[1]?.trim(),hunks:[]},o=null}else i.startsWith("@@ ")&&n?(o={contextHint:i.slice(3).replace(/ @@$/,"").trim()||void 0,lines:[]},n.hunks.push(o)):o&&(i.startsWith("+")?o.lines.push({prefix:"+",content:i.slice(1)}):i.startsWith("-")?o.lines.push({prefix:"-",content:i.slice(1)}):o.lines.push({prefix:" ",content:i.startsWith(" ")?i.slice(1):i}))}return n&&t.push(n),t}function Rh(r){let e=[],t=r.split(/^(<<<< SEARCH)$/m);if(t.length<2)return[];let n=t[0].trim().split(`
204
+ `).length;return{start:n,end:o}}function ql(r,e,t,n){let o=0,s=0,i=-1,a=-1;for(;o<=r.length&&s<=e.length;){if(s===t&&i===-1&&(i=o),s===t+n){a=o;break}if(s>=e.length||o>=r.length)break;for(s++,o++;o<r.length&&s<e.length&&r[o]!==e[s];)o++}return i!==-1&&a===-1&&(a=r.length),i===-1?null:{start:i,end:a}}function Kl(r){let e=r.split(`
205
+ `),t=[],n=null,o=null,s=!1;for(let i of e){if(i.startsWith("*** Begin Patch")){s=!0;continue}if(i.startsWith("*** End Patch"))break;if(s)if(i.startsWith("*** Add File: "))n&&t.push(n),n={type:"add",path:i.slice(14).trim(),hunks:[]},o={lines:[]},n.hunks.push(o);else if(i.startsWith("*** Update File: "))n&&t.push(n),n={type:"update",path:i.slice(17).trim(),hunks:[]},o=null;else if(i.startsWith("*** Delete File: "))n&&t.push(n),n={type:"delete",path:i.slice(17).trim(),hunks:[]},o=null;else if(i.startsWith("*** Move File: ")){n&&t.push(n);let a=i.slice(15).trim().split(" -> ");n={type:"move",path:a[0].trim(),newPath:a[1]?.trim(),hunks:[]},o=null}else i.startsWith("@@ ")&&n?(o={contextHint:i.slice(3).replace(/ @@$/,"").trim()||void 0,lines:[]},n.hunks.push(o)):o&&(i.startsWith("+")?o.lines.push({prefix:"+",content:i.slice(1)}):i.startsWith("-")?o.lines.push({prefix:"-",content:i.slice(1)}):o.lines.push({prefix:" ",content:i.startsWith(" ")?i.slice(1):i}))}return n&&t.push(n),t}function Lh(r){let e=[],t=r.split(/^(<<<< SEARCH)$/m);if(t.length<2)return[];let n=t[0].trim().split(`
204
206
  `).pop()?.trim();if(!n)return[];for(let o=1;o<t.length;o+=2){let s=t[o+1]||"",i=s.indexOf(`
205
207
  ====
206
- `);if(i===-1)continue;let a=s.slice(0,i).replace(/^\n/,""),l=s.slice(i+6),u=l.indexOf(`
207
- >>>> REPLACE`),c=u===-1?l:l.slice(0,u);e.push({path:n,search:a,replace:c})}return e}function Gl(r,e,t){let n=e.lines.filter(g=>g.prefix===" ").map(g=>g.content),o=e.lines.filter(g=>g.prefix==="-").map(g=>g.content),s=e.lines.filter(g=>g.prefix==="+").map(g=>g.content),i=[],a="context";for(let g of e.lines)(g.prefix===" "||g.prefix==="-")&&i.push(g.content);let l=i.join(`
208
- `);if(!l)return{content:r+`
208
+ `);if(i===-1)continue;let a=s.slice(0,i).replace(/^\n/,""),c=s.slice(i+6),d=c.indexOf(`
209
+ >>>> REPLACE`),l=d===-1?c:c.slice(0,d);e.push({path:n,search:a,replace:l})}return e}function Jl(r,e,t){let n=e.lines.filter(g=>g.prefix===" ").map(g=>g.content),o=e.lines.filter(g=>g.prefix==="-").map(g=>g.content),s=e.lines.filter(g=>g.prefix==="+").map(g=>g.content),i=[],a="context";for(let g of e.lines)(g.prefix===" "||g.prefix==="-")&&i.push(g.content);let c=i.join(`
210
+ `);if(!c)return{content:r+`
209
211
  `+s.join(`
210
- `),strategy:"exact"};let u=Hl(r,l,t);if(u.length===0)return null;let c=[];for(let g of e.lines)(g.prefix===" "||g.prefix==="+")&&c.push(g.content);let d=c.join(`
211
- `),p=u[0];return{content:r.slice(0,p.start)+d+r.slice(p.end),strategy:p.strategy}}function ts(r){return{name:xh,label:"Patch",description:"Apply edits to files using fuzzy matching. Supports V4A unified diff format (*** Begin Patch / *** End Patch) for multi-file operations, and simple search/replace blocks. The fuzzy matcher handles whitespace, indentation, unicode, and escape drift \u2014 LLM output with minor formatting differences will still match correctly.",parameters:Sh,execute:async(e,t)=>{let n=t.replaceAll??!1,o={filesModified:[],filesAdded:[],filesDeleted:[],strategies:{},errors:[]},s=t.input.includes("*** Begin Patch"),i=t.input.includes("<<<< SEARCH");if(s){let u=Wl(t.input);if(u.length===0)return{content:[{type:"text",text:"Error: No valid V4A operations found. Ensure *** Begin Patch / *** End Patch markers are present."}],details:{type:"patch",error:"parse_failed"}};for(let c of u){let d=r.resolvePath(c.path);try{switch(c.type){case"add":{let p=c.hunks.flatMap(m=>m.lines.filter(g=>g.prefix==="+").map(g=>g.content)).join(`
212
- `);await r.writeFile(d,p),o.filesAdded.push(c.path),o.strategies[c.path]="exact";break}case"delete":{await r.deleteFile(d),o.filesDeleted.push(c.path);break}case"move":{let p=await r.readFile(d);if(c.newPath){let m=r.resolvePath(c.newPath),g=p;for(let f of c.hunks){let b=Gl(g,f,n);b&&(g=b.content,o.strategies[c.path]=b.strategy)}await r.writeFile(m,g),await r.deleteFile(d),o.filesModified.push(`${c.path} \u2192 ${c.newPath}`)}break}case"update":{let p=await r.readFile(d),m="exact",g=!0;for(let f of c.hunks){let b=Gl(p,f,n);if(b)p=b.content,m=b.strategy;else{g=!1;let T=f.lines.filter(w=>w.prefix===" "||w.prefix==="-").map(w=>w.content).slice(0,5).join(`
213
- `);o.errors.push(`${c.path}: hunk not matched. Search begins with:
214
- ${T}`)}}(g||p!==await r.readFile(d))&&(await r.writeFile(d,p),o.filesModified.push(c.path),o.strategies[c.path]=m);break}}}catch(p){o.errors.push(`${c.type} ${c.path}: ${p instanceof Error?p.message:String(p)}`)}}}else if(i){let u=Rh(t.input);if(u.length===0)return{content:[{type:"text",text:"Error: Invalid search/replace format. Use <<<< SEARCH / ==== / >>>> REPLACE blocks."}],details:{type:"patch",error:"parse_failed"}};for(let c of u){let d=r.resolvePath(c.path);try{let p=await r.readFile(d),m=Hl(p,c.search,n);if(m.length===0){o.errors.push(`${c.path}: search text not matched (tried all 9 strategies)`);continue}let g=[...m].sort((f,b)=>b.start-f.start);for(let f of g)p=p.slice(0,f.start)+c.replace+p.slice(f.end);await r.writeFile(d,p),o.filesModified.push(c.path),o.strategies[c.path]=m[0].strategy}catch(p){o.errors.push(`${c.path}: ${p instanceof Error?p.message:String(p)}`)}}}else return Wl(`*** Begin Patch
212
+ `),strategy:"exact"};let d=Yl(r,c,t);if(d.length===0)return null;let l=[];for(let g of e.lines)(g.prefix===" "||g.prefix==="+")&&l.push(g.content);let u=l.join(`
213
+ `),p=d[0];return{content:r.slice(0,p.start)+u+r.slice(p.end),strategy:p.strategy}}function cs(r){return{name:Ih,label:"Patch",description:"Apply edits to files using fuzzy matching. Supports V4A unified diff format (*** Begin Patch / *** End Patch) for multi-file operations, and simple search/replace blocks. The fuzzy matcher handles whitespace, indentation, unicode, and escape drift \u2014 LLM output with minor formatting differences will still match correctly.",parameters:Eh,execute:async(e,t)=>{let n=t.replaceAll??!1,o={filesModified:[],filesAdded:[],filesDeleted:[],strategies:{},errors:[]},s=t.input.includes("*** Begin Patch"),i=t.input.includes("<<<< SEARCH");if(s){let d=Kl(t.input);if(d.length===0)return{content:[{type:"text",text:"Error: No valid V4A operations found. Ensure *** Begin Patch / *** End Patch markers are present."}],details:{type:"patch",error:"parse_failed"}};for(let l of d){let u=r.resolvePath(l.path);try{switch(l.type){case"add":{let p=l.hunks.flatMap(m=>m.lines.filter(g=>g.prefix==="+").map(g=>g.content)).join(`
214
+ `);await r.writeFile(u,p),o.filesAdded.push(l.path),o.strategies[l.path]="exact";break}case"delete":{await r.deleteFile(u),o.filesDeleted.push(l.path);break}case"move":{let p=await r.readFile(u);if(l.newPath){let m=r.resolvePath(l.newPath),g=p;for(let f of l.hunks){let b=Jl(g,f,n);b&&(g=b.content,o.strategies[l.path]=b.strategy)}await r.writeFile(m,g),await r.deleteFile(u),o.filesModified.push(`${l.path} \u2192 ${l.newPath}`)}break}case"update":{let p=await r.readFile(u),m="exact",g=!0;for(let f of l.hunks){let b=Jl(p,f,n);if(b)p=b.content,m=b.strategy;else{g=!1;let w=f.lines.filter(T=>T.prefix===" "||T.prefix==="-").map(T=>T.content).slice(0,5).join(`
215
+ `);o.errors.push(`${l.path}: hunk not matched. Search begins with:
216
+ ${w}`)}}(g||p!==await r.readFile(u))&&(await r.writeFile(u,p),o.filesModified.push(l.path),o.strategies[l.path]=m);break}}}catch(p){o.errors.push(`${l.type} ${l.path}: ${p instanceof Error?p.message:String(p)}`)}}}else if(i){let d=Lh(t.input);if(d.length===0)return{content:[{type:"text",text:"Error: Invalid search/replace format. Use <<<< SEARCH / ==== / >>>> REPLACE blocks."}],details:{type:"patch",error:"parse_failed"}};for(let l of d){let u=r.resolvePath(l.path);try{let p=await r.readFile(u),m=Yl(p,l.search,n);if(m.length===0){o.errors.push(`${l.path}: search text not matched (tried all 9 strategies)`);continue}let g=[...m].sort((f,b)=>b.start-f.start);for(let f of g)p=p.slice(0,f.start)+l.replace+p.slice(f.end);await r.writeFile(u,p),o.filesModified.push(l.path),o.strategies[l.path]=m[0].strategy}catch(p){o.errors.push(`${l.path}: ${p instanceof Error?p.message:String(p)}`)}}}else return Kl(`*** Begin Patch
215
217
  `+t.input+`
216
- *** End Patch`).length>0?ts(r).execute(e,{input:`*** Begin Patch
218
+ *** End Patch`).length>0?cs(r).execute(e,{input:`*** Begin Patch
217
219
  `+t.input+`
218
- *** End Patch`,replaceAll:n}):{content:[{type:"text",text:"Error: Unrecognized patch format. Use V4A (*** Begin Patch) or search/replace (<<<< SEARCH / ==== / >>>> REPLACE)."}],details:{type:"patch",error:"unknown_format"}};let a=[];if(o.filesAdded.length&&a.push(`Added: ${o.filesAdded.join(", ")}`),o.filesModified.length){let u=o.filesModified.map(c=>`${c} (${o.strategies[c]||"exact"})`).join(", ");a.push(`Modified: ${u}`)}o.filesDeleted.length&&a.push(`Deleted: ${o.filesDeleted.join(", ")}`),o.errors.length&&a.push(`
220
+ *** End Patch`,replaceAll:n}):{content:[{type:"text",text:"Error: Unrecognized patch format. Use V4A (*** Begin Patch) or search/replace (<<<< SEARCH / ==== / >>>> REPLACE)."}],details:{type:"patch",error:"unknown_format"}};let a=[];if(o.filesAdded.length&&a.push(`Added: ${o.filesAdded.join(", ")}`),o.filesModified.length){let d=o.filesModified.map(l=>`${l} (${o.strategies[l]||"exact"})`).join(", ");a.push(`Modified: ${d}`)}o.filesDeleted.length&&a.push(`Deleted: ${o.filesDeleted.join(", ")}`),o.errors.length&&a.push(`
219
221
  Errors:
220
222
  ${o.errors.join(`
221
- `)}`);let l=o.errors.length===0;return{content:[{type:"text",text:a.join(`
222
- `)||"No changes applied."}],details:{type:"patch",...o,success:l}}}}}var Ch="web_fetch",Ah={type:"object",properties:{url:{type:"string",description:"HTTP or HTTPS URL to fetch."},extractMode:{type:"string",enum:["markdown","text","json"],description:'Extraction mode: "markdown" (default), "text", or "json" (LLM-driven structured extraction).'},maxChars:{type:"number",description:"Maximum characters to return (truncates when exceeded).",minimum:100},query:{type:"string",description:"Original search query. When provided, returns the most query-relevant sections."},extract:{type:"boolean",description:"When true, returns structured extraction (title, summary, key facts, entities, topics, sentiment)."},summarize:{type:"boolean",description:"When true, returns a concise summary (< 500 chars) of the page content. Useful for long pages to reduce context usage while preserving key information."}},required:["url"]},Mh=5e4;function Vl(r){return{name:Ch,label:"Web Fetch",description:"Fetch content from a URL and extract it as markdown, text, or structured JSON. Supports query-based relevance filtering and structured extraction (title, summary, key facts, entities, topics, sentiment).",parameters:Ah,execute:async(e,t)=>{let n=await r.fetchUrl({url:t.url,extractMode:t.extractMode,maxChars:t.maxChars??Mh,query:t.query,extract:t.extract});if(t.summarize&&r.summarizeContent&&n.content.length>1e3){let s=await r.summarizeContent(n.content,t.query);return{content:[{type:"text",text:n.title?`# ${n.title}
223
+ `)}`);let c=o.errors.length===0;return{content:[{type:"text",text:a.join(`
224
+ `)||"No changes applied."}],details:{type:"patch",...o,success:c}}}}}var Dh="web_fetch",$h={type:"object",properties:{url:{type:"string",description:"HTTP or HTTPS URL to fetch."},extractMode:{type:"string",enum:["markdown","text","json"],description:'Extraction mode: "markdown" (default), "text", or "json" (LLM-driven structured extraction).'},maxChars:{type:"number",description:"Maximum characters to return (truncates when exceeded).",minimum:100},query:{type:"string",description:"Original search query. When provided, returns the most query-relevant sections."},extract:{type:"boolean",description:"When true, returns structured extraction (title, summary, key facts, entities, topics, sentiment)."},summarize:{type:"boolean",description:"When true, returns a concise summary (< 500 chars) of the page content. Useful for long pages to reduce context usage while preserving key information."}},required:["url"]},Nh=5e4;function Xl(r){return{name:Dh,label:"Web Fetch",description:"Fetch content from a URL and extract it as markdown, text, or structured JSON. Supports query-based relevance filtering and structured extraction (title, summary, key facts, entities, topics, sentiment).",parameters:$h,execute:async(e,t)=>{let n=await r.fetchUrl({url:t.url,extractMode:t.extractMode,maxChars:t.maxChars??Nh,query:t.query,extract:t.extract});if(t.summarize&&r.summarizeContent&&n.content.length>1e3){let s=await r.summarizeContent(n.content,t.query);return{content:[{type:"text",text:n.title?`# ${n.title}
223
225
 
224
226
  ${s}`:s}],details:{type:"web_fetch",url:t.url,summarized:!0,originalLength:n.content.length,summaryLength:s.length}}}let o=[];if(n.title&&o.push(`# ${n.title}
225
227
  `),o.push(n.content),n.relevantExcerpts?.length){o.push(`
226
228
  ---
227
229
  ## Relevant Excerpts
228
230
  `);for(let s of n.relevantExcerpts)o.push(`- ${s}`)}return{content:[{type:"text",text:o.join(`
229
- `)}],details:{type:"web_fetch",url:t.url,extractMode:t.extractMode??"markdown",hasExtraction:!!n.extraction,extraction:n.extraction}}}}}var Ph="web_search",Ih={type:"object",properties:{query:{type:"string",description:"Search query string. Be specific and concise for best results."},allowedDomains:{type:"array",items:{type:"string"},description:"Only include results from these domains (e.g. ['docs.python.org', 'stackoverflow.com']). Cannot be used together with blockedDomains."},blockedDomains:{type:"array",items:{type:"string"},description:"Exclude results from these domains. Cannot be used together with allowedDomains."}},required:["query"]},Eh=10;function zl(r){return{name:Ph,label:"Web Search",description:"Search the web for current information. Returns top results with title, URL, and snippet. Use this when you need up-to-date information that may not be in your training data. You MUST include source URLs as markdown links when citing search results.",parameters:Ih,execute:async(e,t)=>{if(t.allowedDomains?.length&&t.blockedDomains?.length)return{content:[{type:"text",text:"Error: allowedDomains and blockedDomains cannot both be specified."}],details:{type:"web_search",error:"mutual_exclusion"}};if(!t.query||t.query.trim().length<2)return{content:[{type:"text",text:"Error: query must be at least 2 characters."}],details:{type:"web_search",error:"invalid_query"}};let n=await r.search(t.query.trim(),{allowedDomains:t.allowedDomains,blockedDomains:t.blockedDomains,maxResults:Eh});if(n.results.length===0)return{content:[{type:"text",text:`No results found for: "${t.query}"`}],details:{type:"web_search",query:t.query,resultCount:0}};let o=[`Web search results for: "${n.query}"`,"","REMINDER: You MUST include source URLs as markdown links when referencing these results.",""];for(let s=0;s<n.results.length;s++){let i=n.results[s];o.push(`${s+1}. [${i.title}](${i.url})`),o.push(` ${i.snippet}`),o.push("")}return{content:[{type:"text",text:o.join(`
230
- `)}],details:{type:"web_search",query:n.query,resultCount:n.results.length}}}}}var Oh="instructions",Lh={type:"object",properties:{action:{type:"string",enum:["list","read","write","edit","delete"],description:"Operation: list all files, read a file, write (create/overwrite), edit (partial replace), or delete a file."},project_id:{type:"string",description:'Project ID. Use "default" for the default project.'},filename:{type:"string",description:'Instruction file name ending in .md (e.g. "code-style.md"). Required for read/write/delete. Sub-paths like "testing/unit-test.md" are supported.'},content:{type:"string",description:"Markdown content for the instruction file. Required for write action."},old_text:{type:"string",description:"Required for edit action: the exact existing text to find and replace (must appear exactly once)."},new_text:{type:"string",description:"Required for edit action: the replacement text."}},required:["action","project_id"]};function ql(r){return{name:Oh,label:"Instructions",description:"Manage project instruction files (.md) \u2014 list, read, write, edit, or delete. Instructions define agent behavior rules, coding standards, and project context.",parameters:Lh,isReadOnly:!1,isConcurrencySafe:!0,searchHint:"instructions list read write edit delete rules coding standards behavior guidelines",execute:async(e,t)=>{switch(t.action){case"list":{let n=r.list(t.project_id);if(n.length===0)return{content:[{type:"text",text:"No instruction files found for this project."}],details:{projectId:t.project_id,count:0}};let o=n.map(s=>`- ${s.filename} (${s.size} bytes, updated ${s.updatedAt})`).join(`
231
+ `)}],details:{type:"web_fetch",url:t.url,extractMode:t.extractMode??"markdown",hasExtraction:!!n.extraction,extraction:n.extraction}}}}}var Uh="web_search",jh={type:"object",properties:{query:{type:"string",description:"Search query string. Be specific and concise for best results."},allowedDomains:{type:"array",items:{type:"string"},description:"Only include results from these domains (e.g. ['docs.python.org', 'stackoverflow.com']). Cannot be used together with blockedDomains."},blockedDomains:{type:"array",items:{type:"string"},description:"Exclude results from these domains. Cannot be used together with allowedDomains."}},required:["query"]},Fh=10;function Ql(r){return{name:Uh,label:"Web Search",description:"Search the web for current information. Returns top results with title, URL, and snippet. Use this when you need up-to-date information that may not be in your training data. You MUST include source URLs as markdown links when citing search results.",parameters:jh,execute:async(e,t)=>{if(t.allowedDomains?.length&&t.blockedDomains?.length)return{content:[{type:"text",text:"Error: allowedDomains and blockedDomains cannot both be specified."}],details:{type:"web_search",error:"mutual_exclusion"}};if(!t.query||t.query.trim().length<2)return{content:[{type:"text",text:"Error: query must be at least 2 characters."}],details:{type:"web_search",error:"invalid_query"}};let n=await r.search(t.query.trim(),{allowedDomains:t.allowedDomains,blockedDomains:t.blockedDomains,maxResults:Fh});if(n.results.length===0)return{content:[{type:"text",text:`No results found for: "${t.query}"`}],details:{type:"web_search",query:t.query,resultCount:0}};let o=[`Web search results for: "${n.query}"`,"","REMINDER: You MUST include source URLs as markdown links when referencing these results.",""];for(let s=0;s<n.results.length;s++){let i=n.results[s];o.push(`${s+1}. [${i.title}](${i.url})`),o.push(` ${i.snippet}`),o.push("")}return{content:[{type:"text",text:o.join(`
232
+ `)}],details:{type:"web_search",query:n.query,resultCount:n.results.length}}}}}var Bh="instructions",Gh={type:"object",properties:{action:{type:"string",enum:["list","read","write","edit","delete"],description:"Operation: list all files, read a file, write (create/overwrite), edit (partial replace), or delete a file."},project_id:{type:"string",description:'Project ID. Use "default" for the default project.'},filename:{type:"string",description:'Instruction file name ending in .md (e.g. "code-style.md"). Required for read/write/delete. Sub-paths like "testing/unit-test.md" are supported.'},content:{type:"string",description:"Markdown content for the instruction file. Required for write action."},old_text:{type:"string",description:"Required for edit action: the exact existing text to find and replace (must appear exactly once)."},new_text:{type:"string",description:"Required for edit action: the replacement text."}},required:["action","project_id"]};function Zl(r){return{name:Bh,label:"Instructions",description:"Manage project instruction files (.md) \u2014 list, read, write, edit, or delete. Instructions define agent behavior rules, coding standards, and project context.",parameters:Gh,isReadOnly:!1,isConcurrencySafe:!0,searchHint:"instructions list read write edit delete rules coding standards behavior guidelines",execute:async(e,t)=>{switch(t.action){case"list":{let n=r.list(t.project_id);if(n.length===0)return{content:[{type:"text",text:"No instruction files found for this project."}],details:{projectId:t.project_id,count:0}};let o=n.map(s=>`- ${s.filename} (${s.size} bytes, updated ${s.updatedAt})`).join(`
231
233
  `);return{content:[{type:"text",text:`Found ${n.length} instruction file(s):
232
- ${o}`}],details:{projectId:t.project_id,count:n.length,files:n}}}case"read":{if(!t.filename)return{content:[{type:"text",text:"filename is required for read action"}],details:{error:"missing_filename"}};let n=r.read(t.project_id,t.filename);return n?{content:[{type:"text",text:n.content}],details:{projectId:t.project_id,filename:n.filename,size:n.size}}:{content:[{type:"text",text:`Instruction file not found: ${t.filename}`}],details:{projectId:t.project_id,filename:t.filename,error:"not_found"}}}case"write":{if(!t.filename)return{content:[{type:"text",text:"filename is required for write action"}],details:{error:"missing_filename"}};if(t.content===void 0||t.content===null)return{content:[{type:"text",text:"content is required for write action"}],details:{error:"missing_content"}};if(!t.filename.endsWith(".md"))return{content:[{type:"text",text:"Filename must end with .md"}],details:{error:"invalid_filename"}};if(t.filename.includes(".."))return{content:[{type:"text",text:"Path traversal not allowed"}],details:{error:"path_traversal"}};let n=r.write(t.project_id,t.filename,t.content);return{content:[{type:"text",text:`Instruction file written: ${n.filename} (${n.size} bytes)`}],details:{projectId:t.project_id,filename:n.filename,size:n.size}}}case"edit":{if(!t.filename)return{content:[{type:"text",text:"filename is required for edit action"}],details:{error:"missing_filename"}};if(!t.old_text)return{content:[{type:"text",text:"old_text is required for edit action"}],details:{error:"missing_old_text"}};if(t.new_text===void 0||t.new_text===null)return{content:[{type:"text",text:"new_text is required for edit action"}],details:{error:"missing_new_text"}};if(t.filename.includes(".."))return{content:[{type:"text",text:"Path traversal not allowed"}],details:{error:"path_traversal"}};let n=r.read(t.project_id,t.filename);if(!n)return{content:[{type:"text",text:`Instruction file not found: ${t.filename}`}],details:{projectId:t.project_id,filename:t.filename,error:"not_found"}};let o=n.content.split(t.old_text).length-1;if(o===0)return{content:[{type:"text",text:"old_text not found in the file"}],details:{projectId:t.project_id,filename:t.filename,error:"old_text_not_found"}};if(o>1)return{content:[{type:"text",text:`old_text matches ${o} locations \u2014 must match exactly once. Add more surrounding context to make it unique.`}],details:{projectId:t.project_id,filename:t.filename,error:"ambiguous_match",occurrences:o}};let s=n.content.replace(t.old_text,t.new_text),i=r.write(t.project_id,t.filename,s);return{content:[{type:"text",text:`Instruction file edited: ${i.filename} (${i.size} bytes)`}],details:{projectId:t.project_id,filename:i.filename,size:i.size}}}case"delete":return t.filename?t.filename.includes("..")?{content:[{type:"text",text:"Path traversal not allowed"}],details:{error:"path_traversal"}}:r.remove(t.project_id,t.filename)?{content:[{type:"text",text:`Instruction file deleted: ${t.filename}`}],details:{projectId:t.project_id,filename:t.filename}}:{content:[{type:"text",text:`Instruction file not found: ${t.filename}`}],details:{projectId:t.project_id,filename:t.filename,error:"not_found"}}:{content:[{type:"text",text:"filename is required for delete action"}],details:{error:"missing_filename"}};default:return{content:[{type:"text",text:`Unknown action: ${t.action}. Use list, read, write, edit, or delete.`}],details:{error:"unknown_action"}}}}}}var $h="worktree",Dh={type:"object",properties:{action:{type:"string",enum:["enter","exit","list"],description:`enter: Create and switch to an isolated git worktree branch.
234
+ ${o}`}],details:{projectId:t.project_id,count:n.length,files:n}}}case"read":{if(!t.filename)return{content:[{type:"text",text:"filename is required for read action"}],details:{error:"missing_filename"}};let n=r.read(t.project_id,t.filename);return n?{content:[{type:"text",text:n.content}],details:{projectId:t.project_id,filename:n.filename,size:n.size}}:{content:[{type:"text",text:`Instruction file not found: ${t.filename}`}],details:{projectId:t.project_id,filename:t.filename,error:"not_found"}}}case"write":{if(!t.filename)return{content:[{type:"text",text:"filename is required for write action"}],details:{error:"missing_filename"}};if(t.content===void 0||t.content===null)return{content:[{type:"text",text:"content is required for write action"}],details:{error:"missing_content"}};if(!t.filename.endsWith(".md"))return{content:[{type:"text",text:"Filename must end with .md"}],details:{error:"invalid_filename"}};if(t.filename.includes(".."))return{content:[{type:"text",text:"Path traversal not allowed"}],details:{error:"path_traversal"}};let n=r.write(t.project_id,t.filename,t.content);return{content:[{type:"text",text:`Instruction file written: ${n.filename} (${n.size} bytes)`}],details:{projectId:t.project_id,filename:n.filename,size:n.size}}}case"edit":{if(!t.filename)return{content:[{type:"text",text:"filename is required for edit action"}],details:{error:"missing_filename"}};if(!t.old_text)return{content:[{type:"text",text:"old_text is required for edit action"}],details:{error:"missing_old_text"}};if(t.new_text===void 0||t.new_text===null)return{content:[{type:"text",text:"new_text is required for edit action"}],details:{error:"missing_new_text"}};if(t.filename.includes(".."))return{content:[{type:"text",text:"Path traversal not allowed"}],details:{error:"path_traversal"}};let n=r.read(t.project_id,t.filename);if(!n)return{content:[{type:"text",text:`Instruction file not found: ${t.filename}`}],details:{projectId:t.project_id,filename:t.filename,error:"not_found"}};let o=n.content.split(t.old_text).length-1;if(o===0)return{content:[{type:"text",text:"old_text not found in the file"}],details:{projectId:t.project_id,filename:t.filename,error:"old_text_not_found"}};if(o>1)return{content:[{type:"text",text:`old_text matches ${o} locations \u2014 must match exactly once. Add more surrounding context to make it unique.`}],details:{projectId:t.project_id,filename:t.filename,error:"ambiguous_match",occurrences:o}};let s=n.content.replace(t.old_text,t.new_text),i=r.write(t.project_id,t.filename,s);return{content:[{type:"text",text:`Instruction file edited: ${i.filename} (${i.size} bytes)`}],details:{projectId:t.project_id,filename:i.filename,size:i.size}}}case"delete":return t.filename?t.filename.includes("..")?{content:[{type:"text",text:"Path traversal not allowed"}],details:{error:"path_traversal"}}:r.remove(t.project_id,t.filename)?{content:[{type:"text",text:`Instruction file deleted: ${t.filename}`}],details:{projectId:t.project_id,filename:t.filename}}:{content:[{type:"text",text:`Instruction file not found: ${t.filename}`}],details:{projectId:t.project_id,filename:t.filename,error:"not_found"}}:{content:[{type:"text",text:"filename is required for delete action"}],details:{error:"missing_filename"}};default:return{content:[{type:"text",text:`Unknown action: ${t.action}. Use list, read, write, edit, or delete.`}],details:{error:"unknown_action"}}}}}}var Wh="worktree",Hh={type:"object",properties:{action:{type:"string",enum:["enter","exit","list"],description:`enter: Create and switch to an isolated git worktree branch.
233
235
  exit: Leave worktree (keep or remove it).
234
- list: Show all active worktrees.`},name:{type:"string",description:"Worktree/branch name (for enter). Must be kebab-case, max 64 characters. If omitted, auto-generated from task context."},exitAction:{type:"string",enum:["keep","remove"],description:"For exit: 'keep' retains the worktree for later use; 'remove' deletes it."},discardChanges:{type:"boolean",description:"Required true to confirm discarding uncommitted changes when exitAction='remove'. Safety mechanism to prevent data loss."}},required:["action"]},Uh=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]?$/;function Kl(r){return{name:$h,label:"Git Worktree",description:"Create isolated git worktree branches for parallel development. Each worktree has its own working directory independent of the main branch. Use for: parallel features, safe experimentation, sub-agent isolation. Exit to keep or remove the worktree when done.",parameters:Dh,execute:async(e,t)=>{switch(t.action){case"enter":{if(r.isInWorktree())return{content:[{type:"text",text:"Error: already in a worktree. Exit first before entering another."}],details:{type:"worktree",error:"already_in_worktree"}};if(t.name&&!Uh.test(t.name))return{content:[{type:"text",text:"Error: name must be kebab-case (a-z, 0-9, hyphens), 2-64 characters."}],details:{type:"worktree",error:"invalid_name"}};let n=await r.enterWorktree(t.name);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error||"failed to create worktree"}`}],details:{type:"worktree",error:n.error}};let o=n.worktree;return{content:[{type:"text",text:[`Entered worktree: ${o.name}`,` Branch: ${o.branch}`,` Path: ${o.path}`,"","Working in isolated branch. Changes here do not affect the main branch.","Use action='exit' when done (keep or remove)."].join(`
236
+ list: Show all active worktrees.`},name:{type:"string",description:"Worktree/branch name (for enter). Must be kebab-case, max 64 characters. If omitted, auto-generated from task context."},exitAction:{type:"string",enum:["keep","remove"],description:"For exit: 'keep' retains the worktree for later use; 'remove' deletes it."},discardChanges:{type:"boolean",description:"Required true to confirm discarding uncommitted changes when exitAction='remove'. Safety mechanism to prevent data loss."}},required:["action"]},zh=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]?$/;function ec(r){return{name:Wh,label:"Git Worktree",description:"Create isolated git worktree branches for parallel development. Each worktree has its own working directory independent of the main branch. Use for: parallel features, safe experimentation, sub-agent isolation. Exit to keep or remove the worktree when done.",parameters:Hh,execute:async(e,t)=>{switch(t.action){case"enter":{if(r.isInWorktree())return{content:[{type:"text",text:"Error: already in a worktree. Exit first before entering another."}],details:{type:"worktree",error:"already_in_worktree"}};if(t.name&&!zh.test(t.name))return{content:[{type:"text",text:"Error: name must be kebab-case (a-z, 0-9, hyphens), 2-64 characters."}],details:{type:"worktree",error:"invalid_name"}};let n=await r.enterWorktree(t.name);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error||"failed to create worktree"}`}],details:{type:"worktree",error:n.error}};let o=n.worktree;return{content:[{type:"text",text:[`Entered worktree: ${o.name}`,` Branch: ${o.branch}`,` Path: ${o.path}`,"","Working in isolated branch. Changes here do not affect the main branch.","Use action='exit' when done (keep or remove)."].join(`
235
237
  `)}],details:{type:"worktree",action:"enter",name:o.name,branch:o.branch,path:o.path}}}case"exit":{if(!r.isInWorktree())return{content:[{type:"text",text:"Error: not in a worktree."}],details:{type:"worktree",error:"not_in_worktree"}};let n=t.exitAction||"keep";if(n==="remove"){let i=r.currentWorktree?.();if(i&&(i.hasChanges||i.unpushedCommits>0)&&!t.discardChanges){let a=[];return i.hasChanges&&a.push("uncommitted changes"),i.unpushedCommits>0&&a.push(`${i.unpushedCommits} unpushed commit(s)`),{content:[{type:"text",text:`Error: worktree has ${a.join(" and ")}. Set discardChanges=true to confirm removal, or use exitAction='keep'.`}],details:{type:"worktree",error:"has_changes",hasChanges:i.hasChanges,unpushedCommits:i.unpushedCommits}}}}let o=await r.exitWorktree(n,t.discardChanges);return o.success?{content:[{type:"text",text:`Exited worktree. ${n==="keep"?"Worktree kept for later use.":"Worktree removed."}
236
238
  Restored to: ${o.previousCwd||"main workspace"}`}],details:{type:"worktree",action:"exit",exitAction:n,previousCwd:o.previousCwd}}:{content:[{type:"text",text:`Error: ${o.error||"failed to exit worktree"}`}],details:{type:"worktree",error:o.error}}}case"list":{let n=await r.listWorktrees();if(!n.worktrees||n.worktrees.length===0)return{content:[{type:"text",text:"No worktrees (only the main working tree)."}],details:{type:"worktree",action:"list",count:0}};let o=[`Worktrees (${n.worktrees.length}):`,""];for(let s of n.worktrees){let i=s.isCurrent?" \u2190 current":"",a=s.hasChanges?" (has changes)":"";o.push(` ${s.name} [${s.branch}]${i}${a}`),o.push(` path: ${s.path}`)}return{content:[{type:"text",text:o.join(`
237
- `)}],details:{type:"worktree",action:"list",count:n.worktrees.length}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"worktree",error:"unknown_action"}}}}}}import{execFile as Nh}from"node:child_process";import{promisify as jh}from"node:util";import{join as nt,resolve as Jl,basename as ns}from"node:path";import{mkdir as tc,rm as nc,symlink as Fh,readdir as P_,stat as Bh}from"node:fs/promises";var Xt=jh(Nh),Wh=/^[a-zA-Z0-9._-]+$/,Yl=64;function oc(r){if(r.length>Yl)throw new Error(`Invalid worktree name: must be ${Yl} characters or fewer (got ${r.length})`);for(let e of r.split("/")){if(e==="."||e==="..")throw new Error(`Invalid worktree name "${r}": must not contain "." or ".." path segments`);if(!Wh.test(e))throw new Error(`Invalid worktree name "${r}": segment must contain only letters, digits, dots, underscores, and dashes`)}}function os(r){return r.replaceAll("/","+")}function rc(r){return`worktree-${os(r)}`}var ve=null;async function le(r,e){try{let{stdout:t,stderr:n}=await Xt("git",r,{cwd:e??process.cwd(),env:{...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:""},timeout:3e4});return{stdout:t,stderr:n,code:0}}catch(t){let n=t;return{stdout:n.stdout??"",stderr:n.stderr??String(t),code:n.code??1}}}async function Yt(r){let{stdout:e,code:t}=await le(["rev-parse","--show-toplevel"],r);return t===0?e.trim():null}async function Xl(r){let{stdout:e,code:t}=await le(["status","--porcelain"],r);return t!==0?-1:e.trim().split(`
238
- `).filter(Boolean).length}async function Ql(r,e){let{stdout:t,code:n}=await le(["rev-list",`origin/${e}..${e}`,"--count"],r);return n!==0?0:parseInt(t.trim(),10)||0}async function sc(r,e,t,n){for(let o of t){if(o.includes("..")||o.startsWith("/")||o.startsWith("\\")){n?.warn(`[worktree] skipping symlink for "${o}": path traversal detected`);continue}let s=nt(r,o),i=nt(e,o);try{await Fh(s,i,"dir"),n?.info(`[worktree] symlinked ${o} from main repo to worktree`)}catch(a){let l=a.code;l!=="ENOENT"&&l!=="EEXIST"&&n?.warn(`[worktree] failed to symlink ${o} (${l??"unknown"}): ${a}`)}}}async function Gh(r,e,t){let{code:n,stderr:o}=await le(["sparse-checkout","set","--cone","--",...t],r);if(n!==0)throw await le(["worktree","remove","--force",r],e),new Error(`Failed to configure sparse-checkout: ${o}`);let{code:s,stderr:i}=await le(["checkout","HEAD"],r);if(s!==0)throw await le(["worktree","remove","--force",r],e),new Error(`Failed to checkout sparse worktree: ${i}`);return!0}async function Hh(){try{return await Xt("tmux",["-V"],{timeout:5e3}),!0}catch{return!1}}function Vh(r,e){return`${ns(r)}_${e}`.replace(/[/.]/g,"_")}async function zh(r,e){if(!await Hh())return null;try{return await Xt("tmux",["new-session","-d","-s",e,"-c",r],{timeout:1e4}),e}catch{return null}}async function Zl(r){try{return await Xt("tmux",["kill-session","-t",r],{timeout:5e3}),!0}catch{return!1}}async function ec(r,e,t,n){let o=ia(e),s=nt(o,r);try{if(!(await Bh(s)).isFile())return null}catch{return null}try{let{stdout:i,stderr:a}=await Xt(s,[],{cwd:e,env:{...process.env,...t},timeout:3e4});return n?.info(`[worktree] hook ${r} succeeded: ${i.trim()}`),i.trim()||null}catch(i){return n?.warn(`[worktree] hook ${r} failed: ${i}`),null}}async function ic(r,e,t){oc(e);let n=os(e),o=rc(e),s=nt(r,".worktrees"),i=nt(s,n);await tc(s,{recursive:!0});let{code:a,stderr:l}=await le(["worktree","add","-B",o,i,"HEAD"],r);return a!==0?(t?.warn(`[worktree] agent worktree creation failed: ${l}`),null):(await sc(r,i,["node_modules"],t),t?.info(`[worktree] agent worktree created: ${e} at ${i}`),{worktreePath:i,branch:o})}async function ac(r,e,t,n){let{code:o}=await le(["worktree","remove","--force",e],r);return o!==0&&(await nc(e,{recursive:!0,force:!0}).catch(()=>{}),await le(["worktree","prune"],r)),await le(["branch","-D",t],r),n?.info(`[worktree] agent worktree removed: ${e}`),!0}function lc(r){let{log:e,symlinkDirs:t=["node_modules"],sparsePaths:n}=r;return{async enterWorktree(o){try{let s=Date.now(),i=await Yt();if(!i)return{success:!1,error:"Not in a git repository"};let a=await ec("worktree-create",i,{WORKTREE_NAME:o??""},e);if(a){let D=process.cwd();return process.chdir(a),ve={originalCwd:D,worktreePath:a,worktreeName:o??ns(a),worktreeBranch:"",hookBased:!0,creationDurationMs:Date.now()-s},{success:!0,worktree:{name:ve.worktreeName,path:a,branch:"",isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let l=o??`agent-${Date.now().toString(36)}`;oc(l);let u=os(l),c=rc(l),d=nt(i,".worktrees"),p=nt(d,u);await tc(d,{recursive:!0});let{stdout:m}=await le(["worktree","list","--porcelain"],i),g=m.split(`
239
- `).find(D=>D.startsWith("worktree ")&&D.includes(u));if(g){let D=g.replace("worktree ","").trim(),L=process.cwd();return process.chdir(D),ve={originalCwd:L,worktreePath:D,worktreeName:l,worktreeBranch:c},e.info(`[worktree] resumed existing worktree: ${l} at ${D}`),{success:!0,worktree:{name:l,path:D,branch:c,isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let f=n&&n.length>0,b=["worktree","add"];f&&b.push("--no-checkout"),b.push("-B",c,p,"HEAD");let{code:T,stderr:w}=await le(b,i);if(T!==0)return{success:!1,error:`git worktree add failed: ${w.trim()}`};let _=!1;f&&n&&(await Gh(p,i,n),_=!0),await sc(i,p,t,e);let y=process.cwd();process.chdir(p);let C=Vh(i,c),E=await zh(p,C);return ve={originalCwd:y,worktreePath:p,worktreeName:l,worktreeBranch:c,tmuxSessionName:E??void 0,creationDurationMs:Date.now()-s,usedSparsePaths:_},e.info(`[worktree] entered: ${l} at ${p}`),{success:!0,worktree:{name:l,path:p,branch:c,isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}},async exitWorktree(o,s){if(!ve)return{success:!1,error:"Not in a worktree"};try{let i=ve,a=await Yt(i.originalCwd);if(!a)return{success:!1,error:"Original git root not found"};if(o==="remove"){let l=await Xl(i.worktreePath),u=await Ql(i.worktreePath,i.worktreeBranch);if((l>0||u>0)&&!s)return{success:!1,error:`Worktree has ${l} uncommitted change(s) and ${u} unpushed commit(s). Set discardChanges=true to confirm.`};process.chdir(i.originalCwd),ve=null,i.tmuxSessionName&&await Zl(i.tmuxSessionName),await ec("worktree-remove",a,{WORKTREE_PATH:i.worktreePath},e);let c=["worktree","remove"];s&&c.push("--force"),c.push(i.worktreePath);let{code:d,stderr:p}=await le(c,a);d!==0&&(e.warn(`[worktree] git worktree remove failed: ${p.trim()}, cleaning up manually`),await nc(i.worktreePath,{recursive:!0,force:!0}).catch(()=>{}),await le(["worktree","prune"],a)),await le(["branch","-D",i.worktreeBranch],a),e.info(`[worktree] removed: ${i.worktreeName}`)}else process.chdir(i.originalCwd),i.tmuxSessionName&&await Zl(i.tmuxSessionName),ve=null,e.info(`[worktree] exited (kept): ${i.worktreeName}`);return{success:!0,previousCwd:i.originalCwd}}catch(i){return{success:!1,error:i instanceof Error?i.message:String(i)}}},async listWorktrees(){try{let{stdout:o,code:s}=await le(["worktree","list","--porcelain"]);if(s!==0)return{success:!0,worktrees:[]};let i=[],a=process.cwd(),l=o.split(`
239
+ `)}],details:{type:"worktree",action:"list",count:n.worktrees.length}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"worktree",error:"unknown_action"}}}}}}import{execFile as Vh}from"node:child_process";import{promisify as qh}from"node:util";import{join as at,resolve as tc,basename as ds}from"node:path";import{mkdir as ac,rm as lc,symlink as Kh,readdir as J_,stat as Jh}from"node:fs/promises";var rn=qh(Vh),Yh=/^[a-zA-Z0-9._-]+$/,nc=64;function cc(r){if(r.length>nc)throw new Error(`Invalid worktree name: must be ${nc} characters or fewer (got ${r.length})`);for(let e of r.split("/")){if(e==="."||e==="..")throw new Error(`Invalid worktree name "${r}": must not contain "." or ".." path segments`);if(!Yh.test(e))throw new Error(`Invalid worktree name "${r}": segment must contain only letters, digits, dots, underscores, and dashes`)}}function us(r){return r.replaceAll("/","+")}function dc(r){return`worktree-${us(r)}`}var Se=null;async function ue(r,e){try{let{stdout:t,stderr:n}=await rn("git",r,{cwd:e??process.cwd(),env:{...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:""},timeout:3e4});return{stdout:t,stderr:n,code:0}}catch(t){let n=t;return{stdout:n.stdout??"",stderr:n.stderr??String(t),code:n.code??1}}}async function on(r){let{stdout:e,code:t}=await ue(["rev-parse","--show-toplevel"],r);return t===0?e.trim():null}async function oc(r){let{stdout:e,code:t}=await ue(["status","--porcelain"],r);return t!==0?-1:e.trim().split(`
240
+ `).filter(Boolean).length}async function rc(r,e){let{stdout:t,code:n}=await ue(["rev-list",`origin/${e}..${e}`,"--count"],r);return n!==0?0:parseInt(t.trim(),10)||0}async function uc(r,e,t,n){for(let o of t){if(o.includes("..")||o.startsWith("/")||o.startsWith("\\")){n?.warn(`[worktree] skipping symlink for "${o}": path traversal detected`);continue}let s=at(r,o),i=at(e,o);try{await Kh(s,i,"dir"),n?.info(`[worktree] symlinked ${o} from main repo to worktree`)}catch(a){let c=a.code;c!=="ENOENT"&&c!=="EEXIST"&&n?.warn(`[worktree] failed to symlink ${o} (${c??"unknown"}): ${a}`)}}}async function Xh(r,e,t){let{code:n,stderr:o}=await ue(["sparse-checkout","set","--cone","--",...t],r);if(n!==0)throw await ue(["worktree","remove","--force",r],e),new Error(`Failed to configure sparse-checkout: ${o}`);let{code:s,stderr:i}=await ue(["checkout","HEAD"],r);if(s!==0)throw await ue(["worktree","remove","--force",r],e),new Error(`Failed to checkout sparse worktree: ${i}`);return!0}async function Qh(){try{return await rn("tmux",["-V"],{timeout:5e3}),!0}catch{return!1}}function Zh(r,e){return`${ds(r)}_${e}`.replace(/[/.]/g,"_")}async function ey(r,e){if(!await Qh())return null;try{return await rn("tmux",["new-session","-d","-s",e,"-c",r],{timeout:1e4}),e}catch{return null}}async function sc(r){try{return await rn("tmux",["kill-session","-t",r],{timeout:5e3}),!0}catch{return!1}}async function ic(r,e,t,n){let o=ma(e),s=at(o,r);try{if(!(await Jh(s)).isFile())return null}catch{return null}try{let{stdout:i,stderr:a}=await rn(s,[],{cwd:e,env:{...process.env,...t},timeout:3e4});return n?.info(`[worktree] hook ${r} succeeded: ${i.trim()}`),i.trim()||null}catch(i){return n?.warn(`[worktree] hook ${r} failed: ${i}`),null}}async function pc(r,e,t){cc(e);let n=us(e),o=dc(e),s=at(r,".worktrees"),i=at(s,n);await ac(s,{recursive:!0});let{code:a,stderr:c}=await ue(["worktree","add","-B",o,i,"HEAD"],r);return a!==0?(t?.warn(`[worktree] agent worktree creation failed: ${c}`),null):(await uc(r,i,["node_modules"],t),t?.info(`[worktree] agent worktree created: ${e} at ${i}`),{worktreePath:i,branch:o})}async function mc(r,e,t,n){let{code:o}=await ue(["worktree","remove","--force",e],r);return o!==0&&(await lc(e,{recursive:!0,force:!0}).catch(()=>{}),await ue(["worktree","prune"],r)),await ue(["branch","-D",t],r),n?.info(`[worktree] agent worktree removed: ${e}`),!0}function gc(r){let{log:e,symlinkDirs:t=["node_modules"],sparsePaths:n}=r;return{async enterWorktree(o){try{let s=Date.now(),i=await on();if(!i)return{success:!1,error:"Not in a git repository"};let a=await ic("worktree-create",i,{WORKTREE_NAME:o??""},e);if(a){let O=process.cwd();return process.chdir(a),Se={originalCwd:O,worktreePath:a,worktreeName:o??ds(a),worktreeBranch:"",hookBased:!0,creationDurationMs:Date.now()-s},{success:!0,worktree:{name:Se.worktreeName,path:a,branch:"",isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let c=o??`agent-${Date.now().toString(36)}`;cc(c);let d=us(c),l=dc(c),u=at(i,".worktrees"),p=at(u,d);await ac(u,{recursive:!0});let{stdout:m}=await ue(["worktree","list","--porcelain"],i),g=m.split(`
241
+ `).find(O=>O.startsWith("worktree ")&&O.includes(d));if(g){let O=g.replace("worktree ","").trim(),$=process.cwd();return process.chdir(O),Se={originalCwd:$,worktreePath:O,worktreeName:c,worktreeBranch:l},e.info(`[worktree] resumed existing worktree: ${c} at ${O}`),{success:!0,worktree:{name:c,path:O,branch:l,isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let f=n&&n.length>0,b=["worktree","add"];f&&b.push("--no-checkout"),b.push("-B",l,p,"HEAD");let{code:w,stderr:T}=await ue(b,i);if(w!==0)return{success:!1,error:`git worktree add failed: ${T.trim()}`};let _=!1;f&&n&&(await Xh(p,i,n),_=!0),await uc(i,p,t,e);let R=process.cwd();process.chdir(p);let y=Zh(i,l),I=await ey(p,y);return Se={originalCwd:R,worktreePath:p,worktreeName:c,worktreeBranch:l,tmuxSessionName:I??void 0,creationDurationMs:Date.now()-s,usedSparsePaths:_},e.info(`[worktree] entered: ${c} at ${p}`),{success:!0,worktree:{name:c,path:p,branch:l,isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}},async exitWorktree(o,s){if(!Se)return{success:!1,error:"Not in a worktree"};try{let i=Se,a=await on(i.originalCwd);if(!a)return{success:!1,error:"Original git root not found"};if(o==="remove"){let c=await oc(i.worktreePath),d=await rc(i.worktreePath,i.worktreeBranch);if((c>0||d>0)&&!s)return{success:!1,error:`Worktree has ${c} uncommitted change(s) and ${d} unpushed commit(s). Set discardChanges=true to confirm.`};process.chdir(i.originalCwd),Se=null,i.tmuxSessionName&&await sc(i.tmuxSessionName),await ic("worktree-remove",a,{WORKTREE_PATH:i.worktreePath},e);let l=["worktree","remove"];s&&l.push("--force"),l.push(i.worktreePath);let{code:u,stderr:p}=await ue(l,a);u!==0&&(e.warn(`[worktree] git worktree remove failed: ${p.trim()}, cleaning up manually`),await lc(i.worktreePath,{recursive:!0,force:!0}).catch(()=>{}),await ue(["worktree","prune"],a)),await ue(["branch","-D",i.worktreeBranch],a),e.info(`[worktree] removed: ${i.worktreeName}`)}else process.chdir(i.originalCwd),i.tmuxSessionName&&await sc(i.tmuxSessionName),Se=null,e.info(`[worktree] exited (kept): ${i.worktreeName}`);return{success:!0,previousCwd:i.originalCwd}}catch(i){return{success:!1,error:i instanceof Error?i.message:String(i)}}},async listWorktrees(){try{let{stdout:o,code:s}=await ue(["worktree","list","--porcelain"]);if(s!==0)return{success:!0,worktrees:[]};let i=[],a=process.cwd(),c=o.split(`
240
242
 
241
- `).filter(Boolean);for(let u of l){let c=u.split(`
242
- `),d="",p="";for(let b of c)b.startsWith("worktree ")&&(d=b.slice(9).trim()),b.startsWith("branch ")&&(p=b.slice(7).trim().replace("refs/heads/",""));if(!d)continue;let m=Jl(d)===Jl(a),g=await Xl(d),f=await Ql(d,p);i.push({name:p.startsWith("worktree-")?p.slice(9):ns(d),path:d,branch:p,isCurrent:m,hasChanges:g>0,unpushedCommits:f})}return{success:!0,worktrees:i}}catch(o){return{success:!1,error:o instanceof Error?o.message:String(o)}}},isInWorktree(){return ve!==null},currentWorktree(){return ve?{name:ve.worktreeName,path:ve.worktreePath,branch:ve.worktreeBranch,isCurrent:!0,hasChanges:!1,unpushedCommits:0}:null}}}import{readFile as qh,writeFile as Kh}from"node:fs/promises";import*as cc from"node:path";var Jh={type:"object",properties:{notebook_path:{type:"string",description:"Absolute path to the .ipynb notebook file."},cell_number:{type:"number",description:"1-based cell number to operate on. For 'insert', the new cell is inserted after this cell (use 0 to insert at the beginning)."},new_source:{type:"string",description:"New cell content. Required for 'replace' and 'insert' modes."},cell_type:{type:"string",enum:["code","markdown"],description:"Cell type for 'insert' mode. Default: 'code'."},edit_mode:{type:"string",enum:["replace","insert","delete"],description:"Edit operation: replace (default), insert (after cell_number), or delete."}},required:["notebook_path","cell_number"]};function uc(r){let e=r.split(`
243
+ `).filter(Boolean);for(let d of c){let l=d.split(`
244
+ `),u="",p="";for(let b of l)b.startsWith("worktree ")&&(u=b.slice(9).trim()),b.startsWith("branch ")&&(p=b.slice(7).trim().replace("refs/heads/",""));if(!u)continue;let m=tc(u)===tc(a),g=await oc(u),f=await rc(u,p);i.push({name:p.startsWith("worktree-")?p.slice(9):ds(u),path:u,branch:p,isCurrent:m,hasChanges:g>0,unpushedCommits:f})}return{success:!0,worktrees:i}}catch(o){return{success:!1,error:o instanceof Error?o.message:String(o)}}},isInWorktree(){return Se!==null},currentWorktree(){return Se?{name:Se.worktreeName,path:Se.worktreePath,branch:Se.worktreeBranch,isCurrent:!0,hasChanges:!1,unpushedCommits:0}:null}}}import{readFile as ty,writeFile as ny}from"node:fs/promises";import*as fc from"node:path";var oy={type:"object",properties:{notebook_path:{type:"string",description:"Absolute path to the .ipynb notebook file."},cell_number:{type:"number",description:"1-based cell number to operate on. For 'insert', the new cell is inserted after this cell (use 0 to insert at the beginning)."},new_source:{type:"string",description:"New cell content. Required for 'replace' and 'insert' modes."},cell_type:{type:"string",enum:["code","markdown"],description:"Cell type for 'insert' mode. Default: 'code'."},edit_mode:{type:"string",enum:["replace","insert","delete"],description:"Edit operation: replace (default), insert (after cell_number), or delete."}},required:["notebook_path","cell_number"]};function hc(r){let e=r.split(`
243
245
  `);return e.map((t,n)=>n<e.length-1?t+`
244
- `:t)}function dc(r){return r.join("")}function Yh(r,e){let t=dc(r.source).trim(),n=t.length>80?t.slice(0,80)+"...":t;return`Cell ${e+1} [${r.cell_type}]: ${n}`}function Xh(r,e){let t={cell_type:r,source:uc(e),metadata:{}};return r==="code"&&(t.execution_count=null,t.outputs=[]),t}function pc(){return{name:"notebook_edit",label:"Notebook Edit",description:"Edit Jupyter notebook (.ipynb) files at the cell level. Supports replacing cell content, inserting new cells, and deleting cells. Operates on the notebook's JSON structure directly.",parameters:Jh,shouldDefer:!0,isConcurrencySafe:!1,isReadOnly:!1,searchHint:"jupyter notebook ipynb cell edit insert delete",execute:async(r,e)=>{let{notebook_path:t,cell_number:n,edit_mode:o="replace"}=e,s=cc.extname(t).toLowerCase();if(s!==".ipynb")return{content:[{type:"text",text:`Error: File must be a .ipynb notebook. Got: ${s}`}],details:{error:"invalid_extension"}};let i;try{i=await qh(t,"utf-8")}catch(m){return{content:[{type:"text",text:`Error reading notebook: ${m.message}`}],details:{error:"read_failed"}}}let a;try{a=JSON.parse(i)}catch{return{content:[{type:"text",text:"Error: File is not valid JSON (not a valid .ipynb)."}],details:{error:"parse_failed"}}}if(!Array.isArray(a.cells))return{content:[{type:"text",text:"Error: Notebook has no cells array."}],details:{error:"invalid_notebook"}};let l=a.cells.length,u=n-1;if(o==="insert"){if(n<0||n>l)return{content:[{type:"text",text:`Error: cell_number ${n} out of range. For insert, use 0-${l}.`}],details:{error:"out_of_range"}}}else if(u<0||u>=l)return{content:[{type:"text",text:`Error: cell_number ${n} out of range. Notebook has ${l} cell(s).`}],details:{error:"out_of_range"}};let c;switch(o){case"replace":{if(!e.new_source)return{content:[{type:"text",text:"Error: new_source is required for 'replace' mode."}],details:{error:"missing_source"}};let m=a.cells[u],g=dc(m.source);m.source=uc(e.new_source),m.cell_type==="code"&&(m.execution_count=null,m.outputs=[]),c=`Replaced cell ${n} [${m.cell_type}].
246
+ `:t)}function yc(r){return r.join("")}function ry(r,e){let t=yc(r.source).trim(),n=t.length>80?t.slice(0,80)+"...":t;return`Cell ${e+1} [${r.cell_type}]: ${n}`}function sy(r,e){let t={cell_type:r,source:hc(e),metadata:{}};return r==="code"&&(t.execution_count=null,t.outputs=[]),t}function bc(){return{name:"notebook_edit",label:"Notebook Edit",description:"Edit Jupyter notebook (.ipynb) files at the cell level. Supports replacing cell content, inserting new cells, and deleting cells. Operates on the notebook's JSON structure directly.",parameters:oy,shouldDefer:!0,isConcurrencySafe:!1,isReadOnly:!1,searchHint:"jupyter notebook ipynb cell edit insert delete",execute:async(r,e)=>{let{notebook_path:t,cell_number:n,edit_mode:o="replace"}=e,s=fc.extname(t).toLowerCase();if(s!==".ipynb")return{content:[{type:"text",text:`Error: File must be a .ipynb notebook. Got: ${s}`}],details:{error:"invalid_extension"}};let i;try{i=await ty(t,"utf-8")}catch(m){return{content:[{type:"text",text:`Error reading notebook: ${m.message}`}],details:{error:"read_failed"}}}let a;try{a=JSON.parse(i)}catch{return{content:[{type:"text",text:"Error: File is not valid JSON (not a valid .ipynb)."}],details:{error:"parse_failed"}}}if(!Array.isArray(a.cells))return{content:[{type:"text",text:"Error: Notebook has no cells array."}],details:{error:"invalid_notebook"}};let c=a.cells.length,d=n-1;if(o==="insert"){if(n<0||n>c)return{content:[{type:"text",text:`Error: cell_number ${n} out of range. For insert, use 0-${c}.`}],details:{error:"out_of_range"}}}else if(d<0||d>=c)return{content:[{type:"text",text:`Error: cell_number ${n} out of range. Notebook has ${c} cell(s).`}],details:{error:"out_of_range"}};let l;switch(o){case"replace":{if(!e.new_source)return{content:[{type:"text",text:"Error: new_source is required for 'replace' mode."}],details:{error:"missing_source"}};let m=a.cells[d],g=yc(m.source);m.source=hc(e.new_source),m.cell_type==="code"&&(m.execution_count=null,m.outputs=[]),l=`Replaced cell ${n} [${m.cell_type}].
245
247
  Old: ${g.slice(0,120)}${g.length>120?"...":""}
246
- New: ${e.new_source.slice(0,120)}${e.new_source.length>120?"...":""}`;break}case"insert":{if(!e.new_source)return{content:[{type:"text",text:"Error: new_source is required for 'insert' mode."}],details:{error:"missing_source"}};let m=e.cell_type??"code",g=Xh(m,e.new_source);a.cells.splice(n,0,g),c=`Inserted new ${m} cell after position ${n}. Total cells: ${a.cells.length}.`;break}case"delete":{let m=a.cells.splice(u,1)[0];c=`Deleted cell ${n} [${m.cell_type}]. Remaining: ${a.cells.length} cells.`;break}default:return{content:[{type:"text",text:`Error: unknown edit_mode "${o}". Use replace, insert, or delete.`}],details:{error:"unknown_mode"}}}try{let m=JSON.stringify(a,null,1)+`
247
- `;await Kh(t,m,"utf-8")}catch(m){return{content:[{type:"text",text:`Error writing notebook: ${m.message}`}],details:{error:"write_failed"}}}let d=a.cells.slice(0,10).map((m,g)=>Yh(m,g)).join(`
248
+ New: ${e.new_source.slice(0,120)}${e.new_source.length>120?"...":""}`;break}case"insert":{if(!e.new_source)return{content:[{type:"text",text:"Error: new_source is required for 'insert' mode."}],details:{error:"missing_source"}};let m=e.cell_type??"code",g=sy(m,e.new_source);a.cells.splice(n,0,g),l=`Inserted new ${m} cell after position ${n}. Total cells: ${a.cells.length}.`;break}case"delete":{let m=a.cells.splice(d,1)[0];l=`Deleted cell ${n} [${m.cell_type}]. Remaining: ${a.cells.length} cells.`;break}default:return{content:[{type:"text",text:`Error: unknown edit_mode "${o}". Use replace, insert, or delete.`}],details:{error:"unknown_mode"}}}try{let m=JSON.stringify(a,null,1)+`
249
+ `;await ny(t,m,"utf-8")}catch(m){return{content:[{type:"text",text:`Error writing notebook: ${m.message}`}],details:{error:"write_failed"}}}let u=a.cells.slice(0,10).map((m,g)=>ry(m,g)).join(`
248
250
  `),p=a.cells.length>10?`
249
- ... and ${a.cells.length-10} more cells`:"";return{content:[{type:"text",text:`${c}
251
+ ... and ${a.cells.length-10} more cells`:"";return{content:[{type:"text",text:`${l}
250
252
 
251
253
  Current cells:
252
- ${d}${p}`}],details:{type:"notebook_edit",edit_mode:o,cell_number:n,total_cells:a.cells.length}}}}}import{readFile as Qh,readdir as Zh}from"node:fs/promises";import*as gc from"node:path";import{existsSync as ey}from"node:fs";var ty={type:"object",properties:{action:{type:"string",enum:["list","run","describe"],description:`list: Show available workflows.
254
+ ${u}${p}`}],details:{type:"notebook_edit",edit_mode:o,cell_number:n,total_cells:a.cells.length}}}}}import{readFile as iy,readdir as ay}from"node:fs/promises";import*as Tc from"node:path";import{existsSync as ly}from"node:fs";var cy={type:"object",properties:{action:{type:"string",enum:["list","run","describe"],description:`list: Show available workflows.
253
255
  run: Execute a workflow by name.
254
- describe: Show workflow steps and variables.`},workflow:{type:"string",description:"Workflow name (required for 'run' and 'describe')."},variables:{type:"object",description:"Variable overrides (key-value pairs) for the workflow run.",additionalProperties:{type:"string"}}},required:["action"]};async function rs(r){let e=new Map,t=na(r);await mc(t,e);let n=ea();return await mc(n,e),e}async function mc(r,e){if(ey(r))try{let t=await Zh(r,{withFileTypes:!0});for(let n of t)if(n.isFile()&&n.name.endsWith(".json")){let o=n.name.replace(/\.json$/,"");e.has(o)||e.set(o,gc.join(r,n.name))}}catch{}}async function ss(r){let e=await Qh(r,"utf-8");return JSON.parse(e)}function ny(r){let e=new Map(r.map(s=>[s.id,s])),t=new Set,n=[];function o(s,i){if(t.has(s))return;if(i.has(s))throw new Error(`Circular dependency detected at step: ${s}`);i.add(s);let a=e.get(s);if(!a)throw new Error(`Unknown step dependency: ${s}`);for(let l of a.dependsOn??[])o(l,i);i.delete(s),t.add(s),n.push(a)}for(let s of r)o(s.id,new Set);return n}function oy(r,e,t){let n={};for(let[o,s]of Object.entries(r))if(typeof s=="string"){let i=s;i=i.replace(/\$\{var\.(\w+)\}/g,(a,l)=>e[l]??`\${var.${l}}`),i=i.replace(/\$\{step\.(\w+)\.result\}/g,(a,l)=>t.get(l)?.output??""),n[o]=i}else n[o]=s;return n}function fc(r){return{name:"workflow",label:"Workflow",description:"Execute predefined automation workflows. Workflows are step-based pipelines defined as JSON files in .qlogicagent/workflows/ or ~/.qlogicagent/workflows/. Steps run in dependency order, support variable interpolation, and can reference previous step outputs via ${step.<id>.result}.",parameters:ty,shouldDefer:!0,isConcurrencySafe:!1,isReadOnly:!1,searchHint:"workflow pipeline automation steps DAG",execute:async(e,t,n)=>{let o=r.getCwd();switch(t.action){case"list":{let s=await rs(o);if(s.size===0)return{content:[{type:"text",text:"No workflows found. Create .json files in .qlogicagent/workflows/ or ~/.qlogicagent/workflows/."}],details:{type:"workflow",action:"list",count:0}};let i=["Available workflows:"];for(let[a,l]of s)try{let u=await ss(l);i.push(` - ${a}: ${u.description??"(no description)"} (${u.steps.length} steps)`)}catch{i.push(` - ${a}: (failed to load)`)}return{content:[{type:"text",text:i.join(`
255
- `)}],details:{type:"workflow",action:"list",count:s.size}}}case"describe":{if(!t.workflow)return{content:[{type:"text",text:"Error: 'workflow' parameter is required for 'describe'."}],details:{error:"missing_workflow"}};let i=(await rs(o)).get(t.workflow);if(!i)return{content:[{type:"text",text:`Error: Workflow "${t.workflow}" not found.`}],details:{error:"not_found"}};let a=await ss(i),l=[`Workflow: ${a.name}`,a.description?`Description: ${a.description}`:"","","Steps:"];for(let u of a.steps){let c=u.dependsOn?.length?` (after: ${u.dependsOn.join(", ")})`:"";l.push(` ${u.id}: ${u.label??u.tool}${c}`),l.push(` tool: ${u.tool}`),l.push(` args: ${JSON.stringify(u.args)}`)}if(a.variables&&Object.keys(a.variables).length>0){l.push("","Variables (defaults):");for(let[u,c]of Object.entries(a.variables))l.push(` ${u} = ${c}`)}return{content:[{type:"text",text:l.filter(Boolean).join(`
256
- `)}],details:{type:"workflow",action:"describe",workflow:a.name}}}case"run":{if(!t.workflow)return{content:[{type:"text",text:"Error: 'workflow' parameter is required for 'run'."}],details:{error:"missing_workflow"}};let i=(await rs(o)).get(t.workflow);if(!i)return{content:[{type:"text",text:`Error: Workflow "${t.workflow}" not found.`}],details:{error:"not_found"}};let a=await ss(i),l={...a.variables,...t.variables},u;try{u=ny(a.steps)}catch(m){return{content:[{type:"text",text:`Error: ${m.message}`}],details:{error:"dag_error"}}}let c=new Map,d=[`Running workflow: ${a.name}`,""],p=!0;for(let m of u){if(n?.aborted){d.push(`\u26A1 Aborted at step: ${m.id}`),p=!1;break}let g=(m.dependsOn??[]).some(T=>!c.get(T)?.success),f=m.condition??"on_success";if(f==="on_success"&&g){d.push(`\u23ED Skipped ${m.id} (dependency failed)`),c.set(m.id,{stepId:m.id,success:!1,output:"",error:"dependency_failed"}),p=!1;continue}if(f==="on_failure"&&!g){d.push(`\u23ED Skipped ${m.id} (no failure to handle)`),c.set(m.id,{stepId:m.id,success:!0,output:""});continue}d.push(`\u25B6 ${m.id}: ${m.label??m.tool}`);let b=oy(m.args,l,c);try{let T=await r.invokeTool(m.tool,b,n),w=!T.error;if(c.set(m.id,{stepId:m.id,success:w,output:T.result,error:T.error}),w){let _=T.result.length>200?T.result.slice(0,200)+"...":T.result;d.push(` \u2705 ${_}`)}else d.push(` \u274C ${T.error}`),p=!1}catch(T){let w=T.message;c.set(m.id,{stepId:m.id,success:!1,output:"",error:w}),d.push(` \u274C ${w}`),p=!1}}return d.push("",p?"Workflow completed successfully.":"Workflow completed with errors."),{content:[{type:"text",text:d.join(`
257
- `)}],details:{type:"workflow",action:"run",workflow:a.name,success:p,stepsExecuted:c.size,totalSteps:a.steps.length}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}". Use list, run, or describe.`}],details:{error:"unknown_action"}}}}}}var ry="sleep",sy={type:"object",properties:{duration:{type:"number",description:"Duration to sleep in seconds (1\u20133600). Prefer short sleeps (10\u201360s) to stay responsive.",minimum:1,maximum:3600},reason:{type:"string",description:'Brief reason for sleeping. Examples: "waiting for build to finish", "nothing to do", "user asked to rest".'}},required:["duration"]};function hc(r){return{name:ry,label:"Sleep",shouldDefer:!0,isConcurrencySafe:!0,isReadOnly:!0,searchHint:"wait sleep rest idle tick proactive",description:["Wait for a specified duration. The user can interrupt the sleep at any time.","","Use this when:","\u2022 You have nothing useful to do right now","\u2022 You're waiting for an external process to complete","\u2022 The user tells you to sleep or rest","\u2022 You receive a <tick> check-in with no actionable work","","Prefer this over `exec(sleep ...)` \u2014 it doesn't hold a shell process.","You can call this concurrently with other tools \u2014 it won't interfere with them.","","Each wake-up costs an API call, but the prompt cache expires after 5 minutes of inactivity \u2014 balance accordingly."].join(`
258
- `),parameters:sy,execute:async(e,t,n)=>{let o=Math.max(1,Math.min(3600,Math.round(t.duration))),s=o*1e3,i=new AbortController,a=()=>i.abort();n?.addEventListener("abort",a,{once:!0}),n?.aborted&&i.abort();try{let l=await r.sleep(s,i.signal),u=[];return l.interrupted?(u.push(`Sleep interrupted after ${l.sleptSeconds}s.`),l.interruptReason&&u.push(`Reason: ${l.interruptReason}`),u.push("Check for new messages or tasks.")):u.push(`Slept for ${l.sleptSeconds}s. Waking up.`),{content:[{type:"text",text:u.join(`
259
- `)}],details:{...l,requestedSeconds:o}}}finally{n?.removeEventListener("abort",a)}}}}var iy="tool_search",ay={type:"object",properties:{query:{type:"string",description:'Search query for tools. Use "select:toolName" to directly activate a deferred tool, or provide keywords to search tool names/descriptions. Prefix a term with "+" to mark it as required (all +terms must match).'},maxResults:{type:"number",description:"Maximum number of results to return (default: 5)."}},required:["query"]},ly=5;function bc(r){return{name:iy,label:"Tool Search",description:'Search for available tools that are not currently loaded. Many tools are deferred to save context tokens. Use "select:toolName" to directly activate a tool, or provide keywords to find relevant tools. Activated tools become available in subsequent messages.',parameters:ay,execute:async(e,t)=>{if(!t.query||t.query.trim().length===0)return{content:[{type:"text",text:"Error: query is required."}],details:{type:"tool_search",error:"empty_query"}};let n=t.query.trim(),o=t.maxResults??ly;if(n.startsWith("select:")){let i=n.slice(7).split(",").map(c=>c.trim()).filter(Boolean),a=[],l=[];if(r.activateTool)for(let c of i)await r.activateTool(c)?a.push(c):l.push(c);else{let c=await r.searchTools(n,{maxResults:o});return yc(c)}let u=[];return a.length>0&&u.push(`Activated: ${a.join(", ")}. These tools are now available.`),l.length>0&&u.push(`Not found: ${l.join(", ")}.`),{content:[{type:"text",text:u.join(`
260
- `)}],details:{type:"tool_search",activated:a,notFound:l,mode:"select"}}}let s=await r.searchTools(n,{maxResults:o});return yc(s)}}}function yc(r){if(r.matches.length===0)return{content:[{type:"text",text:`No tools found matching "${r.query}". Total deferred tools available: ${r.totalDeferred}.`}],details:{type:"tool_search",query:r.query,matchCount:0,totalDeferred:r.totalDeferred}};let e=[`Found ${r.matches.length} tool(s) matching "${r.query}" (${r.totalDeferred} total deferred):`,""];for(let t of r.matches)e.push(`- **${t.name}**: ${t.description}`);return e.push(""),e.push('Use "select:toolName" to activate a tool for use in subsequent messages.'),{content:[{type:"text",text:e.join(`
261
- `)}],details:{type:"tool_search",query:r.query,matchCount:r.matches.length,totalDeferred:r.totalDeferred,matches:r.matches.map(t=>t.name)}}}var is="image_generate",cy={type:"object",properties:{prompt:{type:"string",description:"Image generation prompt. Enrich vague requests with style, lighting, composition, color, mood details."},purpose:{type:"string",description:"Intended use: 'social-media', 'short-video-cover', 'phone-wallpaper', 'avatar', 'poster', etc."},style:{type:"string",description:"Visual art style: 'photorealistic', 'anime', 'watercolor', 'oil-painting', '3d-render', etc."},size:{type:"string",description:"Dimensions: e.g. '1024x1792' (portrait), '1792x1024' (landscape), '1024x1024' (square). Default: '1024x1024'."},image_url:{type:"string",description:"Reference image URL for image-to-image generation (img2img). Character reference sheet or style transfer. MUST be a publicly accessible HTTP/HTTPS URL. Local file paths and data: URLs are NOT supported."},n:{type:"number",description:"Number of images to generate (1-4). Default: 1."},quality:{type:"string",description:"Image quality level: 'auto', 'high', 'low', 'hd'. Provider-specific."},seed:{type:"number",description:"Random seed for reproducible generation. Same seed + prompt = same result."}},required:["prompt"]};function kc(r){return{name:is,label:"Image Generate",description:"Generate images from a text prompt. You MUST enrich vague prompts with details about style, lighting, composition, color, and mood before calling. Supports img2img via image_url reference. All generated images are saved locally and can be viewed immediately. IMPORTANT: If the user has not specified purpose or preferred style, use ask_user to clarify (e.g. purpose: social-media / wallpaper / poster; style: photorealistic / anime / watercolor) before calling this tool. Infer image size automatically from purpose (e.g. 1024x1792 for phone wallpaper, 1792x1024 for landscape poster, 1024x1024 for avatar/social). Do NOT expose size as a raw number to the user. ALL reference image URLs MUST be publicly accessible HTTP/HTTPS URLs. Use file_upload tool first if the user provides a local file. Local file paths and data: URIs are NOT supported by the generation API.",parameters:cy,execute:async(e,t)=>{let n=await r.generateImage({prompt:t.prompt,purpose:t.purpose,style:t.style,size:t.size,imageUrl:t.image_url,n:t.n,quality:t.quality,seed:t.seed}),o=n.mediaUrls.length;return{content:[{type:"text",text:`Generated ${o} image${o>1?"s":""}${n.model?` (model: ${n.model})`:""}`}],details:{type:"image_generate",model:n.model,size:n.size,durationMs:n.durationMs,mediaUrls:n.mediaUrls}}}}}var uy={type:"object",properties:{text:{type:"string",description:"Text to convert to speech."},channel:{type:"string",description:"Optional channel id to pick output format (e.g. telegram)."},voice:{type:"string",description:"Voice name for TTS. Available voices depend on the provider. Common options: alloy, ash, ballad, coral, echo, fable, nova, onyx, sage, shimmer."},speed:{type:"number",description:"Speech speed multiplier (0.25-4.0). Default is 1.0."}},required:["text"]};function Tc(r){return{name:"tts",label:"TTS",description:"Convert text to speech (TTS) \u2014 read text aloud as spoken audio. Use for narration, voice messages, or any spoken-word output. DO NOT use for music, songs, or melodies \u2014 use music_generate instead.",parameters:uy,execute:async(e,t)=>{let n=await r.textToSpeech({text:t.text,channel:t.channel,voice:t.voice,speed:t.speed});return{content:[{type:"text",text:"\u5DF2\u6210\u529F\u751F\u6210\u8BED\u97F3\u3002"}],details:{type:"tts",audioPath:n.audioPath,provider:n.provider,voiceCompatible:n.voiceCompatible,mediaUrls:n.mediaUrls}}}}}var as="video_generate",dy={type:"object",properties:{prompt:{type:"string",description:"Video generation prompt. MUST be in English. Include scene, movement, camera motion, lighting, style."},purpose:{type:"string",description:"Intended use: 'social-media', 'short-video', 'presentation', etc."},style:{type:"string",description:"Visual style: 'cinematic', 'anime', 'watercolor', etc."},image_url:{type:"string",description:"Reference image URL for image-to-video generation (first frame, style reference, or character reference). MUST be a publicly accessible HTTP/HTTPS URL. Local file paths and data: URLs are NOT supported. If the user provides a local file, use a file hosting service or the image_generate tool first."},reference_videos:{type:"array",items:{type:"string"},maxItems:3,description:"Reference video URLs for video-to-video or multimodal generation (Seedance 2.0). Max 3 videos, total duration \u226415s. Use for: (a) video-to-video: provide source video to restyle/transform with prompt guidance; (b) multimodal reference: combine with image_url and/or reference_audios for style/motion/audio-guided generation. Each URL MUST be publicly accessible HTTP/HTTPS. Use file_upload tool first if the user provides a local file."},reference_audios:{type:"array",items:{type:"string"},maxItems:3,description:"Reference audio URLs for audio-guided video generation (Seedance 2.0). Max 3 audio clips, total duration \u226415s. CANNOT be used alone \u2014 must be combined with at least one image_url or reference_video. Each URL MUST be publicly accessible HTTP/HTTPS. Use file_upload tool first if the user provides a local file."},generate_audio:{type:"boolean",description:"Generate synchronized audio track for the video (Seedance 2.0/1.5 pro). When true, the output video includes AI-generated sound effects matching the visual content."},aspect_ratio:{type:"string",description:"Video aspect ratio: '9:16' (vertical), '16:9' (horizontal), '1:1' (square). Default: '16:9'."},duration:{type:"number",minimum:3,maximum:15,description:"Video duration in seconds. Seedance 2.0: 4-15s per shot. Seedance 1.0/1.5: 3-10s. For longer videos (>15s), use multi-shot storyboard workflow (generate + extend/merge). Must be confirmed by user before generation."},resolution:{type:"string",description:"Output resolution: '480p', '720p', '1080p'. Default: '720p'."},fps:{type:"number",description:"Frame rate: 24 or 30 fps. Default: provider-specific."},seed:{type:"number",description:"Random seed for reproducible generation."},camera_fixed:{type:"boolean",description:"Lock camera position (Seedance 1.0/1.5 only, not supported for img2video)."},return_last_frame:{type:"boolean",description:"Return last frame URL for chaining continuous video segments."},draft:{type:"boolean",description:"Draft mode: low-cost preview (Seedance 1.5 pro only)."},service_tier:{type:"string",enum:["default","flex"],description:"'default' (online, fast) or 'flex' (offline, ~50% cost). Not all models support flex."},callback_url:{type:"string",description:"Webhook URL for async task completion notification."},safety_identifier:{type:"string",description:"End-user safety identifier for content moderation tracking."},execution_expires_after:{type:"number",description:"Task expiration in seconds (for offline/flex scheduling)."},video_tools:{type:"array",items:{type:"string"},description:"Video-level builtin tools, e.g. ['web_search'] (Seedance 2.0 online search)."}},required:["prompt"]};function wc(r){return{name:as,label:"Video Generate",description:"Generate a short video clip from a text prompt, reference image, source video, or multimodal references. Prompt MUST be in English. Include scene, movement, camera motion, lighting details. Single-shot: 3\u201310s. For longer videos (>10s), use multi-shot storyboard workflow. MODES: (1) text-to-video: prompt only. (2) image-to-video: prompt + image_url. (3) video-to-video: prompt + reference_videos \u2014 restyle/transform an existing video with prompt guidance. (4) multimodal reference: prompt + any combination of image_url / reference_videos / reference_audios for style/motion/audio-guided generation. (5) generate_audio=true for synchronized sound effects. ALL image/video/audio URLs MUST be publicly accessible HTTP/HTTPS URLs. Local file paths and data: URIs are NOT supported by the generation API. If the user provides a local file, use the file_upload tool FIRST to get a public URL. IMPORTANT: If the user has not specified aspect ratio or duration, use ask_user to clarify (e.g. aspect: 16:9 for landscape / 9:16 for vertical / 1:1 for square; duration: 3-10s). Auto-set aspect_ratio based on stated purpose (e.g. 9:16 for short-video / Douyin, 16:9 for presentation).",parameters:dy,execute:async(e,t)=>{let n=await r.generateVideo({prompt:t.prompt,purpose:t.purpose,style:t.style,imageUrl:t.image_url,referenceVideos:t.reference_videos,referenceAudios:t.reference_audios,generateAudio:t.generate_audio,aspectRatio:t.aspect_ratio,duration:t.duration,resolution:t.resolution,fps:t.fps,seed:t.seed,cameraFixed:t.camera_fixed,returnLastFrame:t.return_last_frame,draft:t.draft,serviceTier:t.service_tier,callbackUrl:t.callback_url,safetyIdentifier:t.safety_identifier,executionExpiresAfterSeconds:t.execution_expires_after,videoTools:t.video_tools}),o=n.mediaUrls.length,s=[`Generated ${o} video${o>1?"s":""}`];return n.model&&s.push(`model: ${n.model}`),n.lastFrameUrl&&s.push(`last_frame: ${n.lastFrameUrl}`),n.taskId&&s.push(`task_id: ${n.taskId}`),{content:[{type:"text",text:s.length>1?`${s[0]} (${s.slice(1).join(", ")})`:s[0]}],details:{type:"video_generate",model:n.model,durationMs:n.durationMs,mediaUrls:n.mediaUrls,...n.taskId?{taskId:n.taskId}:{}}}}}}var ls="music_generate",py={type:"object",properties:{prompt:{type:"string",description:"Music generation prompt. MUST be in English. Include genre, mood, tempo, instruments, and atmosphere details."},purpose:{type:"string",description:"Intended use: 'background-music', 'ringtone', 'short-video-bgm', 'full-song', 'notification-sound', etc."},style:{type:"string",description:"Musical style/genre: 'lo-fi', 'pop', 'rock', 'jazz', 'classical', 'electronic', 'ambient', etc."},lyrics:{type:"string",description:"Optional lyrics for vocal music. Structure with [verse], [chorus], [bridge] tags if desired."},duration:{type:"number",description:"Duration in seconds (5-300). Infer from purpose: ringtone 15-30s, BGM 30-60s, full song 120-180s."},is_instrumental:{type:"boolean",description:"Set true for pure instrumental music without vocals. Defaults to true when no lyrics are provided."},cover_audio_url:{type:"string",description:"URL of an existing audio track to use as base for cover/remix. When provided, generates a cover version. MUST be a publicly accessible HTTP/HTTPS URL. Use file_upload tool first if the user provides a local file."},audio_format:{type:"string",enum:["mp3","wav","flac"],description:"Output audio format. Defaults to mp3."}},required:["prompt"]};function vc(r){return{name:ls,label:"Music Generate",description:"Generate music, songs, or melodies from text descriptions. Prompt MUST be in English. Supports lyrics for vocal songs. DO NOT use for spoken-word audio or TTS \u2014 use tts tool instead. IMPORTANT: If the user has not specified genre/style or duration, use ask_user to clarify (e.g. style: lo-fi / pop / rock / jazz; duration inferred from purpose: 30s for ringtone, 60-90s for BGM, 180-240s for full song). Auto-infer duration from purpose when possible.",parameters:py,execute:async(e,t)=>{let n=t.lyrics;if(!n&&!t.is_instrumental&&r.generateLyrics)try{n=await r.generateLyrics(t.prompt)}catch{}let o=await r.generateMusic({prompt:t.prompt,purpose:t.purpose,style:t.style,lyrics:n,duration:t.duration,isInstrumental:t.is_instrumental,audioUrl:t.cover_audio_url,audioFormat:t.audio_format}),s=o.mediaUrls.length;return{content:[{type:"text",text:`Generated ${s} audio track${s>1?"s":""}${o.model?` (model: ${o.model})`:""}`}],details:{type:"music_generate",model:o.model,durationMs:o.durationMs,mediaUrls:o.mediaUrls}}}}}var my="video_edit",gy={type:"object",properties:{prompt:{type:"string",description:"Edit instruction. Reference videos as \u89C6\u98911, \u89C6\u98912, \u89C6\u98913. Reference images as \u56FE\u72471, \u56FE\u72472. Operations: add/remove/modify elements, extend, track fill."},source_videos:{type:"array",items:{type:"string"},minItems:1,maxItems:3,description:"Video(s) to edit (1-3 URLs). Order: [0]=\u89C6\u98911, [1]=\u89C6\u98912, [2]=\u89C6\u98913. All URLs MUST be publicly accessible HTTP/HTTPS. Use file_upload tool first if the user provides a local file."},reference_images:{type:"array",items:{type:"string"},maxItems:9,description:"Optional reference images for element replacement (up to 9). All URLs MUST be publicly accessible HTTP/HTTPS. Use file_upload tool first if the user provides a local file."},duration:{type:"number",minimum:4,maximum:15,description:"Output duration in seconds (4-15s). Default: same as source."},aspect_ratio:{type:"string",description:"Output aspect ratio: 16:9, 9:16, 1:1, 4:3, 3:4, 21:9. Default: same as source."},resolution:{type:"string",description:"Output resolution: '480p' or '720p'. Default: '720p'."}},required:["prompt","source_videos"]};function xc(r){return{name:my,label:"Video Edit",description:"Edit existing videos: add/remove/modify elements, extend, or bridge clips. Requires source_videos (max 3). Max 9 reference images for element replacement. Max 720p. All video/image URLs MUST be publicly accessible HTTP/HTTPS. Use file_upload tool first if the user provides a local file. For generating NEW videos from scratch, use video_generate instead.",parameters:gy,execute:async(e,t)=>{if(!t.source_videos?.length)return{content:[{type:"text",text:"Error: source_videos is required."}]};let n=await r.editVideo({prompt:t.prompt,sourceVideos:t.source_videos,referenceImages:t.reference_images,duration:t.duration,aspectRatio:t.aspect_ratio,resolution:t.resolution});return{content:[{type:"text",text:`Video edited successfully${n.model?` (model: ${n.model})`:""}`}],details:{type:"video_edit",model:n.model,durationMs:n.durationMs,mediaUrls:n.mediaUrls}}}}}var fy="video_merge",hy={type:"object",properties:{clips:{type:"array",items:{type:"object",properties:{video:{type:"string",description:"Video URL or file path. MUST be publicly accessible HTTP/HTTPS URL. Use file_upload tool first if local file."},audio:{type:"string",description:"Narration audio file path (from TTS)."},trimStart:{type:"number",description:"Trim start in seconds (default 0)."},trimEnd:{type:"number",description:"Trim end in seconds (default: full)."}},required:["video"]},minItems:2,description:"Array of video clips to merge, in order."},transition:{type:"string",description:"Transition effect: 'crossfade' (default), 'fade', 'wipeleft', 'cut', 'dissolve', etc."},transitionDuration:{type:"number",description:"Transition duration in seconds (0.1-2.0, default 0.5)."},subtitles:{type:"string",description:"Path to SRT subtitle file to burn-in."},bgm:{type:"string",description:"Background music file path."},bgmVolume:{type:"number",description:"BGM volume (0.0-1.0, default 0.15)."},outputResolution:{type:"string",description:"Output resolution: '1920x1080', '1080x1920', etc. Default: auto."},outputFps:{type:"number",description:"Output FPS (default 30)."}},required:["clips"]};function Sc(r){return{name:fy,label:"Video Merge",description:"Merge multiple video clips into a single video with transitions, subtitles, and background music. Requires at least 2 clips. Supports crossfade, fade, wipe, dissolve, and cut transitions. All video/audio URLs MUST be publicly accessible HTTP/HTTPS. Use file_upload tool first if the user provides local files. Audio per clip is preserved; BGM is mixed at adjustable volume.",parameters:hy,execute:async(e,t)=>{if(!t.clips||t.clips.length<2)return{content:[{type:"text",text:"Error: at least 2 clips are required for merging."}]};let n=await r.mergeVideos({clips:t.clips,transition:t.transition,transitionDuration:t.transitionDuration,subtitles:t.subtitles,bgm:t.bgm,bgmVolume:t.bgmVolume,outputResolution:t.outputResolution,outputFps:t.outputFps});return{content:[{type:"text",text:`Merged ${n.clipCount} clips \u2192 ${n.durationSec.toFixed(1)}s video`+(t.transition?` (transition: ${t.transition})`:"")}],details:{type:"video_merge",localPath:n.localPath,servePath:n.servePath,durationSec:n.durationSec,clipCount:n.clipCount,mediaUrls:n.mediaUrls}}}}}var yy="video_upscale",by={type:"object",properties:{video:{type:"string",description:"Video URL to upscale. MUST be publicly accessible HTTP/HTTPS URL. Use file_upload tool first if the user provides a local file."},targetResolution:{type:"string",description:"Target resolution: '1080p' (default, 1920x1080/1080x1920), '2k' (2560x1440/1440x2560)."},sharpness:{type:"string",description:"Sharpening intensity: 'light' (default), 'medium', 'strong'."}},required:["video"]};function _c(r){return{name:yy,label:"Video Upscale",description:"Upscale a video to higher resolution with optional sharpening. Auto-detects orientation (landscape/portrait). Uses Lanczos interpolation + unsharp mask. Supports 1080p and 2K targets. Video URL MUST be publicly accessible HTTP/HTTPS. Use file_upload tool first if the user provides a local file. Best used as post-processing after video_merge.",parameters:by,execute:async(e,t)=>{let n=await r.upscaleVideo({video:t.video,targetResolution:t.targetResolution,sharpness:t.sharpness});return{content:[{type:"text",text:`Upscaled to ${n.resolution}${t.sharpness?` (sharpness: ${t.sharpness})`:""}`}],details:{type:"video_upscale",localPath:n.localPath,servePath:n.servePath,resolution:n.resolution,durationSec:n.durationSec,mediaUrls:n.mediaUrls}}}}}var ky="three_d_generate",Ty={type:"object",properties:{prompt:{type:"string",description:"3D model generation prompt. Describe the object's shape, material, texture, color, and pose. For text-to-3D, provide a detailed description. For image-to-3D, also provide image_url."},image_url:{type:"string",description:"Reference image URL for image-to-3D generation. The image should show the object clearly from a single viewpoint with clean background for best results. MUST be a publicly accessible HTTP/HTTPS URL. Local file paths and data: URLs are NOT supported."},output_format:{type:"string",description:"3D model output format: 'glb' (default), 'obj', 'usd', 'usdz'."},seed:{type:"number",description:"Random seed for reproducible generation."}},required:["prompt"]};function Rc(r){return{name:ky,label:"3D Generate",description:"Generate a 3D model from a text prompt or reference image. Supports text-to-3D and image-to-3D workflows. Output formats include GLB, OBJ, USD. The generated model can be viewed in any 3D viewer or imported into game engines. IMPORTANT: Describe the object in detail \u2014 shape, size, material, texture, color, and pose.",parameters:Ty,execute:async(e,t)=>{let n=await r.generate3D({prompt:t.prompt,imageUrl:t.image_url,outputFormat:t.output_format,seed:t.seed}),o=n.mediaUrls.length,s=`Generated ${o} 3D model${o>1?"s":""}${n.model?` (model: ${n.model})`:""}`;return o===0&&n.metadata?.debugResponseKeys&&(s+=` [debug: response keys=${JSON.stringify(n.metadata.debugResponseKeys)}, content=${n.metadata.debugContentSample??"null"}]`),{content:[{type:"text",text:s}],details:{type:"three_d_generate",model:n.model,durationMs:n.durationMs,mediaUrls:n.mediaUrls,...n.metadata??{}}}}}}var wy={type:"object",properties:{audio_url:{type:"string",description:"URL of the audio file to transcribe. Supports mp3, wav, m4a, ogg, flac formats. MUST be a publicly accessible HTTP/HTTPS URL. Use file_upload tool first if the user provides a local file."},language:{type:"string",description:"Language hint for transcription: 'zh' (Chinese), 'en' (English), or auto-detect if omitted."}},required:["audio_url"]};function Cc(r){return{name:"stt",label:"STT",description:"Transcribe audio to text (Speech-to-Text). Provide an audio file URL and receive the spoken content as text. Supports Chinese and English. Use for meeting transcription, voice message reading, subtitle generation, or any audio-to-text conversion.",parameters:wy,execute:async(e,t)=>{if(!t.audio_url)return{content:[{type:"text",text:"Error: audio_url parameter is required. Provide a publicly accessible HTTP/HTTPS URL to an audio file."}],details:{error:"audio_url parameter is required"}};let n=await r.speechToText({audioUrl:t.audio_url,language:t.language}),o=n.transcription.length>200?n.transcription.slice(0,200)+"\u2026":n.transcription;return{content:[{type:"text",text:n.transcription}],details:{type:"stt",model:n.model,durationMs:n.durationMs,transcriptionLength:n.transcription.length,preview:o}}}}}var vy="voice_clone",xy={type:"object",properties:{text:{type:"string",description:"Text to synthesize in the cloned voice."},sample_audio_url:{type:"string",description:"URL of an audio sample (5-30 seconds recommended) of the voice to clone. The sample should be clear speech with minimal background noise. MUST be a publicly accessible HTTP/HTTPS URL. Use file_upload tool first if the user provides a local file."},speed:{type:"number",description:"Speech speed multiplier (0.5-2.0). Default is 1.0."}},required:["text","sample_audio_url"]};function Ac(r){return{name:vy,label:"Voice Clone",description:"Clone a voice from an audio sample and synthesize new speech in that voice. Requires a clear audio sample (5-30s recommended) of the target voice. Use for personalized narration, character voices, or voice preservation. DO NOT use for impersonation or deception. For standard TTS with preset voices, use the tts tool instead.",parameters:xy,execute:async(e,t)=>{let n=await r.cloneVoice({text:t.text,sampleAudioUrl:t.sample_audio_url,speed:t.speed});return{content:[{type:"text",text:`Voice cloned and synthesized speech${n.model?` (model: ${n.model})`:""}`}],details:{type:"voice_clone",model:n.model,voiceId:n.voiceId,durationMs:n.durationMs,mediaUrls:n.mediaUrls}}}}}var Sy="media_cancel",_y={type:"object",properties:{task_id:{type:"string",description:"The task ID of the media generation to cancel (returned in previous generation results)."},provider:{type:"string",description:"Provider name (e.g. 'doubao', 'zhipu'). If omitted, auto-detects from task context."}},required:["task_id"]};function Mc(r){return{name:Sy,label:"Media Cancel",description:"Cancel an in-progress media generation task (video, 3D, etc.). Provide the task_id from a previous generation result. Use this when a user wants to abort a long-running generation.",parameters:_y,execute:async(e,t)=>{if(!t.task_id)return{content:[{type:"text",text:"Error: task_id is required."}],details:{error:"task_id is required"}};let n=await r.cancelTask({taskId:t.task_id,provider:t.provider});return{content:[{type:"text",text:n.ok?`Task ${t.task_id} cancelled.`:`Cancel failed: ${n.message}`}],details:n.ok?void 0:{error:n.message}}}}}var Ry="file_upload",Cy={type:"object",properties:{file_path:{type:"string",description:"Absolute path to the local file to upload. Supported: images (jpg/png/webp/gif), audio (mp3/wav/m4a/ogg/flac), video (mp4/mov/avi). The file will be uploaded to the configured provider's Files API and a file ID or public URL will be returned."},purpose:{type:"string",description:"Upload purpose hint: 'media_reference' (for image/video/audio generation), 'user_data' (general). Default: 'media_reference'."}},required:["file_path"]};function Pc(r){return{name:Ry,label:"File Upload",description:"Upload a local file to the cloud provider's Files API. Returns a file ID (or public URL) that can be used as input for media generation tools (image_generate, video_generate, video_edit, etc.). Use this when the user provides a local file that needs to be referenced by URL in media tools. IMPORTANT: Only call this tool for files that actually need to be uploaded for media generation. Not all providers support file upload \u2014 tool availability depends on the configured provider.",parameters:Cy,execute:async(e,t)=>{let n=await r.uploadFile({filePath:t.file_path,purpose:t.purpose}),o=[`Uploaded "${n.filename}" (${cs(n.bytes)}) via ${n.provider}`];return n.url&&o.push(`URL: ${n.url}`),o.push(`File ID: ${n.fileId}`),{content:[{type:"text",text:o.join(`
262
- `)}],details:{type:"file_upload",fileId:n.fileId,url:n.url,filename:n.filename,bytes:n.bytes,provider:n.provider}}}}}var Ay="file_query",My={type:"object",properties:{file_id:{type:"string",description:"Query a specific file by ID. If omitted, lists recent uploaded files."},limit:{type:"number",description:"Max number of files to list when file_id is omitted. Default: 10, max: 100."}},required:[]};function Ic(r){return{name:Ay,label:"File Query",description:"Query or list uploaded files from the provider's Files API. Use file_id to get info on a specific file, or omit to list recent uploads. Returns file ID, name, size, status, and URL (if available).",parameters:My,execute:async(e,t)=>{if(t.file_id){let i=await r.queryFile({fileId:t.file_id}),a=[`File: ${i.filename}`,`ID: ${i.id}`,`Size: ${cs(i.bytes)}`,`Status: ${i.status}`];return i.url&&a.push(`URL: ${i.url}`),i.createdAt&&a.push(`Created: ${i.createdAt}`),{content:[{type:"text",text:a.join(`
256
+ describe: Show workflow steps and variables.`},workflow:{type:"string",description:"Workflow name (required for 'run' and 'describe')."},variables:{type:"object",description:"Variable overrides (key-value pairs) for the workflow run.",additionalProperties:{type:"string"}}},required:["action"]};async function ps(r){let e=new Map,t=ca(r);await kc(t,e);let n=aa();return await kc(n,e),e}async function kc(r,e){if(ly(r))try{let t=await ay(r,{withFileTypes:!0});for(let n of t)if(n.isFile()&&n.name.endsWith(".json")){let o=n.name.replace(/\.json$/,"");e.has(o)||e.set(o,Tc.join(r,n.name))}}catch{}}async function ms(r){let e=await iy(r,"utf-8");return JSON.parse(e)}function dy(r){let e=new Map(r.map(s=>[s.id,s])),t=new Set,n=[];function o(s,i){if(t.has(s))return;if(i.has(s))throw new Error(`Circular dependency detected at step: ${s}`);i.add(s);let a=e.get(s);if(!a)throw new Error(`Unknown step dependency: ${s}`);for(let c of a.dependsOn??[])o(c,i);i.delete(s),t.add(s),n.push(a)}for(let s of r)o(s.id,new Set);return n}function uy(r,e,t){let n={};for(let[o,s]of Object.entries(r))if(typeof s=="string"){let i=s;i=i.replace(/\$\{var\.(\w+)\}/g,(a,c)=>e[c]??`\${var.${c}}`),i=i.replace(/\$\{step\.(\w+)\.result\}/g,(a,c)=>t.get(c)?.output??""),n[o]=i}else n[o]=s;return n}function wc(r){return{name:"workflow",label:"Workflow",description:"Execute predefined automation workflows. Workflows are step-based pipelines defined as JSON files in .qlogicagent/workflows/ or ~/.qlogicagent/workflows/. Steps run in dependency order, support variable interpolation, and can reference previous step outputs via ${step.<id>.result}.",parameters:cy,shouldDefer:!0,isConcurrencySafe:!1,isReadOnly:!1,searchHint:"workflow pipeline automation steps DAG",execute:async(e,t,n)=>{let o=r.getCwd();switch(t.action){case"list":{let s=await ps(o);if(s.size===0)return{content:[{type:"text",text:"No workflows found. Create .json files in .qlogicagent/workflows/ or ~/.qlogicagent/workflows/."}],details:{type:"workflow",action:"list",count:0}};let i=["Available workflows:"];for(let[a,c]of s)try{let d=await ms(c);i.push(` - ${a}: ${d.description??"(no description)"} (${d.steps.length} steps)`)}catch{i.push(` - ${a}: (failed to load)`)}return{content:[{type:"text",text:i.join(`
257
+ `)}],details:{type:"workflow",action:"list",count:s.size}}}case"describe":{if(!t.workflow)return{content:[{type:"text",text:"Error: 'workflow' parameter is required for 'describe'."}],details:{error:"missing_workflow"}};let i=(await ps(o)).get(t.workflow);if(!i)return{content:[{type:"text",text:`Error: Workflow "${t.workflow}" not found.`}],details:{error:"not_found"}};let a=await ms(i),c=[`Workflow: ${a.name}`,a.description?`Description: ${a.description}`:"","","Steps:"];for(let d of a.steps){let l=d.dependsOn?.length?` (after: ${d.dependsOn.join(", ")})`:"";c.push(` ${d.id}: ${d.label??d.tool}${l}`),c.push(` tool: ${d.tool}`),c.push(` args: ${JSON.stringify(d.args)}`)}if(a.variables&&Object.keys(a.variables).length>0){c.push("","Variables (defaults):");for(let[d,l]of Object.entries(a.variables))c.push(` ${d} = ${l}`)}return{content:[{type:"text",text:c.filter(Boolean).join(`
258
+ `)}],details:{type:"workflow",action:"describe",workflow:a.name}}}case"run":{if(!t.workflow)return{content:[{type:"text",text:"Error: 'workflow' parameter is required for 'run'."}],details:{error:"missing_workflow"}};let i=(await ps(o)).get(t.workflow);if(!i)return{content:[{type:"text",text:`Error: Workflow "${t.workflow}" not found.`}],details:{error:"not_found"}};let a=await ms(i),c={...a.variables,...t.variables},d;try{d=dy(a.steps)}catch(m){return{content:[{type:"text",text:`Error: ${m.message}`}],details:{error:"dag_error"}}}let l=new Map,u=[`Running workflow: ${a.name}`,""],p=!0;for(let m of d){if(n?.aborted){u.push(`\u26A1 Aborted at step: ${m.id}`),p=!1;break}let g=(m.dependsOn??[]).some(w=>!l.get(w)?.success),f=m.condition??"on_success";if(f==="on_success"&&g){u.push(`\u23ED Skipped ${m.id} (dependency failed)`),l.set(m.id,{stepId:m.id,success:!1,output:"",error:"dependency_failed"}),p=!1;continue}if(f==="on_failure"&&!g){u.push(`\u23ED Skipped ${m.id} (no failure to handle)`),l.set(m.id,{stepId:m.id,success:!0,output:""});continue}u.push(`\u25B6 ${m.id}: ${m.label??m.tool}`);let b=uy(m.args,c,l);try{let w=await r.invokeTool(m.tool,b,n),T=!w.error;if(l.set(m.id,{stepId:m.id,success:T,output:w.result,error:w.error}),T){let _=w.result.length>200?w.result.slice(0,200)+"...":w.result;u.push(` \u2705 ${_}`)}else u.push(` \u274C ${w.error}`),p=!1}catch(w){let T=w.message;l.set(m.id,{stepId:m.id,success:!1,output:"",error:T}),u.push(` \u274C ${T}`),p=!1}}return u.push("",p?"Workflow completed successfully.":"Workflow completed with errors."),{content:[{type:"text",text:u.join(`
259
+ `)}],details:{type:"workflow",action:"run",workflow:a.name,success:p,stepsExecuted:l.size,totalSteps:a.steps.length}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}". Use list, run, or describe.`}],details:{error:"unknown_action"}}}}}}var py="sleep",my={type:"object",properties:{duration:{type:"number",description:"Duration to sleep in seconds (1\u20133600). Prefer short sleeps (10\u201360s) to stay responsive.",minimum:1,maximum:3600},reason:{type:"string",description:'Brief reason for sleeping. Examples: "waiting for build to finish", "nothing to do", "user asked to rest".'}},required:["duration"]};function vc(r){return{name:py,label:"Sleep",shouldDefer:!0,isConcurrencySafe:!0,isReadOnly:!0,searchHint:"wait sleep rest idle tick proactive",description:["Wait for a specified duration. The user can interrupt the sleep at any time.","","Use this when:","\u2022 You have nothing useful to do right now","\u2022 You're waiting for an external process to complete","\u2022 The user tells you to sleep or rest","\u2022 You receive a <tick> check-in with no actionable work","","Prefer this over `exec(sleep ...)` \u2014 it doesn't hold a shell process.","You can call this concurrently with other tools \u2014 it won't interfere with them.","","Each wake-up costs an API call, but the prompt cache expires after 5 minutes of inactivity \u2014 balance accordingly."].join(`
260
+ `),parameters:my,execute:async(e,t,n)=>{let o=Math.max(1,Math.min(3600,Math.round(t.duration))),s=o*1e3,i=new AbortController,a=()=>i.abort();n?.addEventListener("abort",a,{once:!0}),n?.aborted&&i.abort();try{let c=await r.sleep(s,i.signal),d=[];return c.interrupted?(d.push(`Sleep interrupted after ${c.sleptSeconds}s.`),c.interruptReason&&d.push(`Reason: ${c.interruptReason}`),d.push("Check for new messages or tasks.")):d.push(`Slept for ${c.sleptSeconds}s. Waking up.`),{content:[{type:"text",text:d.join(`
261
+ `)}],details:{...c,requestedSeconds:o}}}finally{n?.removeEventListener("abort",a)}}}}var gy="tool_search",fy={type:"object",properties:{query:{type:"string",description:'Search query for tools. Use "select:toolName" to directly activate a deferred tool, or provide keywords to search tool names/descriptions. Prefix a term with "+" to mark it as required (all +terms must match).'},maxResults:{type:"number",description:"Maximum number of results to return (default: 5)."}},required:["query"]},hy=5;function Sc(r){return{name:gy,label:"Tool Search",description:'Search for available tools that are not currently loaded. Many tools are deferred to save context tokens. Use "select:toolName" to directly activate a tool, or provide keywords to find relevant tools. Activated tools become available in subsequent messages.',parameters:fy,execute:async(e,t)=>{if(!t.query||t.query.trim().length===0)return{content:[{type:"text",text:"Error: query is required."}],details:{type:"tool_search",error:"empty_query"}};let n=t.query.trim(),o=t.maxResults??hy;if(n.startsWith("select:")){let i=n.slice(7).split(",").map(l=>l.trim()).filter(Boolean),a=[],c=[];if(r.activateTool)for(let l of i)await r.activateTool(l)?a.push(l):c.push(l);else{let l=await r.searchTools(n,{maxResults:o});return xc(l)}let d=[];return a.length>0&&d.push(`Activated: ${a.join(", ")}. These tools are now available.`),c.length>0&&d.push(`Not found: ${c.join(", ")}.`),{content:[{type:"text",text:d.join(`
262
+ `)}],details:{type:"tool_search",activated:a,notFound:c,mode:"select"}}}let s=await r.searchTools(n,{maxResults:o});return xc(s)}}}function xc(r){if(r.matches.length===0)return{content:[{type:"text",text:`No tools found matching "${r.query}". Total deferred tools available: ${r.totalDeferred}.`}],details:{type:"tool_search",query:r.query,matchCount:0,totalDeferred:r.totalDeferred}};let e=[`Found ${r.matches.length} tool(s) matching "${r.query}" (${r.totalDeferred} total deferred):`,""];for(let t of r.matches)e.push(`- **${t.name}**: ${t.description}`);return e.push(""),e.push('Use "select:toolName" to activate a tool for use in subsequent messages.'),{content:[{type:"text",text:e.join(`
263
+ `)}],details:{type:"tool_search",query:r.query,matchCount:r.matches.length,totalDeferred:r.totalDeferred,matches:r.matches.map(t=>t.name)}}}var gs="image_generate",yy={type:"object",properties:{prompt:{type:"string",description:"Image generation prompt. Enrich vague requests with style, lighting, composition, color, mood details."},purpose:{type:"string",description:"Intended use: 'social-media', 'short-video-cover', 'phone-wallpaper', 'avatar', 'poster', etc."},style:{type:"string",description:"Visual art style: 'photorealistic', 'anime', 'watercolor', 'oil-painting', '3d-render', etc."},size:{type:"string",description:"Dimensions: e.g. '1024x1792' (portrait), '1792x1024' (landscape), '1024x1024' (square). Default: '1024x1024'."},image_url:{type:"string",description:"Reference image URL for image-to-image generation (img2img). Character reference sheet or style transfer. MUST be a publicly accessible HTTP/HTTPS URL. Local file paths and data: URLs are NOT supported."},n:{type:"number",description:"Number of images to generate (1-4). Default: 1."},quality:{type:"string",description:"Image quality level: 'auto', 'high', 'low', 'hd'. Provider-specific."},seed:{type:"number",description:"Random seed for reproducible generation. Same seed + prompt = same result."}},required:["prompt"]};function _c(r){return{name:gs,label:"Image Generate",description:"Generate images from a text prompt. You MUST enrich vague prompts with details about style, lighting, composition, color, and mood before calling. Supports img2img via image_url reference. All generated images are saved locally and can be viewed immediately. IMPORTANT: If the user has not specified purpose or preferred style, use ask_user to clarify (e.g. purpose: social-media / wallpaper / poster; style: photorealistic / anime / watercolor) before calling this tool. Infer image size automatically from purpose (e.g. 1024x1792 for phone wallpaper, 1792x1024 for landscape poster, 1024x1024 for avatar/social). Do NOT expose size as a raw number to the user. ALL reference image URLs MUST be publicly accessible HTTP/HTTPS URLs. Use file_upload tool first if the user provides a local file. Local file paths and data: URIs are NOT supported by the generation API.",parameters:yy,execute:async(e,t)=>{let n=await r.generateImage({prompt:t.prompt,purpose:t.purpose,style:t.style,size:t.size,imageUrl:t.image_url,n:t.n,quality:t.quality,seed:t.seed}),o=n.mediaUrls.length;return{content:[{type:"text",text:`Generated ${o} image${o>1?"s":""}${n.model?` (model: ${n.model})`:""}`}],details:{type:"image_generate",model:n.model,size:n.size,durationMs:n.durationMs,mediaUrls:n.mediaUrls}}}}}var by={type:"object",properties:{text:{type:"string",description:"Text to convert to speech."},channel:{type:"string",description:"Optional channel id to pick output format (e.g. telegram)."},voice:{type:"string",description:"Voice name for TTS. Available voices depend on the provider. Common options: alloy, ash, ballad, coral, echo, fable, nova, onyx, sage, shimmer."},speed:{type:"number",description:"Speech speed multiplier (0.25-4.0). Default is 1.0."}},required:["text"]};function Rc(r){return{name:"tts",label:"TTS",description:"Convert text to speech (TTS) \u2014 read text aloud as spoken audio. Use for narration, voice messages, or any spoken-word output. DO NOT use for music, songs, or melodies \u2014 use music_generate instead.",parameters:by,execute:async(e,t)=>{let n=await r.textToSpeech({text:t.text,channel:t.channel,voice:t.voice,speed:t.speed});return{content:[{type:"text",text:"\u5DF2\u6210\u529F\u751F\u6210\u8BED\u97F3\u3002"}],details:{type:"tts",audioPath:n.audioPath,provider:n.provider,voiceCompatible:n.voiceCompatible,mediaUrls:n.mediaUrls}}}}}var fs="video_generate",ky={type:"object",properties:{prompt:{type:"string",description:"Video generation prompt. MUST be in English. Include scene, movement, camera motion, lighting, style."},purpose:{type:"string",description:"Intended use: 'social-media', 'short-video', 'presentation', etc."},style:{type:"string",description:"Visual style: 'cinematic', 'anime', 'watercolor', etc."},image_url:{type:"string",description:"Reference image URL for image-to-video generation (first frame, style reference, or character reference). MUST be a publicly accessible HTTP/HTTPS URL. Local file paths and data: URLs are NOT supported. If the user provides a local file, use a file hosting service or the image_generate tool first."},reference_videos:{type:"array",items:{type:"string"},maxItems:3,description:"Reference video URLs for video-to-video or multimodal generation (Seedance 2.0). Max 3 videos, total duration \u226415s. Use for: (a) video-to-video: provide source video to restyle/transform with prompt guidance; (b) multimodal reference: combine with image_url and/or reference_audios for style/motion/audio-guided generation. Each URL MUST be publicly accessible HTTP/HTTPS. Use file_upload tool first if the user provides a local file."},reference_audios:{type:"array",items:{type:"string"},maxItems:3,description:"Reference audio URLs for audio-guided video generation (Seedance 2.0). Max 3 audio clips, total duration \u226415s. CANNOT be used alone \u2014 must be combined with at least one image_url or reference_video. Each URL MUST be publicly accessible HTTP/HTTPS. Use file_upload tool first if the user provides a local file."},generate_audio:{type:"boolean",description:"Generate synchronized audio track for the video (Seedance 2.0/1.5 pro). When true, the output video includes AI-generated sound effects matching the visual content."},aspect_ratio:{type:"string",description:"Video aspect ratio: '9:16' (vertical), '16:9' (horizontal), '1:1' (square). Default: '16:9'."},duration:{type:"number",minimum:3,maximum:15,description:"Video duration in seconds. Seedance 2.0: 4-15s per shot. Seedance 1.0/1.5: 3-10s. For longer videos (>15s), use multi-shot storyboard workflow (generate + extend/merge). Must be confirmed by user before generation."},resolution:{type:"string",description:"Output resolution: '480p', '720p', '1080p'. Default: '720p'."},fps:{type:"number",description:"Frame rate: 24 or 30 fps. Default: provider-specific."},seed:{type:"number",description:"Random seed for reproducible generation."},camera_fixed:{type:"boolean",description:"Lock camera position (Seedance 1.0/1.5 only, not supported for img2video)."},return_last_frame:{type:"boolean",description:"Return last frame URL for chaining continuous video segments."},draft:{type:"boolean",description:"Draft mode: low-cost preview (Seedance 1.5 pro only)."},service_tier:{type:"string",enum:["default","flex"],description:"'default' (online, fast) or 'flex' (offline, ~50% cost). Not all models support flex."},callback_url:{type:"string",description:"Webhook URL for async task completion notification."},safety_identifier:{type:"string",description:"End-user safety identifier for content moderation tracking."},execution_expires_after:{type:"number",description:"Task expiration in seconds (for offline/flex scheduling)."},video_tools:{type:"array",items:{type:"string"},description:"Video-level builtin tools, e.g. ['web_search'] (Seedance 2.0 online search)."}},required:["prompt"]};function Cc(r){return{name:fs,label:"Video Generate",description:"Generate a short video clip from a text prompt, reference image, source video, or multimodal references. Prompt MUST be in English. Include scene, movement, camera motion, lighting details. Single-shot: 3\u201310s. For longer videos (>10s), use multi-shot storyboard workflow. MODES: (1) text-to-video: prompt only. (2) image-to-video: prompt + image_url. (3) video-to-video: prompt + reference_videos \u2014 restyle/transform an existing video with prompt guidance. (4) multimodal reference: prompt + any combination of image_url / reference_videos / reference_audios for style/motion/audio-guided generation. (5) generate_audio=true for synchronized sound effects. ALL image/video/audio URLs MUST be publicly accessible HTTP/HTTPS URLs. Local file paths and data: URIs are NOT supported by the generation API. If the user provides a local file, use the file_upload tool FIRST to get a public URL. IMPORTANT: If the user has not specified aspect ratio or duration, use ask_user to clarify (e.g. aspect: 16:9 for landscape / 9:16 for vertical / 1:1 for square; duration: 3-10s). Auto-set aspect_ratio based on stated purpose (e.g. 9:16 for short-video / Douyin, 16:9 for presentation).",parameters:ky,execute:async(e,t)=>{let n=await r.generateVideo({prompt:t.prompt,purpose:t.purpose,style:t.style,imageUrl:t.image_url,referenceVideos:t.reference_videos,referenceAudios:t.reference_audios,generateAudio:t.generate_audio,aspectRatio:t.aspect_ratio,duration:t.duration,resolution:t.resolution,fps:t.fps,seed:t.seed,cameraFixed:t.camera_fixed,returnLastFrame:t.return_last_frame,draft:t.draft,serviceTier:t.service_tier,callbackUrl:t.callback_url,safetyIdentifier:t.safety_identifier,executionExpiresAfterSeconds:t.execution_expires_after,videoTools:t.video_tools}),o=n.mediaUrls.length,s=[`Generated ${o} video${o>1?"s":""}`];return n.model&&s.push(`model: ${n.model}`),n.lastFrameUrl&&s.push(`last_frame: ${n.lastFrameUrl}`),n.taskId&&s.push(`task_id: ${n.taskId}`),{content:[{type:"text",text:s.length>1?`${s[0]} (${s.slice(1).join(", ")})`:s[0]}],details:{type:"video_generate",model:n.model,durationMs:n.durationMs,mediaUrls:n.mediaUrls,...n.taskId?{taskId:n.taskId}:{}}}}}}var hs="music_generate",Ty={type:"object",properties:{prompt:{type:"string",description:"Music generation prompt. MUST be in English. Include genre, mood, tempo, instruments, and atmosphere details."},purpose:{type:"string",description:"Intended use: 'background-music', 'ringtone', 'short-video-bgm', 'full-song', 'notification-sound', etc."},style:{type:"string",description:"Musical style/genre: 'lo-fi', 'pop', 'rock', 'jazz', 'classical', 'electronic', 'ambient', etc."},lyrics:{type:"string",description:"Optional lyrics for vocal music. Structure with [verse], [chorus], [bridge] tags if desired."},duration:{type:"number",description:"Duration in seconds (5-300). Infer from purpose: ringtone 15-30s, BGM 30-60s, full song 120-180s."},is_instrumental:{type:"boolean",description:"Set true for pure instrumental music without vocals. Defaults to true when no lyrics are provided."},cover_audio_url:{type:"string",description:"URL of an existing audio track to use as base for cover/remix. When provided, generates a cover version. MUST be a publicly accessible HTTP/HTTPS URL. Use file_upload tool first if the user provides a local file."},audio_format:{type:"string",enum:["mp3","wav","flac"],description:"Output audio format. Defaults to mp3."}},required:["prompt"]};function Ac(r){return{name:hs,label:"Music Generate",description:"Generate music, songs, or melodies from text descriptions. Prompt MUST be in English. Supports lyrics for vocal songs. DO NOT use for spoken-word audio or TTS \u2014 use tts tool instead. IMPORTANT: If the user has not specified genre/style or duration, use ask_user to clarify (e.g. style: lo-fi / pop / rock / jazz; duration inferred from purpose: 30s for ringtone, 60-90s for BGM, 180-240s for full song). Auto-infer duration from purpose when possible.",parameters:Ty,execute:async(e,t)=>{let n=t.lyrics;if(!n&&!t.is_instrumental&&r.generateLyrics)try{n=await r.generateLyrics(t.prompt)}catch{}let o=await r.generateMusic({prompt:t.prompt,purpose:t.purpose,style:t.style,lyrics:n,duration:t.duration,isInstrumental:t.is_instrumental,audioUrl:t.cover_audio_url,audioFormat:t.audio_format}),s=o.mediaUrls.length;return{content:[{type:"text",text:`Generated ${s} audio track${s>1?"s":""}${o.model?` (model: ${o.model})`:""}`}],details:{type:"music_generate",model:o.model,durationMs:o.durationMs,mediaUrls:o.mediaUrls}}}}}var wy="video_edit",vy={type:"object",properties:{prompt:{type:"string",description:"Edit instruction. Reference videos as \u89C6\u98911, \u89C6\u98912, \u89C6\u98913. Reference images as \u56FE\u72471, \u56FE\u72472. Operations: add/remove/modify elements, extend, track fill."},source_videos:{type:"array",items:{type:"string"},minItems:1,maxItems:3,description:"Video(s) to edit (1-3 URLs). Order: [0]=\u89C6\u98911, [1]=\u89C6\u98912, [2]=\u89C6\u98913. All URLs MUST be publicly accessible HTTP/HTTPS. Use file_upload tool first if the user provides a local file."},reference_images:{type:"array",items:{type:"string"},maxItems:9,description:"Optional reference images for element replacement (up to 9). All URLs MUST be publicly accessible HTTP/HTTPS. Use file_upload tool first if the user provides a local file."},duration:{type:"number",minimum:4,maximum:15,description:"Output duration in seconds (4-15s). Default: same as source."},aspect_ratio:{type:"string",description:"Output aspect ratio: 16:9, 9:16, 1:1, 4:3, 3:4, 21:9. Default: same as source."},resolution:{type:"string",description:"Output resolution: '480p' or '720p'. Default: '720p'."}},required:["prompt","source_videos"]};function Pc(r){return{name:wy,label:"Video Edit",description:"Edit existing videos: add/remove/modify elements, extend, or bridge clips. Requires source_videos (max 3). Max 9 reference images for element replacement. Max 720p. All video/image URLs MUST be publicly accessible HTTP/HTTPS. Use file_upload tool first if the user provides a local file. For generating NEW videos from scratch, use video_generate instead.",parameters:vy,execute:async(e,t)=>{if(!t.source_videos?.length)return{content:[{type:"text",text:"Error: source_videos is required."}]};let n=await r.editVideo({prompt:t.prompt,sourceVideos:t.source_videos,referenceImages:t.reference_images,duration:t.duration,aspectRatio:t.aspect_ratio,resolution:t.resolution});return{content:[{type:"text",text:`Video edited successfully${n.model?` (model: ${n.model})`:""}`}],details:{type:"video_edit",model:n.model,durationMs:n.durationMs,mediaUrls:n.mediaUrls}}}}}var xy="video_merge",Sy={type:"object",properties:{clips:{type:"array",items:{type:"object",properties:{video:{type:"string",description:"Video URL or file path. MUST be publicly accessible HTTP/HTTPS URL. Use file_upload tool first if local file."},audio:{type:"string",description:"Narration audio file path (from TTS)."},trimStart:{type:"number",description:"Trim start in seconds (default 0)."},trimEnd:{type:"number",description:"Trim end in seconds (default: full)."}},required:["video"]},minItems:2,description:"Array of video clips to merge, in order."},transition:{type:"string",description:"Transition effect: 'crossfade' (default), 'fade', 'wipeleft', 'cut', 'dissolve', etc."},transitionDuration:{type:"number",description:"Transition duration in seconds (0.1-2.0, default 0.5)."},subtitles:{type:"string",description:"Path to SRT subtitle file to burn-in."},bgm:{type:"string",description:"Background music file path."},bgmVolume:{type:"number",description:"BGM volume (0.0-1.0, default 0.15)."},outputResolution:{type:"string",description:"Output resolution: '1920x1080', '1080x1920', etc. Default: auto."},outputFps:{type:"number",description:"Output FPS (default 30)."}},required:["clips"]};function Mc(r){return{name:xy,label:"Video Merge",description:"Merge multiple video clips into a single video with transitions, subtitles, and background music. Requires at least 2 clips. Supports crossfade, fade, wipe, dissolve, and cut transitions. All video/audio URLs MUST be publicly accessible HTTP/HTTPS. Use file_upload tool first if the user provides local files. Audio per clip is preserved; BGM is mixed at adjustable volume.",parameters:Sy,execute:async(e,t)=>{if(!t.clips||t.clips.length<2)return{content:[{type:"text",text:"Error: at least 2 clips are required for merging."}]};let n=await r.mergeVideos({clips:t.clips,transition:t.transition,transitionDuration:t.transitionDuration,subtitles:t.subtitles,bgm:t.bgm,bgmVolume:t.bgmVolume,outputResolution:t.outputResolution,outputFps:t.outputFps});return{content:[{type:"text",text:`Merged ${n.clipCount} clips \u2192 ${n.durationSec.toFixed(1)}s video`+(t.transition?` (transition: ${t.transition})`:"")}],details:{type:"video_merge",localPath:n.localPath,servePath:n.servePath,durationSec:n.durationSec,clipCount:n.clipCount,mediaUrls:n.mediaUrls}}}}}var _y="video_upscale",Ry={type:"object",properties:{video:{type:"string",description:"Video URL to upscale. MUST be publicly accessible HTTP/HTTPS URL. Use file_upload tool first if the user provides a local file."},targetResolution:{type:"string",description:"Target resolution: '1080p' (default, 1920x1080/1080x1920), '2k' (2560x1440/1440x2560)."},sharpness:{type:"string",description:"Sharpening intensity: 'light' (default), 'medium', 'strong'."}},required:["video"]};function Ic(r){return{name:_y,label:"Video Upscale",description:"Upscale a video to higher resolution with optional sharpening. Auto-detects orientation (landscape/portrait). Uses Lanczos interpolation + unsharp mask. Supports 1080p and 2K targets. Video URL MUST be publicly accessible HTTP/HTTPS. Use file_upload tool first if the user provides a local file. Best used as post-processing after video_merge.",parameters:Ry,execute:async(e,t)=>{let n=await r.upscaleVideo({video:t.video,targetResolution:t.targetResolution,sharpness:t.sharpness});return{content:[{type:"text",text:`Upscaled to ${n.resolution}${t.sharpness?` (sharpness: ${t.sharpness})`:""}`}],details:{type:"video_upscale",localPath:n.localPath,servePath:n.servePath,resolution:n.resolution,durationSec:n.durationSec,mediaUrls:n.mediaUrls}}}}}var Cy="three_d_generate",Ay={type:"object",properties:{prompt:{type:"string",description:"3D model generation prompt. Describe the object's shape, material, texture, color, and pose. For text-to-3D, provide a detailed description. For image-to-3D, also provide image_url."},image_url:{type:"string",description:"Reference image URL for image-to-3D generation. The image should show the object clearly from a single viewpoint with clean background for best results. MUST be a publicly accessible HTTP/HTTPS URL. Local file paths and data: URLs are NOT supported."},output_format:{type:"string",description:"3D model output format: 'glb' (default), 'obj', 'usd', 'usdz'."},seed:{type:"number",description:"Random seed for reproducible generation."}},required:["prompt"]};function Ec(r){return{name:Cy,label:"3D Generate",description:"Generate a 3D model from a text prompt or reference image. Supports text-to-3D and image-to-3D workflows. Output formats include GLB, OBJ, USD. The generated model can be viewed in any 3D viewer or imported into game engines. IMPORTANT: Describe the object in detail \u2014 shape, size, material, texture, color, and pose.",parameters:Ay,execute:async(e,t)=>{let n=await r.generate3D({prompt:t.prompt,imageUrl:t.image_url,outputFormat:t.output_format,seed:t.seed}),o=n.mediaUrls.length,s=`Generated ${o} 3D model${o>1?"s":""}${n.model?` (model: ${n.model})`:""}`;return o===0&&n.metadata?.debugResponseKeys&&(s+=` [debug: response keys=${JSON.stringify(n.metadata.debugResponseKeys)}, content=${n.metadata.debugContentSample??"null"}]`),{content:[{type:"text",text:s}],details:{type:"three_d_generate",model:n.model,durationMs:n.durationMs,mediaUrls:n.mediaUrls,...n.metadata??{}}}}}}var Py={type:"object",properties:{audio_url:{type:"string",description:"URL of the audio file to transcribe. Supports mp3, wav, m4a, ogg, flac formats. MUST be a publicly accessible HTTP/HTTPS URL. Use file_upload tool first if the user provides a local file."},language:{type:"string",description:"Language hint for transcription: 'zh' (Chinese), 'en' (English), or auto-detect if omitted."}},required:["audio_url"]};function Oc(r){return{name:"stt",label:"STT",description:"Transcribe audio to text (Speech-to-Text). Provide an audio file URL and receive the spoken content as text. Supports Chinese and English. Use for meeting transcription, voice message reading, subtitle generation, or any audio-to-text conversion.",parameters:Py,execute:async(e,t)=>{if(!t.audio_url)return{content:[{type:"text",text:"Error: audio_url parameter is required. Provide a publicly accessible HTTP/HTTPS URL to an audio file."}],details:{error:"audio_url parameter is required"}};let n=await r.speechToText({audioUrl:t.audio_url,language:t.language}),o=n.transcription.length>200?n.transcription.slice(0,200)+"\u2026":n.transcription;return{content:[{type:"text",text:n.transcription}],details:{type:"stt",model:n.model,durationMs:n.durationMs,transcriptionLength:n.transcription.length,preview:o}}}}}var My="voice_clone",Iy={type:"object",properties:{text:{type:"string",description:"Text to synthesize in the cloned voice."},sample_audio_url:{type:"string",description:"URL of an audio sample (5-30 seconds recommended) of the voice to clone. The sample should be clear speech with minimal background noise. MUST be a publicly accessible HTTP/HTTPS URL. Use file_upload tool first if the user provides a local file."},speed:{type:"number",description:"Speech speed multiplier (0.5-2.0). Default is 1.0."}},required:["text","sample_audio_url"]};function Lc(r){return{name:My,label:"Voice Clone",description:"Clone a voice from an audio sample and synthesize new speech in that voice. Requires a clear audio sample (5-30s recommended) of the target voice. Use for personalized narration, character voices, or voice preservation. DO NOT use for impersonation or deception. For standard TTS with preset voices, use the tts tool instead.",parameters:Iy,execute:async(e,t)=>{let n=await r.cloneVoice({text:t.text,sampleAudioUrl:t.sample_audio_url,speed:t.speed});return{content:[{type:"text",text:`Voice cloned and synthesized speech${n.model?` (model: ${n.model})`:""}`}],details:{type:"voice_clone",model:n.model,voiceId:n.voiceId,durationMs:n.durationMs,mediaUrls:n.mediaUrls}}}}}var Ey="media_cancel",Oy={type:"object",properties:{task_id:{type:"string",description:"The task ID of the media generation to cancel (returned in previous generation results)."},provider:{type:"string",description:"Provider name (e.g. 'doubao', 'zhipu'). If omitted, auto-detects from task context."}},required:["task_id"]};function Dc(r){return{name:Ey,label:"Media Cancel",description:"Cancel an in-progress media generation task (video, 3D, etc.). Provide the task_id from a previous generation result. Use this when a user wants to abort a long-running generation.",parameters:Oy,execute:async(e,t)=>{if(!t.task_id)return{content:[{type:"text",text:"Error: task_id is required."}],details:{error:"task_id is required"}};let n=await r.cancelTask({taskId:t.task_id,provider:t.provider});return{content:[{type:"text",text:n.ok?`Task ${t.task_id} cancelled.`:`Cancel failed: ${n.message}`}],details:n.ok?void 0:{error:n.message}}}}}var Ly="file_upload",Dy={type:"object",properties:{file_path:{type:"string",description:"Absolute path to the local file to upload. Supported: images (jpg/png/webp/gif), audio (mp3/wav/m4a/ogg/flac), video (mp4/mov/avi). The file will be uploaded to the configured provider's Files API and a file ID or public URL will be returned."},purpose:{type:"string",description:"Upload purpose hint: 'media_reference' (for image/video/audio generation), 'user_data' (general). Default: 'media_reference'."}},required:["file_path"]};function $c(r){return{name:Ly,label:"File Upload",description:"Upload a local file to the cloud provider's Files API. Returns a file ID (or public URL) that can be used as input for media generation tools (image_generate, video_generate, video_edit, etc.). Use this when the user provides a local file that needs to be referenced by URL in media tools. IMPORTANT: Only call this tool for files that actually need to be uploaded for media generation. Not all providers support file upload \u2014 tool availability depends on the configured provider.",parameters:Dy,execute:async(e,t)=>{let n=await r.uploadFile({filePath:t.file_path,purpose:t.purpose}),o=[`Uploaded "${n.filename}" (${ys(n.bytes)}) via ${n.provider}`];return n.url&&o.push(`URL: ${n.url}`),o.push(`File ID: ${n.fileId}`),{content:[{type:"text",text:o.join(`
264
+ `)}],details:{type:"file_upload",fileId:n.fileId,url:n.url,filename:n.filename,bytes:n.bytes,provider:n.provider}}}}}var $y="file_query",Ny={type:"object",properties:{file_id:{type:"string",description:"Query a specific file by ID. If omitted, lists recent uploaded files."},limit:{type:"number",description:"Max number of files to list when file_id is omitted. Default: 10, max: 100."}},required:[]};function Nc(r){return{name:$y,label:"File Query",description:"Query or list uploaded files from the provider's Files API. Use file_id to get info on a specific file, or omit to list recent uploads. Returns file ID, name, size, status, and URL (if available).",parameters:Ny,execute:async(e,t)=>{if(t.file_id){let i=await r.queryFile({fileId:t.file_id}),a=[`File: ${i.filename}`,`ID: ${i.id}`,`Size: ${ys(i.bytes)}`,`Status: ${i.status}`];return i.url&&a.push(`URL: ${i.url}`),i.createdAt&&a.push(`Created: ${i.createdAt}`),{content:[{type:"text",text:a.join(`
263
265
  `)}],details:{type:"file_query",fileId:i.id}}}let n=Math.min(Math.max(t.limit??10,1),100),o=await r.listFiles({limit:n});if(o.length===0)return{content:[{type:"text",text:"No uploaded files found."}],details:{type:"file_query",count:0}};let s=[`Found ${o.length} file(s):
264
- `];for(let i of o)s.push(`- ${i.filename} | ID: ${i.id} | ${cs(i.bytes)} | ${i.status}${i.url?` | ${i.url}`:""}`);return{content:[{type:"text",text:s.join(`
265
- `)}],details:{type:"file_query",count:o.length}}}}}var Py="file_delete",Iy={type:"object",properties:{file_id:{type:"string",description:"ID of the uploaded file to delete."}},required:["file_id"]};function Ec(r){return{name:Py,label:"File Delete",description:"Delete a previously uploaded file from the provider's Files API. Use the file ID returned by file_upload or file_query.",parameters:Iy,execute:async(e,t)=>(await r.deleteFile({fileId:t.file_id}),{content:[{type:"text",text:`Deleted file ${t.file_id}`}],details:{type:"file_delete",fileId:t.file_id}})}}function cs(r){return r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`}var Ey="ask_user",Oy={type:"object",properties:{questions:{type:"array",minItems:1,maxItems:4,description:"1-4 clarifying questions to ask the user.",items:{type:"object",properties:{question:{type:"string",description:"The question text. Should end with '?'."},header:{type:"string",description:"Short identifier/tag for this question (max 50 chars)."},options:{type:"array",description:"2-4 options for the user to choose from. Omit for free text.",items:{type:"object",properties:{label:{type:"string",description:"Display label (1-5 words)."},description:{type:"string",description:"Brief explanation of this option."}},required:["label"]}},multiSelect:{type:"boolean",description:"Allow selecting multiple options (default: false)."}},required:["question","header"]}}},required:["questions"]};function Oc(r){return{name:Ey,label:"Ask User",description:"Ask the user clarifying questions when you need more information to proceed. Supports free text questions and multiple-choice options. Use this when the user's intent is ambiguous or you need confirmation.",parameters:Oy,execute:async(e,t)=>{if(!t.questions||t.questions.length===0)return{content:[{type:"text",text:"Error: at least one question is required."}],details:{type:"ask_user",error:"no_questions"}};if(t.questions.length>4)return{content:[{type:"text",text:"Error: maximum 4 questions allowed."}],details:{type:"ask_user",error:"too_many_questions"}};let n=t.questions.map(i=>i.question);if(new Set(n).size!==n.length)return{content:[{type:"text",text:"Error: all questions must have unique text."}],details:{type:"ask_user",error:"duplicate_questions"}};for(let i of t.questions){if(i.options&&(i.options.length<2||i.options.length>4))return{content:[{type:"text",text:`Error: question "${i.header}" must have 2-4 options (got ${i.options.length}).`}],details:{type:"ask_user",error:"invalid_option_count"}};if(i.options){let a=i.options.map(l=>l.label);if(new Set(a).size!==a.length)return{content:[{type:"text",text:`Error: question "${i.header}" has duplicate option labels.`}],details:{type:"ask_user",error:"duplicate_option_labels"}}}}let o=await r.askUser(t.questions);if(o===null)return{content:[{type:"text",text:"User declined to answer questions."}],details:{type:"ask_user",declined:!0}};let s=["User answered:"];for(let i of t.questions){let a=o[i.question]??"(no answer)";s.push(`- ${i.header}: ${a}`)}return{content:[{type:"text",text:s.join(`
266
- `)}],details:{type:"ask_user",answers:o,questionCount:t.questions.length}}}}}function Lc(r,e){return!r?.webSearch||!r.capabilities.includes("web_search")?e:async(t,n)=>{try{let s=await r.webSearch(t,{maxResults:n?.maxResults});if(n?.allowedDomains?.length){let i=new Set(n.allowedDomains.map(a=>a.toLowerCase()));s=s.filter(a=>{try{return i.has(new URL(a.url).hostname.toLowerCase())}catch{return!1}})}if(n?.blockedDomains?.length){let i=new Set(n.blockedDomains.map(a=>a.toLowerCase()));s=s.filter(a=>{try{return!i.has(new URL(a.url).hostname.toLowerCase())}catch{return!0}})}if(s.length>0)return{query:t,results:s.map(i=>({title:i.title,url:i.url,snippet:i.snippet}))}}catch{}return e(t,n)}}var ee,de={},Uc,ps,He={},Nc;function jc(r){Nc=r}var Fc=null;function Bc(r){Fc=r}function Wc(r,e,t,n,o){ee=r,de=e??{},Uc=t,ps=o,He=n??{},Dy()}function ms(r){let e=He[r];if(!(!e||!ee))return ee.resolveModelById(e.provider,e.model,r)}function Dy(){Uy(),Ny(),jy(),Fy()}function Uy(){let r=we(as);if(!r)return;let e=He.video;if(!e||!ee)return;let t=ee.resolveModelById(e.provider,e.model,"video");if(!t)return;let n=t.modelInfo.mediaCapabilities;if(!n)return;let o=n.maxDurationSeconds??10,s=o>=10?4:3,i=n.resolutions?.join("/")||"720P",a=t.modelInfo.name||t.modelInfo.id;r.description=`Generate a short video clip from a text prompt, reference image, source video, or multimodal references. Prompt MUST be in English. Include scene, movement, camera motion, lighting details. Current model: ${a}. Single-shot: ${s}\u2013${o}s. For longer videos (>${o}s), use multi-shot storyboard workflow. MODES: (1) text-to-video: prompt only. (2) image-to-video: prompt + image_url. (3) video-to-video: prompt + reference_videos \u2014 restyle/transform an existing video with prompt guidance. (4) multimodal reference: prompt + any combination of image_url / reference_videos / reference_audios for style/motion/audio-guided generation. (5) generate_audio=true for synchronized sound effects. ALL image/video/audio URLs MUST be publicly accessible HTTP/HTTPS URLs. Local file paths and data: URIs are NOT supported by the generation API. If the user provides a local file, use the file_upload tool FIRST to get a public URL. IMPORTANT: If the user has not specified aspect ratio or duration, use ask_user to clarify (e.g. aspect: 16:9 for landscape / 9:16 for vertical / 1:1 for square; duration: ${s}-${o}s). Auto-set aspect_ratio based on stated purpose (e.g. 9:16 for short-video / Douyin, 16:9 for presentation).`;let l=r.parameters?.properties,u=l?.duration;u&&(u.minimum=s,u.maximum=o,u.description=`Video duration in seconds (${s}\u2013${o}s for ${a}). For longer videos (>${o}s), use multi-shot storyboard workflow (generate + extend/merge). Must be confirmed by user before generation.`);let c=l?.resolution;c&&n.resolutions&&(c.description=`Output resolution: ${i}. Default: '720p'.`)}function Ny(){let r=we(is);if(!r)return;let e=ms("image");if(!e)return;let t=e.modelInfo.mediaCapabilities,n=e.modelInfo.name||e.modelInfo.id,o=[];if(t?.sizes?.length&&o.push(`Sizes: ${t.sizes.join(", ")}`),t?.transparentBackground&&o.push("Supports transparent background"),r.description=`Generate images from a text prompt. You MUST enrich vague prompts with details about style, lighting, composition, color, and mood before calling. Supports img2img via image_url reference. All generated images are saved locally and can be viewed immediately. Current model: ${n}. ${o.join(". ")}${o.length?". ":""}IMPORTANT: If the user has not specified purpose or preferred style, use ask_user to clarify (e.g. purpose: social-media / wallpaper / poster; style: photorealistic / anime / watercolor). Infer image size automatically from purpose. ALL reference image URLs MUST be publicly accessible HTTP/HTTPS URLs. Use file_upload tool first if the user provides a local file.`,t?.sizes?.length){let i=r.parameters?.properties?.size;i&&(i.description=`Dimensions: ${t.sizes.join(", ")}. Default: '1024x1024'. Auto-infer from purpose.`)}}function jy(){let r=we("tts");if(!r)return;let e=ms("tts");if(!e)return;let t=e.modelInfo.mediaCapabilities,n=e.modelInfo.name||e.modelInfo.id,o=[];if(t?.voices?.length&&o.push(`Voices: ${t.voices.join(", ")}`),t?.maxCharacters&&o.push(`Max: ${t.maxCharacters} characters per request`),t?.formats?.length&&o.push(`Formats: ${t.formats.join(", ")}`),r.description=`Convert text to speech (TTS) \u2014 read text aloud as spoken audio. Use for narration, voice messages, or any spoken-word output. DO NOT use for music, songs, or melodies \u2014 use music_generate instead. Current model: ${n}. ${o.join(". ")}${o.length?".":""}`,t?.voices?.length){let i=r.parameters?.properties?.voice;i&&(i.description=`Voice name. Available: ${t.voices.join(", ")}.`)}}function Fy(){let r=we(ls);if(!r)return;let e=ms("music");if(!e)return;let t=e.modelInfo.mediaCapabilities,n=e.modelInfo.name||e.modelInfo.id,o=[];if(t?.maxDurationSeconds&&o.push(`Max duration: ${t.maxDurationSeconds}s`),t?.formats?.length&&o.push(`Formats: ${t.formats.join(", ")}`),r.description=`Generate music, songs, or melodies from text descriptions. Prompt MUST be in English. Supports lyrics for vocal songs. DO NOT use for spoken-word audio or TTS \u2014 use tts tool instead. Current model: ${n}. ${o.join(". ")}${o.length?". ":""}IMPORTANT: If the user has not specified genre/style or duration, use ask_user to clarify (e.g. style: lo-fi / pop / rock / jazz; duration inferred from purpose).`,t?.maxDurationSeconds){let i=r.parameters?.properties?.duration;i&&(i.maximum=t.maxDurationSeconds,i.description=`Duration in seconds (5\u2013${t.maxDurationSeconds}s for ${n}). Infer from purpose: ringtone 15-30s, BGM 30-60s, full song 120-180s.`)}}async function Ie(r){if(!ee)throw new Error(`No media provider configured for ${r.mediaType}`);let e=He[r.mediaType],t=e?.provider,n=e?.model||r.model;if(!t)throw new Error(`No provider configured for ${r.mediaType}. Please configure a provider in settings.`);let o={...r};ps&&!o.onProgress&&(o.onProgress=(l,u,c)=>{ps(c??"pending",r.mediaType,l,u,t)});let s=await $c(t,n||r.model,o);if(s.ok)return s.result;let i=ee.listMediaModels(r.mediaType),a=[`${t}: ${s.error}`];for(let l of i){if(l.providerId===t||!de[l.providerId])continue;let c=await $c(l.providerId,l.modelInfo.id,r);if(c.ok)return c.result;a.push(`${l.providerId}/${l.modelInfo.id}: ${c.error}`)}throw new Error(`All media providers failed for ${r.mediaType}:
267
- `+a.map(l=>` - ${l}`).join(`
268
- `))}async function $c(r,e,t){let n=ee.getTransport(r);if(!n)return{ok:!1,error:"transport not available"};let o=de[r];if(!o)return{ok:!1,error:"no API key"};try{let s={...t,model:e},i=await n.generate(s,o);i.billingUnit||(t.mediaType==="tts"&&t.text?(i.billingUnit="per_character",i.billingQuantity=t.text.length):(t.mediaType==="video"||t.mediaType==="music")&&t.duration?(i.billingUnit="per_second",i.billingQuantity=t.duration):(i.billingUnit="per_call",i.billingQuantity=1));let a=i.model??s.model,l=i.billingUnit??"per_call",u=i.billingQuantity??1;return Uc?.(a,l,u),{ok:!0,result:i}}catch(s){return{ok:!1,error:s instanceof Error?s.message:String(s)}}}function Ee(r){if(!ee)return!1;let e=He[r];if(!e)return!1;let t=ee.getTransport(e.provider),n=de[e.provider];return!!(t&&n)}function us(r,e){if(!Ee(r))return!1;let t=He[r],n=ee.resolveModelById(t.provider,t.model,r);if(!n)return!1;let o=n.modelInfo.mediaCapabilities;return!o||!("operations"in o)||!o.operations?!0:o.operations.includes(e)}function Qn(){if(!ee)return;for(let[,e]of Object.entries(He)){if(!e)continue;let t=ee.getTransport(e.provider),n=de[e.provider];if(t instanceof _e&&n)return{id:e.provider,type:"volcengine"}}if(de.google)return{id:"google",type:"gemini"}}var ds;function Zn(){return ds||(ds=new Bt({baseUrl:"https://generativelanguage.googleapis.com/v1beta"})),ds}var ot=process.cwd();function ge(r){return H.isAbsolute(r)?H.normalize(r):H.resolve(ot,r)}var By=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg",".ico"]),Gc=new Set([".exe",".dll",".so",".dylib",".zip",".tar",".gz",".7z",".rar",".wasm",".class"]),Wy={".pdf":"application/pdf",".txt":"text/plain",".html":"text/html",".htm":"text/html",".css":"text/css",".js":"text/javascript",".ts":"text/plain",".json":"application/json",".xml":"application/xml",".csv":"text/csv",".md":"text/markdown",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".svg":"image/svg+xml",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".flac":"audio/flac",".m4a":"audio/mp4",".aac":"audio/aac",".mp4":"video/mp4",".webm":"video/webm",".avi":"video/x-msvideo",".mov":"video/quicktime",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation"};function Gy(){return{resolvePath:ge,async readFile(r){let e=ge(r),t=H.extname(e).toLowerCase();if(Gc.has(t))return{type:"binary",mimeType:"application/octet-stream"};if(By.has(t)){let o=await U.promises.readFile(e),s=t===".png"?"image/png":t===".svg"?"image/svg+xml":t===".gif"?"image/gif":t===".webp"?"image/webp":"image/jpeg";return{type:"image",base64:o.toString("base64"),mimeType:s}}return{type:"text",text:await U.promises.readFile(e,"utf8")}},validatePath(r){let e=ge(r);return e.startsWith("/dev/")||e.startsWith("/proc/")||e.startsWith("/sys/")?`Blocked: reading device/system path ${e}`:null}}}function Hy(){return{resolvePath:ge,async writeFile(r,e){let t=ge(r);await U.promises.mkdir(H.dirname(t),{recursive:!0}),await U.promises.writeFile(t,e,"utf8")}}}function Vy(){return{resolvePath:ge,async readFile(r){let e=ge(r);return U.promises.readFile(e,"utf8")},async writeFile(r,e){let t=ge(r);await U.promises.mkdir(H.dirname(t),{recursive:!0}),await U.promises.writeFile(t,e,"utf8")}}}function zy(){return{resolvePath:ge,async readFile(r){let e=ge(r);return U.promises.readFile(e,"utf8")},async writeFile(r,e){let t=ge(r);await U.promises.mkdir(H.dirname(t),{recursive:!0}),await U.promises.writeFile(t,e,"utf8")},async deleteFile(r){let e=ge(r);await U.promises.unlink(e)},async fileExists(r){let e=ge(r);try{return await U.promises.access(e),!0}catch{return!1}}}}function qy(){return{resolvePath:ge,async glob(r,e){let t=e.cwd||ot,n=e.limit||1e3,o=[],s=!1,i=r.replace(/\\/g,"/").split("/"),a=i.some(c=>c==="**"),l=i[i.length-1]??"*",u=Hc(l);try{await gs(t,async c=>{if(o.length>=n)return s=!0,!1;let d=H.basename(c);return u.test(d)&&o.push(c),!0},a?1/0:1)}catch{}return{files:o,truncated:s}},async grep(r,e){let t=e.cwd||ot;try{return await Jy(r,t,e)}catch{return await Yy(r,t,e)}}}}function Hc(r){let e=r.replace(/[.+^$|()[\]\\]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".");return e=e.replace(/\\\{([^}]+)\\\}/g,(t,n)=>"("+n.replace(/,/g,"|")+")"),new RegExp(`^${e}$`,"i")}var Ky=new Set([".git",".svn",".hg","node_modules","__pycache__",".next","dist",".tox",".venv"]);async function gs(r,e,t,n=0,o=""){if(n>t)return;let s;try{s=await U.promises.readdir(r,{withFileTypes:!0})}catch{return}for(let i of s){let a=o?`${o}/${i.name}`:i.name;if(i.isDirectory()){if(Ky.has(i.name))continue;await gs(H.join(r,i.name),e,t,n+1,a)}else if(i.isFile()&&!await e(a))return}}function Jy(r,e,t){return new Promise((n,o)=>{let s=["--json","--no-heading","--max-columns","500"];t.caseInsensitive&&s.push("-i"),t.contextLines&&s.push("-C",String(t.contextLines)),t.fileGlob&&s.push("-g",t.fileGlob),s.push("--max-count",String(t.headLimit??250)),s.push(r),s.push("."),$y("rg",s,{cwd:e,maxBuffer:10*1024*1024,timeout:3e4},(i,a)=>{if(i&&!("killed"in i&&i.killed)&&i.code!==1){o(i);return}let l=[];for(let p of a.split(`
269
- `))if(p.trim())try{let m=JSON.parse(p);m.type==="match"&&m.data&&l.push({path:m.data.path?.text??"",line:m.data.line_number??0,text:(m.data.lines?.text??"").trimEnd()})}catch{}let u=t.headLimit??250,c=t.offset??0,d=l.slice(c,c+u);n({matches:d,truncated:l.length>c+u})})})}async function Yy(r,e,t){let n=new RegExp(r,t.caseInsensitive?"i":""),o=t.headLimit??250,s=t.offset??0,i=t.fileGlob?Hc(t.fileGlob):null,a=[],l=!1;return await gs(e,async u=>{if(a.length>=s+o+1)return l=!0,!1;if(i&&!i.test(H.basename(u)))return!0;let c=H.extname(u).toLowerCase();if(Gc.has(c))return!0;try{let p=(await U.promises.readFile(H.join(e,u),"utf8")).split(`
270
- `);for(let m=0;m<p.length;m++)if(n.test(p[m])&&(a.push({path:u,line:m+1,text:p[m].slice(0,500)}),a.length>=s+o+1))return l=!0,!1}catch{}return!0},1/0),{matches:a.slice(s,s+o),truncated:l}}var Dc=!1;function Xy(){if(!Dc)if(Dc=!0,Wn()){let r=process.env.QLOGICAGENT_POWERSHELL_PATH??"powershell.exe";Jt(Yr(r))}else if(process.platform==="win32"){let r=Qy();Jt(Xn(r))}else{let r=process.env.SHELL?.endsWith("bash")?process.env.SHELL:"/bin/bash";Jt(Xn(r))}}function Qy(){let r=process.env.QLOGICAGENT_BASH_PATH;if(r&&U.existsSync(r))return r;let e=["C:\\Program Files\\Git\\bin\\bash.exe","C:\\Program Files (x86)\\Git\\bin\\bash.exe"],t=process.env.ProgramFiles?H.join(process.env.ProgramFiles,"Git","bin","bash.exe"):null;t&&!e.includes(t)&&e.unshift(t);for(let n of e)if(U.existsSync(n))return n;return"bash"}function Zy(){return{async fetchUrl(r){let e=new AbortController,t=setTimeout(()=>e.abort(),3e4);try{let n=await fetch(r.url,{signal:e.signal,headers:{"User-Agent":"Mozilla/5.0 (compatible; QLogicAgent/1.0)",Accept:"text/html,application/xhtml+xml,text/plain,*/*"},redirect:"follow"});if(!n.ok)return{content:`HTTP ${n.status} ${n.statusText}`};let o=n.headers.get("content-type")??"",s=await n.text();return r.maxChars&&s.length>r.maxChars&&(s=s.slice(0,r.maxChars)),o.includes("html")&&r.extractMode!=="json"&&(s=eb(s)),{content:s,title:tb(s)}}finally{clearTimeout(t)}}}}function eb(r){return r.replace(/<script[\s\S]*?<\/script>/gi,"").replace(/<style[\s\S]*?<\/style>/gi,"").replace(/<[^>]+>/g," ").replace(/&nbsp;/gi," ").replace(/&amp;/gi,"&").replace(/&lt;/gi,"<").replace(/&gt;/gi,">").replace(/&quot;/gi,'"').replace(/&#39;/gi,"'").replace(/\s{2,}/g," ").trim()}function tb(r){return r.match(/<title[^>]*>([^<]+)<\/title>/i)?.[1]?.trim()}function nb(){let r=async(e,t)=>{let n=process.env.SEARXNG_BASE_URL?.trim();if(!n)return{query:e,results:[],totalResults:0};let o=t?.maxResults??10,s=new URL("/search",n);s.searchParams.set("q",e),s.searchParams.set("format","json"),s.searchParams.set("pageno","1");let i=new AbortController,a=setTimeout(()=>i.abort(),15e3);try{let l=await fetch(s.toString(),{signal:i.signal,headers:{Accept:"application/json"}});if(!l.ok)return{query:e,results:[]};let u=await l.json(),c=(u.results??[]).slice(0,o).map(d=>({title:d.title??"",url:d.url??"",snippet:d.content??""}));if(t?.allowedDomains?.length){let d=new Set(t.allowedDomains.map(p=>p.toLowerCase()));return{query:e,results:c.filter(p=>{try{return d.has(new URL(p.url).hostname.toLowerCase())}catch{return!1}})}}if(t?.blockedDomains?.length){let d=new Set(t.blockedDomains.map(p=>p.toLowerCase()));return{query:e,results:c.filter(p=>{try{return!d.has(new URL(p.url).hostname.toLowerCase())}catch{return!0}})}}return{query:e,results:c,totalResults:u.number_of_results}}finally{clearTimeout(a)}};return{search:(e,t)=>Lc(Nc,r)(e,t)}}function ob(){let r=H.join(process.env.HOME??process.env.USERPROFILE??".",".qlogicagent");function e(o){return H.join(r,"projects",o,".instructions")}function t(o,s){if(!s.endsWith(".md"))throw new Error("Filename must end with .md");if(s.includes(".."))throw new Error("Path traversal not allowed");let i=e(o),a=H.resolve(i,s);if(!a.startsWith(i+H.sep)&&a!==i)throw new Error("Path traversal not allowed");return a}function n(o,s){if(!U.existsSync(o))return[];let i=[];for(let a of U.readdirSync(o,{withFileTypes:!0})){let l=H.join(o,a.name);if(a.isDirectory())i.push(...n(l,s));else if(a.isFile()&&a.name.endsWith(".md")){let u=U.statSync(l);i.push({filename:H.relative(s,l).replace(/\\/g,"/"),path:l,size:u.size,updatedAt:u.mtime.toISOString(),content:U.readFileSync(l,"utf-8")})}}return i}return{list(o){let s=e(o);return n(s,s).map(i=>({filename:i.filename,path:i.path,size:i.size,updatedAt:i.updatedAt}))},read(o,s){try{let i=t(o,s);if(!U.existsSync(i))return null;let a=U.statSync(i),l=U.readFileSync(i,"utf-8");return{filename:s,path:i,size:a.size,updatedAt:a.mtime.toISOString(),content:l}}catch{return null}},write(o,s,i){let a=t(o,s);U.mkdirSync(H.dirname(a),{recursive:!0}),U.writeFileSync(a,i,"utf-8");let l=U.statSync(a);return{filename:s,path:a,size:l.size,updatedAt:l.mtime.toISOString(),content:i}},remove(o,s){try{let i=t(o,s);return U.existsSync(i)?(U.unlinkSync(i),!0):!1}catch{return!1}}}}function rb(r){r?.workdir&&(ot=r.workdir),Xy(),Kn(ot);let e=[];e.push(pl()),e.push(ml()),e.push(Oc({askUser:async c=>Fc?.(c)??null})),e.push(Rl({onProgress:r?.onExecProgress,interpretExitCode:(c,d)=>{if(c===127)return"command not found";if(c===126)return"permission denied";if(c===137)return"killed (SIGKILL / OOM)";if(c===143)return"terminated (SIGTERM)";if(c===130)return"interrupted (Ctrl+C)"}}));let t=Gy(),n=Hy(),o=Vy(),s=zy();e.push(Ml(t)),e.push(Il(n)),e.push(El(o)),e.push(ts(s)),e.push(Dl(s)),e.push($l(qy())),e.push(Vl(Zy())),e.push(zl(nb()));let i=ob();e.push(ql(i));let a=r?.log??{info:()=>{},warn:()=>{}};e.push(Kl(lc({log:a}))),e.push(pc());let l={invokeTool:async(c,d,p)=>{let m=we(c);if(!m)return{result:"",error:`Unknown tool: ${c}`};try{let g=await m.execute(`wf_${Date.now()}`,d,p);return{result:g.content.map(b=>b.text??"").join(`
271
- `),error:g.details?.error}}catch(g){return{result:"",error:g.message}}},getCwd:()=>ot};e.push(fc(l)),e.push(hc({sleep:(c,d)=>new Promise(p=>{let m=Date.now(),g=setTimeout(()=>{p({sleptSeconds:Math.round((Date.now()-m)/1e3),interrupted:!1})},c),f=()=>{clearTimeout(g),p({sleptSeconds:Math.round((Date.now()-m)/1e3),interrupted:!0,interruptReason:"aborted"})};d.addEventListener("abort",f,{once:!0}),d.aborted&&(clearTimeout(g),f())})})),e.push(bc({searchTools:async(c,d)=>{let p=d?.maxResults??5,m=Be(),g=c.toLowerCase().split(/\s+/).filter(Boolean),f=[],b=[];for(let C of g)C.startsWith("+")&&C.length>1?f.push(C.slice(1)):b.push(C);let T=[...f,...b],w=C=>C.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/_/g," ").toLowerCase().split(/\s+/).filter(Boolean);return{matches:m.map(C=>{let E=we(C),D=w(C),L=(E?.description??"").toLowerCase(),v=(E?.searchHint??"").toLowerCase();if(f.length>0){let F=`${D.join(" ")} ${L} ${v}`;if(!f.every(ne=>F.includes(ne)))return null}let ce=0;for(let F of T){let j=0;D.some(ne=>ne===F)?j=10:D.some(ne=>ne.includes(F))?j=5:C.toLowerCase().includes(F)&&(j=3),v&&new RegExp(`\\b${F}`,"i").test(v)&&(j+=4),new RegExp(`\\b${F}`,"i").test(L)&&(j+=2),ce+=j}return{name:C,description:E?.description??"",searchHint:E?.searchHint,score:ce}}).filter(C=>C!==null&&C.score>0).sort((C,E)=>E.score-C.score).slice(0,p),query:c,totalDeferred:m.length}},activateTool:async c=>dl(c)})),e.push({...kc({generateImage:async c=>{let d=await Ie({mediaType:"image",model:"",prompt:c.prompt,purpose:c.purpose,style:c.style,size:c.size,imageUrl:c.imageUrl,n:c.n,quality:c.quality,seed:c.seed});return{mediaUrls:d.mediaUrls,model:d.model,size:d.size,durationMs:d.durationMs}}}),isEnabled:()=>Ee("image")}),e.push({...Tc({textToSpeech:async c=>{let d=await Ie({mediaType:"tts",model:"",prompt:"",text:c.text,channel:c.channel,voice:c.voice,speed:c.speed});return{audioPath:"",provider:d.model,mediaUrls:d.mediaUrls}}}),isEnabled:()=>Ee("tts")}),e.push({...wc({generateVideo:async c=>{let d=await Ie({mediaType:"video",model:"",prompt:c.prompt,purpose:c.purpose,style:c.style,imageUrl:c.imageUrl,referenceVideos:c.referenceVideos,referenceAudios:c.referenceAudios,generateAudio:c.generateAudio,aspectRatio:c.aspectRatio,duration:c.duration,resolution:c.resolution,fps:c.fps,seed:c.seed,cameraFixed:c.cameraFixed,returnLastFrame:c.returnLastFrame,draft:c.draft,serviceTier:c.serviceTier,callbackUrl:c.callbackUrl,safetyIdentifier:c.safetyIdentifier,executionExpiresAfterSeconds:c.executionExpiresAfterSeconds,videoTools:c.videoTools});return{mediaUrls:d.mediaUrls,model:d.model,durationMs:d.durationMs,lastFrameUrl:d.lastFrameUrl,taskId:d.taskId}}}),isEnabled:()=>Ee("video")}),e.push({...vc({generateMusic:async c=>{let d=await Ie({mediaType:"music",model:"",prompt:c.prompt,purpose:c.purpose,style:c.style,lyrics:c.lyrics,duration:c.duration,isInstrumental:c.isInstrumental,audioUrl:c.audioUrl,audioFormat:c.audioFormat});return{mediaUrls:d.mediaUrls,model:d.model,durationMs:d.durationMs}},generateLyrics:async c=>{let d=He.music;if(!d||!ee)return"";let p=ee.getTransport(d.provider);if(!(p instanceof Ze))return"";let m=de[d.provider];return m?p.generateLyrics(c,m):""}}),isEnabled:()=>Ee("music")}),e.push({...xc({editVideo:async c=>{let d=await Ie({mediaType:"video",model:"",prompt:c.prompt,operation:"edit",sourceVideos:c.sourceVideos,referenceImages:c.referenceImages,duration:c.duration,aspectRatio:c.aspectRatio,resolution:c.resolution});return{mediaUrls:d.mediaUrls,model:d.model,durationMs:d.durationMs}}}),shouldDefer:!0,isEnabled:()=>us("video","edit")}),e.push({...Sc({mergeVideos:async c=>{let d=[`merge ${c.clips.length} clips`];c.transition&&d.push(`transition: ${c.transition}${c.transitionDuration?` (${c.transitionDuration}s)`:""}`),c.subtitles&&d.push(`burn-in subtitles: ${c.subtitles}`),c.bgm&&d.push(`background music: ${c.bgm}${c.bgmVolume!==void 0?` at volume ${c.bgmVolume}`:""}`);let p=await Ie({mediaType:"video",model:"",prompt:d.join("; "),operation:"merge",sourceVideos:c.clips.map(m=>m.video),resolution:c.outputResolution,fps:c.outputFps});return{localPath:"",servePath:p.mediaUrls[0]??"",durationSec:(p.durationMs??0)/1e3,clipCount:c.clips.length,mediaUrls:p.mediaUrls}}}),shouldDefer:!0,isEnabled:()=>us("video","merge")}),e.push({..._c({upscaleVideo:async c=>{let d=["upscale"];c.sharpness&&d.push(`sharpness: ${c.sharpness}`);let p=await Ie({mediaType:"video",model:"",prompt:d.join(", "),operation:"upscale",sourceVideos:[c.video],resolution:c.targetResolution??"1080p"});return{localPath:"",servePath:p.mediaUrls[0]??"",resolution:c.targetResolution??"1080p",durationSec:(p.durationMs??0)/1e3,mediaUrls:p.mediaUrls}}}),shouldDefer:!0,isEnabled:()=>us("video","upscale")}),e.push({...Rc({generate3D:async c=>{let d=await Ie({mediaType:"3d",model:"",prompt:c.prompt,imageUrl:c.imageUrl,outputFormat:c.outputFormat,seed:c.seed});return{mediaUrls:d.mediaUrls,model:d.model,durationMs:d.durationMs,metadata:d.metadata}}}),shouldDefer:!0,isEnabled:()=>Ee("3d")}),e.push({...Cc({speechToText:async c=>{let d=await Ie({mediaType:"stt",model:"",prompt:"",audioUrl:c.audioUrl,metadata:c.language?{language:c.language}:void 0});return{transcription:d.metadata?.transcription??"",model:d.model,durationMs:d.durationMs}}}),shouldDefer:!0,isEnabled:()=>Ee("stt")}),e.push({...Ac({cloneVoice:async c=>{let d=await Ie({mediaType:"voice_clone",model:"",prompt:"",text:c.text,audioUrl:c.sampleAudioUrl,speed:c.speed});return{mediaUrls:d.mediaUrls,model:d.model,voiceId:d.metadata?.voiceId,durationMs:d.durationMs}}}),shouldDefer:!0,isEnabled:()=>Ee("voice_clone")}),e.push({...Mc({cancelTask:async c=>{let d=c.provider??"doubao";if(!ee)return{ok:!1,message:"Media client not configured."};let p=ee.getTransport(d);if(!p)return{ok:!1,message:`No transport for provider: ${d}`};let m=de[d];if(!m)return{ok:!1,message:`No API key for provider: ${d}`};try{return"deleteVideoTask"in p&&typeof p.deleteVideoTask=="function"?(await p.deleteVideoTask(c.taskId,m),{ok:!0,message:"Task cancelled."}):{ok:!1,message:`Provider ${d} does not support task cancellation.`}}catch(g){return{ok:!1,message:g instanceof Error?g.message:String(g)}}}}),shouldDefer:!0,isEnabled:()=>Ee("video")||Ee("3d")});let u=Qn();return e.push({...Pc({uploadFile:async c=>{if(!u)throw new Error("No file upload provider available. Configure a media provider with Files API support (e.g. Volcengine, Google).");let d=ge(c.filePath);if(!U.existsSync(d))throw new Error(`File not found: ${d}`);let p=U.statSync(d);if(p.size>100*1024*1024)throw new Error(`File too large (${(p.size/1024/1024).toFixed(1)} MB). Max: 100 MB.`);let m=await U.promises.readFile(d),g=H.basename(d);if(u.type==="gemini"){let y=Zn(),C=de.google,E=H.extname(d).toLowerCase(),D=Wy[E]??"application/octet-stream",L=await y.uploadFile(Buffer.from(m),C,{mimeType:D,displayName:g});if(L.state==="PROCESSING"){let v=await y.waitForProcessing(L.name,C);return{fileId:v.name,url:v.uri,filename:g,bytes:p.size,provider:"google"}}return{fileId:L.name,url:L.uri,filename:g,bytes:p.size,provider:"google"}}let f=new Blob([m]),b=ee.getTransport(u.id),T=de[u.id];if(!(b instanceof _e))throw new Error(`File upload only supported via Volcengine or Google provider. Current: ${u.id}`);let w=await b.uploadFile(f,T,{purpose:c.purpose??"media_reference",filename:g}),_;try{let y=await b.getFile(w.id,T);typeof y.url=="string"&&y.url&&(_=y.url)}catch{}return{fileId:w.id,url:_,filename:g,bytes:p.size,provider:u.id}}}),shouldDefer:!0,isEnabled:()=>!!Qn()}),e.push({...Ic({queryFile:async c=>{if(!u)throw new Error("No file API provider available.");if(u.type==="gemini"){let g=Zn(),f=de.google,b=await g.getFile(c.fileId,f);return{id:b.name,filename:b.displayName??"",bytes:Number(b.sizeBytes??0),status:b.state?.toLowerCase()??"unknown",createdAt:b.createTime,url:b.uri}}let d=ee.getTransport(u.id),p=de[u.id];if(!(d instanceof _e))throw new Error("File query only supported via Volcengine or Google provider.");let m=await d.getFile(c.fileId,p);return{id:String(m.id??c.fileId),filename:String(m.filename??""),bytes:Number(m.bytes??0),status:String(m.status??"unknown"),createdAt:m.created_at?String(m.created_at):void 0,url:m.url?String(m.url):void 0}},listFiles:async c=>{if(!u)throw new Error("No file API provider available.");if(u.type==="gemini"){let f=Zn(),b=de.google;return(await f.listFiles(b,{pageSize:c.limit??10})).files.map(w=>({id:w.name,filename:w.displayName??"",bytes:Number(w.sizeBytes??0),status:w.state?.toLowerCase()??"unknown",createdAt:w.createTime,url:w.uri}))}let d=ee.getTransport(u.id),p=de[u.id];if(!(d instanceof _e))throw new Error("File list only supported via Volcengine or Google provider.");return((await d.listFiles(p,{limit:c.limit??10})).data??[]).map(f=>({id:String(f.id??""),filename:String(f.filename??""),bytes:Number(f.bytes??0),status:String(f.status??"unknown"),createdAt:f.created_at?String(f.created_at):void 0,url:f.url?String(f.url):void 0}))}}),shouldDefer:!0,isEnabled:()=>!!Qn()}),e.push({...Ec({deleteFile:async c=>{if(!u)throw new Error("No file API provider available.");if(u.type==="gemini"){let m=Zn(),g=de.google;await m.deleteFile(c.fileId,g);return}let d=ee.getTransport(u.id),p=de[u.id];if(!(d instanceof _e))throw new Error("File delete only supported via Volcengine or Google provider.");await d.deleteFile(c.fileId,p)}}),shouldDefer:!0,isEnabled:()=>!!Qn()}),ul(e),r?.log?.info(`[tool-bootstrap] Registered ${e.length} local tools (${e.filter(c=>c.isEnabled?.()!==!1).length} enabled): ${Be().join(", ")}`),e}var Vc=rb;function fs(r){ot=r,Kn(r)}import{spawn as sb}from"node:child_process";import{createInterface as ib}from"node:readline";var eo=class{process=null;readline=null;pending=new Map;nextId=1;connected=!1;toolsCache=[];serverName="";serverVersion="";supportsToolsListChanged=!1;onToolsChanged=null;stderrBuffer="";config;constructor(e){this.config=e}async connect(){if(this.connected)return;let e={...process.env,...this.config.env};this.process=sb(this.config.command,this.config.args??[],{stdio:["pipe","pipe","pipe"],env:e,cwd:this.config.cwd,windowsHide:!0}),this.process.on("error",n=>{this.handleProcessError(n)}),this.process.on("exit",n=>{this.handleProcessExit(n)}),this.process.stderr?.on("data",n=>{this.stderrBuffer+=n.toString(),this.stderrBuffer.length>4096&&(this.stderrBuffer=this.stderrBuffer.slice(-4096))}),this.readline=ib({input:this.process.stdout,crlfDelay:Number.POSITIVE_INFINITY}),this.readline.on("line",n=>this.handleLine(n));let t=await this.sendRequest("initialize",{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"qlogicagent",version:"0.3.0"}},this.config.initTimeoutMs??3e4);this.serverName=t.serverInfo?.name??this.config.name,this.serverVersion=t.serverInfo?.version??"unknown",this.supportsToolsListChanged=t.capabilities?.tools?.listChanged??!1,this.sendNotification("notifications/initialized",{}),this.connected=!0,await this.refreshTools()}async disconnect(){if(this.connected){this.connected=!1;for(let[,e]of this.pending)e.reject(new Error("MCP client disconnecting"));if(this.pending.clear(),this.toolsCache=[],this.readline?.close(),this.readline=null,this.process){this.process.kill("SIGTERM");let e=setTimeout(()=>this.process?.kill("SIGKILL"),5e3);this.process.on("exit",()=>clearTimeout(e)),this.process=null}}}get isConnected(){return this.connected}get info(){return{name:this.serverName,version:this.serverVersion}}async refreshTools(){if(!this.connected)return[];try{let e=await this.sendRequest("tools/list",{});this.toolsCache=e.tools??[]}catch{this.toolsCache=[]}return this.toolsCache}getCachedTools(){return this.toolsCache}async callTool(e,t,n){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return await this.sendRequest("tools/call",{name:e,arguments:t??{}},12e4,n)}async listResources(){if(!this.connected)return[];try{return(await this.sendRequest("resources/list",{})).resources??[]}catch{return[]}}async readResource(e){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return(await this.sendRequest("resources/read",{uri:e})).contents??[]}toPortableTools(){let e=ab(this.config.name);return this.toolsCache.map(t=>({name:`mcp__${e}__${t.name}`,label:`[${this.config.name}] ${t.name}`,description:t.description??`MCP tool from ${this.config.name}`,parameters:t.inputSchema??{type:"object",properties:{}},isConcurrencySafe:!0,isReadOnly:!1,searchHint:`mcp ${this.config.name} ${t.name}`,execute:async(n,o,s)=>this.executeAsTool(t.name,o,s)}))}setOnToolsChanged(e){this.onToolsChanged=e}async executeAsTool(e,t,n){try{let o=await this.callTool(e,t,n);return{content:[{type:"text",text:o.content.filter(a=>a.type==="text"&&a.text).map(a=>a.text).join(`
272
- `)||"(no text output)"}],...o.isError?{details:{error:"mcp_tool_error"}}:{}}}catch(o){let s=o instanceof Error?o.message:String(o);return{content:[{type:"text",text:`MCP tool error: ${s}`}],details:{error:s}}}}sendRequest(e,t,n=3e4,o){return new Promise((s,i)=>{if(o?.aborted){i(new Error("Aborted"));return}let a=this.nextId++,l={jsonrpc:"2.0",id:a,method:e,params:t},u=setTimeout(()=>{this.pending.delete(a),i(new Error(`MCP request ${e} timed out after ${n}ms`))},n),c=()=>{clearTimeout(u),this.pending.delete(a)};o?.addEventListener("abort",()=>{c(),i(new Error("Aborted"))},{once:!0}),this.pending.set(a,{resolve:d=>{c(),d.error?i(new Error(`MCP error ${d.error.code}: ${d.error.message}`)):s(d.result)},reject:d=>{c(),i(d)}}),this.writeLine(JSON.stringify(l))})}sendNotification(e,t){let n={jsonrpc:"2.0",method:e,params:t};this.writeLine(JSON.stringify(n))}writeLine(e){this.process?.stdin?.writable&&this.process.stdin.write(e+`
273
- `)}handleLine(e){let t=e.trim();if(!t)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n&&("result"in n||"error"in n)){let o=n.id,s=this.pending.get(o);s&&s.resolve(n)}else"method"in n&&!("id"in n)&&this.handleNotification(n)}handleNotification(e){e.method==="notifications/tools/list_changed"&&this.refreshTools().then(()=>{this.onToolsChanged?.()}).catch(()=>{})}handleProcessError(e){this.connected=!1;for(let[,t]of this.pending)t.reject(new Error(`MCP process error: ${e.message}`));this.pending.clear()}handleProcessExit(e){this.connected=!1;for(let[,t]of this.pending)t.reject(new Error(`MCP process exited with code ${e}`));this.pending.clear()}};function ab(r){return r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}import{randomUUID as lb}from"node:crypto";var to=class{connected=!1;toolsCache=[];serverName="";serverVersion="";sessionId=null;onToolsChanged=null;config;constructor(e){this.config=e}async connect(){if(this.connected)return;let e=await this.sendRequest("initialize",{protocolVersion:"2025-03-26",capabilities:{},clientInfo:{name:"qlogicagent",version:"0.3.0"}},this.config.initTimeoutMs??3e4);this.serverName=e.serverInfo?.name??this.config.name,this.serverVersion=e.serverInfo?.version??"unknown",await this.sendNotification("notifications/initialized",{}),this.connected=!0,await this.refreshTools()}async disconnect(){this.connected=!1,this.toolsCache=[],this.sessionId=null}async callTool(e,t,n){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return await this.sendRequest("tools/call",{name:e,arguments:t??{}},this.config.toolCallTimeoutMs??12e4,n)}async listResources(){if(!this.connected)return[];try{return(await this.sendRequest("resources/list",{})).resources??[]}catch{return[]}}async readResource(e){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return(await this.sendRequest("resources/read",{uri:e})).contents??[]}toPortableTools(){return this.toolsCache.map(e=>this.schemaToPortableTool(e))}getCachedTools(){return[...this.toolsCache]}get isConnected(){return this.connected}get info(){return{name:this.serverName,version:this.serverVersion}}setOnToolsChanged(e){this.onToolsChanged=e}async refreshTools(){let e=await this.sendRequest("tools/list",{});this.toolsCache=e.tools??[]}async sendRequest(e,t,n=3e4,o){let s=lb(),i={jsonrpc:"2.0",id:s,method:e,params:t},a=new AbortController,l=setTimeout(()=>a.abort(),n);o&&o.addEventListener("abort",()=>a.abort(),{once:!0});try{let u={"Content-Type":"application/json",Accept:"application/json, text/event-stream",...this.config.headers};this.sessionId&&(u["Mcp-Session-Id"]=this.sessionId);let c=await fetch(this.config.url,{method:"POST",headers:u,body:JSON.stringify(i),signal:a.signal}),d=c.headers.get("mcp-session-id");if(d&&(this.sessionId=d),!c.ok)throw new Error(`MCP HTTP error ${c.status}: ${c.statusText}`);if((c.headers.get("content-type")??"").includes("text/event-stream"))return await this.parseSSEResponse(c,s);let m=await c.json();if(m.error)throw new Error(`MCP error ${m.error.code}: ${m.error.message}`);return m.result}finally{clearTimeout(l)}}async sendNotification(e,t){let n={jsonrpc:"2.0",method:e,params:t},o={"Content-Type":"application/json",...this.config.headers};this.sessionId&&(o["Mcp-Session-Id"]=this.sessionId),await fetch(this.config.url,{method:"POST",headers:o,body:JSON.stringify(n)}).catch(()=>{})}async parseSSEResponse(e,t){let n=e.body;if(!n)throw new Error("MCP SSE response has no body");let o=n.getReader(),s=new TextDecoder,i="";try{for(;;){let{done:a,value:l}=await o.read();if(a)break;i+=s.decode(l,{stream:!0});let u=i.split(`
274
- `);i=u.pop()??"";for(let c of u){if(!c.startsWith("data: "))continue;let d=c.slice(6).trim();if(d)try{let p=JSON.parse(d);if("method"in p&&p.method==="notifications/tools/list_changed"){this.onToolsChanged?.();continue}if(p.id===t){if(p.error)throw new Error(`MCP error ${p.error.code}: ${p.error.message}`);return p.result}}catch(p){if(p instanceof Error&&p.message.startsWith("MCP error"))throw p}}}}finally{o.releaseLock()}throw new Error("MCP SSE stream ended without response")}schemaToPortableTool(e){let t=this;return{name:`mcp__${cb(this.config.name)}__${e.name}`,label:`[${this.config.name}] ${e.name}`,description:e.description??`MCP tool from ${this.config.name}`,parameters:e.inputSchema??{type:"object",properties:{}},isConcurrencySafe:!0,isReadOnly:!1,searchHint:`mcp ${this.config.name} ${e.name}`,execute:async(o,s,i)=>{try{let a=await t.callTool(e.name,s,i);return{content:[{type:"text",text:(a.content??[]).filter(c=>c.type==="text"&&c.text).map(c=>c.text).join(`
275
- `)||"(no output)"}],details:a.isError?{type:"mcp",error:"tool_error"}:{type:"mcp"}}}catch(a){let l=a instanceof Error?a.message:String(a);return{content:[{type:"text",text:`MCP tool error: ${l}`}],details:{type:"mcp",error:l}}}}}}};function cb(r){return r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}var no=class{clients=new Map;injected=!1;log;constructor(e){this.log=e.log??{info:()=>{},warn:()=>{}};for(let t of e.servers){if(t.disabled)continue;if((t.type??(t.url?"http":"stdio"))==="http"){if(!t.url){this.log.warn(`[mcp] server "${t.name}" is type "http" but has no url, skipping`);continue}let o={name:t.name,url:t.url,headers:t.headers,initTimeoutMs:t.initTimeoutMs};this.clients.set(t.name,new to(o))}else{if(!t.command){this.log.warn(`[mcp] server "${t.name}" is type "stdio" but has no command, skipping`);continue}let o={name:t.name,command:t.command,args:t.args,env:t.env,initTimeoutMs:t.initTimeoutMs};this.clients.set(t.name,new eo(o))}}}async connectAll(){let e=Array.from(this.clients.entries()).map(async([t,n])=>{try{await n.connect(),this.log.info(`[mcp] connected to ${t} (${n.info.name} v${n.info.version})`),n.setOnToolsChanged(()=>{this.log.info(`[mcp] tools changed on ${t}, re-injecting`),this.injected&&this.reinjectTools(t,n)})}catch(o){this.log.warn(`[mcp] failed to connect to ${t}: ${o instanceof Error?o.message:o}`)}});await Promise.allSettled(e)}injectTools(){this.injected=!0;for(let[e,t]of this.clients){if(!t.isConnected)continue;let n=t.toPortableTools();Lr(n),this.log.info(`[mcp] injected ${n.length} tools from ${e}`)}}getConnectedServers(){return Array.from(this.clients.entries()).filter(([,e])=>e.isConnected).map(([e])=>e)}getToolCount(){let e=0;for(let t of this.clients.values())t.isConnected&&(e+=t.getCachedTools().length);return e}async disconnectAll(){let e=Array.from(this.clients.values()).map(async t=>{try{await t.disconnect()}catch{}});await Promise.allSettled(e),this.clients.clear(),this.injected=!1}async listResources(e){let t=e?[[e,this.clients.get(e)]].filter(([,o])=>o):Array.from(this.clients.entries());return(await Promise.all(t.map(async([o,s])=>{if(!s?.isConnected||!s.listResources)return[];try{return(await s.listResources()).map(a=>({...a,server:o}))}catch{return this.log.warn(`[mcp] failed to list resources from ${o}`),[]}}))).flat()}async readResource(e,t){let n=this.clients.get(e);if(!n?.isConnected)throw new Error(`MCP server "${e}" is not connected`);if(!n.readResource)throw new Error(`MCP server "${e}" does not support resources`);return n.readResource(t)}reinjectTools(e,t){if(!this.injected)return;let n=`mcp__${e.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`;for(let s of Be())s.startsWith(n)&&Bn(s);let o=t.toPortableTools();Lr(o),this.log.info(`[mcp] re-injected ${o.length} tools from ${e}`)}};function hs(r){if(!r||typeof r!="object")return[];let e=r,t=[],n=e.mcpServers??e.servers??e;for(let[o,s]of Object.entries(n)){if(!s||typeof s!="object")continue;let i=s;if(typeof i.url=="string"){t.push({name:o,type:"http",url:i.url,headers:i.headers&&typeof i.headers=="object"?i.headers:void 0,disabled:i.disabled===!0,initTimeoutMs:typeof i.initTimeoutMs=="number"?i.initTimeoutMs:void 0});continue}typeof i.command=="string"&&t.push({name:o,type:"stdio",command:i.command,args:Array.isArray(i.args)?i.args:void 0,env:i.env&&typeof i.env=="object"?i.env:void 0,disabled:i.disabled===!0})}return t}var ub={type:"object",properties:{server:{type:"string",description:"MCP server name to list resources from. Omit to list from all connected servers."}}};function zc(r){return{name:"list_mcp_resources",label:"List MCP Resources",description:"List resources available from connected MCP servers. Resources are data items (files, database records, API data) exposed by MCP servers that can be read with read_mcp_resource.",parameters:ub,shouldDefer:!0,isConcurrencySafe:!0,isReadOnly:!0,searchHint:"mcp resource list browse discover",execute:async(e,t)=>{let n=r();if(!n)return{content:[{type:"text",text:"No MCP servers configured."}],details:{type:"list_mcp_resources",count:0}};let o=await n.listResources(t.server);if(o.length===0)return{content:[{type:"text",text:t.server?`No resources found from MCP server "${t.server}".`:"No resources found from any connected MCP server."}],details:{type:"list_mcp_resources",count:0}};let s=new Map;for(let a of o){let l=s.get(a.server)??[];l.push(a),s.set(a.server,l)}let i=[];for(let[a,l]of s){i.push(`Server: ${a} (${l.length} resources)`);for(let u of l){let c=u.mimeType?` [${u.mimeType}]`:"",d=u.description?` \u2014 ${u.description}`:"";i.push(` ${u.name}: ${u.uri}${c}${d}`)}i.push("")}return{content:[{type:"text",text:i.join(`
276
- `).trim()}],details:{type:"list_mcp_resources",count:o.length}}}}}var db={type:"object",properties:{server:{type:"string",description:"Name of the MCP server that hosts the resource."},uri:{type:"string",description:"URI of the resource to read (from list_mcp_resources output)."}},required:["server","uri"]};function qc(r){return{name:"read_mcp_resource",label:"Read MCP Resource",description:"Read a specific resource from an MCP server by URI. Returns the resource content (text or binary metadata). Use list_mcp_resources first to discover available URIs.",parameters:db,shouldDefer:!0,isConcurrencySafe:!0,isReadOnly:!0,searchHint:"mcp resource read fetch content",execute:async(e,t)=>{let n=r();if(!n)return{content:[{type:"text",text:"No MCP servers configured."}],details:{error:"no_mcp"}};try{let o=await n.readResource(t.server,t.uri);if(o.length===0)return{content:[{type:"text",text:`Resource "${t.uri}" returned no content.`}],details:{type:"read_mcp_resource",empty:!0}};let s=[];for(let i of o)if(i.text){let a=i.mimeType?` (${i.mimeType})`:"";s.push({type:"text",text:`--- ${i.uri}${a} ---
266
+ `];for(let i of o)s.push(`- ${i.filename} | ID: ${i.id} | ${ys(i.bytes)} | ${i.status}${i.url?` | ${i.url}`:""}`);return{content:[{type:"text",text:s.join(`
267
+ `)}],details:{type:"file_query",count:o.length}}}}}var Uy="file_delete",jy={type:"object",properties:{file_id:{type:"string",description:"ID of the uploaded file to delete."}},required:["file_id"]};function Uc(r){return{name:Uy,label:"File Delete",description:"Delete a previously uploaded file from the provider's Files API. Use the file ID returned by file_upload or file_query.",parameters:jy,execute:async(e,t)=>(await r.deleteFile({fileId:t.file_id}),{content:[{type:"text",text:`Deleted file ${t.file_id}`}],details:{type:"file_delete",fileId:t.file_id}})}}function ys(r){return r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`}var Fy="ask_user",By={type:"object",properties:{questions:{type:"array",minItems:1,maxItems:4,description:"1-4 clarifying questions to ask the user.",items:{type:"object",properties:{question:{type:"string",description:"The question text. Should end with '?'."},header:{type:"string",description:"Short identifier/tag for this question (max 50 chars)."},options:{type:"array",description:"2-4 options for the user to choose from. Omit for free text.",items:{type:"object",properties:{label:{type:"string",description:"Display label (1-5 words)."},description:{type:"string",description:"Brief explanation of this option."}},required:["label"]}},multiSelect:{type:"boolean",description:"Allow selecting multiple options (default: false)."}},required:["question","header"]}}},required:["questions"]};function jc(r){return{name:Fy,label:"Ask User",description:"Ask the user clarifying questions when you need more information to proceed. Supports free text questions and multiple-choice options. Use this when the user's intent is ambiguous or you need confirmation.",parameters:By,execute:async(e,t)=>{if(!t.questions||t.questions.length===0)return{content:[{type:"text",text:"Error: at least one question is required."}],details:{type:"ask_user",error:"no_questions"}};if(t.questions.length>4)return{content:[{type:"text",text:"Error: maximum 4 questions allowed."}],details:{type:"ask_user",error:"too_many_questions"}};let n=t.questions.map(i=>i.question);if(new Set(n).size!==n.length)return{content:[{type:"text",text:"Error: all questions must have unique text."}],details:{type:"ask_user",error:"duplicate_questions"}};for(let i of t.questions){if(i.options&&(i.options.length<2||i.options.length>4))return{content:[{type:"text",text:`Error: question "${i.header}" must have 2-4 options (got ${i.options.length}).`}],details:{type:"ask_user",error:"invalid_option_count"}};if(i.options){let a=i.options.map(c=>c.label);if(new Set(a).size!==a.length)return{content:[{type:"text",text:`Error: question "${i.header}" has duplicate option labels.`}],details:{type:"ask_user",error:"duplicate_option_labels"}}}}let o=await r.askUser(t.questions);if(o===null)return{content:[{type:"text",text:"User declined to answer questions."}],details:{type:"ask_user",declined:!0}};let s=["User answered:"];for(let i of t.questions){let a=o[i.question]??"(no answer)";s.push(`- ${i.header}: ${a}`)}return{content:[{type:"text",text:s.join(`
268
+ `)}],details:{type:"ask_user",answers:o,questionCount:t.questions.length}}}}}function Fc(r,e){return!r?.webSearch||!r.capabilities.includes("web_search")?e:async(t,n)=>{try{let s=await r.webSearch(t,{maxResults:n?.maxResults});if(n?.allowedDomains?.length){let i=new Set(n.allowedDomains.map(a=>a.toLowerCase()));s=s.filter(a=>{try{return i.has(new URL(a.url).hostname.toLowerCase())}catch{return!1}})}if(n?.blockedDomains?.length){let i=new Set(n.blockedDomains.map(a=>a.toLowerCase()));s=s.filter(a=>{try{return!i.has(new URL(a.url).hostname.toLowerCase())}catch{return!0}})}if(s.length>0)return{query:t,results:s.map(i=>({title:i.title,url:i.url,snippet:i.snippet}))}}catch{}return e(t,n)}}var te,ge={},Wc,Ts,Je={},Hc;function zc(r){Hc=r}var Vc=null;function qc(r){Vc=r}function Kc(r,e,t,n,o){te=r,ge=e??{},Wc=t,Ts=o,Je=n??{},Hy()}function ws(r){let e=Je[r];if(!(!e||!te))return te.resolveModelById(e.provider,e.model,r)}function Hy(){zy(),Vy(),qy(),Ky()}function zy(){let r=xe(fs);if(!r)return;let e=Je.video;if(!e||!te)return;let t=te.resolveModelById(e.provider,e.model,"video");if(!t)return;let n=t.modelInfo.mediaCapabilities;if(!n)return;let o=n.maxDurationSeconds??10,s=o>=10?4:3,i=n.resolutions?.join("/")||"720P",a=t.modelInfo.name||t.modelInfo.id;r.description=`Generate a short video clip from a text prompt, reference image, source video, or multimodal references. Prompt MUST be in English. Include scene, movement, camera motion, lighting details. Current model: ${a}. Single-shot: ${s}\u2013${o}s. For longer videos (>${o}s), use multi-shot storyboard workflow. MODES: (1) text-to-video: prompt only. (2) image-to-video: prompt + image_url. (3) video-to-video: prompt + reference_videos \u2014 restyle/transform an existing video with prompt guidance. (4) multimodal reference: prompt + any combination of image_url / reference_videos / reference_audios for style/motion/audio-guided generation. (5) generate_audio=true for synchronized sound effects. ALL image/video/audio URLs MUST be publicly accessible HTTP/HTTPS URLs. Local file paths and data: URIs are NOT supported by the generation API. If the user provides a local file, use the file_upload tool FIRST to get a public URL. IMPORTANT: If the user has not specified aspect ratio or duration, use ask_user to clarify (e.g. aspect: 16:9 for landscape / 9:16 for vertical / 1:1 for square; duration: ${s}-${o}s). Auto-set aspect_ratio based on stated purpose (e.g. 9:16 for short-video / Douyin, 16:9 for presentation).`;let c=r.parameters?.properties,d=c?.duration;d&&(d.minimum=s,d.maximum=o,d.description=`Video duration in seconds (${s}\u2013${o}s for ${a}). For longer videos (>${o}s), use multi-shot storyboard workflow (generate + extend/merge). Must be confirmed by user before generation.`);let l=c?.resolution;l&&n.resolutions&&(l.description=`Output resolution: ${i}. Default: '720p'.`)}function Vy(){let r=xe(gs);if(!r)return;let e=ws("image");if(!e)return;let t=e.modelInfo.mediaCapabilities,n=e.modelInfo.name||e.modelInfo.id,o=[];if(t?.sizes?.length&&o.push(`Sizes: ${t.sizes.join(", ")}`),t?.transparentBackground&&o.push("Supports transparent background"),r.description=`Generate images from a text prompt. You MUST enrich vague prompts with details about style, lighting, composition, color, and mood before calling. Supports img2img via image_url reference. All generated images are saved locally and can be viewed immediately. Current model: ${n}. ${o.join(". ")}${o.length?". ":""}IMPORTANT: If the user has not specified purpose or preferred style, use ask_user to clarify (e.g. purpose: social-media / wallpaper / poster; style: photorealistic / anime / watercolor). Infer image size automatically from purpose. ALL reference image URLs MUST be publicly accessible HTTP/HTTPS URLs. Use file_upload tool first if the user provides a local file.`,t?.sizes?.length){let i=r.parameters?.properties?.size;i&&(i.description=`Dimensions: ${t.sizes.join(", ")}. Default: '1024x1024'. Auto-infer from purpose.`)}}function qy(){let r=xe("tts");if(!r)return;let e=ws("tts");if(!e)return;let t=e.modelInfo.mediaCapabilities,n=e.modelInfo.name||e.modelInfo.id,o=[];if(t?.voices?.length&&o.push(`Voices: ${t.voices.join(", ")}`),t?.maxCharacters&&o.push(`Max: ${t.maxCharacters} characters per request`),t?.formats?.length&&o.push(`Formats: ${t.formats.join(", ")}`),r.description=`Convert text to speech (TTS) \u2014 read text aloud as spoken audio. Use for narration, voice messages, or any spoken-word output. DO NOT use for music, songs, or melodies \u2014 use music_generate instead. Current model: ${n}. ${o.join(". ")}${o.length?".":""}`,t?.voices?.length){let i=r.parameters?.properties?.voice;i&&(i.description=`Voice name. Available: ${t.voices.join(", ")}.`)}}function Ky(){let r=xe(hs);if(!r)return;let e=ws("music");if(!e)return;let t=e.modelInfo.mediaCapabilities,n=e.modelInfo.name||e.modelInfo.id,o=[];if(t?.maxDurationSeconds&&o.push(`Max duration: ${t.maxDurationSeconds}s`),t?.formats?.length&&o.push(`Formats: ${t.formats.join(", ")}`),r.description=`Generate music, songs, or melodies from text descriptions. Prompt MUST be in English. Supports lyrics for vocal songs. DO NOT use for spoken-word audio or TTS \u2014 use tts tool instead. Current model: ${n}. ${o.join(". ")}${o.length?". ":""}IMPORTANT: If the user has not specified genre/style or duration, use ask_user to clarify (e.g. style: lo-fi / pop / rock / jazz; duration inferred from purpose).`,t?.maxDurationSeconds){let i=r.parameters?.properties?.duration;i&&(i.maximum=t.maxDurationSeconds,i.description=`Duration in seconds (5\u2013${t.maxDurationSeconds}s for ${n}). Infer from purpose: ringtone 15-30s, BGM 30-60s, full song 120-180s.`)}}async function Oe(r){if(!te)throw new Error(`No media provider configured for ${r.mediaType}`);let e=Je[r.mediaType],t=e?.provider,n=e?.model||r.model;if(!t)throw new Error(`No provider configured for ${r.mediaType}. Please configure a provider in settings.`);let o={...r};Ts&&!o.onProgress&&(o.onProgress=(c,d,l)=>{Ts(l??"pending",r.mediaType,c,d,t)});let s=await Bc(t,n||r.model,o);if(s.ok)return s.result;let i=te.listMediaModels(r.mediaType),a=[`${t}: ${s.error}`];for(let c of i){if(c.providerId===t||!ge[c.providerId])continue;let l=await Bc(c.providerId,c.modelInfo.id,r);if(l.ok)return l.result;a.push(`${c.providerId}/${c.modelInfo.id}: ${l.error}`)}throw new Error(`All media providers failed for ${r.mediaType}:
269
+ `+a.map(c=>` - ${c}`).join(`
270
+ `))}async function Bc(r,e,t){let n=te.getTransport(r);if(!n)return{ok:!1,error:"transport not available"};let o=ge[r];if(!o)return{ok:!1,error:"no API key"};try{let s={...t,model:e},i=await n.generate(s,o);i.billingUnit||(t.mediaType==="tts"&&t.text?(i.billingUnit="per_character",i.billingQuantity=t.text.length):(t.mediaType==="video"||t.mediaType==="music")&&t.duration?(i.billingUnit="per_second",i.billingQuantity=t.duration):(i.billingUnit="per_call",i.billingQuantity=1));let a=i.model??s.model,c=i.billingUnit??"per_call",d=i.billingQuantity??1;return Wc?.(a,c,d),{ok:!0,result:i}}catch(s){return{ok:!1,error:s instanceof Error?s.message:String(s)}}}function Le(r){if(!te)return!1;let e=Je[r];if(!e)return!1;let t=te.getTransport(e.provider),n=ge[e.provider];return!!(t&&n)}function bs(r,e){if(!Le(r))return!1;let t=Je[r],n=te.resolveModelById(t.provider,t.model,r);if(!n)return!1;let o=n.modelInfo.mediaCapabilities;return!o||!("operations"in o)||!o.operations?!0:o.operations.includes(e)}function so(){if(!te)return;for(let[,e]of Object.entries(Je)){if(!e)continue;let t=te.getTransport(e.provider),n=ge[e.provider];if(t instanceof Re&&n)return{id:e.provider,type:"volcengine"}}if(ge.google)return{id:"google",type:"gemini"}}var ks;function io(){return ks||(ks=new Jt({baseUrl:"https://generativelanguage.googleapis.com/v1beta"})),ks}var lt=process.cwd();function he(r){return z.isAbsolute(r)?z.normalize(r):z.resolve(lt,r)}var Jy=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg",".ico"]),Jc=new Set([".exe",".dll",".so",".dylib",".zip",".tar",".gz",".7z",".rar",".wasm",".class"]),Yy={".pdf":"application/pdf",".txt":"text/plain",".html":"text/html",".htm":"text/html",".css":"text/css",".js":"text/javascript",".ts":"text/plain",".json":"application/json",".xml":"application/xml",".csv":"text/csv",".md":"text/markdown",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".svg":"image/svg+xml",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".flac":"audio/flac",".m4a":"audio/mp4",".aac":"audio/aac",".mp4":"video/mp4",".webm":"video/webm",".avi":"video/x-msvideo",".mov":"video/quicktime",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation"};function Xy(){return{resolvePath:he,async readFile(r){let e=he(r),t=z.extname(e).toLowerCase();if(Jc.has(t))return{type:"binary",mimeType:"application/octet-stream"};if(Jy.has(t)){let o=await N.promises.readFile(e),s=t===".png"?"image/png":t===".svg"?"image/svg+xml":t===".gif"?"image/gif":t===".webp"?"image/webp":"image/jpeg";return{type:"image",base64:o.toString("base64"),mimeType:s}}return{type:"text",text:await N.promises.readFile(e,"utf8")}},validatePath(r){let e=he(r);return e.startsWith("/dev/")||e.startsWith("/proc/")||e.startsWith("/sys/")?`Blocked: reading device/system path ${e}`:null}}}function Qy(){return{resolvePath:he,async writeFile(r,e){let t=he(r);await N.promises.mkdir(z.dirname(t),{recursive:!0}),await N.promises.writeFile(t,e,"utf8")}}}function Zy(){return{resolvePath:he,async readFile(r){let e=he(r);return N.promises.readFile(e,"utf8")},async writeFile(r,e){let t=he(r);await N.promises.mkdir(z.dirname(t),{recursive:!0}),await N.promises.writeFile(t,e,"utf8")}}}function eb(){return{resolvePath:he,async readFile(r){let e=he(r);return N.promises.readFile(e,"utf8")},async writeFile(r,e){let t=he(r);await N.promises.mkdir(z.dirname(t),{recursive:!0}),await N.promises.writeFile(t,e,"utf8")},async deleteFile(r){let e=he(r);await N.promises.unlink(e)},async fileExists(r){let e=he(r);try{return await N.promises.access(e),!0}catch{return!1}}}}function tb(){return{resolvePath:he,async glob(r,e){let t=e.cwd||lt,n=e.limit||1e3,o=[],s=!1,i=r.replace(/\\/g,"/").split("/"),a=i.some(l=>l==="**"),c=i[i.length-1]??"*",d=Yc(c);try{await vs(t,async l=>{if(o.length>=n)return s=!0,!1;let u=z.basename(l);return d.test(u)&&o.push(l),!0},a?1/0:1)}catch{}return{files:o,truncated:s}},async grep(r,e){let t=e.cwd||lt;try{return await ob(r,t,e)}catch{return await rb(r,t,e)}}}}function Yc(r){let e=r.replace(/[.+^$|()[\]\\]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".");return e=e.replace(/\\\{([^}]+)\\\}/g,(t,n)=>"("+n.replace(/,/g,"|")+")"),new RegExp(`^${e}$`,"i")}var nb=new Set([".git",".svn",".hg","node_modules","__pycache__",".next","dist",".tox",".venv"]);async function vs(r,e,t,n=0,o=""){if(n>t)return;let s;try{s=await N.promises.readdir(r,{withFileTypes:!0})}catch{return}for(let i of s){let a=o?`${o}/${i.name}`:i.name;if(i.isDirectory()){if(nb.has(i.name))continue;await vs(z.join(r,i.name),e,t,n+1,a)}else if(i.isFile()&&!await e(a))return}}function ob(r,e,t){return new Promise((n,o)=>{let s=["--json","--no-heading","--max-columns","500"];t.caseInsensitive&&s.push("-i"),t.contextLines&&s.push("-C",String(t.contextLines)),t.fileGlob&&s.push("-g",t.fileGlob),s.push("--max-count",String(t.headLimit??250)),s.push(r),s.push("."),Wy("rg",s,{cwd:e,maxBuffer:10*1024*1024,timeout:3e4},(i,a)=>{if(i&&!("killed"in i&&i.killed)&&i.code!==1){o(i);return}let c=[];for(let p of a.split(`
271
+ `))if(p.trim())try{let m=JSON.parse(p);m.type==="match"&&m.data&&c.push({path:m.data.path?.text??"",line:m.data.line_number??0,text:(m.data.lines?.text??"").trimEnd()})}catch{}let d=t.headLimit??250,l=t.offset??0,u=c.slice(l,l+d);n({matches:u,truncated:c.length>l+d})})})}async function rb(r,e,t){let n=new RegExp(r,t.caseInsensitive?"i":""),o=t.headLimit??250,s=t.offset??0,i=t.fileGlob?Yc(t.fileGlob):null,a=[],c=!1;return await vs(e,async d=>{if(a.length>=s+o+1)return c=!0,!1;if(i&&!i.test(z.basename(d)))return!0;let l=z.extname(d).toLowerCase();if(Jc.has(l))return!0;try{let p=(await N.promises.readFile(z.join(e,d),"utf8")).split(`
272
+ `);for(let m=0;m<p.length;m++)if(n.test(p[m])&&(a.push({path:d,line:m+1,text:p[m].slice(0,500)}),a.length>=s+o+1))return c=!0,!1}catch{}return!0},1/0),{matches:a.slice(s,s+o),truncated:c}}var Gc=!1;function sb(){if(!Gc)if(Gc=!0,Jn()){let r=process.env.QLOGICAGENT_POWERSHELL_PATH??"powershell.exe";nn(rs(r))}else if(process.platform==="win32"){let r=ib();nn(ro(r))}else{let r=process.env.SHELL?.endsWith("bash")?process.env.SHELL:"/bin/bash";nn(ro(r))}}function ib(){let r=process.env.QLOGICAGENT_BASH_PATH;if(r&&N.existsSync(r))return r;let e=["C:\\Program Files\\Git\\bin\\bash.exe","C:\\Program Files (x86)\\Git\\bin\\bash.exe"],t=process.env.ProgramFiles?z.join(process.env.ProgramFiles,"Git","bin","bash.exe"):null;t&&!e.includes(t)&&e.unshift(t);for(let n of e)if(N.existsSync(n))return n;return"bash"}function ab(){return{async fetchUrl(r){let e=new AbortController,t=setTimeout(()=>e.abort(),3e4);try{let n=await fetch(r.url,{signal:e.signal,headers:{"User-Agent":"Mozilla/5.0 (compatible; QLogicAgent/1.0)",Accept:"text/html,application/xhtml+xml,text/plain,*/*"},redirect:"follow"});if(!n.ok)return{content:`HTTP ${n.status} ${n.statusText}`};let o=n.headers.get("content-type")??"",s=await n.text();return r.maxChars&&s.length>r.maxChars&&(s=s.slice(0,r.maxChars)),o.includes("html")&&r.extractMode!=="json"&&(s=lb(s)),{content:s,title:cb(s)}}finally{clearTimeout(t)}}}}function lb(r){return r.replace(/<script[\s\S]*?<\/script>/gi,"").replace(/<style[\s\S]*?<\/style>/gi,"").replace(/<[^>]+>/g," ").replace(/&nbsp;/gi," ").replace(/&amp;/gi,"&").replace(/&lt;/gi,"<").replace(/&gt;/gi,">").replace(/&quot;/gi,'"').replace(/&#39;/gi,"'").replace(/\s{2,}/g," ").trim()}function cb(r){return r.match(/<title[^>]*>([^<]+)<\/title>/i)?.[1]?.trim()}function db(){let r=async(e,t)=>{let n=process.env.SEARXNG_BASE_URL?.trim();if(!n)return{query:e,results:[],totalResults:0};let o=t?.maxResults??10,s=new URL("/search",n);s.searchParams.set("q",e),s.searchParams.set("format","json"),s.searchParams.set("pageno","1");let i=new AbortController,a=setTimeout(()=>i.abort(),15e3);try{let c=await fetch(s.toString(),{signal:i.signal,headers:{Accept:"application/json"}});if(!c.ok)return{query:e,results:[]};let d=await c.json(),l=(d.results??[]).slice(0,o).map(u=>({title:u.title??"",url:u.url??"",snippet:u.content??""}));if(t?.allowedDomains?.length){let u=new Set(t.allowedDomains.map(p=>p.toLowerCase()));return{query:e,results:l.filter(p=>{try{return u.has(new URL(p.url).hostname.toLowerCase())}catch{return!1}})}}if(t?.blockedDomains?.length){let u=new Set(t.blockedDomains.map(p=>p.toLowerCase()));return{query:e,results:l.filter(p=>{try{return!u.has(new URL(p.url).hostname.toLowerCase())}catch{return!0}})}}return{query:e,results:l,totalResults:d.number_of_results}}finally{clearTimeout(a)}};return{search:(e,t)=>Fc(Hc,r)(e,t)}}function ub(){let r=z.join(process.env.HOME??process.env.USERPROFILE??".",".qlogicagent");function e(o){return z.join(r,"projects",o,".instructions")}function t(o,s){if(!s.endsWith(".md"))throw new Error("Filename must end with .md");if(s.includes(".."))throw new Error("Path traversal not allowed");let i=e(o),a=z.resolve(i,s);if(!a.startsWith(i+z.sep)&&a!==i)throw new Error("Path traversal not allowed");return a}function n(o,s){if(!N.existsSync(o))return[];let i=[];for(let a of N.readdirSync(o,{withFileTypes:!0})){let c=z.join(o,a.name);if(a.isDirectory())i.push(...n(c,s));else if(a.isFile()&&a.name.endsWith(".md")){let d=N.statSync(c);i.push({filename:z.relative(s,c).replace(/\\/g,"/"),path:c,size:d.size,updatedAt:d.mtime.toISOString(),content:N.readFileSync(c,"utf-8")})}}return i}return{list(o){let s=e(o);return n(s,s).map(i=>({filename:i.filename,path:i.path,size:i.size,updatedAt:i.updatedAt}))},read(o,s){try{let i=t(o,s);if(!N.existsSync(i))return null;let a=N.statSync(i),c=N.readFileSync(i,"utf-8");return{filename:s,path:i,size:a.size,updatedAt:a.mtime.toISOString(),content:c}}catch{return null}},write(o,s,i){let a=t(o,s);N.mkdirSync(z.dirname(a),{recursive:!0}),N.writeFileSync(a,i,"utf-8");let c=N.statSync(a);return{filename:s,path:a,size:c.size,updatedAt:c.mtime.toISOString(),content:i}},remove(o,s){try{let i=t(o,s);return N.existsSync(i)?(N.unlinkSync(i),!0):!1}catch{return!1}}}}function pb(r){r?.workdir&&(lt=r.workdir),sb(),to(lt);let e=[];e.push(bl()),e.push(kl()),e.push(jc({askUser:async l=>Vc?.(l)??null})),e.push(El({onProgress:r?.onExecProgress,interpretExitCode:(l,u)=>{if(l===127)return"command not found";if(l===126)return"permission denied";if(l===137)return"killed (SIGKILL / OOM)";if(l===143)return"terminated (SIGTERM)";if(l===130)return"interrupted (Ctrl+C)"}}));let t=Xy(),n=Qy(),o=Zy(),s=eb();e.push(Dl(t)),e.push(Nl(n)),e.push(Ul(o)),e.push(cs(s)),e.push(Gl(s)),e.push(Bl(tb())),e.push(Xl(ab())),e.push(Ql(db()));let i=ub();e.push(Zl(i));let a=r?.log??{info:()=>{},warn:()=>{}};e.push(ec(gc({log:a}))),e.push(bc());let c={invokeTool:async(l,u,p)=>{let m=xe(l);if(!m)return{result:"",error:`Unknown tool: ${l}`};try{let g=await m.execute(`wf_${Date.now()}`,u,p);return{result:g.content.map(b=>b.text??"").join(`
273
+ `),error:g.details?.error}}catch(g){return{result:"",error:g.message}}},getCwd:()=>lt};e.push(wc(c)),e.push(vc({sleep:(l,u)=>new Promise(p=>{let m=Date.now(),g=setTimeout(()=>{p({sleptSeconds:Math.round((Date.now()-m)/1e3),interrupted:!1})},l),f=()=>{clearTimeout(g),p({sleptSeconds:Math.round((Date.now()-m)/1e3),interrupted:!0,interruptReason:"aborted"})};u.addEventListener("abort",f,{once:!0}),u.aborted&&(clearTimeout(g),f())})})),e.push(Sc({searchTools:async(l,u)=>{let p=u?.maxResults??5,m=qe(),g=l.toLowerCase().split(/\s+/).filter(Boolean),f=[],b=[];for(let y of g)y.startsWith("+")&&y.length>1?f.push(y.slice(1)):b.push(y);let w=[...f,...b],T=y=>y.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/_/g," ").toLowerCase().split(/\s+/).filter(Boolean);return{matches:m.map(y=>{let I=xe(y),O=T(y),$=(I?.description??"").toLowerCase(),v=(I?.searchHint??"").toLowerCase();if(f.length>0){let F=`${O.join(" ")} ${$} ${v}`;if(!f.every(oe=>F.includes(oe)))return null}let pe=0;for(let F of w){let j=0;O.some(oe=>oe===F)?j=10:O.some(oe=>oe.includes(F))?j=5:y.toLowerCase().includes(F)&&(j=3),v&&new RegExp(`\\b${F}`,"i").test(v)&&(j+=4),new RegExp(`\\b${F}`,"i").test($)&&(j+=2),pe+=j}return{name:y,description:I?.description??"",searchHint:I?.searchHint,score:pe}}).filter(y=>y!==null&&y.score>0).sort((y,I)=>I.score-y.score).slice(0,p),query:l,totalDeferred:m.length}},activateTool:async l=>yl(l)})),e.push({..._c({generateImage:async l=>{let u=await Oe({mediaType:"image",model:"",prompt:l.prompt,purpose:l.purpose,style:l.style,size:l.size,imageUrl:l.imageUrl,n:l.n,quality:l.quality,seed:l.seed});return{mediaUrls:u.mediaUrls,model:u.model,size:u.size,durationMs:u.durationMs}}}),isEnabled:()=>Le("image")}),e.push({...Rc({textToSpeech:async l=>{let u=await Oe({mediaType:"tts",model:"",prompt:"",text:l.text,channel:l.channel,voice:l.voice,speed:l.speed});return{audioPath:"",provider:u.model,mediaUrls:u.mediaUrls}}}),isEnabled:()=>Le("tts")}),e.push({...Cc({generateVideo:async l=>{let u=await Oe({mediaType:"video",model:"",prompt:l.prompt,purpose:l.purpose,style:l.style,imageUrl:l.imageUrl,referenceVideos:l.referenceVideos,referenceAudios:l.referenceAudios,generateAudio:l.generateAudio,aspectRatio:l.aspectRatio,duration:l.duration,resolution:l.resolution,fps:l.fps,seed:l.seed,cameraFixed:l.cameraFixed,returnLastFrame:l.returnLastFrame,draft:l.draft,serviceTier:l.serviceTier,callbackUrl:l.callbackUrl,safetyIdentifier:l.safetyIdentifier,executionExpiresAfterSeconds:l.executionExpiresAfterSeconds,videoTools:l.videoTools});return{mediaUrls:u.mediaUrls,model:u.model,durationMs:u.durationMs,lastFrameUrl:u.lastFrameUrl,taskId:u.taskId}}}),isEnabled:()=>Le("video")}),e.push({...Ac({generateMusic:async l=>{let u=await Oe({mediaType:"music",model:"",prompt:l.prompt,purpose:l.purpose,style:l.style,lyrics:l.lyrics,duration:l.duration,isInstrumental:l.isInstrumental,audioUrl:l.audioUrl,audioFormat:l.audioFormat});return{mediaUrls:u.mediaUrls,model:u.model,durationMs:u.durationMs}},generateLyrics:async l=>{let u=Je.music;if(!u||!te)return"";let p=te.getTransport(u.provider);if(!(p instanceof rt))return"";let m=ge[u.provider];return m?p.generateLyrics(l,m):""}}),isEnabled:()=>Le("music")}),e.push({...Pc({editVideo:async l=>{let u=await Oe({mediaType:"video",model:"",prompt:l.prompt,operation:"edit",sourceVideos:l.sourceVideos,referenceImages:l.referenceImages,duration:l.duration,aspectRatio:l.aspectRatio,resolution:l.resolution});return{mediaUrls:u.mediaUrls,model:u.model,durationMs:u.durationMs}}}),shouldDefer:!0,isEnabled:()=>bs("video","edit")}),e.push({...Mc({mergeVideos:async l=>{let u=[`merge ${l.clips.length} clips`];l.transition&&u.push(`transition: ${l.transition}${l.transitionDuration?` (${l.transitionDuration}s)`:""}`),l.subtitles&&u.push(`burn-in subtitles: ${l.subtitles}`),l.bgm&&u.push(`background music: ${l.bgm}${l.bgmVolume!==void 0?` at volume ${l.bgmVolume}`:""}`);let p=await Oe({mediaType:"video",model:"",prompt:u.join("; "),operation:"merge",sourceVideos:l.clips.map(m=>m.video),resolution:l.outputResolution,fps:l.outputFps});return{localPath:"",servePath:p.mediaUrls[0]??"",durationSec:(p.durationMs??0)/1e3,clipCount:l.clips.length,mediaUrls:p.mediaUrls}}}),shouldDefer:!0,isEnabled:()=>bs("video","merge")}),e.push({...Ic({upscaleVideo:async l=>{let u=["upscale"];l.sharpness&&u.push(`sharpness: ${l.sharpness}`);let p=await Oe({mediaType:"video",model:"",prompt:u.join(", "),operation:"upscale",sourceVideos:[l.video],resolution:l.targetResolution??"1080p"});return{localPath:"",servePath:p.mediaUrls[0]??"",resolution:l.targetResolution??"1080p",durationSec:(p.durationMs??0)/1e3,mediaUrls:p.mediaUrls}}}),shouldDefer:!0,isEnabled:()=>bs("video","upscale")}),e.push({...Ec({generate3D:async l=>{let u=await Oe({mediaType:"3d",model:"",prompt:l.prompt,imageUrl:l.imageUrl,outputFormat:l.outputFormat,seed:l.seed});return{mediaUrls:u.mediaUrls,model:u.model,durationMs:u.durationMs,metadata:u.metadata}}}),shouldDefer:!0,isEnabled:()=>Le("3d")}),e.push({...Oc({speechToText:async l=>{let u=await Oe({mediaType:"stt",model:"",prompt:"",audioUrl:l.audioUrl,metadata:l.language?{language:l.language}:void 0});return{transcription:u.metadata?.transcription??"",model:u.model,durationMs:u.durationMs}}}),shouldDefer:!0,isEnabled:()=>Le("stt")}),e.push({...Lc({cloneVoice:async l=>{let u=await Oe({mediaType:"voice_clone",model:"",prompt:"",text:l.text,audioUrl:l.sampleAudioUrl,speed:l.speed});return{mediaUrls:u.mediaUrls,model:u.model,voiceId:u.metadata?.voiceId,durationMs:u.durationMs}}}),shouldDefer:!0,isEnabled:()=>Le("voice_clone")}),e.push({...Dc({cancelTask:async l=>{let u=l.provider??"doubao";if(!te)return{ok:!1,message:"Media client not configured."};let p=te.getTransport(u);if(!p)return{ok:!1,message:`No transport for provider: ${u}`};let m=ge[u];if(!m)return{ok:!1,message:`No API key for provider: ${u}`};try{return"deleteVideoTask"in p&&typeof p.deleteVideoTask=="function"?(await p.deleteVideoTask(l.taskId,m),{ok:!0,message:"Task cancelled."}):{ok:!1,message:`Provider ${u} does not support task cancellation.`}}catch(g){return{ok:!1,message:g instanceof Error?g.message:String(g)}}}}),shouldDefer:!0,isEnabled:()=>Le("video")||Le("3d")});let d=so();return e.push({...$c({uploadFile:async l=>{if(!d)throw new Error("No file upload provider available. Configure a media provider with Files API support (e.g. Volcengine, Google).");let u=he(l.filePath);if(!N.existsSync(u))throw new Error(`File not found: ${u}`);let p=N.statSync(u);if(p.size>100*1024*1024)throw new Error(`File too large (${(p.size/1024/1024).toFixed(1)} MB). Max: 100 MB.`);let m=await N.promises.readFile(u),g=z.basename(u);if(d.type==="gemini"){let R=io(),y=ge.google,I=z.extname(u).toLowerCase(),O=Yy[I]??"application/octet-stream",$=await R.uploadFile(Buffer.from(m),y,{mimeType:O,displayName:g});if($.state==="PROCESSING"){let v=await R.waitForProcessing($.name,y);return{fileId:v.name,url:v.uri,filename:g,bytes:p.size,provider:"google"}}return{fileId:$.name,url:$.uri,filename:g,bytes:p.size,provider:"google"}}let f=new Blob([m]),b=te.getTransport(d.id),w=ge[d.id];if(!(b instanceof Re))throw new Error(`File upload only supported via Volcengine or Google provider. Current: ${d.id}`);let T=await b.uploadFile(f,w,{purpose:l.purpose??"media_reference",filename:g}),_;try{let R=await b.getFile(T.id,w);typeof R.url=="string"&&R.url&&(_=R.url)}catch{}return{fileId:T.id,url:_,filename:g,bytes:p.size,provider:d.id}}}),shouldDefer:!0,isEnabled:()=>!!so()}),e.push({...Nc({queryFile:async l=>{if(!d)throw new Error("No file API provider available.");if(d.type==="gemini"){let g=io(),f=ge.google,b=await g.getFile(l.fileId,f);return{id:b.name,filename:b.displayName??"",bytes:Number(b.sizeBytes??0),status:b.state?.toLowerCase()??"unknown",createdAt:b.createTime,url:b.uri}}let u=te.getTransport(d.id),p=ge[d.id];if(!(u instanceof Re))throw new Error("File query only supported via Volcengine or Google provider.");let m=await u.getFile(l.fileId,p);return{id:String(m.id??l.fileId),filename:String(m.filename??""),bytes:Number(m.bytes??0),status:String(m.status??"unknown"),createdAt:m.created_at?String(m.created_at):void 0,url:m.url?String(m.url):void 0}},listFiles:async l=>{if(!d)throw new Error("No file API provider available.");if(d.type==="gemini"){let f=io(),b=ge.google;return(await f.listFiles(b,{pageSize:l.limit??10})).files.map(T=>({id:T.name,filename:T.displayName??"",bytes:Number(T.sizeBytes??0),status:T.state?.toLowerCase()??"unknown",createdAt:T.createTime,url:T.uri}))}let u=te.getTransport(d.id),p=ge[d.id];if(!(u instanceof Re))throw new Error("File list only supported via Volcengine or Google provider.");return((await u.listFiles(p,{limit:l.limit??10})).data??[]).map(f=>({id:String(f.id??""),filename:String(f.filename??""),bytes:Number(f.bytes??0),status:String(f.status??"unknown"),createdAt:f.created_at?String(f.created_at):void 0,url:f.url?String(f.url):void 0}))}}),shouldDefer:!0,isEnabled:()=>!!so()}),e.push({...Uc({deleteFile:async l=>{if(!d)throw new Error("No file API provider available.");if(d.type==="gemini"){let m=io(),g=ge.google;await m.deleteFile(l.fileId,g);return}let u=te.getTransport(d.id),p=ge[d.id];if(!(u instanceof Re))throw new Error("File delete only supported via Volcengine or Google provider.");await u.deleteFile(l.fileId,p)}}),shouldDefer:!0,isEnabled:()=>!!so()}),hl(e),r?.log?.info(`[tool-bootstrap] Registered ${e.length} local tools (${e.filter(l=>l.isEnabled?.()!==!1).length} enabled): ${qe().join(", ")}`),e}var Xc=pb;function ao(r){lt=r,to(r)}import{spawn as mb}from"node:child_process";import{createInterface as gb}from"node:readline";var lo=class{process=null;readline=null;pending=new Map;nextId=1;connected=!1;toolsCache=[];serverName="";serverVersion="";supportsToolsListChanged=!1;onToolsChanged=null;stderrBuffer="";config;constructor(e){this.config=e}async connect(){if(this.connected)return;let e={...process.env,...this.config.env};this.process=mb(this.config.command,this.config.args??[],{stdio:["pipe","pipe","pipe"],env:e,cwd:this.config.cwd,windowsHide:!0}),this.process.on("error",n=>{this.handleProcessError(n)}),this.process.on("exit",n=>{this.handleProcessExit(n)}),this.process.stderr?.on("data",n=>{this.stderrBuffer+=n.toString(),this.stderrBuffer.length>4096&&(this.stderrBuffer=this.stderrBuffer.slice(-4096))}),this.readline=gb({input:this.process.stdout,crlfDelay:Number.POSITIVE_INFINITY}),this.readline.on("line",n=>this.handleLine(n));let t=await this.sendRequest("initialize",{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"qlogicagent",version:"0.3.0"}},this.config.initTimeoutMs??3e4);this.serverName=t.serverInfo?.name??this.config.name,this.serverVersion=t.serverInfo?.version??"unknown",this.supportsToolsListChanged=t.capabilities?.tools?.listChanged??!1,this.sendNotification("notifications/initialized",{}),this.connected=!0,await this.refreshTools()}async disconnect(){if(this.connected){this.connected=!1;for(let[,e]of this.pending)e.reject(new Error("MCP client disconnecting"));if(this.pending.clear(),this.toolsCache=[],this.readline?.close(),this.readline=null,this.process){this.process.kill("SIGTERM");let e=setTimeout(()=>this.process?.kill("SIGKILL"),5e3);this.process.on("exit",()=>clearTimeout(e)),this.process=null}}}get isConnected(){return this.connected}get info(){return{name:this.serverName,version:this.serverVersion}}async refreshTools(){if(!this.connected)return[];try{let e=await this.sendRequest("tools/list",{});this.toolsCache=e.tools??[]}catch{this.toolsCache=[]}return this.toolsCache}getCachedTools(){return this.toolsCache}async callTool(e,t,n){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return await this.sendRequest("tools/call",{name:e,arguments:t??{}},12e4,n)}async listResources(){if(!this.connected)return[];try{return(await this.sendRequest("resources/list",{})).resources??[]}catch{return[]}}async readResource(e){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return(await this.sendRequest("resources/read",{uri:e})).contents??[]}toPortableTools(){let e=fb(this.config.name);return this.toolsCache.map(t=>({name:`mcp__${e}__${t.name}`,label:`[${this.config.name}] ${t.name}`,description:t.description??`MCP tool from ${this.config.name}`,parameters:t.inputSchema??{type:"object",properties:{}},isConcurrencySafe:!0,isReadOnly:!1,searchHint:`mcp ${this.config.name} ${t.name}`,execute:async(n,o,s)=>this.executeAsTool(t.name,o,s)}))}setOnToolsChanged(e){this.onToolsChanged=e}async executeAsTool(e,t,n){try{let o=await this.callTool(e,t,n);return{content:[{type:"text",text:o.content.filter(a=>a.type==="text"&&a.text).map(a=>a.text).join(`
274
+ `)||"(no text output)"}],...o.isError?{details:{error:"mcp_tool_error"}}:{}}}catch(o){let s=o instanceof Error?o.message:String(o);return{content:[{type:"text",text:`MCP tool error: ${s}`}],details:{error:s}}}}sendRequest(e,t,n=3e4,o){return new Promise((s,i)=>{if(o?.aborted){i(new Error("Aborted"));return}let a=this.nextId++,c={jsonrpc:"2.0",id:a,method:e,params:t},d=setTimeout(()=>{this.pending.delete(a),i(new Error(`MCP request ${e} timed out after ${n}ms`))},n),l=()=>{clearTimeout(d),this.pending.delete(a)};o?.addEventListener("abort",()=>{l(),i(new Error("Aborted"))},{once:!0}),this.pending.set(a,{resolve:u=>{l(),u.error?i(new Error(`MCP error ${u.error.code}: ${u.error.message}`)):s(u.result)},reject:u=>{l(),i(u)}}),this.writeLine(JSON.stringify(c))})}sendNotification(e,t){let n={jsonrpc:"2.0",method:e,params:t};this.writeLine(JSON.stringify(n))}writeLine(e){this.process?.stdin?.writable&&this.process.stdin.write(e+`
275
+ `)}handleLine(e){let t=e.trim();if(!t)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n&&("result"in n||"error"in n)){let o=n.id,s=this.pending.get(o);s&&s.resolve(n)}else"method"in n&&!("id"in n)&&this.handleNotification(n)}handleNotification(e){e.method==="notifications/tools/list_changed"&&this.refreshTools().then(()=>{this.onToolsChanged?.()}).catch(()=>{})}handleProcessError(e){this.connected=!1;for(let[,t]of this.pending)t.reject(new Error(`MCP process error: ${e.message}`));this.pending.clear()}handleProcessExit(e){this.connected=!1;for(let[,t]of this.pending)t.reject(new Error(`MCP process exited with code ${e}`));this.pending.clear()}};function fb(r){return r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}import{randomUUID as hb}from"node:crypto";var co=class{connected=!1;toolsCache=[];serverName="";serverVersion="";sessionId=null;onToolsChanged=null;config;constructor(e){this.config=e}async connect(){if(this.connected)return;let e=await this.sendRequest("initialize",{protocolVersion:"2025-03-26",capabilities:{},clientInfo:{name:"qlogicagent",version:"0.3.0"}},this.config.initTimeoutMs??3e4);this.serverName=e.serverInfo?.name??this.config.name,this.serverVersion=e.serverInfo?.version??"unknown",await this.sendNotification("notifications/initialized",{}),this.connected=!0,await this.refreshTools()}async disconnect(){this.connected=!1,this.toolsCache=[],this.sessionId=null}async callTool(e,t,n){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return await this.sendRequest("tools/call",{name:e,arguments:t??{}},this.config.toolCallTimeoutMs??12e4,n)}async listResources(){if(!this.connected)return[];try{return(await this.sendRequest("resources/list",{})).resources??[]}catch{return[]}}async readResource(e){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return(await this.sendRequest("resources/read",{uri:e})).contents??[]}toPortableTools(){return this.toolsCache.map(e=>this.schemaToPortableTool(e))}getCachedTools(){return[...this.toolsCache]}get isConnected(){return this.connected}get info(){return{name:this.serverName,version:this.serverVersion}}setOnToolsChanged(e){this.onToolsChanged=e}async refreshTools(){let e=await this.sendRequest("tools/list",{});this.toolsCache=e.tools??[]}async sendRequest(e,t,n=3e4,o){let s=hb(),i={jsonrpc:"2.0",id:s,method:e,params:t},a=new AbortController,c=setTimeout(()=>a.abort(),n);o&&o.addEventListener("abort",()=>a.abort(),{once:!0});try{let d={"Content-Type":"application/json",Accept:"application/json, text/event-stream",...this.config.headers};this.sessionId&&(d["Mcp-Session-Id"]=this.sessionId);let l=await fetch(this.config.url,{method:"POST",headers:d,body:JSON.stringify(i),signal:a.signal}),u=l.headers.get("mcp-session-id");if(u&&(this.sessionId=u),!l.ok)throw new Error(`MCP HTTP error ${l.status}: ${l.statusText}`);if((l.headers.get("content-type")??"").includes("text/event-stream"))return await this.parseSSEResponse(l,s);let m=await l.json();if(m.error)throw new Error(`MCP error ${m.error.code}: ${m.error.message}`);return m.result}finally{clearTimeout(c)}}async sendNotification(e,t){let n={jsonrpc:"2.0",method:e,params:t},o={"Content-Type":"application/json",...this.config.headers};this.sessionId&&(o["Mcp-Session-Id"]=this.sessionId),await fetch(this.config.url,{method:"POST",headers:o,body:JSON.stringify(n)}).catch(()=>{})}async parseSSEResponse(e,t){let n=e.body;if(!n)throw new Error("MCP SSE response has no body");let o=n.getReader(),s=new TextDecoder,i="";try{for(;;){let{done:a,value:c}=await o.read();if(a)break;i+=s.decode(c,{stream:!0});let d=i.split(`
276
+ `);i=d.pop()??"";for(let l of d){if(!l.startsWith("data: "))continue;let u=l.slice(6).trim();if(u)try{let p=JSON.parse(u);if("method"in p&&p.method==="notifications/tools/list_changed"){this.onToolsChanged?.();continue}if(p.id===t){if(p.error)throw new Error(`MCP error ${p.error.code}: ${p.error.message}`);return p.result}}catch(p){if(p instanceof Error&&p.message.startsWith("MCP error"))throw p}}}}finally{o.releaseLock()}throw new Error("MCP SSE stream ended without response")}schemaToPortableTool(e){let t=this;return{name:`mcp__${yb(this.config.name)}__${e.name}`,label:`[${this.config.name}] ${e.name}`,description:e.description??`MCP tool from ${this.config.name}`,parameters:e.inputSchema??{type:"object",properties:{}},isConcurrencySafe:!0,isReadOnly:!1,searchHint:`mcp ${this.config.name} ${e.name}`,execute:async(o,s,i)=>{try{let a=await t.callTool(e.name,s,i);return{content:[{type:"text",text:(a.content??[]).filter(l=>l.type==="text"&&l.text).map(l=>l.text).join(`
277
+ `)||"(no output)"}],details:a.isError?{type:"mcp",error:"tool_error"}:{type:"mcp"}}}catch(a){let c=a instanceof Error?a.message:String(a);return{content:[{type:"text",text:`MCP tool error: ${c}`}],details:{type:"mcp",error:c}}}}}}};function yb(r){return r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}var uo=class{clients=new Map;injected=!1;log;constructor(e){this.log=e.log??{info:()=>{},warn:()=>{}};for(let t of e.servers){if(t.disabled)continue;if((t.type??(t.url?"http":"stdio"))==="http"){if(!t.url){this.log.warn(`[mcp] server "${t.name}" is type "http" but has no url, skipping`);continue}let o={name:t.name,url:t.url,headers:t.headers,initTimeoutMs:t.initTimeoutMs};this.clients.set(t.name,new co(o))}else{if(!t.command){this.log.warn(`[mcp] server "${t.name}" is type "stdio" but has no command, skipping`);continue}let o={name:t.name,command:t.command,args:t.args,env:t.env,initTimeoutMs:t.initTimeoutMs};this.clients.set(t.name,new lo(o))}}}async connectAll(){let e=Array.from(this.clients.entries()).map(async([t,n])=>{try{await n.connect(),this.log.info(`[mcp] connected to ${t} (${n.info.name} v${n.info.version})`),n.setOnToolsChanged(()=>{this.log.info(`[mcp] tools changed on ${t}, re-injecting`),this.injected&&this.reinjectTools(t,n)})}catch(o){this.log.warn(`[mcp] failed to connect to ${t}: ${o instanceof Error?o.message:o}`)}});await Promise.allSettled(e)}injectTools(){this.injected=!0;for(let[e,t]of this.clients){if(!t.isConnected)continue;let n=t.toPortableTools();Gr(n),this.log.info(`[mcp] injected ${n.length} tools from ${e}`)}}getConnectedServers(){return Array.from(this.clients.entries()).filter(([,e])=>e.isConnected).map(([e])=>e)}getToolCount(){let e=0;for(let t of this.clients.values())t.isConnected&&(e+=t.getCachedTools().length);return e}async disconnectAll(){let e=Array.from(this.clients.values()).map(async t=>{try{await t.disconnect()}catch{}});await Promise.allSettled(e),this.clients.clear(),this.injected=!1}async listResources(e){let t=e?[[e,this.clients.get(e)]].filter(([,o])=>o):Array.from(this.clients.entries());return(await Promise.all(t.map(async([o,s])=>{if(!s?.isConnected||!s.listResources)return[];try{return(await s.listResources()).map(a=>({...a,server:o}))}catch{return this.log.warn(`[mcp] failed to list resources from ${o}`),[]}}))).flat()}async readResource(e,t){let n=this.clients.get(e);if(!n?.isConnected)throw new Error(`MCP server "${e}" is not connected`);if(!n.readResource)throw new Error(`MCP server "${e}" does not support resources`);return n.readResource(t)}reinjectTools(e,t){if(!this.injected)return;let n=`mcp__${e.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`;for(let s of qe())s.startsWith(n)&&Kn(s);let o=t.toPortableTools();Gr(o),this.log.info(`[mcp] re-injected ${o.length} tools from ${e}`)}};function xs(r){if(!r||typeof r!="object")return[];let e=r,t=[],n=e.mcpServers??e.servers??e;for(let[o,s]of Object.entries(n)){if(!s||typeof s!="object")continue;let i=s;if(typeof i.url=="string"){t.push({name:o,type:"http",url:i.url,headers:i.headers&&typeof i.headers=="object"?i.headers:void 0,disabled:i.disabled===!0,initTimeoutMs:typeof i.initTimeoutMs=="number"?i.initTimeoutMs:void 0});continue}typeof i.command=="string"&&t.push({name:o,type:"stdio",command:i.command,args:Array.isArray(i.args)?i.args:void 0,env:i.env&&typeof i.env=="object"?i.env:void 0,disabled:i.disabled===!0})}return t}var bb={type:"object",properties:{server:{type:"string",description:"MCP server name to list resources from. Omit to list from all connected servers."}}};function Qc(r){return{name:"list_mcp_resources",label:"List MCP Resources",description:"List resources available from connected MCP servers. Resources are data items (files, database records, API data) exposed by MCP servers that can be read with read_mcp_resource.",parameters:bb,shouldDefer:!0,isConcurrencySafe:!0,isReadOnly:!0,searchHint:"mcp resource list browse discover",execute:async(e,t)=>{let n=r();if(!n)return{content:[{type:"text",text:"No MCP servers configured."}],details:{type:"list_mcp_resources",count:0}};let o=await n.listResources(t.server);if(o.length===0)return{content:[{type:"text",text:t.server?`No resources found from MCP server "${t.server}".`:"No resources found from any connected MCP server."}],details:{type:"list_mcp_resources",count:0}};let s=new Map;for(let a of o){let c=s.get(a.server)??[];c.push(a),s.set(a.server,c)}let i=[];for(let[a,c]of s){i.push(`Server: ${a} (${c.length} resources)`);for(let d of c){let l=d.mimeType?` [${d.mimeType}]`:"",u=d.description?` \u2014 ${d.description}`:"";i.push(` ${d.name}: ${d.uri}${l}${u}`)}i.push("")}return{content:[{type:"text",text:i.join(`
278
+ `).trim()}],details:{type:"list_mcp_resources",count:o.length}}}}}var kb={type:"object",properties:{server:{type:"string",description:"Name of the MCP server that hosts the resource."},uri:{type:"string",description:"URI of the resource to read (from list_mcp_resources output)."}},required:["server","uri"]};function Zc(r){return{name:"read_mcp_resource",label:"Read MCP Resource",description:"Read a specific resource from an MCP server by URI. Returns the resource content (text or binary metadata). Use list_mcp_resources first to discover available URIs.",parameters:kb,shouldDefer:!0,isConcurrencySafe:!0,isReadOnly:!0,searchHint:"mcp resource read fetch content",execute:async(e,t)=>{let n=r();if(!n)return{content:[{type:"text",text:"No MCP servers configured."}],details:{error:"no_mcp"}};try{let o=await n.readResource(t.server,t.uri);if(o.length===0)return{content:[{type:"text",text:`Resource "${t.uri}" returned no content.`}],details:{type:"read_mcp_resource",empty:!0}};let s=[];for(let i of o)if(i.text){let a=i.mimeType?` (${i.mimeType})`:"";s.push({type:"text",text:`--- ${i.uri}${a} ---
277
279
  ${i.text}`})}else if(i.blob){let a=Math.ceil(i.blob.length*3/4/1024);s.push({type:"text",text:`--- ${i.uri} (binary, ~${a}KB, ${i.mimeType??"unknown"}) ---
278
- [Binary content not displayed. Use appropriate tool to process.]`})}return s.length===0?{content:[{type:"text",text:`Resource "${t.uri}" has no readable content.`}],details:{type:"read_mcp_resource",empty:!0}}:{content:s,details:{type:"read_mcp_resource",uri:t.uri,server:t.server,contentCount:o.length}}}catch(o){return{content:[{type:"text",text:`Error reading resource: ${o.message}`}],details:{error:o.message}}}}}}import*as Ve from"node:fs";import*as oo from"node:path";import{pathToFileURL as pb}from"node:url";var Kc={preToolUse:"tool.before_invoke",postToolUse:"tool.after_invoke",onTurnStart:"turn.submitted",onTurnEnd:"turn.completed",onSessionEnd:"session.ended"};var ro=class{constructor(e){this.config=e;this.log=e.log??{info:()=>{},warn:()=>{}}}config;loaded=[];pluginSkills=[];activations=new Map;log;async loadAll(){for(let e of this.config.pluginDirs){if(!Ve.existsSync(e))continue;let t;try{t=Ve.readdirSync(e,{withFileTypes:!0})}catch{continue}for(let n of t){if(!n.isDirectory()||n.name.startsWith(".")||n.name.startsWith("_"))continue;let o=oo.join(e,n.name);await this.loadPlugin(n.name,o)}}return this.log.info(`[plugins] loaded ${this.loaded.length} plugin(s): ${this.loaded.map(e=>e.name).join(", ")||"(none)"}`),this.loaded}getPluginSkills(){return this.pluginSkills}getLoaded(){return this.loaded}async refreshActivations(){let e=Date.now();for(let[t,n]of this.activations){if(e-n.lastCheckAt<n.ttlMs)continue;let o;try{o=await n.checkFn()}catch(s){this.log.warn(`[plugins] ${t}: check_fn error: ${s instanceof Error?s.message:s}`),o=n.lastResult}if(n.lastCheckAt=e,o!==n.lastResult){if(n.lastResult=o,o&&!n.active){for(let s of n.tools)me(s);n.active=!0,this.log.info(`[plugins] ${t}: reactivated (${n.tools.length} tools)`)}else if(!o&&n.active){for(let s of n.tools)Bn(s.name);for(let s of n.hookUnregisterFns)s();n.active=!1,this.log.info(`[plugins] ${t}: deactivated`)}}}}async loadPlugin(e,t){let n=["index.js","index.mjs"],o=null;for(let f of n){let b=oo.join(t,f);if(Ve.existsSync(b)){o=b;break}}if(!o){this.log.warn(`[plugins] ${e}: no index.js found, skipping`);return}let s=0,i=0,a=0,l=[],u=[],c=null,d=6e4,p={},m=oo.join(t,"config.json");if(Ve.existsSync(m))try{p=JSON.parse(Ve.readFileSync(m,"utf8"))}catch{}let g={pluginName:e,registerTool:f=>{me(f),l.push(f),s++},registerHook:(f,b)=>{let T=Kc[f];if(!T){this.log.warn(`[plugins] ${e}: unknown hook phase "${f}"`);return}let w=this.config.hookRegistry.register({point:T,handler:b,label:`plugin:${e}:${f}`,priority:200});u.push(w),i++},registerSkill:f=>{this.pluginSkills.push(f),a++},getConfig:()=>p,setActivationCheck:(f,b)=>{c=f,b!==void 0&&(d=b)}};try{let b=await import(pb(o).href);if(typeof b.register!="function"){this.log.warn(`[plugins] ${e}: no register() export, skipping`);return}await b.register(g),c&&this.activations.set(e,{checkFn:c,ttlMs:d,lastCheckAt:Date.now(),lastResult:!0,tools:l,hookUnregisterFns:u,active:!0}),this.loaded.push({name:e,directory:t,toolCount:s,hookCount:i,skillCount:a}),this.log.info(`[plugins] ${e}: ${s} tools, ${i} hooks, ${a} skills`)}catch(f){this.log.warn(`[plugins] ${e}: load error: ${f instanceof Error?f.message:f}`)}}};import*as ie from"node:fs";import*as Qt from"node:path";function ys(){return Xi()}function Jc(){return Qt.join(ys(),"installed_plugins.json")}function Yc(){let r=Jc();if(!ie.existsSync(r))return{version:1,plugins:[]};try{return JSON.parse(ie.readFileSync(r,"utf-8"))}catch{return{version:1,plugins:[]}}}function mb(r){let e=ys();ie.existsSync(e)||ie.mkdirSync(e,{recursive:!0}),ie.writeFileSync(Jc(),JSON.stringify(r,null,2),"utf-8")}function gb(r,e){return!(e.blocklist?.includes(r)||e.allowlist&&!e.allowlist.includes(r))}async function fb(r,e,t){let{execFile:n}=await import("node:child_process"),{promisify:o}=await import("node:util"),s=o(n),i=ys(),a=e?`${r}@${e}`:r;try{let{stdout:l}=await s("npm",["pack",a,"--pack-destination",i],{timeout:6e4,cwd:i}),u=l.trim().split(`
279
- `).pop()?.trim();if(!u)return t.warn(`[marketplace] npm pack returned no output for ${a}`),null;let c=Qt.join(i,u),p=u.match(/^(.+)-(\d+\.\d+\.\d+.*)\.tgz$/)?.[2]??"0.0.0",m=Qt.join(i,`${r}@${p}`);ie.existsSync(m)||ie.mkdirSync(m,{recursive:!0}),await s("tar",["xzf",c,"-C",m,"--strip-components=1"],{timeout:3e4});try{ie.unlinkSync(c)}catch{}let g=Qt.join(m,"package.json");if(ie.existsSync(g))try{await s("npm",["install","--production","--no-save"],{cwd:m,timeout:12e4})}catch(f){t.warn(`[marketplace] npm install for ${r} failed: ${f.message}`)}return t.info(`[marketplace] installed ${r}@${p} from npm`),{name:r,version:p,installPath:m}}catch(l){return t.warn(`[marketplace] failed to install ${a} from npm: ${l.message}`),null}}function hb(){return Yc().plugins.filter(e=>ie.existsSync(e.installPath)).map(e=>e.installPath)}async function yb(r,e){let t=Yc(),n=[];for(let o of r.enabledPlugins){let s=o.specifier.split("/").pop()??o.specifier;if(!gb(s,r)){e.warn(`[marketplace] plugin "${s}" blocked by enterprise policy`);continue}let i=t.plugins.find(l=>l.source.specifier===o.specifier&&l.source.type===o.type);if(i&&ie.existsSync(i.installPath)&&(!o.version||i.version===o.version)){n.push(i.installPath);continue}let a=null;switch(o.type){case"npm":a=await fb(o.specifier,o.version,e);break;case"git":case"url":e.warn(`[marketplace] ${o.type} source not yet implemented for "${o.specifier}"`);break}if(a){let l={name:a.name,version:a.version,source:o,installPath:a.installPath,installedAt:new Date().toISOString()};t.plugins=t.plugins.filter(u=>!(u.source.specifier===o.specifier&&u.source.type===o.type)),t.plugins.push(l),n.push(a.installPath)}}return mb(t),n}function bb(){let r=Zi();if(!ie.existsSync(r))return null;try{return JSON.parse(ie.readFileSync(r,"utf-8"))}catch{return null}}async function Xc(r,e){let t=[...r],n=hb();t.push(...n);let o=bb();if(o&&o.enabledPlugins.length>0)try{let s=await yb(o,e),i=new Set(t);for(let a of s)i.has(a)||t.push(a)}catch(s){e.warn(`[marketplace] failed to update plugins: ${s.message}`)}return t}var so=class{mode;rules;defaultBehavior;compiledPatterns;constructor(e){this.mode=e.mode,this.rules=[...e.rules],this.defaultBehavior=e.defaultBehavior,this.compiledPatterns=this.compileRules(this.rules)}getMode(){return this.mode}setMode(e){this.mode=e}getRules(){return this.rules}getDefaultBehavior(){return this.defaultBehavior}replaceRules(e){this.rules=[...e],this.compiledPatterns=this.compileRules(this.rules)}setDefaultBehavior(e){this.defaultBehavior=e}addRule(e){this.rules.push(e),this.compiledPatterns=this.compileRules(this.rules)}applyUpdate(e){this.addRule({pattern:e.pattern,behavior:e.behavior,reason:e.description,source:"user"})}check(e){let{toolName:t,meta:n}=e;switch(this.mode){case"bypassPermissions":return{behavior:"allow",decisionReason:{type:"mode",mode:"bypassPermissions"}};case"dontAsk":return{behavior:"deny",message:`Tool "${t}" denied \u2014 mode is dontAsk`,decisionReason:{type:"mode",mode:"dontAsk"}};case"plan":return{behavior:"deny",message:`Tool "${t}" paused \u2014 mode is plan (execution suspended)`,decisionReason:{type:"mode",mode:"plan"}}}for(let{rule:o,regex:s}of this.compiledPatterns)if(s.test(t))return Tb(o,e);return n?.isReadOnly?{behavior:"allow",decisionReason:{type:"tool_check",reason:"isReadOnly"}}:n?.requiresApproval?{behavior:"ask",message:`Tool "${t}" requires approval`,toolName:t,input:e.arguments,decisionReason:{type:"tool_check",reason:"requiresApproval"}}:n?.isDangerous?{behavior:"ask",message:`Tool "${t}" is marked dangerous`,toolName:t,input:e.arguments,decisionReason:{type:"tool_check",reason:"isDangerous"}}:this.mode==="acceptEdits"?/write|edit|create|delete|move|rename|patch/i.test(t)?{behavior:"allow",decisionReason:{type:"mode",mode:"acceptEdits"}}:{behavior:"ask",message:`Tool "${t}" needs approval in acceptEdits mode`,toolName:t,input:e.arguments,decisionReason:{type:"mode",mode:"acceptEdits"}}:this.defaultBehavior==="allow"?{behavior:"allow"}:this.defaultBehavior==="deny"?{behavior:"deny",message:`Tool "${t}" denied by default policy`,decisionReason:{type:"other",reason:"default_deny"}}:{behavior:"ask",message:`Tool "${t}" requires approval (default policy)`,toolName:t,input:e.arguments}}compileRules(e){return e.map(t=>({rule:t,regex:kb(t.pattern)}))}};function bs(r){if(!r||typeof r!="object")return{mode:"default",rules:[],defaultBehavior:"allow"};let e=r,t=[];for(let a of["allow","deny","ask"]){let l=e[a];if(Array.isArray(l))for(let u of l)typeof u=="string"&&t.push({pattern:u,behavior:a,source:"config"})}if(Array.isArray(e.rules)){for(let a of e.rules)if(a&&typeof a=="object"){let l=a,u=l.pattern,c=l.behavior??l.action;typeof u=="string"&&typeof c=="string"&&(c==="allow"||c==="deny"||c==="ask")&&t.push({pattern:u,behavior:c,reason:typeof l.reason=="string"?l.reason:void 0,source:typeof l.source=="string"?l.source:"config"})}}let n=e.mode,o=typeof n=="string"&&wb(n)?n:"default",s=e.default??e.defaultBehavior,i=typeof s=="string"&&vb(s)?s:"allow";return{mode:o,rules:t,defaultBehavior:i}}function kb(r){let t=r.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*+/g,".*");return new RegExp(`^${t}$`,"i")}function Tb(r,e){let t={type:"rule",rule:r};return r.behavior==="allow"?{behavior:"allow",decisionReason:t}:r.behavior==="deny"?{behavior:"deny",message:r.reason??`Tool "${e.toolName}" denied by rule "${r.pattern}"`,decisionReason:t}:{behavior:"ask",message:r.reason??`Tool "${e.toolName}" requires approval (rule "${r.pattern}")`,toolName:e.toolName,input:e.arguments,decisionReason:t}}function wb(r){return r==="default"||r==="bypassPermissions"||r==="acceptEdits"||r==="dontAsk"||r==="plan"}function vb(r){return r==="allow"||r==="deny"||r==="ask"}import{randomUUID as Pb}from"node:crypto";var xb=new Set(["node --version","npm --version","npx --version","pnpm --version","yarn --version","bun --version","deno --version","python --version","python3 --version","pip --version","ruby --version","go version","rustc --version","cargo --version","java -version","javac -version","dotnet --version","gcc --version","g++ --version","clang --version","git --version","docker --version","--help","-h"]),Qc=new Set(["ls","dir","find","fd","locate","which","where","type","cat","head","tail","less","more","bat","wc","file","stat","du","df","tree","exa","eza","grep","rg","ripgrep","ag","ack","fgrep","egrep","git status","git log","git diff","git show","git branch","git tag","git remote","git stash list","git blame","git shortlog","git describe","git rev-parse","git ls-files","git ls-tree","git cat-file","git reflog","ps","top","htop","uptime","uname","hostname","whoami","id","env","printenv","echo","ping","nslookup","dig","host","ifconfig","ip","netstat","ss","npm list","npm ls","npm info","npm view","npm outdated","npm audit","pnpm list","pnpm ls","pnpm outdated","pip list","pip show","pip freeze","cargo tree","npm test","npm run test","npm run build","npm run lint","pnpm test","pnpm run test","pnpm run build","pnpm run lint","yarn test","yarn build","yarn lint","cargo test","cargo build","cargo check","cargo clippy","go test","go build","go vet","make","cmake","pytest","python -m pytest","python3 -m pytest","jest","vitest","mocha","tsc","tsc --noEmit","eslint","prettier","oxlint"]),Sb=[/\brm\s+-rf?\s+[/~]/,/\brm\s+-rf?\s+\.\.\//,/\bsudo\b/,/\bsu\s/,/\bchmod\s+777\b/,/\bmkfs\b/,/\bfdisk\b/,/\bdd\s+if=/,/\bsystemctl\s+(start|stop|restart|enable|disable)\b/,/\bservice\s+\S+\s+(start|stop|restart)\b/,/\breg\s+(add|delete)\b/i,/\\Windows\\System32/i,/\/etc\/(passwd|shadow|sudoers|fstab)/,/\bgit\s+push\s+.*--force\b/,/\bgit\s+push\s+-f\b/,/\bcurl\b.*(-H|--header)\s+.*[Aa]uthorization/,/\bwget\b.*--header.*[Aa]uthorization/,/\bcurl\b.*\|\s*(sh|bash|zsh)\b/,/\bwget\b.*-O\s*-\s*\|\s*(sh|bash|zsh)\b/,/\bnpm\s+install\s+-g\b/,/\bpip\s+install\b(?!.*-r\b)(?!.*requirements)/,/\bDROP\s+(DATABASE|TABLE|SCHEMA)\b/i,/\bTRUNCATE\s+TABLE\b/i],Zc=new Set(["npm install","npm i","npm ci","pnpm install","pnpm i","yarn install","yarn","pip install -r","pip install -e","cargo build","cargo install","go mod download","go get","bundle install","composer install","git add","git commit","git stash","git checkout","git switch","git merge","git rebase","git cherry-pick","git pull","git fetch","docker build","docker compose","mkdir","touch","cp"]);function eu(r,e,t){let n=r.trim();if(!n)return{decision:"allow",reason:"empty command"};let o=Xr(n)??Qr(n)??void 0;for(let u of Sb)if(u.test(n))return{decision:"deny",reason:`matches dangerous pattern: ${u.source}`,destructiveWarning:o};for(let u of xb)if(n===u||n.startsWith(u+" "))return{decision:"allow",reason:`known safe command: ${u}`,destructiveWarning:o};let s=n.split(/\s+/),i=s[0],a=s.length>1?`${s[0]} ${s[1]}`:i;return Qc.has(i)||Qc.has(a)?{decision:"allow",reason:`known safe command: ${i}`,destructiveWarning:o}:e&&t&&e.startsWith(t)&&(Zc.has(i)||Zc.has(a))?{decision:"allow",reason:`safe in project: ${a}`,destructiveWarning:o}:{decision:"defer",reason:"unknown command \u2014 needs LLM classification",destructiveWarning:o}}function _b(r){let e=Object.keys(r).sort(),t={};for(let n of e){let o=r[n];typeof o=="string"?t[n]=o.replace(/\s+/g," ").trim():t[n]=o}return JSON.stringify(t)}function ks(r,e){return`${r}::${_b(e)}`}var Rb=500,io=class{cache=new Map;get(e,t){let n=ks(e,t),o=this.cache.get(n);if(o)return o.hitCount++,o}set(e,t,n){if(this.cache.size>=Rb){let s=this.cache.keys().next().value;s!==void 0&&this.cache.delete(s)}let o=ks(e,t);this.cache.set(o,{shouldBlock:n.shouldBlock,reason:n.reason,classifiedAt:Date.now(),hitCount:0})}has(e,t){return this.cache.has(ks(e,t))}clear(){this.cache.clear()}get size(){return this.cache.size}get totalHits(){let e=0;for(let t of this.cache.values())e+=t.hitCount;return e}};var Cb=new Set(["read","search","instructions","think","todo","memory","skill_list","skill_view","tool_search","plan_mode","lsp","brief","web_search","checkpoint"]);function Zt(r){return Cb.has(r)}var tu=`You are a security classifier for an AI coding agent. Your job is to decide whether a tool invocation is safe to execute without user confirmation.
280
+ [Binary content not displayed. Use appropriate tool to process.]`})}return s.length===0?{content:[{type:"text",text:`Resource "${t.uri}" has no readable content.`}],details:{type:"read_mcp_resource",empty:!0}}:{content:s,details:{type:"read_mcp_resource",uri:t.uri,server:t.server,contentCount:o.length}}}catch(o){return{content:[{type:"text",text:`Error reading resource: ${o.message}`}],details:{error:o.message}}}}}}import*as Ye from"node:fs";import*as po from"node:path";import{pathToFileURL as Tb}from"node:url";var ed={preToolUse:"tool.before_invoke",postToolUse:"tool.after_invoke",onTurnStart:"turn.submitted",onTurnEnd:"turn.completed",onSessionEnd:"session.ended"};var mo=class{constructor(e){this.config=e;this.log=e.log??{info:()=>{},warn:()=>{}}}config;loaded=[];pluginSkills=[];activations=new Map;log;async loadAll(){for(let e of this.config.pluginDirs){if(!Ye.existsSync(e))continue;let t;try{t=Ye.readdirSync(e,{withFileTypes:!0})}catch{continue}for(let n of t){if(!n.isDirectory()||n.name.startsWith(".")||n.name.startsWith("_"))continue;let o=po.join(e,n.name);await this.loadPlugin(n.name,o)}}return this.log.info(`[plugins] loaded ${this.loaded.length} plugin(s): ${this.loaded.map(e=>e.name).join(", ")||"(none)"}`),this.loaded}getPluginSkills(){return this.pluginSkills}getLoaded(){return this.loaded}async refreshActivations(){let e=Date.now();for(let[t,n]of this.activations){if(e-n.lastCheckAt<n.ttlMs)continue;let o;try{o=await n.checkFn()}catch(s){this.log.warn(`[plugins] ${t}: check_fn error: ${s instanceof Error?s.message:s}`),o=n.lastResult}if(n.lastCheckAt=e,o!==n.lastResult){if(n.lastResult=o,o&&!n.active){for(let s of n.tools)fe(s);n.active=!0,this.log.info(`[plugins] ${t}: reactivated (${n.tools.length} tools)`)}else if(!o&&n.active){for(let s of n.tools)Kn(s.name);for(let s of n.hookUnregisterFns)s();n.active=!1,this.log.info(`[plugins] ${t}: deactivated`)}}}}async loadPlugin(e,t){let n=["index.js","index.mjs"],o=null;for(let f of n){let b=po.join(t,f);if(Ye.existsSync(b)){o=b;break}}if(!o){this.log.warn(`[plugins] ${e}: no index.js found, skipping`);return}let s=0,i=0,a=0,c=[],d=[],l=null,u=6e4,p={},m=po.join(t,"config.json");if(Ye.existsSync(m))try{p=JSON.parse(Ye.readFileSync(m,"utf8"))}catch{}let g={pluginName:e,registerTool:f=>{fe(f),c.push(f),s++},registerHook:(f,b)=>{let w=ed[f];if(!w){this.log.warn(`[plugins] ${e}: unknown hook phase "${f}"`);return}let T=this.config.hookRegistry.register({point:w,handler:b,label:`plugin:${e}:${f}`,priority:200});d.push(T),i++},registerSkill:f=>{this.pluginSkills.push(f),a++},getConfig:()=>p,setActivationCheck:(f,b)=>{l=f,b!==void 0&&(u=b)}};try{let b=await import(Tb(o).href);if(typeof b.register!="function"){this.log.warn(`[plugins] ${e}: no register() export, skipping`);return}await b.register(g),l&&this.activations.set(e,{checkFn:l,ttlMs:u,lastCheckAt:Date.now(),lastResult:!0,tools:c,hookUnregisterFns:d,active:!0}),this.loaded.push({name:e,directory:t,toolCount:s,hookCount:i,skillCount:a}),this.log.info(`[plugins] ${e}: ${s} tools, ${i} hooks, ${a} skills`)}catch(f){this.log.warn(`[plugins] ${e}: load error: ${f instanceof Error?f.message:f}`)}}};import*as ie from"node:fs";import*as sn from"node:path";function Ss(){return ra()}function td(){return sn.join(Ss(),"installed_plugins.json")}function nd(){let r=td();if(!ie.existsSync(r))return{version:1,plugins:[]};try{return JSON.parse(ie.readFileSync(r,"utf-8"))}catch{return{version:1,plugins:[]}}}function wb(r){let e=Ss();ie.existsSync(e)||ie.mkdirSync(e,{recursive:!0}),ie.writeFileSync(td(),JSON.stringify(r,null,2),"utf-8")}function vb(r,e){return!(e.blocklist?.includes(r)||e.allowlist&&!e.allowlist.includes(r))}async function xb(r,e,t){let{execFile:n}=await import("node:child_process"),{promisify:o}=await import("node:util"),s=o(n),i=Ss(),a=e?`${r}@${e}`:r;try{let{stdout:c}=await s("npm",["pack",a,"--pack-destination",i],{timeout:6e4,cwd:i}),d=c.trim().split(`
281
+ `).pop()?.trim();if(!d)return t.warn(`[marketplace] npm pack returned no output for ${a}`),null;let l=sn.join(i,d),p=d.match(/^(.+)-(\d+\.\d+\.\d+.*)\.tgz$/)?.[2]??"0.0.0",m=sn.join(i,`${r}@${p}`);ie.existsSync(m)||ie.mkdirSync(m,{recursive:!0}),await s("tar",["xzf",l,"-C",m,"--strip-components=1"],{timeout:3e4});try{ie.unlinkSync(l)}catch{}let g=sn.join(m,"package.json");if(ie.existsSync(g))try{await s("npm",["install","--production","--no-save"],{cwd:m,timeout:12e4})}catch(f){t.warn(`[marketplace] npm install for ${r} failed: ${f.message}`)}return t.info(`[marketplace] installed ${r}@${p} from npm`),{name:r,version:p,installPath:m}}catch(c){return t.warn(`[marketplace] failed to install ${a} from npm: ${c.message}`),null}}function Sb(){return nd().plugins.filter(e=>ie.existsSync(e.installPath)).map(e=>e.installPath)}async function _b(r,e){let t=nd(),n=[];for(let o of r.enabledPlugins){let s=o.specifier.split("/").pop()??o.specifier;if(!vb(s,r)){e.warn(`[marketplace] plugin "${s}" blocked by enterprise policy`);continue}let i=t.plugins.find(c=>c.source.specifier===o.specifier&&c.source.type===o.type);if(i&&ie.existsSync(i.installPath)&&(!o.version||i.version===o.version)){n.push(i.installPath);continue}let a=null;switch(o.type){case"npm":a=await xb(o.specifier,o.version,e);break;case"git":case"url":e.warn(`[marketplace] ${o.type} source not yet implemented for "${o.specifier}"`);break}if(a){let c={name:a.name,version:a.version,source:o,installPath:a.installPath,installedAt:new Date().toISOString()};t.plugins=t.plugins.filter(d=>!(d.source.specifier===o.specifier&&d.source.type===o.type)),t.plugins.push(c),n.push(a.installPath)}}return wb(t),n}function Rb(){let r=ia();if(!ie.existsSync(r))return null;try{return JSON.parse(ie.readFileSync(r,"utf-8"))}catch{return null}}async function od(r,e){let t=[...r],n=Sb();t.push(...n);let o=Rb();if(o&&o.enabledPlugins.length>0)try{let s=await _b(o,e),i=new Set(t);for(let a of s)i.has(a)||t.push(a)}catch(s){e.warn(`[marketplace] failed to update plugins: ${s.message}`)}return t}var go=class{mode;rules;defaultBehavior;compiledPatterns;constructor(e){this.mode=e.mode,this.rules=[...e.rules],this.defaultBehavior=e.defaultBehavior,this.compiledPatterns=this.compileRules(this.rules)}getMode(){return this.mode}setMode(e){this.mode=e}getRules(){return this.rules}getDefaultBehavior(){return this.defaultBehavior}replaceRules(e){this.rules=[...e],this.compiledPatterns=this.compileRules(this.rules)}setDefaultBehavior(e){this.defaultBehavior=e}addRule(e){this.rules.push(e),this.compiledPatterns=this.compileRules(this.rules)}applyUpdate(e){this.addRule({pattern:e.pattern,behavior:e.behavior,reason:e.description,source:"user"})}check(e){let{toolName:t,meta:n}=e;switch(this.mode){case"bypassPermissions":return{behavior:"allow",decisionReason:{type:"mode",mode:"bypassPermissions"}};case"dontAsk":return{behavior:"deny",message:`Tool "${t}" denied \u2014 mode is dontAsk`,decisionReason:{type:"mode",mode:"dontAsk"}};case"plan":return{behavior:"deny",message:`Tool "${t}" paused \u2014 mode is plan (execution suspended)`,decisionReason:{type:"mode",mode:"plan"}}}for(let{rule:o,regex:s}of this.compiledPatterns)if(s.test(t))return Ab(o,e);return n?.isReadOnly?{behavior:"allow",decisionReason:{type:"tool_check",reason:"isReadOnly"}}:n?.requiresApproval?{behavior:"ask",message:`Tool "${t}" requires approval`,toolName:t,input:e.arguments,decisionReason:{type:"tool_check",reason:"requiresApproval"}}:n?.isDangerous?{behavior:"ask",message:`Tool "${t}" is marked dangerous`,toolName:t,input:e.arguments,decisionReason:{type:"tool_check",reason:"isDangerous"}}:this.mode==="acceptEdits"?/write|edit|create|delete|move|rename|patch/i.test(t)?{behavior:"allow",decisionReason:{type:"mode",mode:"acceptEdits"}}:{behavior:"ask",message:`Tool "${t}" needs approval in acceptEdits mode`,toolName:t,input:e.arguments,decisionReason:{type:"mode",mode:"acceptEdits"}}:this.defaultBehavior==="allow"?{behavior:"allow"}:this.defaultBehavior==="deny"?{behavior:"deny",message:`Tool "${t}" denied by default policy`,decisionReason:{type:"other",reason:"default_deny"}}:{behavior:"ask",message:`Tool "${t}" requires approval (default policy)`,toolName:t,input:e.arguments}}compileRules(e){return e.map(t=>({rule:t,regex:Cb(t.pattern)}))}};function _s(r){if(!r||typeof r!="object")return{mode:"default",rules:[],defaultBehavior:"allow"};let e=r,t=[];for(let a of["allow","deny","ask"]){let c=e[a];if(Array.isArray(c))for(let d of c)typeof d=="string"&&t.push({pattern:d,behavior:a,source:"config"})}if(Array.isArray(e.rules)){for(let a of e.rules)if(a&&typeof a=="object"){let c=a,d=c.pattern,l=c.behavior??c.action;typeof d=="string"&&typeof l=="string"&&(l==="allow"||l==="deny"||l==="ask")&&t.push({pattern:d,behavior:l,reason:typeof c.reason=="string"?c.reason:void 0,source:typeof c.source=="string"?c.source:"config"})}}let n=e.mode,o=typeof n=="string"&&Pb(n)?n:"default",s=e.default??e.defaultBehavior,i=typeof s=="string"&&Mb(s)?s:"allow";return{mode:o,rules:t,defaultBehavior:i}}function Cb(r){let t=r.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*+/g,".*");return new RegExp(`^${t}$`,"i")}function Ab(r,e){let t={type:"rule",rule:r};return r.behavior==="allow"?{behavior:"allow",decisionReason:t}:r.behavior==="deny"?{behavior:"deny",message:r.reason??`Tool "${e.toolName}" denied by rule "${r.pattern}"`,decisionReason:t}:{behavior:"ask",message:r.reason??`Tool "${e.toolName}" requires approval (rule "${r.pattern}")`,toolName:e.toolName,input:e.arguments,decisionReason:t}}function Pb(r){return r==="default"||r==="bypassPermissions"||r==="acceptEdits"||r==="dontAsk"||r==="plan"}function Mb(r){return r==="allow"||r==="deny"||r==="ask"}import{randomUUID as Ub}from"node:crypto";var Ib=new Set(["node --version","npm --version","npx --version","pnpm --version","yarn --version","bun --version","deno --version","python --version","python3 --version","pip --version","ruby --version","go version","rustc --version","cargo --version","java -version","javac -version","dotnet --version","gcc --version","g++ --version","clang --version","git --version","docker --version","--help","-h"]),rd=new Set(["ls","dir","find","fd","locate","which","where","type","cat","head","tail","less","more","bat","wc","file","stat","du","df","tree","exa","eza","grep","rg","ripgrep","ag","ack","fgrep","egrep","git status","git log","git diff","git show","git branch","git tag","git remote","git stash list","git blame","git shortlog","git describe","git rev-parse","git ls-files","git ls-tree","git cat-file","git reflog","ps","top","htop","uptime","uname","hostname","whoami","id","env","printenv","echo","ping","nslookup","dig","host","ifconfig","ip","netstat","ss","npm list","npm ls","npm info","npm view","npm outdated","npm audit","pnpm list","pnpm ls","pnpm outdated","pip list","pip show","pip freeze","cargo tree","npm test","npm run test","npm run build","npm run lint","pnpm test","pnpm run test","pnpm run build","pnpm run lint","yarn test","yarn build","yarn lint","cargo test","cargo build","cargo check","cargo clippy","go test","go build","go vet","make","cmake","pytest","python -m pytest","python3 -m pytest","jest","vitest","mocha","tsc","tsc --noEmit","eslint","prettier","oxlint"]),Eb=[/\brm\s+-rf?\s+[/~]/,/\brm\s+-rf?\s+\.\.\//,/\bsudo\b/,/\bsu\s/,/\bchmod\s+777\b/,/\bmkfs\b/,/\bfdisk\b/,/\bdd\s+if=/,/\bsystemctl\s+(start|stop|restart|enable|disable)\b/,/\bservice\s+\S+\s+(start|stop|restart)\b/,/\breg\s+(add|delete)\b/i,/\\Windows\\System32/i,/\/etc\/(passwd|shadow|sudoers|fstab)/,/\bgit\s+push\s+.*--force\b/,/\bgit\s+push\s+-f\b/,/\bcurl\b.*(-H|--header)\s+.*[Aa]uthorization/,/\bwget\b.*--header.*[Aa]uthorization/,/\bcurl\b.*\|\s*(sh|bash|zsh)\b/,/\bwget\b.*-O\s*-\s*\|\s*(sh|bash|zsh)\b/,/\bnpm\s+install\s+-g\b/,/\bpip\s+install\b(?!.*-r\b)(?!.*requirements)/,/\bDROP\s+(DATABASE|TABLE|SCHEMA)\b/i,/\bTRUNCATE\s+TABLE\b/i],sd=new Set(["npm install","npm i","npm ci","pnpm install","pnpm i","yarn install","yarn","pip install -r","pip install -e","cargo build","cargo install","go mod download","go get","bundle install","composer install","git add","git commit","git stash","git checkout","git switch","git merge","git rebase","git cherry-pick","git pull","git fetch","docker build","docker compose","mkdir","touch","cp"]);function id(r,e,t){let n=r.trim();if(!n)return{decision:"allow",reason:"empty command"};let o=ss(n)??is(n)??void 0;for(let d of Eb)if(d.test(n))return{decision:"deny",reason:`matches dangerous pattern: ${d.source}`,destructiveWarning:o};for(let d of Ib)if(n===d||n.startsWith(d+" "))return{decision:"allow",reason:`known safe command: ${d}`,destructiveWarning:o};let s=n.split(/\s+/),i=s[0],a=s.length>1?`${s[0]} ${s[1]}`:i;return rd.has(i)||rd.has(a)?{decision:"allow",reason:`known safe command: ${i}`,destructiveWarning:o}:e&&t&&e.startsWith(t)&&(sd.has(i)||sd.has(a))?{decision:"allow",reason:`safe in project: ${a}`,destructiveWarning:o}:{decision:"defer",reason:"unknown command \u2014 needs LLM classification",destructiveWarning:o}}function Ob(r){let e=Object.keys(r).sort(),t={};for(let n of e){let o=r[n];typeof o=="string"?t[n]=o.replace(/\s+/g," ").trim():t[n]=o}return JSON.stringify(t)}function Rs(r,e){return`${r}::${Ob(e)}`}var Lb=500,fo=class{cache=new Map;get(e,t){let n=Rs(e,t),o=this.cache.get(n);if(o)return o.hitCount++,o}set(e,t,n){if(this.cache.size>=Lb){let s=this.cache.keys().next().value;s!==void 0&&this.cache.delete(s)}let o=Rs(e,t);this.cache.set(o,{shouldBlock:n.shouldBlock,reason:n.reason,classifiedAt:Date.now(),hitCount:0})}has(e,t){return this.cache.has(Rs(e,t))}clear(){this.cache.clear()}get size(){return this.cache.size}get totalHits(){let e=0;for(let t of this.cache.values())e+=t.hitCount;return e}};var Db=new Set(["read","search","instructions","think","todo","memory","skill_list","skill_view","tool_search","plan_mode","lsp","brief","web_search","checkpoint"]);function an(r){return Db.has(r)}var ad=`You are a security classifier for an AI coding agent. Your job is to decide whether a tool invocation is safe to execute without user confirmation.
280
282
 
281
283
  The agent operates in a workspace and has been given permission to use tools autonomously. You must decide if each tool call is SAFE (routine development work) or DANGEROUS (could cause harm, data loss, or unexpected side effects).
282
284
 
@@ -298,7 +300,7 @@ DANGEROUS operations (SHOULD be blocked):
298
300
  - Running commands with sudo/admin privileges
299
301
  - Downloading and executing unknown scripts
300
302
 
301
- Respond ONLY with XML. No other text.`;async function Ts(r,e,t,n){let o=Date.now();if(Zt(r))return{shouldBlock:!1,reason:"allowlisted safe tool",stage:"allowlist",durationMs:Date.now()-o};let s=Ab(t),i=Mb(r,e),a=`<transcript>
303
+ Respond ONLY with XML. No other text.`;async function Cs(r,e,t,n){let o=Date.now();if(an(r))return{shouldBlock:!1,reason:"allowlisted safe tool",stage:"allowlist",durationMs:Date.now()-o};let s=$b(t),i=Nb(r,e),a=`<transcript>
302
304
  ${s}
303
305
  </transcript>
304
306
 
@@ -306,7 +308,7 @@ ${s}
306
308
  ${i}
307
309
  </action>
308
310
 
309
- Should this action be blocked? Respond with <block>yes</block> or <block>no</block>. If blocking, add <reason>explanation</reason>.`;try{let l=await n({system:tu,messages:[{role:"user",content:a}],maxTokens:64,temperature:0,stop:["</reason>"],cacheSystemPrompt:!0}),u=ru(l.text);if(nu(u)===!1)return{shouldBlock:!1,reason:"classifier: safe",stage:"fast",durationMs:Date.now()-o};let d=`<transcript>
311
+ Should this action be blocked? Respond with <block>yes</block> or <block>no</block>. If blocking, add <reason>explanation</reason>.`;try{let c=await n({system:ad,messages:[{role:"user",content:a}],maxTokens:64,temperature:0,stop:["</reason>"],cacheSystemPrompt:!0}),d=dd(c.text);if(ld(d)===!1)return{shouldBlock:!1,reason:"classifier: safe",stage:"fast",durationMs:Date.now()-o};let u=`<transcript>
310
312
  ${s}
311
313
  </transcript>
312
314
 
@@ -314,55 +316,55 @@ ${s}
314
316
  ${i}
315
317
  </action>
316
318
 
317
- The fast classifier flagged this action. Review carefully \u2014 is it actually dangerous, or is it safe development work? Consider the project context. Use <thinking> tags to reason, then respond with <block>yes</block> or <block>no</block> and <reason>explanation</reason>.`,p=await n({system:tu,messages:[{role:"user",content:d}],maxTokens:4096,temperature:0,cacheSystemPrompt:!0}),m=ru(p.text),g=nu(m),f=ou(m)??ou(u)??"classifier decision";return{shouldBlock:g!==!1,reason:f,stage:"thinking",durationMs:Date.now()-o}}catch{return{shouldBlock:!0,reason:"classifier unavailable",stage:"fast",durationMs:Date.now()-o}}}function Ab(r){return r.slice(-20).map(t=>{let n=t.role==="user"?"User":t.role==="assistant"?"Assistant":"System",o=typeof t.content=="string"?t.content.slice(0,500):JSON.stringify(t.content).slice(0,500);return`${n}: ${o}`}).join(`
318
- `)}function Mb(r,e){let t=JSON.stringify(e,null,0),n=t.length>2e3?t.slice(0,2e3)+"...":t;return`Tool: ${r}
319
- Arguments: ${n}`}function nu(r){let e=r.match(/<block>(yes|no)<\/block>/i);return e?e[1].toLowerCase()==="yes":null}function ou(r){let e=r.match(/<reason>([\s\S]*?)(?:<\/reason>|$)/i);return e?e[1].trim():null}function ru(r){return r.replace(/<thinking>[\s\S]*?<\/thinking>/gi,"").trim()}var su={maxConsecutive:3,maxTotal:20};function iu(){return{consecutiveDenials:0,totalDenials:0}}function ws(r){return{consecutiveDenials:r.consecutiveDenials+1,totalDenials:r.totalDenials+1}}function vs(r){return r.consecutiveDenials===0?r:{...r,consecutiveDenials:0}}function au(r){return r.consecutiveDenials>=su.maxConsecutive||r.totalDenials>=su.maxTotal}var Ib=12e4,ao=class{ruleEngine;hookRegistry;onRequestApproval;onPermissionUpdate;onDenied;classifierLLMCall;getRecentMessages;permissionRole;pendingApprovals=new Map;unregisterHook=null;toolMetaCache=new Map;classifierCache=new io;denialTracking=iu();constructor(e){this.ruleEngine=e.ruleEngine,this.hookRegistry=e.hookRegistry,this.onRequestApproval=e.onRequestApproval,this.onPermissionUpdate=e.onPermissionUpdate,this.onDenied=e.onDenied,this.classifierLLMCall=e.classifierLLMCall,this.getRecentMessages=e.getRecentMessages,this.permissionRole=e.permissionRole??"interactive"}register(){return this.unregisterHook&&this.unregisterHook(),this.classifierCache.clear(),this.unregisterHook=this.hookRegistry.register({point:"tool.before_invoke",priority:100,label:"permission-checker",handler:async(e,t)=>{let n=this.toolMetaCache.get(t.toolName),o={toolName:t.toolName,arguments:t.arguments,meta:n?{isReadOnly:n.isReadOnly,isDangerous:n.isDangerous,requiresApproval:n.requiresApproval,parallelSafe:n.parallelSafe}:void 0},s=this.ruleEngine.check(o);return this.handleResult(s,t.callId,t.toolName,t.arguments)}}),()=>{this.unregisterHook?.(),this.unregisterHook=null,this.cancelAllPending()}}resolveApproval(e){let t=this.pendingApprovals.get(e.approvalId);t&&(clearTimeout(t.timeoutId),this.pendingApprovals.delete(e.approvalId),t.resolve(e))}setToolMeta(e){this.toolMetaCache.clear();for(let t of e)t.meta&&this.toolMetaCache.set(t.function.name,t.meta)}get ruleEngineRef(){return this.ruleEngine}fireDenied(e,t,n){this.onDenied?.(t,n),this.hookRegistry.invoke("permission.denied",{sessionId:"",turnId:"",approvalId:e,callId:e,toolName:t,decision:"denied",reason:n}).catch(()=>{})}async handleResult(e,t,n,o){if(e.behavior==="allow")return{action:"continue",context:e.updatedInput?{arguments:e.updatedInput}:void 0};if(e.behavior==="deny")return this.fireDenied(t,n,e.message),{action:"abort",reason:e.message};if(e.decisionReason?.type==="tool_check"&&(e.decisionReason.reason==="isDangerous"||e.decisionReason.reason==="requiresApproval")&&this.permissionRole!=="interactive")return this.fireDenied(t,n,`safety check: ${e.message} (${this.permissionRole} cannot override)`),{action:"abort",reason:`Tool "${n}" blocked by safety check (${this.permissionRole} agents cannot override dangerous tool restrictions)`};if((n==="bash"||n==="execute_command"||n==="Bash"||n==="shell")&&o){let u=o.command??o.cmd??"";if(u){let c=eu(u);if(c.decision==="allow")return{action:"continue"};if(c.decision==="deny")return this.fireDenied(t,n,c.reason),{action:"abort",reason:c.reason}}}if(o){let u=this.classifierCache.get(n,o);if(u)return u.shouldBlock?(this.fireDenied(t,n,`cached: ${u.reason}`),{action:"abort",reason:u.reason}):{action:"continue"}}if(this.permissionRole==="worker")return this.handleWorkerAsk(t,n,o);if(this.permissionRole==="coordinator")return this.toolMetaCache.get(n)?.isReadOnly||Zt(n)?{action:"continue"}:this.handleWorkerAsk(t,n,o);if(this.ruleEngine.getMode()==="auto"){if(Zt(n))return{action:"continue"};let u=au(this.denialTracking);if(this.classifierLLMCall&&!u)try{let c=this.getRecentMessages?.()??[],d=await Ts(n,o??{},c,this.classifierLLMCall);if(o&&this.classifierCache.set(n,o,{shouldBlock:d.shouldBlock,reason:d.reason}),!d.shouldBlock)return this.denialTracking=vs(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:"auto",reason:d.reason}}};this.denialTracking=ws(this.denialTracking)}catch{}}let a=Pb(),l={approvalId:a,callId:t,toolName:n,arguments:o,message:e.message,suggestions:e.suggestions};this.hookRegistry.invoke("approval.requested",{sessionId:"",turnId:"",approvalId:a,callId:t,toolName:n}).catch(()=>{});try{let u=await this.requestApproval(l);return this.hookRegistry.invoke("approval.responded",{sessionId:"",turnId:"",approvalId:a,callId:t,toolName:n,decision:u.decision==="approved"?"approved":"denied"}).catch(()=>{}),u.permissionUpdate&&(this.ruleEngine.applyUpdate(u.permissionUpdate),this.onPermissionUpdate?.(u.permissionUpdate)),u.decision==="approved"?{action:"continue",context:u.updatedInput?{arguments:u.updatedInput}:void 0}:(this.fireDenied(t,n,`denied by user (approval ${a})`),{action:"abort",reason:`Tool "${n}" denied by user`})}catch{return this.fireDenied(t,n,`approval timeout or error (approval ${a})`),{action:"abort",reason:`Tool "${n}" \u2014 approval timed out`}}}async handleWorkerAsk(e,t,n){if(Zt(t))return{action:"continue"};if(this.classifierLLMCall)try{let o=this.getRecentMessages?.()??[],s=await Ts(t,n??{},o,this.classifierLLMCall);return n&&this.classifierCache.set(t,n,{shouldBlock:s.shouldBlock,reason:s.reason}),s.shouldBlock?(this.denialTracking=ws(this.denialTracking),this.fireDenied(e,t,`blocked by classifier in ${this.permissionRole} mode: ${s.reason}`),{action:"abort",reason:`Tool "${t}" blocked by classifier (${this.permissionRole})`}):(this.denialTracking=vs(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:this.permissionRole,reason:s.reason}}})}catch{}return this.fireDenied(e,t,`no classifier available in ${this.permissionRole} mode`),{action:"abort",reason:`Tool "${t}" denied \u2014 no classifier for ${this.permissionRole} mode`}}requestApproval(e){return new Promise((t,n)=>{let o=setTimeout(()=>{this.pendingApprovals.delete(e.approvalId),n(new Error("Approval timed out"))},Ib);this.pendingApprovals.set(e.approvalId,{resolve:t,reject:n,timeoutId:o}),this.onRequestApproval(e).then(s=>{let i=this.pendingApprovals.get(e.approvalId);i&&(clearTimeout(i.timeoutId),this.pendingApprovals.delete(e.approvalId),t(s))},s=>{let i=this.pendingApprovals.get(e.approvalId);i&&(clearTimeout(i.timeoutId),this.pendingApprovals.delete(e.approvalId),n(s))})})}clearClassifierCache(){this.classifierCache.clear(),this.denialTracking={consecutiveDenials:0,totalDenials:0}}cancelAllPending(){this.classifierCache.clear();for(let[e,t]of this.pendingApprovals)clearTimeout(t.timeoutId),t.reject(new Error("Permission checker destroyed")),this.pendingApprovals.delete(e)}};var Eb="skill",Ob={type:"object",properties:{action:{type:"string",enum:["invoke","list","view","create","edit","patch","delete"],description:["The operation to perform:","\u2022 'invoke' \u2014 Run a skill by name (provide 'name', optional 'args')","\u2022 'list' \u2014 List all available skills (optional 'category' filter)","\u2022 'view' \u2014 View full skill content (provide 'name', optional 'filePath')","\u2022 'create' \u2014 Create a new skill (provide 'name', 'content')","\u2022 'edit' \u2014 Overwrite skill content (provide 'name', 'content')","\u2022 'patch' \u2014 Find/replace in skill (provide 'name', 'oldString', 'newString')","\u2022 'delete' \u2014 Remove a skill (provide 'name')"].join(`
320
- `)},name:{type:"string",description:"Skill name (required for invoke/view/create/edit/patch/delete)."},args:{type:"string",description:"Arguments or context to pass when invoking a skill."},category:{type:"string",description:"Filter skills by category (for 'list' action)."},content:{type:"string",description:"Full SKILL.md content for create/edit actions."},filePath:{type:"string",description:"View a specific file within the skill (for 'view' action)."},fileContent:{type:"string",description:"Content for writing supporting files."},oldString:{type:"string",description:"Text to find for patch action."},newString:{type:"string",description:"Replacement text for patch action."}},required:["action"]};function lu(r){return{name:Eb,label:"Skill",description:Nb(r),parameters:Ob,isConcurrencySafe:!1,isReadOnly:!1,searchHint:"skill invoke list view create edit delete command workflow",execute:async(e,t,n)=>{let{action:o}=t;switch(o){case"invoke":return Lb(r,t,n);case"list":return $b(r,t);case"view":return Db(r,t);case"create":case"edit":case"patch":case"delete":return Ub(r,t);default:return{content:[{type:"text",text:`Unknown action: ${o}. Use invoke, list, view, create, edit, patch, or delete.`}]}}}}}async function Lb(r,e,t){let{name:n,args:o}=e;if(!n)return{content:[{type:"text",text:`Error: 'name' is required for invoke. Available skills: ${r.listSkills().map(u=>u.name).join(", ")||"(none)"}`}]};let s=await r.readSkillContent(n);if(!s){let l=r.listSkills().map(u=>u.name).join(", ");return{content:[{type:"text",text:`Skill "${n}" not found. Available skills: ${l||"(none)"}`}]}}if(r.executeSkillSubturn)try{return{content:[{type:"text",text:await r.executeSkillSubturn(n,s,o,t)}],details:{skillName:n,action:"invoke",mode:"subturn"}}}catch(l){let u=l instanceof Error?l.message:String(l);return{content:[{type:"text",text:`Skill execution error: ${u}`}],details:{error:u,skillName:n}}}let i=`## Skill: ${n}
319
+ The fast classifier flagged this action. Review carefully \u2014 is it actually dangerous, or is it safe development work? Consider the project context. Use <thinking> tags to reason, then respond with <block>yes</block> or <block>no</block> and <reason>explanation</reason>.`,p=await n({system:ad,messages:[{role:"user",content:u}],maxTokens:4096,temperature:0,cacheSystemPrompt:!0}),m=dd(p.text),g=ld(m),f=cd(m)??cd(d)??"classifier decision";return{shouldBlock:g!==!1,reason:f,stage:"thinking",durationMs:Date.now()-o}}catch{return{shouldBlock:!0,reason:"classifier unavailable",stage:"fast",durationMs:Date.now()-o}}}function $b(r){return r.slice(-20).map(t=>{let n=t.role==="user"?"User":t.role==="assistant"?"Assistant":"System",o=typeof t.content=="string"?t.content.slice(0,500):JSON.stringify(t.content).slice(0,500);return`${n}: ${o}`}).join(`
320
+ `)}function Nb(r,e){let t=JSON.stringify(e,null,0),n=t.length>2e3?t.slice(0,2e3)+"...":t;return`Tool: ${r}
321
+ Arguments: ${n}`}function ld(r){let e=r.match(/<block>(yes|no)<\/block>/i);return e?e[1].toLowerCase()==="yes":null}function cd(r){let e=r.match(/<reason>([\s\S]*?)(?:<\/reason>|$)/i);return e?e[1].trim():null}function dd(r){return r.replace(/<thinking>[\s\S]*?<\/thinking>/gi,"").trim()}var ud={maxConsecutive:3,maxTotal:20};function pd(){return{consecutiveDenials:0,totalDenials:0}}function As(r){return{consecutiveDenials:r.consecutiveDenials+1,totalDenials:r.totalDenials+1}}function Ps(r){return r.consecutiveDenials===0?r:{...r,consecutiveDenials:0}}function md(r){return r.consecutiveDenials>=ud.maxConsecutive||r.totalDenials>=ud.maxTotal}var jb=12e4,ho=class{ruleEngine;hookRegistry;onRequestApproval;onPermissionUpdate;onDenied;classifierLLMCall;getRecentMessages;permissionRole;pendingApprovals=new Map;unregisterHook=null;toolMetaCache=new Map;classifierCache=new fo;denialTracking=pd();constructor(e){this.ruleEngine=e.ruleEngine,this.hookRegistry=e.hookRegistry,this.onRequestApproval=e.onRequestApproval,this.onPermissionUpdate=e.onPermissionUpdate,this.onDenied=e.onDenied,this.classifierLLMCall=e.classifierLLMCall,this.getRecentMessages=e.getRecentMessages,this.permissionRole=e.permissionRole??"interactive"}register(){return this.unregisterHook&&this.unregisterHook(),this.classifierCache.clear(),this.unregisterHook=this.hookRegistry.register({point:"tool.before_invoke",priority:100,label:"permission-checker",handler:async(e,t)=>{let n=this.toolMetaCache.get(t.toolName),o={toolName:t.toolName,arguments:t.arguments,meta:n?{isReadOnly:n.isReadOnly,isDangerous:n.isDangerous,requiresApproval:n.requiresApproval,parallelSafe:n.parallelSafe}:void 0},s=this.ruleEngine.check(o);return this.handleResult(s,t.callId,t.toolName,t.arguments)}}),()=>{this.unregisterHook?.(),this.unregisterHook=null,this.cancelAllPending()}}resolveApproval(e){let t=this.pendingApprovals.get(e.approvalId);t&&(clearTimeout(t.timeoutId),this.pendingApprovals.delete(e.approvalId),t.resolve(e))}setToolMeta(e){this.toolMetaCache.clear();for(let t of e)t.meta&&this.toolMetaCache.set(t.function.name,t.meta)}get ruleEngineRef(){return this.ruleEngine}fireDenied(e,t,n){this.onDenied?.(t,n),this.hookRegistry.invoke("permission.denied",{sessionId:"",turnId:"",approvalId:e,callId:e,toolName:t,decision:"denied",reason:n}).catch(()=>{})}async handleResult(e,t,n,o){if(e.behavior==="allow")return{action:"continue",context:e.updatedInput?{arguments:e.updatedInput}:void 0};if(e.behavior==="deny")return this.fireDenied(t,n,e.message),{action:"abort",reason:e.message};if(e.decisionReason?.type==="tool_check"&&(e.decisionReason.reason==="isDangerous"||e.decisionReason.reason==="requiresApproval")&&this.permissionRole!=="interactive")return this.fireDenied(t,n,`safety check: ${e.message} (${this.permissionRole} cannot override)`),{action:"abort",reason:`Tool "${n}" blocked by safety check (${this.permissionRole} agents cannot override dangerous tool restrictions)`};if((n==="bash"||n==="execute_command"||n==="Bash"||n==="shell")&&o){let d=o.command??o.cmd??"";if(d){let l=id(d);if(l.decision==="allow")return{action:"continue"};if(l.decision==="deny")return this.fireDenied(t,n,l.reason),{action:"abort",reason:l.reason}}}if(o){let d=this.classifierCache.get(n,o);if(d)return d.shouldBlock?(this.fireDenied(t,n,`cached: ${d.reason}`),{action:"abort",reason:d.reason}):{action:"continue"}}if(this.permissionRole==="worker")return this.handleWorkerAsk(t,n,o);if(this.permissionRole==="coordinator")return this.toolMetaCache.get(n)?.isReadOnly||an(n)?{action:"continue"}:this.handleWorkerAsk(t,n,o);if(this.ruleEngine.getMode()==="auto"){if(an(n))return{action:"continue"};let d=md(this.denialTracking);if(this.classifierLLMCall&&!d)try{let l=this.getRecentMessages?.()??[],u=await Cs(n,o??{},l,this.classifierLLMCall);if(o&&this.classifierCache.set(n,o,{shouldBlock:u.shouldBlock,reason:u.reason}),!u.shouldBlock)return this.denialTracking=Ps(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:"auto",reason:u.reason}}};this.denialTracking=As(this.denialTracking)}catch{}}let a=Ub(),c={approvalId:a,callId:t,toolName:n,arguments:o,message:e.message,suggestions:e.suggestions};this.hookRegistry.invoke("approval.requested",{sessionId:"",turnId:"",approvalId:a,callId:t,toolName:n}).catch(()=>{});try{let d=await this.requestApproval(c);return this.hookRegistry.invoke("approval.responded",{sessionId:"",turnId:"",approvalId:a,callId:t,toolName:n,decision:d.decision==="approved"?"approved":"denied"}).catch(()=>{}),d.permissionUpdate&&(this.ruleEngine.applyUpdate(d.permissionUpdate),this.onPermissionUpdate?.(d.permissionUpdate)),d.decision==="approved"?{action:"continue",context:d.updatedInput?{arguments:d.updatedInput}:void 0}:(this.fireDenied(t,n,`denied by user (approval ${a})`),{action:"abort",reason:`Tool "${n}" denied by user`})}catch{return this.fireDenied(t,n,`approval timeout or error (approval ${a})`),{action:"abort",reason:`Tool "${n}" \u2014 approval timed out`}}}async handleWorkerAsk(e,t,n){if(an(t))return{action:"continue"};if(this.classifierLLMCall)try{let o=this.getRecentMessages?.()??[],s=await Cs(t,n??{},o,this.classifierLLMCall);return n&&this.classifierCache.set(t,n,{shouldBlock:s.shouldBlock,reason:s.reason}),s.shouldBlock?(this.denialTracking=As(this.denialTracking),this.fireDenied(e,t,`blocked by classifier in ${this.permissionRole} mode: ${s.reason}`),{action:"abort",reason:`Tool "${t}" blocked by classifier (${this.permissionRole})`}):(this.denialTracking=Ps(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:this.permissionRole,reason:s.reason}}})}catch{}return this.fireDenied(e,t,`no classifier available in ${this.permissionRole} mode`),{action:"abort",reason:`Tool "${t}" denied \u2014 no classifier for ${this.permissionRole} mode`}}requestApproval(e){return new Promise((t,n)=>{let o=setTimeout(()=>{this.pendingApprovals.delete(e.approvalId),n(new Error("Approval timed out"))},jb);this.pendingApprovals.set(e.approvalId,{resolve:t,reject:n,timeoutId:o}),this.onRequestApproval(e).then(s=>{let i=this.pendingApprovals.get(e.approvalId);i&&(clearTimeout(i.timeoutId),this.pendingApprovals.delete(e.approvalId),t(s))},s=>{let i=this.pendingApprovals.get(e.approvalId);i&&(clearTimeout(i.timeoutId),this.pendingApprovals.delete(e.approvalId),n(s))})})}clearClassifierCache(){this.classifierCache.clear(),this.denialTracking={consecutiveDenials:0,totalDenials:0}}cancelAllPending(){this.classifierCache.clear();for(let[e,t]of this.pendingApprovals)clearTimeout(t.timeoutId),t.reject(new Error("Permission checker destroyed")),this.pendingApprovals.delete(e)}};var Fb="skill",Bb={type:"object",properties:{action:{type:"string",enum:["invoke","list","view","create","edit","patch","delete"],description:["The operation to perform:","\u2022 'invoke' \u2014 Run a skill by name (provide 'name', optional 'args')","\u2022 'list' \u2014 List all available skills (optional 'category' filter)","\u2022 'view' \u2014 View full skill content (provide 'name', optional 'filePath')","\u2022 'create' \u2014 Create a new skill (provide 'name', 'content')","\u2022 'edit' \u2014 Overwrite skill content (provide 'name', 'content')","\u2022 'patch' \u2014 Find/replace in skill (provide 'name', 'oldString', 'newString')","\u2022 'delete' \u2014 Remove a skill (provide 'name')"].join(`
322
+ `)},name:{type:"string",description:"Skill name (required for invoke/view/create/edit/patch/delete)."},args:{type:"string",description:"Arguments or context to pass when invoking a skill."},category:{type:"string",description:"Filter skills by category (for 'list' action)."},content:{type:"string",description:"Full SKILL.md content for create/edit actions."},filePath:{type:"string",description:"View a specific file within the skill (for 'view' action)."},fileContent:{type:"string",description:"Content for writing supporting files."},oldString:{type:"string",description:"Text to find for patch action."},newString:{type:"string",description:"Replacement text for patch action."}},required:["action"]};function gd(r){return{name:Fb,label:"Skill",description:Vb(r),parameters:Bb,isConcurrencySafe:!1,isReadOnly:!1,searchHint:"skill invoke list view create edit delete command workflow",execute:async(e,t,n)=>{let{action:o}=t;switch(o){case"invoke":return Gb(r,t,n);case"list":return Wb(r,t);case"view":return Hb(r,t);case"create":case"edit":case"patch":case"delete":return zb(r,t);default:return{content:[{type:"text",text:`Unknown action: ${o}. Use invoke, list, view, create, edit, patch, or delete.`}]}}}}}async function Gb(r,e,t){let{name:n,args:o}=e;if(!n)return{content:[{type:"text",text:`Error: 'name' is required for invoke. Available skills: ${r.listSkills().map(d=>d.name).join(", ")||"(none)"}`}]};let s=await r.readSkillContent(n);if(!s){let c=r.listSkills().map(d=>d.name).join(", ");return{content:[{type:"text",text:`Skill "${n}" not found. Available skills: ${c||"(none)"}`}]}}if(r.executeSkillSubturn)try{return{content:[{type:"text",text:await r.executeSkillSubturn(n,s,o,t)}],details:{skillName:n,action:"invoke",mode:"subturn"}}}catch(c){let d=c instanceof Error?c.message:String(c);return{content:[{type:"text",text:`Skill execution error: ${d}`}],details:{error:d,skillName:n}}}let i=`## Skill: ${n}
321
323
 
322
324
  `,a=o?`
323
325
 
324
326
  ### User Context
325
327
  ${o}`:"";return{content:[{type:"text",text:`${i}Follow these instructions:
326
328
 
327
- ${s}${a}`}],details:{skillName:n,action:"invoke",mode:"inline"}}}async function $b(r,e){let t=await r.listSkillsFull(e.category);if(t.skills.length===0)return{content:[{type:"text",text:e.category?`No skills found in category "${e.category}".`:"No skills available."}],details:{action:"list",count:0}};let n=[`Available skills (${t.skills.length}):`];t.categories.length>0&&n.push(`Categories: ${t.categories.join(", ")}`),n.push("");for(let o of t.skills){let s=o.category?` [${o.category}]`:"",i=o.version?` (v${o.version})`:"";n.push(`- **${o.name}**${i}${s}: ${o.description}`)}return{content:[{type:"text",text:n.join(`
328
- `)}],details:{action:"list",count:t.skills.length}}}async function Db(r,e){if(!e.name)return{content:[{type:"text",text:"Error: 'name' is required for view."}]};let t=await r.viewSkill(e.name,e.filePath);if(!t)return{content:[{type:"text",text:`Skill "${e.name}" not found. Use action: "list" to see available skills.`}],details:{action:"view",error:"not_found"}};let n=[`## Skill: ${t.name}
329
+ ${s}${a}`}],details:{skillName:n,action:"invoke",mode:"inline"}}}async function Wb(r,e){let t=await r.listSkillsFull(e.category);if(t.skills.length===0)return{content:[{type:"text",text:e.category?`No skills found in category "${e.category}".`:"No skills available."}],details:{action:"list",count:0}};let n=[`Available skills (${t.skills.length}):`];t.categories.length>0&&n.push(`Categories: ${t.categories.join(", ")}`),n.push("");for(let o of t.skills){let s=o.category?` [${o.category}]`:"",i=o.version?` (v${o.version})`:"";n.push(`- **${o.name}**${i}${s}: ${o.description}`)}return{content:[{type:"text",text:n.join(`
330
+ `)}],details:{action:"list",count:t.skills.length}}}async function Hb(r,e){if(!e.name)return{content:[{type:"text",text:"Error: 'name' is required for view."}]};let t=await r.viewSkill(e.name,e.filePath);if(!t)return{content:[{type:"text",text:`Skill "${e.name}" not found. Use action: "list" to see available skills.`}],details:{action:"view",error:"not_found"}};let n=[`## Skill: ${t.name}
329
331
  `,t.content];return t.referenceFiles&&t.referenceFiles.length>0&&n.push(`
330
332
  ### Reference Files
331
333
  ${t.referenceFiles.map(o=>`- ${o}`).join(`
332
334
  `)}`),{content:[{type:"text",text:n.join(`
333
- `)}],details:{action:"view",name:t.name}}}async function Ub(r,e){if(!e.name)return{content:[{type:"text",text:`Error: 'name' is required for ${e.action}.`}]};let t=await r.manageSkill({action:e.action,name:e.name,content:e.content,filePath:e.filePath,fileContent:e.fileContent,oldString:e.oldString,newString:e.newString});return{content:[{type:"text",text:t.message}],details:{action:e.action,success:t.success,path:t.path}}}function Nb(r){let e=r.listSkills(),t="Manage and invoke skills \u2014 reusable workflows and domain-specific knowledge packages. Use action: 'list' to discover skills, 'view' to read content, 'invoke' to run a skill. Skills can also be created, edited, patched, or deleted.";if(e.length===0)return t;let n=e.slice(0,50).map(o=>`- ${o.name}: ${o.description??"(no description)"}`).join(`
335
+ `)}],details:{action:"view",name:t.name}}}async function zb(r,e){if(!e.name)return{content:[{type:"text",text:`Error: 'name' is required for ${e.action}.`}]};let t=await r.manageSkill({action:e.action,name:e.name,content:e.content,filePath:e.filePath,fileContent:e.fileContent,oldString:e.oldString,newString:e.newString});return{content:[{type:"text",text:t.message}],details:{action:e.action,success:t.success,path:t.path}}}function Vb(r){let e=r.listSkills(),t="Manage and invoke skills \u2014 reusable workflows and domain-specific knowledge packages. Use action: 'list' to discover skills, 'view' to read content, 'invoke' to run a skill. Skills can also be created, edited, patched, or deleted.";if(e.length===0)return t;let n=e.slice(0,50).map(o=>`- ${o.name}: ${o.description??"(no description)"}`).join(`
334
336
  `);return`${t}
335
337
 
336
338
  Available skills:
337
- ${n}`}var jb="agent",cu=["general","explore","plan","code","research","verify"],Fb={type:"object",properties:{agent:{type:"string",enum:["general","explore","plan","code","research","verify"],description:`Sub-agent type to fork:
339
+ ${n}`}var qb="agent",fd=["general","explore","plan","code","research","verify"],Kb={type:"object",properties:{agent:{type:"string",enum:["general","explore","plan","code","research","verify"],description:`Sub-agent type to fork:
338
340
  - general: Full tool access, any task
339
341
  - explore: Read-only codebase exploration (search, read, analyze)
340
342
  - plan: Planning mode (explore + produce plan, no writes)
341
343
  - code: Coding agent with full tool access
342
344
  - research: Web research and information gathering
343
- - verify: Run tests, check builds, validate changes`},prompt:{type:"string",description:"Detailed task for the sub-agent. The sub-agent shares your conversation history as context (prompt cache shared). Be specific about what information to return in the final response."},description:{type:"string",description:"Short description (3-7 words) for status tracking."},maxTurns:{type:"number",description:"Max turns for the sub-agent. Defaults: general=200, explore=50, plan=80, code=200, research=30, verify=40."},background:{type:"boolean",description:"If true, runs in background and returns a task_id. Poll with task tool. Default: false."}},required:["agent","prompt"],additionalProperties:!1},uu=4;function du(r){return{name:jb,label:"Sub-Agent",description:"Fork a sub-agent to handle complex tasks autonomously. Sub-agents share your conversation context (prompt cache) and have isolated tool state. Use for: parallel research, code exploration, testing, delegating large tasks to specialized agents.",parameters:Fb,searchHint:"fork subagent delegate spawn child parallel worker",isConcurrencySafe:!0,execute:async(e,t)=>{if(!t.prompt||t.prompt.trim().length<10)return{content:[{type:"text",text:"Error: prompt must be at least 10 characters."}],details:{type:"agent",error:"prompt_too_short"}};if(!cu.includes(t.agent))return{content:[{type:"text",text:`Error: unknown agent "${t.agent}". Available: ${cu.join(", ")}`}],details:{type:"agent",error:"invalid_agent_type"}};let n=r.currentForkDepth??0;if(n>=uu)return{content:[{type:"text",text:`Error: maximum fork depth (${uu}) reached. Cannot spawn more sub-agents. Complete current work instead.`}],details:{type:"agent",error:"max_depth_reached",depth:n}};try{let o=await r.forkAgent({agent:t.agent,prompt:t.prompt.trim(),description:t.description,maxTurns:t.maxTurns,background:t.background,abortSignal:r.abortSignal});if(t.background&&o.status==="running")return{content:[{type:"text",text:`Sub-agent "${t.agent}" started in background.
345
+ - verify: Run tests, check builds, validate changes`},prompt:{type:"string",description:"Detailed task for the sub-agent. The sub-agent shares your conversation history as context (prompt cache shared). Be specific about what information to return in the final response."},description:{type:"string",description:"Short description (3-7 words) for status tracking."},maxTurns:{type:"number",description:"Max turns for the sub-agent. Defaults: general=200, explore=50, plan=80, code=200, research=30, verify=40."},background:{type:"boolean",description:"If true, runs in background and returns a task_id. Poll with task tool. Default: false."}},required:["agent","prompt"],additionalProperties:!1},hd=4;function yd(r){return{name:qb,label:"Sub-Agent",description:"Fork a sub-agent to handle complex tasks autonomously. Sub-agents share your conversation context (prompt cache) and have isolated tool state. Use for: parallel research, code exploration, testing, delegating large tasks to specialized agents.",parameters:Kb,searchHint:"fork subagent delegate spawn child parallel worker",isConcurrencySafe:!0,execute:async(e,t)=>{if(!t.prompt||t.prompt.trim().length<10)return{content:[{type:"text",text:"Error: prompt must be at least 10 characters."}],details:{type:"agent",error:"prompt_too_short"}};if(!fd.includes(t.agent))return{content:[{type:"text",text:`Error: unknown agent "${t.agent}". Available: ${fd.join(", ")}`}],details:{type:"agent",error:"invalid_agent_type"}};let n=r.currentForkDepth??0;if(n>=hd)return{content:[{type:"text",text:`Error: maximum fork depth (${hd}) reached. Cannot spawn more sub-agents. Complete current work instead.`}],details:{type:"agent",error:"max_depth_reached",depth:n}};try{let o=await r.forkAgent({agent:t.agent,prompt:t.prompt.trim(),description:t.description,maxTurns:t.maxTurns,background:t.background,abortSignal:r.abortSignal});if(t.background&&o.status==="running")return{content:[{type:"text",text:`Sub-agent "${t.agent}" started in background.
344
346
  Agent ID: ${o.agentId}
345
347
  Use task tool with this ID to check status and get output.`}],details:{type:"agent",agentId:o.agentId,status:"running",background:!0}};if(o.status==="failed")return{content:[{type:"text",text:`Sub-agent failed: ${o.error||"unknown error"}`}],details:{type:"agent",agentId:o.agentId,status:"failed",error:o.error}};let s=o.output||"(sub-agent returned no output)",i=o.maxTurnsReached?`
346
348
 
347
- [Note: Sub-agent reached turn limit. Output may be incomplete.]`:"";return{content:[{type:"text",text:s+i}],details:{type:"agent",agentId:o.agentId,status:"completed",tokensUsed:o.tokensUsed,maxTurnsReached:o.maxTurnsReached}}}catch(o){let s=o instanceof Error?o.message:String(o);return{content:[{type:"text",text:`Sub-agent execution failed: ${s}`}],details:{type:"agent",error:"execution_error",message:s}}}}}}var Bb="config",Wb={type:"object",properties:{action:{type:"string",enum:["get","set","list","reset"],description:`Action:
349
+ [Note: Sub-agent reached turn limit. Output may be incomplete.]`:"";return{content:[{type:"text",text:s+i}],details:{type:"agent",agentId:o.agentId,status:"completed",tokensUsed:o.tokensUsed,maxTurnsReached:o.maxTurnsReached}}}catch(o){let s=o instanceof Error?o.message:String(o);return{content:[{type:"text",text:`Sub-agent execution failed: ${s}`}],details:{type:"agent",error:"execution_error",message:s}}}}}}var Jb="config",Yb={type:"object",properties:{action:{type:"string",enum:["get","set","list","reset"],description:`Action:
348
350
  - get: Read a config setting
349
351
  - set: Write a config setting
350
352
  - list: List all available settings
351
- - reset: Reset a setting to default`},key:{type:"string",description:"Config key path (e.g. 'model', 'language', 'theme', 'permissions.defaultMode'). Required for get/set/reset."},value:{description:"Value to set. Type depends on the setting. Required for 'set' action."}},required:["action"]},en=["permissions.securityPolicy","api.key","api.secret","auth.token","system.adminMode"];function pu(r){return{name:Bb,label:"Config",description:"Read and write agent configuration settings. Supports preferences like model selection, language, theme, tool enablement, etc. Security-critical settings (API keys, permissions) are read-only. Changes persist across sessions.",parameters:Wb,execute:async(e,t)=>{switch(t.action){case"get":{if(!t.key)return{content:[{type:"text",text:"Error: key is required for get."}],details:{type:"config",error:"missing_key"}};if(r.isValidKey&&!r.isValidKey(t.key))return{content:[{type:"text",text:`Error: unknown config key "${t.key}". Use action='list' to see available settings.`}],details:{type:"config",error:"unknown_key"}};let n=await r.getConfig(t.key);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}};let o=n.setting,s=[`${o.key} = ${JSON.stringify(o.value)}`,` Type: ${o.type}${o.options?` (${o.options.join(" | ")})`:""}`,` ${o.description}`];return o.readOnly&&s.push(" \u26A0\uFE0F Read-only (cannot be changed)"),{content:[{type:"text",text:s.join(`
352
- `)}],details:{type:"config",action:"get",key:t.key,value:o.value}}}case"set":{if(!t.key)return{content:[{type:"text",text:"Error: key is required for set."}],details:{type:"config",error:"missing_key"}};if(t.value===void 0)return{content:[{type:"text",text:"Error: value is required for set."}],details:{type:"config",error:"missing_value"}};if(en.includes(t.key))return{content:[{type:"text",text:`Error: "${t.key}" is a security-critical setting and cannot be modified.`}],details:{type:"config",error:"readonly_key"}};if(r.isValidKey&&!r.isValidKey(t.key))return{content:[{type:"text",text:`Error: unknown config key "${t.key}".`}],details:{type:"config",error:"unknown_key"}};let n=await r.setConfig(t.key,t.value);return n.success?{content:[{type:"text",text:`Updated "${t.key}": ${JSON.stringify(n.previousValue)} \u2192 ${JSON.stringify(t.value)}`}],details:{type:"config",action:"set",key:t.key,previousValue:n.previousValue,newValue:t.value}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}}}case"list":{let n=await r.listConfig();if(!n.settings||n.settings.length===0)return{content:[{type:"text",text:"No config settings available."}],details:{type:"config",action:"list",count:0}};let o=[`Available settings (${n.settings.length}):`,""];for(let s of n.settings){let i=s.readOnly?" [read-only]":"",a=JSON.stringify(s.value);o.push(` ${s.key} = ${a}${i}`),o.push(` ${s.description}`)}return{content:[{type:"text",text:o.join(`
353
- `)}],details:{type:"config",action:"list",count:n.settings.length}}}case"reset":{if(!t.key)return{content:[{type:"text",text:"Error: key is required for reset."}],details:{type:"config",error:"missing_key"}};if(en.includes(t.key))return{content:[{type:"text",text:`Error: "${t.key}" cannot be reset (security-critical).`}],details:{type:"config",error:"readonly_key"}};let n=await r.resetConfig(t.key);return n.success?{content:[{type:"text",text:`Reset "${t.key}" to default: ${JSON.stringify(n.setting?.value)}`}],details:{type:"config",action:"reset",key:t.key,value:n.setting?.value}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"config",error:"unknown_action"}}}}}}var Gb="cron",Hb={type:"object",properties:{action:{type:"string",enum:["create","list","get","update","delete","pause","resume","trigger"],description:"CRUD action: create/list/get/update/delete/pause/resume/trigger."},jobId:{type:"string",description:"Job ID. Required for get/update/delete/pause/resume/trigger."},prompt:{type:"string",description:"Task prompt to execute on schedule. Required for create."},schedule:{type:"string",description:`Schedule expression. Supports:
353
+ - reset: Reset a setting to default`},key:{type:"string",description:"Config key path (e.g. 'model', 'language', 'theme', 'permissions.defaultMode'). Required for get/set/reset."},value:{description:"Value to set. Type depends on the setting. Required for 'set' action."}},required:["action"]},ln=["permissions.securityPolicy","api.key","api.secret","auth.token","system.adminMode"];function bd(r){return{name:Jb,label:"Config",description:"Read and write agent configuration settings. Supports preferences like model selection, language, theme, tool enablement, etc. Security-critical settings (API keys, permissions) are read-only. Changes persist across sessions.",parameters:Yb,execute:async(e,t)=>{switch(t.action){case"get":{if(!t.key)return{content:[{type:"text",text:"Error: key is required for get."}],details:{type:"config",error:"missing_key"}};if(r.isValidKey&&!r.isValidKey(t.key))return{content:[{type:"text",text:`Error: unknown config key "${t.key}". Use action='list' to see available settings.`}],details:{type:"config",error:"unknown_key"}};let n=await r.getConfig(t.key);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}};let o=n.setting,s=[`${o.key} = ${JSON.stringify(o.value)}`,` Type: ${o.type}${o.options?` (${o.options.join(" | ")})`:""}`,` ${o.description}`];return o.readOnly&&s.push(" \u26A0\uFE0F Read-only (cannot be changed)"),{content:[{type:"text",text:s.join(`
354
+ `)}],details:{type:"config",action:"get",key:t.key,value:o.value}}}case"set":{if(!t.key)return{content:[{type:"text",text:"Error: key is required for set."}],details:{type:"config",error:"missing_key"}};if(t.value===void 0)return{content:[{type:"text",text:"Error: value is required for set."}],details:{type:"config",error:"missing_value"}};if(ln.includes(t.key))return{content:[{type:"text",text:`Error: "${t.key}" is a security-critical setting and cannot be modified.`}],details:{type:"config",error:"readonly_key"}};if(r.isValidKey&&!r.isValidKey(t.key))return{content:[{type:"text",text:`Error: unknown config key "${t.key}".`}],details:{type:"config",error:"unknown_key"}};let n=await r.setConfig(t.key,t.value);return n.success?{content:[{type:"text",text:`Updated "${t.key}": ${JSON.stringify(n.previousValue)} \u2192 ${JSON.stringify(t.value)}`}],details:{type:"config",action:"set",key:t.key,previousValue:n.previousValue,newValue:t.value}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}}}case"list":{let n=await r.listConfig();if(!n.settings||n.settings.length===0)return{content:[{type:"text",text:"No config settings available."}],details:{type:"config",action:"list",count:0}};let o=[`Available settings (${n.settings.length}):`,""];for(let s of n.settings){let i=s.readOnly?" [read-only]":"",a=JSON.stringify(s.value);o.push(` ${s.key} = ${a}${i}`),o.push(` ${s.description}`)}return{content:[{type:"text",text:o.join(`
355
+ `)}],details:{type:"config",action:"list",count:n.settings.length}}}case"reset":{if(!t.key)return{content:[{type:"text",text:"Error: key is required for reset."}],details:{type:"config",error:"missing_key"}};if(ln.includes(t.key))return{content:[{type:"text",text:`Error: "${t.key}" cannot be reset (security-critical).`}],details:{type:"config",error:"readonly_key"}};let n=await r.resetConfig(t.key);return n.success?{content:[{type:"text",text:`Reset "${t.key}" to default: ${JSON.stringify(n.setting?.value)}`}],details:{type:"config",action:"reset",key:t.key,value:n.setting?.value}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"config",error:"unknown_action"}}}}}}var Xb="cron",Qb={type:"object",properties:{action:{type:"string",enum:["create","list","get","update","delete","pause","resume","trigger"],description:"CRUD action: create/list/get/update/delete/pause/resume/trigger."},jobId:{type:"string",description:"Job ID. Required for get/update/delete/pause/resume/trigger."},prompt:{type:"string",description:"Task prompt to execute on schedule. Required for create."},schedule:{type:"string",description:`Schedule expression. Supports:
354
356
  - Cron: '0 9 * * *' (every day at 9am)
355
357
  - Shorthand: '5m' (every 5 min), '1h' (hourly), '1d' (daily)
356
- Required for create.`},name:{type:"string",description:"Human-readable job name."},repeat:{type:"number",description:"Number of times to repeat (null = infinite). Default: null."},allowedTools:{type:"array",items:{type:"string"},description:"Tools the scheduled task is allowed to use."},enabled:{type:"boolean",description:"Whether the job is enabled (for update)."}},required:["action"]},mu=50;function gu(r){return{name:Gb,label:"Cron",description:"Manage scheduled tasks. Create recurring jobs with cron expressions or shorthand ('5m', '1h', '0 9 * * *'). Jobs persist locally and survive restarts. Actions: create, list, get, update, delete, pause, resume, trigger (run now).",parameters:Hb,execute:async(e,t)=>{switch(t.action){case"create":{if(!t.prompt)return{content:[{type:"text",text:"Error: prompt is required for create."}],details:{type:"cron",error:"missing_prompt"}};if(!t.schedule)return{content:[{type:"text",text:"Error: schedule is required for create."}],details:{type:"cron",error:"missing_schedule"}};if(r.validateSchedule){let s=r.validateSchedule(t.schedule);if(s)return{content:[{type:"text",text:`Error: invalid schedule \u2014 ${s}`}],details:{type:"cron",error:"invalid_schedule"}}}let n=await r.listJobs();if(n.jobs&&n.jobs.length>=mu)return{content:[{type:"text",text:`Error: maximum ${mu} jobs reached. Delete unused jobs first.`}],details:{type:"cron",error:"max_jobs_reached"}};let o=await r.createJob({prompt:t.prompt,schedule:t.schedule,name:t.name,repeat:t.repeat,allowedTools:t.allowedTools});return o.success?{content:[{type:"text",text:xs(o.job)}],details:{type:"cron",action:"create",jobId:o.job.id}}:{content:[{type:"text",text:`Error: ${o.error}`}],details:{type:"cron",error:o.error}}}case"list":{let n=await r.listJobs();if(!n.jobs||n.jobs.length===0)return{content:[{type:"text",text:"No scheduled jobs."}],details:{type:"cron",action:"list",count:0}};let o=[`Scheduled jobs (${n.jobs.length}):`,""];for(let s of n.jobs)o.push(`- **${s.name||s.id}** [${s.state}] ${s.scheduleDisplay} \u2014 next: ${s.nextRunAt||"N/A"}`);return{content:[{type:"text",text:o.join(`
357
- `)}],details:{type:"cron",action:"list",count:n.jobs.length}}}case"get":{if(!t.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await r.getJob(t.jobId);return n.success?{content:[{type:"text",text:xs(n.job)}],details:{type:"cron",action:"get",jobId:t.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"update":{if(!t.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n={};t.prompt!==void 0&&(n.prompt=t.prompt),t.schedule!==void 0&&(n.schedule=t.schedule),t.name!==void 0&&(n.name=t.name),t.enabled!==void 0&&(n.enabled=t.enabled),t.repeat!==void 0&&(n.repeat=t.repeat),t.allowedTools!==void 0&&(n.allowedTools=t.allowedTools);let o=await r.updateJob(t.jobId,n);return o.success?{content:[{type:"text",text:`Job updated.
358
- ${xs(o.job)}`}],details:{type:"cron",action:"update",jobId:t.jobId}}:{content:[{type:"text",text:`Error: ${o.error}`}],details:{type:"cron",error:o.error}}}case"delete":{if(!t.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await r.deleteJob(t.jobId);return n.success?{content:[{type:"text",text:`Job ${t.jobId} deleted.`}],details:{type:"cron",action:"delete",jobId:t.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"pause":{if(!t.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await r.pauseJob(t.jobId);return n.success?{content:[{type:"text",text:`Job ${t.jobId} paused.`}],details:{type:"cron",action:"pause",jobId:t.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"resume":{if(!t.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await r.resumeJob(t.jobId);return n.success?{content:[{type:"text",text:`Job ${t.jobId} resumed.`}],details:{type:"cron",action:"resume",jobId:t.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"trigger":{if(!t.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await r.triggerJob(t.jobId);return n.success?{content:[{type:"text",text:`Job ${t.jobId} triggered (running now).`}],details:{type:"cron",action:"trigger",jobId:t.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"cron",error:"unknown_action"}}}}}}function xs(r){let e=[`Job: ${r.name||r.id}`,`ID: ${r.id}`,`Schedule: ${r.scheduleDisplay} (${r.schedule})`,`State: ${r.state}`,`Repeat: ${r.repeat.times===null?"infinite":`${r.repeat.completed}/${r.repeat.times}`}`];return r.nextRunAt&&e.push(`Next run: ${r.nextRunAt}`),r.lastRunAt&&e.push(`Last run: ${r.lastRunAt} (${r.lastStatus||"unknown"})`),e.push(`Prompt: ${r.prompt.slice(0,100)}${r.prompt.length>100?"...":""}`),e.join(`
359
- `)}var Vb="monitor",zb={type:"object",properties:{action:{type:"string",enum:["start","stop","list"],description:"Action to perform: start a new monitor, stop an existing one, or list active monitors."},monitorId:{type:"string",description:"Identifier for the monitor instance. Required for start/stop."},source:{type:"string",enum:["process","file","task","custom"],description:"Type of event source to watch."},target:{type:"string",description:"Selector for the monitored target. For process: PID or background job id. For file: glob pattern. For task: task ID. For custom: host-defined key."},conditions:{type:"array",items:{type:"object",properties:{type:{type:"string",enum:["exit","output_match","file_changed","task_status"]},value:{type:"string"}},required:["type"]},description:"Conditions that trigger a wake-up notification."},timeoutSeconds:{type:"number",description:"Auto-stop after this many seconds (default: 3600).",minimum:1,maximum:86400}},required:["action"]};function fu(r){return{name:Vb,label:"Monitor",shouldDefer:!0,description:["Set up event-driven monitoring to wake up when something happens.","","Use this to watch for:","\u2022 Background process completion or specific output patterns","\u2022 File system changes (new file, modification)","\u2022 Async task state transitions (pending \u2192 completed/failed)","\u2022 Custom host-defined events","","When a monitored condition triggers, you'll receive a notification in your next tick.","This is more efficient than polling with Sleep \u2014 you only wake up when there's work to do.","","Actions:","\u2022 start \u2014 register a new monitor (requires monitorId, source, target)","\u2022 stop \u2014 deregister an active monitor","\u2022 list \u2014 show all active monitors and their event counts"].join(`
360
- `),parameters:zb,execute:async(e,t)=>{let{action:n}=t;if(n==="list"){let i=await r.listMonitors();return i.length===0?{content:[{type:"text",text:"No active monitors."}],details:{action:n,monitors:[]}}:{content:[{type:"text",text:`Active monitors:
361
- ${i.map(l=>`\u2022 ${l.monitorId} [${l.source}] \u2192 ${l.target} (events: ${l.eventCount}, timeout: ${l.timeoutSeconds}s)`).join(`
362
- `)}`}],details:{action:n,monitors:i}}}if(!t.monitorId)return{content:[{type:"text",text:"Error: monitorId is required for start/stop."}],details:{action:n,success:!1,error:"missing_monitor_id"}};if(n==="stop"){let i=await r.stopMonitor(t.monitorId);return{content:[{type:"text",text:i.success?`Monitor "${t.monitorId}" stopped.`:`Failed to stop monitor "${t.monitorId}": ${i.error??"not found"}`}],details:{...i}}}if(!t.source||!t.target)return{content:[{type:"text",text:"Error: source and target are required to start a monitor."}],details:{action:n,success:!1,error:"missing_source_or_target"}};let o=await r.startMonitor({monitorId:t.monitorId,source:t.source,target:t.target,conditions:t.conditions??[],timeoutSeconds:t.timeoutSeconds??3600});return{content:[{type:"text",text:o.success?`Monitor "${t.monitorId}" started: watching ${t.source} "${t.target}".`:`Failed to start monitor: ${o.error??"unknown"}`}],details:{...o}}}}}var qb="team",Kb={type:"object",properties:{action:{type:"string",enum:["create","delete","list","status"],description:"Team action: create (new team), delete (disband), list (all teams), status (team details)."},teamName:{type:"string",description:"Team name. Required for create/delete/status."},description:{type:"string",description:"Team description/objective. Used for create."},members:{type:"array",description:"Team members with roles and tool restrictions.",items:{type:"object",properties:{name:{type:"string",description:"Agent name/role identifier."},role:{type:"string",description:"Role description (e.g. 'frontend developer')."},tools:{type:"array",items:{type:"string"},description:"Allowed tools for this member."}},required:["name","role"]}}},required:["action"]};function hu(r){return{name:qb,label:"Team",description:"Manage multi-agent teams. Create teams of specialized agents that collaborate via send_message. Each member has a role and optional tool restrictions. Use for complex tasks requiring parallel work.",parameters:Kb,execute:async(e,t)=>{switch(t.action){case"create":{if(!t.teamName)return{content:[{type:"text",text:"Error: teamName required for create."}],details:{type:"team",error:"missing_name"}};let n=await r.createTeam({teamName:t.teamName,description:t.description,members:t.members});if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"team",error:n.error}};let o=[`Team "${n.team.name}" created.`,`Lead: ${n.team.leadId}`,`Members: ${n.team.members.length}`];for(let s of n.team.members)o.push(` - ${s.name} (${s.role})`);return{content:[{type:"text",text:o.join(`
358
+ Required for create.`},name:{type:"string",description:"Human-readable job name."},repeat:{type:"number",description:"Number of times to repeat (null = infinite). Default: null."},allowedTools:{type:"array",items:{type:"string"},description:"Tools the scheduled task is allowed to use."},enabled:{type:"boolean",description:"Whether the job is enabled (for update)."}},required:["action"]},kd=50;function Td(r){return{name:Xb,label:"Cron",description:"Manage scheduled tasks. Create recurring jobs with cron expressions or shorthand ('5m', '1h', '0 9 * * *'). Jobs persist locally and survive restarts. Actions: create, list, get, update, delete, pause, resume, trigger (run now).",parameters:Qb,execute:async(e,t)=>{switch(t.action){case"create":{if(!t.prompt)return{content:[{type:"text",text:"Error: prompt is required for create."}],details:{type:"cron",error:"missing_prompt"}};if(!t.schedule)return{content:[{type:"text",text:"Error: schedule is required for create."}],details:{type:"cron",error:"missing_schedule"}};if(r.validateSchedule){let s=r.validateSchedule(t.schedule);if(s)return{content:[{type:"text",text:`Error: invalid schedule \u2014 ${s}`}],details:{type:"cron",error:"invalid_schedule"}}}let n=await r.listJobs();if(n.jobs&&n.jobs.length>=kd)return{content:[{type:"text",text:`Error: maximum ${kd} jobs reached. Delete unused jobs first.`}],details:{type:"cron",error:"max_jobs_reached"}};let o=await r.createJob({prompt:t.prompt,schedule:t.schedule,name:t.name,repeat:t.repeat,allowedTools:t.allowedTools});return o.success?{content:[{type:"text",text:Ms(o.job)}],details:{type:"cron",action:"create",jobId:o.job.id}}:{content:[{type:"text",text:`Error: ${o.error}`}],details:{type:"cron",error:o.error}}}case"list":{let n=await r.listJobs();if(!n.jobs||n.jobs.length===0)return{content:[{type:"text",text:"No scheduled jobs."}],details:{type:"cron",action:"list",count:0}};let o=[`Scheduled jobs (${n.jobs.length}):`,""];for(let s of n.jobs)o.push(`- **${s.name||s.id}** [${s.state}] ${s.scheduleDisplay} \u2014 next: ${s.nextRunAt||"N/A"}`);return{content:[{type:"text",text:o.join(`
359
+ `)}],details:{type:"cron",action:"list",count:n.jobs.length}}}case"get":{if(!t.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await r.getJob(t.jobId);return n.success?{content:[{type:"text",text:Ms(n.job)}],details:{type:"cron",action:"get",jobId:t.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"update":{if(!t.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n={};t.prompt!==void 0&&(n.prompt=t.prompt),t.schedule!==void 0&&(n.schedule=t.schedule),t.name!==void 0&&(n.name=t.name),t.enabled!==void 0&&(n.enabled=t.enabled),t.repeat!==void 0&&(n.repeat=t.repeat),t.allowedTools!==void 0&&(n.allowedTools=t.allowedTools);let o=await r.updateJob(t.jobId,n);return o.success?{content:[{type:"text",text:`Job updated.
360
+ ${Ms(o.job)}`}],details:{type:"cron",action:"update",jobId:t.jobId}}:{content:[{type:"text",text:`Error: ${o.error}`}],details:{type:"cron",error:o.error}}}case"delete":{if(!t.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await r.deleteJob(t.jobId);return n.success?{content:[{type:"text",text:`Job ${t.jobId} deleted.`}],details:{type:"cron",action:"delete",jobId:t.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"pause":{if(!t.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await r.pauseJob(t.jobId);return n.success?{content:[{type:"text",text:`Job ${t.jobId} paused.`}],details:{type:"cron",action:"pause",jobId:t.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"resume":{if(!t.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await r.resumeJob(t.jobId);return n.success?{content:[{type:"text",text:`Job ${t.jobId} resumed.`}],details:{type:"cron",action:"resume",jobId:t.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"trigger":{if(!t.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await r.triggerJob(t.jobId);return n.success?{content:[{type:"text",text:`Job ${t.jobId} triggered (running now).`}],details:{type:"cron",action:"trigger",jobId:t.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"cron",error:"unknown_action"}}}}}}function Ms(r){let e=[`Job: ${r.name||r.id}`,`ID: ${r.id}`,`Schedule: ${r.scheduleDisplay} (${r.schedule})`,`State: ${r.state}`,`Repeat: ${r.repeat.times===null?"infinite":`${r.repeat.completed}/${r.repeat.times}`}`];return r.nextRunAt&&e.push(`Next run: ${r.nextRunAt}`),r.lastRunAt&&e.push(`Last run: ${r.lastRunAt} (${r.lastStatus||"unknown"})`),e.push(`Prompt: ${r.prompt.slice(0,100)}${r.prompt.length>100?"...":""}`),e.join(`
361
+ `)}var Zb="monitor",ek={type:"object",properties:{action:{type:"string",enum:["start","stop","list"],description:"Action to perform: start a new monitor, stop an existing one, or list active monitors."},monitorId:{type:"string",description:"Identifier for the monitor instance. Required for start/stop."},source:{type:"string",enum:["process","file","task","custom"],description:"Type of event source to watch."},target:{type:"string",description:"Selector for the monitored target. For process: PID or background job id. For file: glob pattern. For task: task ID. For custom: host-defined key."},conditions:{type:"array",items:{type:"object",properties:{type:{type:"string",enum:["exit","output_match","file_changed","task_status"]},value:{type:"string"}},required:["type"]},description:"Conditions that trigger a wake-up notification."},timeoutSeconds:{type:"number",description:"Auto-stop after this many seconds (default: 3600).",minimum:1,maximum:86400}},required:["action"]};function wd(r){return{name:Zb,label:"Monitor",shouldDefer:!0,description:["Set up event-driven monitoring to wake up when something happens.","","Use this to watch for:","\u2022 Background process completion or specific output patterns","\u2022 File system changes (new file, modification)","\u2022 Async task state transitions (pending \u2192 completed/failed)","\u2022 Custom host-defined events","","When a monitored condition triggers, you'll receive a notification in your next tick.","This is more efficient than polling with Sleep \u2014 you only wake up when there's work to do.","","Actions:","\u2022 start \u2014 register a new monitor (requires monitorId, source, target)","\u2022 stop \u2014 deregister an active monitor","\u2022 list \u2014 show all active monitors and their event counts"].join(`
362
+ `),parameters:ek,execute:async(e,t)=>{let{action:n}=t;if(n==="list"){let i=await r.listMonitors();return i.length===0?{content:[{type:"text",text:"No active monitors."}],details:{action:n,monitors:[]}}:{content:[{type:"text",text:`Active monitors:
363
+ ${i.map(c=>`\u2022 ${c.monitorId} [${c.source}] \u2192 ${c.target} (events: ${c.eventCount}, timeout: ${c.timeoutSeconds}s)`).join(`
364
+ `)}`}],details:{action:n,monitors:i}}}if(!t.monitorId)return{content:[{type:"text",text:"Error: monitorId is required for start/stop."}],details:{action:n,success:!1,error:"missing_monitor_id"}};if(n==="stop"){let i=await r.stopMonitor(t.monitorId);return{content:[{type:"text",text:i.success?`Monitor "${t.monitorId}" stopped.`:`Failed to stop monitor "${t.monitorId}": ${i.error??"not found"}`}],details:{...i}}}if(!t.source||!t.target)return{content:[{type:"text",text:"Error: source and target are required to start a monitor."}],details:{action:n,success:!1,error:"missing_source_or_target"}};let o=await r.startMonitor({monitorId:t.monitorId,source:t.source,target:t.target,conditions:t.conditions??[],timeoutSeconds:t.timeoutSeconds??3600});return{content:[{type:"text",text:o.success?`Monitor "${t.monitorId}" started: watching ${t.source} "${t.target}".`:`Failed to start monitor: ${o.error??"unknown"}`}],details:{...o}}}}}var tk="team",nk={type:"object",properties:{action:{type:"string",enum:["create","delete","list","status"],description:"Team action: create (new team), delete (disband), list (all teams), status (team details)."},teamName:{type:"string",description:"Team name. Required for create/delete/status."},description:{type:"string",description:"Team description/objective. Used for create."},members:{type:"array",description:"Team members with roles and tool restrictions.",items:{type:"object",properties:{name:{type:"string",description:"Agent name/role identifier."},role:{type:"string",description:"Role description (e.g. 'frontend developer')."},tools:{type:"array",items:{type:"string"},description:"Allowed tools for this member."}},required:["name","role"]}}},required:["action"]};function vd(r){return{name:tk,label:"Team",description:"Manage multi-agent teams. Create teams of specialized agents that collaborate via send_message. Each member has a role and optional tool restrictions. Use for complex tasks requiring parallel work.",parameters:nk,execute:async(e,t)=>{switch(t.action){case"create":{if(!t.teamName)return{content:[{type:"text",text:"Error: teamName required for create."}],details:{type:"team",error:"missing_name"}};let n=await r.createTeam({teamName:t.teamName,description:t.description,members:t.members});if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"team",error:n.error}};let o=[`Team "${n.team.name}" created.`,`Lead: ${n.team.leadId}`,`Members: ${n.team.members.length}`];for(let s of n.team.members)o.push(` - ${s.name} (${s.role})`);return{content:[{type:"text",text:o.join(`
363
365
  `)}],details:{type:"team",action:"create",teamName:n.team.name}}}case"delete":{if(!t.teamName)return{content:[{type:"text",text:"Error: teamName required for delete."}],details:{type:"team",error:"missing_name"}};let n=await r.deleteTeam(t.teamName);return n.success?{content:[{type:"text",text:`Team "${t.teamName}" disbanded.`}],details:{type:"team",action:"delete",teamName:t.teamName}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"team",error:n.error}}}case"list":{let n=await r.listTeams();if(!n.teams||n.teams.length===0)return{content:[{type:"text",text:"No active teams."}],details:{type:"team",action:"list",count:0}};let o=[`Active teams (${n.teams.length}):`,""];for(let s of n.teams)o.push(`- **${s.name}**: ${s.description||"(no description)"} \u2014 ${s.members.length} members`);return{content:[{type:"text",text:o.join(`
364
- `)}],details:{type:"team",action:"list",count:n.teams.length}}}case"status":{if(!t.teamName)return{content:[{type:"text",text:"Error: teamName required for status."}],details:{type:"team",error:"missing_name"}};let n=await r.getTeamStatus(t.teamName);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"team",error:n.error}};let o=n.team,s=n.memberProgress??{},i=[`Team: ${o.name}`,`Description: ${o.description||"\u2014"}`,`Lead: ${o.leadId}`,`Created: ${o.createdAt}`,"",`Members (${o.members.length}):`];for(let a of o.members){let l=a.tools?` [tools: ${a.tools.join(", ")}]`:"",u=a.worktreePath?` [worktree: ${a.worktreePath}]`:a.cwd?` [cwd: ${a.cwd}]`:"",c=s[a.name],d=a.isActive===!1?" (idle)":" (active)";if(c){let p=[];if(c.runningFor&&p.push(`running ${Math.round(c.runningFor/1e3)}s`),c.lastToolCall&&p.push(`tool: ${c.lastToolCall}`),c.idleFor!==void 0&&c.idleFor>5&&p.push(`idle ${c.idleFor}s`),c.mediaProgress){let m=c.mediaProgress;p.push(`${m.mediaType} ${m.percent}% [${m.status}] taskId=${m.taskId}${m.provider?` provider=${m.provider}`:""}`)}p.length&&(d=` (${p.join(", ")})`)}i.push(` - ${a.name} (${a.role})${l}${u}${d}`)}return{content:[{type:"text",text:i.join(`
365
- `)}],details:{type:"team",action:"status",teamName:o.name}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"team",error:"unknown_action"}}}}}}var Yb="mcp",Xb={type:"object",properties:{action:{type:"string",enum:["list_servers","list_tools","call_tool","list_resources","read_resource","list_prompts","get_prompt","authenticate","manage_server"],description:`MCP action:
366
+ `)}],details:{type:"team",action:"list",count:n.teams.length}}}case"status":{if(!t.teamName)return{content:[{type:"text",text:"Error: teamName required for status."}],details:{type:"team",error:"missing_name"}};let n=await r.getTeamStatus(t.teamName);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"team",error:n.error}};let o=n.team,s=n.memberProgress??{},i=[`Team: ${o.name}`,`Description: ${o.description||"\u2014"}`,`Lead: ${o.leadId}`,`Created: ${o.createdAt}`,"",`Members (${o.members.length}):`];for(let a of o.members){let c=a.tools?` [tools: ${a.tools.join(", ")}]`:"",d=a.worktreePath?` [worktree: ${a.worktreePath}]`:a.cwd?` [cwd: ${a.cwd}]`:"",l=s[a.name],u=a.isActive===!1?" (idle)":" (active)";if(l){let p=[];if(l.runningFor&&p.push(`running ${Math.round(l.runningFor/1e3)}s`),l.lastToolCall&&p.push(`tool: ${l.lastToolCall}`),l.idleFor!==void 0&&l.idleFor>5&&p.push(`idle ${l.idleFor}s`),l.mediaProgress){let m=l.mediaProgress;p.push(`${m.mediaType} ${m.percent}% [${m.status}] taskId=${m.taskId}${m.provider?` provider=${m.provider}`:""}`)}p.length&&(u=` (${p.join(", ")})`)}i.push(` - ${a.name} (${a.role})${c}${d}${u}`)}return{content:[{type:"text",text:i.join(`
367
+ `)}],details:{type:"team",action:"status",teamName:o.name}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"team",error:"unknown_action"}}}}}}var rk="mcp",sk={type:"object",properties:{action:{type:"string",enum:["list_servers","list_tools","call_tool","list_resources","read_resource","list_prompts","get_prompt","authenticate","manage_server"],description:`MCP action:
366
368
  - list_servers: List configured MCP servers, their status and capabilities
367
369
  - list_tools: List tools provided by a specific server
368
370
  - call_tool: Execute a tool on an MCP server
@@ -371,14 +373,14 @@ ${i.map(l=>`\u2022 ${l.monitorId} [${l.source}] \u2192 ${l.target} (events: ${l.
371
373
  - list_prompts: List prompts available from a server
372
374
  - get_prompt: Get a specific prompt with arguments
373
375
  - authenticate: Initiate OAuth authentication with a server
374
- - manage_server: Add, remove, restart, or check server status`},server:{type:"string",description:"MCP server name. Required for all actions except list_servers."},toolName:{type:"string",description:"Tool name on the MCP server. Required for call_tool."},arguments:{type:"object",description:"Arguments for the tool call or prompt. Used with call_tool and get_prompt."},uri:{type:"string",description:"Resource URI. Required for read_resource."},promptName:{type:"string",description:"Prompt name. Required for get_prompt."},manageAction:{type:"string",enum:["add","remove","restart","health_check","enable","disable"],description:"Sub-action for manage_server."},config:{type:"object",description:"Server configuration. Required for manage_server add."}},required:["action"]};function yu(r){return{name:Yb,label:"MCP",description:`Interact with external MCP (Model Context Protocol) servers. Discover and call tools, read resources, get prompts, manage servers, and handle authentication. MCP servers extend agent capabilities with external integrations (databases, APIs, code analysis, custom tools).
376
+ - manage_server: Add, remove, restart, or check server status`},server:{type:"string",description:"MCP server name. Required for all actions except list_servers."},toolName:{type:"string",description:"Tool name on the MCP server. Required for call_tool."},arguments:{type:"object",description:"Arguments for the tool call or prompt. Used with call_tool and get_prompt."},uri:{type:"string",description:"Resource URI. Required for read_resource."},promptName:{type:"string",description:"Prompt name. Required for get_prompt."},manageAction:{type:"string",enum:["add","remove","restart","health_check","enable","disable"],description:"Sub-action for manage_server."},config:{type:"object",description:"Server configuration. Required for manage_server add."}},required:["action"]};function xd(r){return{name:rk,label:"MCP",description:`Interact with external MCP (Model Context Protocol) servers. Discover and call tools, read resources, get prompts, manage servers, and handle authentication. MCP servers extend agent capabilities with external integrations (databases, APIs, code analysis, custom tools).
375
377
 
376
- Dynamic tools: When MCP servers are connected, their tools also appear as individual entries in the tool list (prefixed mcp__server__tool) for direct invocation without going through this management tool.`,parameters:Xb,shouldDefer:!0,execute:async(e,t,n)=>{switch(t.action){case"list_servers":{let o=await r.listServers();if(o.length===0)return{content:[{type:"text",text:"No MCP servers configured. Use manage_server action to add one."}],details:{type:"mcp",action:"list_servers",count:0}};let s=[`MCP Servers (${o.length}):`,""];for(let i of o){let a=Qb(i.status);if(s.push(`${a} **${i.name}** [${i.transport}] \u2014 ${i.status}`),s.push(` Tools: ${i.toolCount} | Resources: ${i.resourceCount} | Prompts: ${i.promptCount}`),i.capabilities){let l=[];i.capabilities.tools?.listChanged&&l.push("tools/listChanged"),i.capabilities.resources?.subscribe&&l.push("resources/subscribe"),i.capabilities.prompts?.listChanged&&l.push("prompts/listChanged"),l.length>0&&s.push(` Capabilities: ${l.join(", ")}`)}i.serverVersion&&s.push(` Version: ${i.serverVersion}`),i.error&&s.push(` \u26A0 Error: ${i.error}`),s.push("")}return{content:[{type:"text",text:s.join(`
377
- `)}],details:{type:"mcp",action:"list_servers",count:o.length}}}case"list_tools":{if(!t.server)return te("server is required for list_tools.");let o=await r.listTools(t.server);if(o.length===0)return{content:[{type:"text",text:`No tools available from server "${t.server}".`}],details:{type:"mcp",action:"list_tools",server:t.server,count:0}};let s=[`Tools from "${t.server}" (${o.length}):`,""];for(let i of o){let a=Zb(i.annotations);s.push(`- **${i.name}**${a}${i.description?`: ${i.description}`:""}`),i.prefixedName&&s.push(` Direct call: \`${i.prefixedName}\``)}return{content:[{type:"text",text:s.join(`
378
- `)}],details:{type:"mcp",action:"list_tools",server:t.server,count:o.length}}}case"call_tool":{if(!t.server)return te("server is required for call_tool.");if(!t.toolName)return te("toolName is required for call_tool.");let o=await r.callTool(t.server,t.toolName,t.arguments,n);return!o.success||o.isError?{content:[{type:"text",text:`MCP tool error (${t.server}/${t.toolName}): ${o.error||o.content||"unknown error"}`}],details:{type:"mcp",action:"call_tool",server:t.server,toolName:t.toolName,success:!1}}:o.contentBlocks&&o.contentBlocks.length>0?{content:o.contentBlocks.map(i=>i.type==="image"&&i.data?{type:"image",data:i.data,mimeType:i.mimeType}:{type:"text",text:i.text||""}),details:{type:"mcp",action:"call_tool",server:t.server,toolName:t.toolName,success:!0}}:{content:[{type:"text",text:o.content||"(no output)"}],details:{type:"mcp",action:"call_tool",server:t.server,toolName:t.toolName,success:!0}}}case"list_resources":{let o=await r.listResources(t.server);if(o.length===0)return{content:[{type:"text",text:t.server?`No resources from "${t.server}".`:"No MCP resources available."}],details:{type:"mcp",action:"list_resources",count:0}};let s=[`MCP Resources (${o.length}):`,""];for(let i of o)s.push(`- **${i.name}** \`${i.uri}\`${i.mimeType?` [${i.mimeType}]`:""}`),i.description&&s.push(` ${i.description}`),i.server&&s.push(` Server: ${i.server}`);return{content:[{type:"text",text:s.join(`
379
- `)}],details:{type:"mcp",action:"list_resources",count:o.length,server:t.server}}}case"read_resource":{if(!t.server)return te("server is required for read_resource.");if(!t.uri)return te("uri is required for read_resource.");let o=await r.readResource(t.server,t.uri);if(o.length===0)return{content:[{type:"text",text:"Resource returned no content."}],details:{type:"mcp",action:"read_resource",server:t.server,uri:t.uri}};let s=[];for(let i of o)i.blobSavedTo?s.push({type:"text",text:`[Binary content saved to: ${i.blobSavedTo}${i.blobSize?` (${ek(i.blobSize)})`:""}]`}):i.text&&s.push({type:"text",text:i.text});return s.length===0&&s.push({type:"text",text:"(empty content)"}),{content:s,details:{type:"mcp",action:"read_resource",server:t.server,uri:t.uri}}}case"list_prompts":{if(!t.server)return te("server is required for list_prompts.");if(!r.listPrompts)return te("Prompt listing not supported by the current MCP host.");let o=await r.listPrompts(t.server);if(o.length===0)return{content:[{type:"text",text:`No prompts available from "${t.server}".`}],details:{type:"mcp",action:"list_prompts",server:t.server,count:0}};let s=[`Prompts from "${t.server}" (${o.length}):`,""];for(let i of o)if(s.push(`- **${i.name}**${i.description?`: ${i.description}`:""}`),i.arguments&&i.arguments.length>0){let a=i.arguments.map(l=>`${l.name}${l.required?" (required)":""}${l.description?`: ${l.description}`:""}`);s.push(` Arguments: ${a.join(", ")}`)}return{content:[{type:"text",text:s.join(`
380
- `)}],details:{type:"mcp",action:"list_prompts",server:t.server,count:o.length}}}case"get_prompt":{if(!t.server)return te("server is required for get_prompt.");if(!t.promptName)return te("promptName is required for get_prompt.");if(!r.getPrompt)return te("Prompt retrieval not supported by the current MCP host.");let o=t.arguments?Object.fromEntries(Object.entries(t.arguments).map(([a,l])=>[a,String(l)])):void 0,s=await r.getPrompt(t.server,t.promptName,o),i=[];s.description&&i.push(`> ${s.description}`,"");for(let a of s.messages)i.push(`**[${a.role}]:**`),a.content.type==="text"?i.push(a.content.text):a.content.type==="resource"?(i.push(`[Resource: ${a.content.resource.uri}]`),a.content.resource.text&&i.push(a.content.resource.text)):a.content.type==="image"&&i.push("[Image content]"),i.push("");return{content:[{type:"text",text:i.join(`
381
- `)||"(empty prompt)"}],details:{type:"mcp",action:"get_prompt",server:t.server,promptName:t.promptName}}}case"authenticate":{if(!t.server)return te("server is required for authenticate.");let o=await r.authenticate(t.server);switch(o.status){case"auth_url":return{content:[{type:"text",text:`Authentication required for "${t.server}".
378
+ Dynamic tools: When MCP servers are connected, their tools also appear as individual entries in the tool list (prefixed mcp__server__tool) for direct invocation without going through this management tool.`,parameters:sk,shouldDefer:!0,execute:async(e,t,n)=>{switch(t.action){case"list_servers":{let o=await r.listServers();if(o.length===0)return{content:[{type:"text",text:"No MCP servers configured. Use manage_server action to add one."}],details:{type:"mcp",action:"list_servers",count:0}};let s=[`MCP Servers (${o.length}):`,""];for(let i of o){let a=ik(i.status);if(s.push(`${a} **${i.name}** [${i.transport}] \u2014 ${i.status}`),s.push(` Tools: ${i.toolCount} | Resources: ${i.resourceCount} | Prompts: ${i.promptCount}`),i.capabilities){let c=[];i.capabilities.tools?.listChanged&&c.push("tools/listChanged"),i.capabilities.resources?.subscribe&&c.push("resources/subscribe"),i.capabilities.prompts?.listChanged&&c.push("prompts/listChanged"),c.length>0&&s.push(` Capabilities: ${c.join(", ")}`)}i.serverVersion&&s.push(` Version: ${i.serverVersion}`),i.error&&s.push(` \u26A0 Error: ${i.error}`),s.push("")}return{content:[{type:"text",text:s.join(`
379
+ `)}],details:{type:"mcp",action:"list_servers",count:o.length}}}case"list_tools":{if(!t.server)return ne("server is required for list_tools.");let o=await r.listTools(t.server);if(o.length===0)return{content:[{type:"text",text:`No tools available from server "${t.server}".`}],details:{type:"mcp",action:"list_tools",server:t.server,count:0}};let s=[`Tools from "${t.server}" (${o.length}):`,""];for(let i of o){let a=ak(i.annotations);s.push(`- **${i.name}**${a}${i.description?`: ${i.description}`:""}`),i.prefixedName&&s.push(` Direct call: \`${i.prefixedName}\``)}return{content:[{type:"text",text:s.join(`
380
+ `)}],details:{type:"mcp",action:"list_tools",server:t.server,count:o.length}}}case"call_tool":{if(!t.server)return ne("server is required for call_tool.");if(!t.toolName)return ne("toolName is required for call_tool.");let o=await r.callTool(t.server,t.toolName,t.arguments,n);return!o.success||o.isError?{content:[{type:"text",text:`MCP tool error (${t.server}/${t.toolName}): ${o.error||o.content||"unknown error"}`}],details:{type:"mcp",action:"call_tool",server:t.server,toolName:t.toolName,success:!1}}:o.contentBlocks&&o.contentBlocks.length>0?{content:o.contentBlocks.map(i=>i.type==="image"&&i.data?{type:"image",data:i.data,mimeType:i.mimeType}:{type:"text",text:i.text||""}),details:{type:"mcp",action:"call_tool",server:t.server,toolName:t.toolName,success:!0}}:{content:[{type:"text",text:o.content||"(no output)"}],details:{type:"mcp",action:"call_tool",server:t.server,toolName:t.toolName,success:!0}}}case"list_resources":{let o=await r.listResources(t.server);if(o.length===0)return{content:[{type:"text",text:t.server?`No resources from "${t.server}".`:"No MCP resources available."}],details:{type:"mcp",action:"list_resources",count:0}};let s=[`MCP Resources (${o.length}):`,""];for(let i of o)s.push(`- **${i.name}** \`${i.uri}\`${i.mimeType?` [${i.mimeType}]`:""}`),i.description&&s.push(` ${i.description}`),i.server&&s.push(` Server: ${i.server}`);return{content:[{type:"text",text:s.join(`
381
+ `)}],details:{type:"mcp",action:"list_resources",count:o.length,server:t.server}}}case"read_resource":{if(!t.server)return ne("server is required for read_resource.");if(!t.uri)return ne("uri is required for read_resource.");let o=await r.readResource(t.server,t.uri);if(o.length===0)return{content:[{type:"text",text:"Resource returned no content."}],details:{type:"mcp",action:"read_resource",server:t.server,uri:t.uri}};let s=[];for(let i of o)i.blobSavedTo?s.push({type:"text",text:`[Binary content saved to: ${i.blobSavedTo}${i.blobSize?` (${lk(i.blobSize)})`:""}]`}):i.text&&s.push({type:"text",text:i.text});return s.length===0&&s.push({type:"text",text:"(empty content)"}),{content:s,details:{type:"mcp",action:"read_resource",server:t.server,uri:t.uri}}}case"list_prompts":{if(!t.server)return ne("server is required for list_prompts.");if(!r.listPrompts)return ne("Prompt listing not supported by the current MCP host.");let o=await r.listPrompts(t.server);if(o.length===0)return{content:[{type:"text",text:`No prompts available from "${t.server}".`}],details:{type:"mcp",action:"list_prompts",server:t.server,count:0}};let s=[`Prompts from "${t.server}" (${o.length}):`,""];for(let i of o)if(s.push(`- **${i.name}**${i.description?`: ${i.description}`:""}`),i.arguments&&i.arguments.length>0){let a=i.arguments.map(c=>`${c.name}${c.required?" (required)":""}${c.description?`: ${c.description}`:""}`);s.push(` Arguments: ${a.join(", ")}`)}return{content:[{type:"text",text:s.join(`
382
+ `)}],details:{type:"mcp",action:"list_prompts",server:t.server,count:o.length}}}case"get_prompt":{if(!t.server)return ne("server is required for get_prompt.");if(!t.promptName)return ne("promptName is required for get_prompt.");if(!r.getPrompt)return ne("Prompt retrieval not supported by the current MCP host.");let o=t.arguments?Object.fromEntries(Object.entries(t.arguments).map(([a,c])=>[a,String(c)])):void 0,s=await r.getPrompt(t.server,t.promptName,o),i=[];s.description&&i.push(`> ${s.description}`,"");for(let a of s.messages)i.push(`**[${a.role}]:**`),a.content.type==="text"?i.push(a.content.text):a.content.type==="resource"?(i.push(`[Resource: ${a.content.resource.uri}]`),a.content.resource.text&&i.push(a.content.resource.text)):a.content.type==="image"&&i.push("[Image content]"),i.push("");return{content:[{type:"text",text:i.join(`
383
+ `)||"(empty prompt)"}],details:{type:"mcp",action:"get_prompt",server:t.server,promptName:t.promptName}}}case"authenticate":{if(!t.server)return ne("server is required for authenticate.");let o=await r.authenticate(t.server);switch(o.status){case"auth_url":return{content:[{type:"text",text:`Authentication required for "${t.server}".
382
384
 
383
385
  Please open this URL in your browser:
384
386
  ${o.authUrl}
@@ -386,68 +388,72 @@ ${o.authUrl}
386
388
  ${o.message||"Once you complete authentication, the server's tools will become available automatically."}`}],details:{type:"mcp",action:"authenticate",server:t.server,status:"auth_url"}};case"already_authenticated":return{content:[{type:"text",text:`Server "${t.server}" is already authenticated.`}],details:{type:"mcp",action:"authenticate",server:t.server,status:"already_authenticated"}};case"step_up_required":return{content:[{type:"text",text:`Server "${t.server}" requires elevated permissions.
387
389
  Required scopes: ${o.requiredScopes?.join(", ")||"unknown"}
388
390
 
389
- `+(o.authUrl?`Re-authorize at: ${o.authUrl}`:"Please re-authenticate with elevated permissions.")}],details:{type:"mcp",action:"authenticate",server:t.server,status:"step_up_required"}};case"unsupported":return{content:[{type:"text",text:`Authentication not supported for "${t.server}" (${o.message||"uses local transport"}).`}],details:{type:"mcp",action:"authenticate",server:t.server,status:"unsupported"}};default:return{content:[{type:"text",text:`Authentication error for "${t.server}": ${o.message||"unknown error"}`}],details:{type:"mcp",action:"authenticate",server:t.server,status:"error"}}}}case"manage_server":{if(!t.server)return te("server is required for manage_server.");if(!t.manageAction)return te("manageAction is required for manage_server.");switch(t.manageAction){case"add":{if(!r.addServer)return te("Server addition not supported by the current MCP host.");if(!t.config)return te("config is required for manage_server add.");let o=await r.addServer(t.server,t.config);return tn("add",t.server,o)}case"remove":{if(!r.removeServer)return te("Server removal not supported by the current MCP host.");let o=await r.removeServer(t.server);return tn("remove",t.server,o)}case"restart":{if(!r.restartServer)return te("Server restart not supported by the current MCP host.");let o=await r.restartServer(t.server);return tn("restart",t.server,o)}case"health_check":{if(!r.healthCheck)return te("Health check not supported by the current MCP host.");let o=await r.healthCheck(t.server);return tn("health_check",t.server,o)}case"enable":case"disable":{if(!r.setServerEnabled)return te("Server enable/disable not supported by the current MCP host.");let o=await r.setServerEnabled(t.server,t.manageAction==="enable");return tn(t.manageAction,t.server,o)}default:return te(`Unknown manageAction: ${t.manageAction}`)}}default:return te(`Unknown action: "${t.action}".`)}}}}function te(r){return{content:[{type:"text",text:`Error: ${r}`}],details:{type:"mcp",error:r}}}function Qb(r){switch(r){case"connected":return"\u2705";case"connecting":return"\u23F3";case"needs-auth":return"\u{1F511}";case"failed":return"\u274C";case"disconnected":return"\u26AA";case"disabled":return"\u{1F6AB}";default:return"\u2753"}}function Zb(r){if(!r)return"";let e=[];return r.readOnlyHint&&e.push("\u{1F4D6}"),r.destructiveHint&&e.push("\u26A0\uFE0F"),r.idempotentHint&&e.push("\u267B\uFE0F"),e.length>0?` ${e.join("")}`:""}function ek(r){return r<1024?`${r}B`:r<1024*1024?`${(r/1024).toFixed(1)}KB`:`${(r/(1024*1024)).toFixed(1)}MB`}function tn(r,e,t){let n=[];return n.push(`${t.success?"\u2705":"\u274C"} ${r} "${e}": ${t.message}`),t.serverState&&(n.push(""),n.push(` Status: ${t.serverState.status}`),n.push(` Tools: ${t.serverState.toolCount} | Resources: ${t.serverState.resourceCount}`)),{content:[{type:"text",text:n.join(`
390
- `)}],details:{type:"mcp",action:"manage_server",manageAction:r,server:e,success:t.success}}}var tk="checkpoint",nk={type:"object",properties:{action:{type:"string",enum:["create","list","restore","diff"],description:"Action: create (snapshot current state), list (show checkpoints), restore (revert to checkpoint), diff (show changes since checkpoint)."},checkpointId:{type:"string",description:"Checkpoint ID. Required for restore and diff."},message:{type:"string",description:"Optional descriptive message for the checkpoint."},paths:{type:"array",items:{type:"string"},description:"File paths to restore (partial restore). Omit to restore everything."}},required:["action"]},bu=/^[0-9a-fA-F]{4,64}$/;function ku(r){return{name:tk,label:"Checkpoint",description:"Manage workspace checkpoints (shadow snapshots independent of user's git). Create snapshots before risky operations, list history, restore on errors, or diff to see what changed. Checkpoints do NOT affect user's .git.",parameters:nk,execute:async(e,t)=>{switch(t.action){case"create":{let n=await r.createCheckpoint(t.message);return n.success?{content:[{type:"text",text:`Checkpoint created: ${n.checkpoint.id}
391
+ `+(o.authUrl?`Re-authorize at: ${o.authUrl}`:"Please re-authenticate with elevated permissions.")}],details:{type:"mcp",action:"authenticate",server:t.server,status:"step_up_required"}};case"unsupported":return{content:[{type:"text",text:`Authentication not supported for "${t.server}" (${o.message||"uses local transport"}).`}],details:{type:"mcp",action:"authenticate",server:t.server,status:"unsupported"}};default:return{content:[{type:"text",text:`Authentication error for "${t.server}": ${o.message||"unknown error"}`}],details:{type:"mcp",action:"authenticate",server:t.server,status:"error"}}}}case"manage_server":{if(!t.server)return ne("server is required for manage_server.");if(!t.manageAction)return ne("manageAction is required for manage_server.");switch(t.manageAction){case"add":{if(!r.addServer)return ne("Server addition not supported by the current MCP host.");if(!t.config)return ne("config is required for manage_server add.");let o=await r.addServer(t.server,t.config);return cn("add",t.server,o)}case"remove":{if(!r.removeServer)return ne("Server removal not supported by the current MCP host.");let o=await r.removeServer(t.server);return cn("remove",t.server,o)}case"restart":{if(!r.restartServer)return ne("Server restart not supported by the current MCP host.");let o=await r.restartServer(t.server);return cn("restart",t.server,o)}case"health_check":{if(!r.healthCheck)return ne("Health check not supported by the current MCP host.");let o=await r.healthCheck(t.server);return cn("health_check",t.server,o)}case"enable":case"disable":{if(!r.setServerEnabled)return ne("Server enable/disable not supported by the current MCP host.");let o=await r.setServerEnabled(t.server,t.manageAction==="enable");return cn(t.manageAction,t.server,o)}default:return ne(`Unknown manageAction: ${t.manageAction}`)}}default:return ne(`Unknown action: "${t.action}".`)}}}}function ne(r){return{content:[{type:"text",text:`Error: ${r}`}],details:{type:"mcp",error:r}}}function ik(r){switch(r){case"connected":return"\u2705";case"connecting":return"\u23F3";case"needs-auth":return"\u{1F511}";case"failed":return"\u274C";case"disconnected":return"\u26AA";case"disabled":return"\u{1F6AB}";default:return"\u2753"}}function ak(r){if(!r)return"";let e=[];return r.readOnlyHint&&e.push("\u{1F4D6}"),r.destructiveHint&&e.push("\u26A0\uFE0F"),r.idempotentHint&&e.push("\u267B\uFE0F"),e.length>0?` ${e.join("")}`:""}function lk(r){return r<1024?`${r}B`:r<1024*1024?`${(r/1024).toFixed(1)}KB`:`${(r/(1024*1024)).toFixed(1)}MB`}function cn(r,e,t){let n=[];return n.push(`${t.success?"\u2705":"\u274C"} ${r} "${e}": ${t.message}`),t.serverState&&(n.push(""),n.push(` Status: ${t.serverState.status}`),n.push(` Tools: ${t.serverState.toolCount} | Resources: ${t.serverState.resourceCount}`)),{content:[{type:"text",text:n.join(`
392
+ `)}],details:{type:"mcp",action:"manage_server",manageAction:r,server:e,success:t.success}}}var ck="checkpoint",dk={type:"object",properties:{action:{type:"string",enum:["create","list","restore","diff"],description:"Action: create (snapshot current state), list (show checkpoints), restore (revert to checkpoint), diff (show changes since checkpoint)."},checkpointId:{type:"string",description:"Checkpoint ID. Required for restore and diff."},message:{type:"string",description:"Optional descriptive message for the checkpoint."},paths:{type:"array",items:{type:"string"},description:"File paths to restore (partial restore). Omit to restore everything."}},required:["action"]},Sd=/^[0-9a-fA-F]{4,64}$/;function _d(r){return{name:ck,label:"Checkpoint",description:"Manage workspace checkpoints (shadow snapshots independent of user's git). Create snapshots before risky operations, list history, restore on errors, or diff to see what changed. Checkpoints do NOT affect user's .git.",parameters:dk,execute:async(e,t)=>{switch(t.action){case"create":{let n=await r.createCheckpoint(t.message);return n.success?{content:[{type:"text",text:`Checkpoint created: ${n.checkpoint.id}
391
393
  Message: ${n.checkpoint.message}
392
394
  Files: ${n.checkpoint.fileCount}`}],details:{type:"checkpoint",action:"create",checkpointId:n.checkpoint.id}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"checkpoint",error:n.error}}}case"list":{let n=await r.listCheckpoints();if(!n.checkpoints||n.checkpoints.length===0)return{content:[{type:"text",text:"No checkpoints available."}],details:{type:"checkpoint",action:"list",count:0}};let o=[`Checkpoints (${n.checkpoints.length}):`,""];for(let s of n.checkpoints)o.push(`- ${s.id.slice(0,8)} [${s.timestamp}] ${s.message} (${s.fileCount} files)`);return{content:[{type:"text",text:o.join(`
393
- `)}],details:{type:"checkpoint",action:"list",count:n.checkpoints.length}}}case"restore":{if(!t.checkpointId)return{content:[{type:"text",text:"Error: checkpointId required for restore."}],details:{type:"checkpoint",error:"missing_id"}};if(!bu.test(t.checkpointId))return{content:[{type:"text",text:"Error: invalid checkpoint ID format."}],details:{type:"checkpoint",error:"invalid_id"}};let n=await r.restoreCheckpoint(t.checkpointId,t.paths);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"checkpoint",error:n.error}};let o=t.paths?`(${t.paths.length} files)`:"(full workspace)";return{content:[{type:"text",text:`Restored to checkpoint ${t.checkpointId.slice(0,8)} ${o}`}],details:{type:"checkpoint",action:"restore",checkpointId:t.checkpointId}}}case"diff":{if(!t.checkpointId)return{content:[{type:"text",text:"Error: checkpointId required for diff."}],details:{type:"checkpoint",error:"missing_id"}};if(!bu.test(t.checkpointId))return{content:[{type:"text",text:"Error: invalid checkpoint ID format."}],details:{type:"checkpoint",error:"invalid_id"}};let n=await r.diffCheckpoint(t.checkpointId);return n.success?{content:[{type:"text",text:n.diff||"(no changes since checkpoint)"}],details:{type:"checkpoint",action:"diff",checkpointId:t.checkpointId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"checkpoint",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"checkpoint",error:"unknown_action"}}}}}}import*as be from"node:fs";import*as ht from"node:path";function Tu(r,e){let t=Yi(e);return{createCheckpoint:async n=>{try{be.mkdirSync(t,{recursive:!0});let{execSync:o}=await import("node:child_process"),s=ht.join(t,".git");be.existsSync(s)||(o("git init",{cwd:t,stdio:"pipe"}),o('git config user.email "checkpoint@agent"',{cwd:t,stdio:"pipe"}),o('git config user.name "Checkpoint"',{cwd:t,stdio:"pipe"})),be.cpSync(r,t,{recursive:!0,filter:u=>!u.includes(".git")&&!u.includes("node_modules")}),o("git add -A",{cwd:t,stdio:"pipe"});let i=n||`checkpoint ${new Date().toISOString()}`;o(`git commit --allow-empty -m "${i.replace(/"/g,'\\"')}"`,{cwd:t,stdio:"pipe"});let a=o("git rev-parse HEAD",{cwd:t,stdio:"pipe"}).toString().trim(),l=parseInt(o("git ls-files | wc -l",{cwd:t,stdio:"pipe"}).toString().trim(),10)||0;return{success:!0,checkpoint:{id:a,message:i,timestamp:new Date().toISOString(),fileCount:l}}}catch(o){return{success:!1,error:o.message}}},listCheckpoints:async()=>{try{let{execSync:n}=await import("node:child_process"),o=ht.join(t,".git");if(!be.existsSync(o))return{success:!0,checkpoints:[]};let s=n('git log --format="%H|%aI|%s" --max-count=20',{cwd:t,stdio:"pipe"}).toString().trim();return s?{success:!0,checkpoints:s.split(`
394
- `).map(a=>{let[l="",u="",...c]=a.split("|");return{id:l,timestamp:u,message:c.join("|"),fileCount:0}})}:{success:!0,checkpoints:[]}}catch(n){return{success:!1,error:n.message}}},restoreCheckpoint:async(n,o)=>{try{let{execSync:s}=await import("node:child_process");if(o&&o.length>0){s(`git checkout ${n} -- ${o.map(i=>`"${i.replace(/"/g,'\\"')}"`).join(" ")}`,{cwd:t,stdio:"pipe"});for(let i of o){let a=ht.join(t,i),l=ht.join(r,i);be.existsSync(a)&&be.cpSync(a,l,{recursive:!0})}}else{s(`git checkout ${n} -- .`,{cwd:t,stdio:"pipe"});let i=be.readdirSync(r);for(let a of i){if(a===".git"||a==="node_modules")continue;let l=ht.join(r,a);be.rmSync(l,{recursive:!0,force:!0})}be.cpSync(t,r,{recursive:!0,filter:a=>!a.includes(".git")})}return{success:!0}}catch(s){return{success:!1,error:s.message}}},diffCheckpoint:async n=>{try{let{execSync:o}=await import("node:child_process");return{success:!0,diff:o(`git diff ${n} HEAD`,{cwd:t,stdio:"pipe"}).toString()}}catch(o){return{success:!1,error:o.message}}}}}import{spawn as _s}from"node:child_process";import{createInterface as co}from"node:readline";import{resolve as pk,join as on}from"node:path";import{createServer as mk}from"node:net";import{createWriteStream as gk,mkdirSync as fk}from"node:fs";import{tmpdir as hk}from"node:os";import{createInterface as ok}from"node:readline";var rk=1,sk=1e4,rt=class{pendingRpcs=new Map;rl=null;onNotification=null;attach(e,t){this.onNotification=t??null,this.rl=ok({input:e.stdout,crlfDelay:Number.POSITIVE_INFINITY}),this.rl.on("line",n=>{let o=n.trim();if(!o)return;let s;try{s=JSON.parse(o)}catch{return}if("id"in s&&typeof s.id=="number"){let i=this.pendingRpcs.get(s.id);if(i){clearTimeout(i.timer),this.pendingRpcs.delete(s.id);let a=s;a.error?i.reject(new Error(a.error.message)):i.resolve(a.result)}return}"method"in s&&!("id"in s)&&this.onNotification?.(s.method,s.params)})}detach(){this.rl?.close(),this.rl=null;for(let[e,t]of this.pendingRpcs)clearTimeout(t.timer),t.reject(new Error("ACP adapter detached")),this.pendingRpcs.delete(e)}sendRpc(e,t,n,o=3e4){let s=rk++,i={jsonrpc:"2.0",id:s,method:t,params:n};return new Promise((a,l)=>{let u=setTimeout(()=>{this.pendingRpcs.delete(s),l(new Error(`ACP RPC timeout: ${t} (${o}ms)`))},o);this.pendingRpcs.set(s,{resolve:a,reject:l,timer:u});try{e.stdin.write(`${JSON.stringify(i)}
395
- `)}catch(c){clearTimeout(u),this.pendingRpcs.delete(s),l(c instanceof Error?c:new Error(String(c)))}})}async initialize(e){let t=await this.sendRpc(e,"initialize",{protocolVersion:1,clientInfo:{name:"qlogicagent",version:"1.0.0"}},sk),n=t?.capabilities??{};return{protocolVersion:typeof t?.protocolVersion=="number"?t.protocolVersion:0,capabilities:{prompts:n.prompts!==!1,supportsResume:n.supportsResume===!0||n.resume===!0},serverInfo:t?.serverInfo}}async createSession(e,t){let n={workspaceRoot:t.workspaceRoot};t.mcpServers?.length&&(n.mcpServers=t.mcpServers),t.systemPrompt&&(n.systemPrompt=t.systemPrompt);let o=await this.sendRpc(e,"session/new",n);return{id:typeof o?.id=="string"?o.id:"unknown"}}async sendPrompt(e,t,n,o=3e5){let s=await this.sendRpc(e,"prompt",{sessionId:t,content:[{type:"text",text:n}]},o);return{content:Array.isArray(s?.content)?s.content:[{type:"text",text:String(s??"")}],usage:s?.usage}}async resumeSession(e,t,n){let o={sessionId:t};n?.workspaceRoot&&(o.workspaceRoot=n.workspaceRoot),n?.mcpServers?.length&&(o.mcpServers=n.mcpServers);let s=await this.sendRpc(e,"session/resume",o,3e4);return{id:typeof s?.id=="string"?s.id:t}}async closeSession(e,t){try{await this.sendRpc(e,"session/close",{sessionId:t},5e3)}catch{}}static translateNotification(e,t){let n=t;switch(e){case"message":{if(!n)return null;let o=n.type;return o==="text"||!o?{method:"turn.delta",params:{text:n.content??n.text??""}}:o==="finish"||o==="end"?{method:"turn.end",params:{content:n.content??n.text??"",usage:n.usage}}:null}case"usage_update":return{method:"turn.usage_update",params:n??{}};case"notifications/progress":case"progress":return{method:"turn.exec_progress",params:{status:n?.message??n?.status??"working",percent:n?.percent}};default:return null}}};var nn=class{usage={inputTokens:0,outputTokens:0,totalTokens:0,cachedReadTokens:0,thoughtTokens:0,cost:0,hasTier1:!1,turnCount:0};onUsageUpdate(e){this.usage.hasTier1=!0,typeof e.inputTokens=="number"&&(this.usage.inputTokens+=e.inputTokens),typeof e.outputTokens=="number"&&(this.usage.outputTokens+=e.outputTokens),typeof e.totalTokens=="number"&&(this.usage.totalTokens+=e.totalTokens),typeof e.cost=="number"&&(this.usage.cost+=e.cost)}onPromptResponseUsage(e){e&&(this.usage.hasTier1||(this.usage.turnCount++,typeof e.inputTokens=="number"&&(this.usage.inputTokens+=e.inputTokens),typeof e.outputTokens=="number"&&(this.usage.outputTokens+=e.outputTokens),typeof e.totalTokens=="number"&&(this.usage.totalTokens+=e.totalTokens),typeof e.cachedReadTokens=="number"&&(this.usage.cachedReadTokens+=e.cachedReadTokens),typeof e.thoughtTokens=="number"&&(this.usage.thoughtTokens+=e.thoughtTokens)))}getUsage(){return{...this.usage}}reset(){this.usage={inputTokens:0,outputTokens:0,totalTokens:0,cachedReadTokens:0,thoughtTokens:0,cost:0,hasTier1:!1,turnCount:0}}hasData(){return this.usage.hasTier1||this.usage.turnCount>0}};import{execSync as vu}from"node:child_process";import{platform as ik}from"node:os";var Ss={claude:{id:"claude",name:"Claude Code",cliCommand:"claude",acpArgs:["--experimental-acp"],authRequired:!0,skillsDirs:[".claude/skills"],supportsBaseUrlOverride:!0,apiKeyEnvVar:"ANTHROPIC_API_KEY",baseUrlEnvVar:"ANTHROPIC_BASE_URL"},codex:{id:"codex",name:"OpenAI Codex CLI",cliCommand:"codex-acp",acpArgs:[],authRequired:!0,supportsBaseUrlOverride:!0,apiKeyEnvVar:"OPENAI_API_KEY",baseUrlEnvVar:"OPENAI_BASE_URL"},qwen:{id:"qwen",name:"Qwen Code",cliCommand:"qwen",acpArgs:["--acp"],defaultCliPath:"npx @anthropic-ai/claude-code@qwen",authRequired:!0,skillsDirs:[".qwen/skills"],supportsBaseUrlOverride:!0,apiKeyEnvVar:"ANTHROPIC_API_KEY",baseUrlEnvVar:"ANTHROPIC_BASE_URL"},goose:{id:"goose",name:"Goose",cliCommand:"goose",acpArgs:["acp"],authRequired:!1,skillsDirs:[".goose/skills"],supportsBaseUrlOverride:!0},kimi:{id:"kimi",name:"Kimi CLI",cliCommand:"kimi",acpArgs:["acp"],authRequired:!1,skillsDirs:[".kimi/skills"],supportsBaseUrlOverride:!0},opencode:{id:"opencode",name:"OpenCode",cliCommand:"opencode",acpArgs:["acp"],authRequired:!1,skillsDirs:[".opencode/skills"],supportsBaseUrlOverride:!0},cursor:{id:"cursor",name:"Cursor Agent",cliCommand:"agent",acpArgs:["acp"],authRequired:!0,skillsDirs:[".cursor/skills"],supportsBaseUrlOverride:!1},hermes:{id:"hermes",name:"Hermes Agent",cliCommand:"hermes",acpArgs:["acp"],authRequired:!1,supportsBaseUrlOverride:!0},copilot:{id:"copilot",name:"GitHub Copilot",cliCommand:"copilot",acpArgs:["--acp","--stdio"],authRequired:!0,supportsBaseUrlOverride:!1},codebuddy:{id:"codebuddy",name:"CodeBuddy",cliCommand:"codebuddy",acpArgs:["--acp"],authRequired:!0,skillsDirs:[".codebuddy/skills"],supportsBaseUrlOverride:!0},auggie:{id:"auggie",name:"Auggie",cliCommand:"auggie",acpArgs:["--acp"],authRequired:!0,supportsBaseUrlOverride:!0},droid:{id:"droid",name:"Droid",cliCommand:"droid",acpArgs:["exec","--output-format","acp"],authRequired:!0,skillsDirs:[".factory/skills"],supportsBaseUrlOverride:!0},kiro:{id:"kiro",name:"Kiro CLI",cliCommand:"kiro-cli",acpArgs:["acp"],authRequired:!0,supportsBaseUrlOverride:!0},snow:{id:"snow",name:"Snow",cliCommand:"snow",acpArgs:["--acp"],authRequired:!0,supportsBaseUrlOverride:!0},vibe:{id:"vibe",name:"Vibe (Mistral)",cliCommand:"vibe-acp",acpArgs:[],authRequired:!0,supportsBaseUrlOverride:!0},qoder:{id:"qoder",name:"Qoder",cliCommand:"qodercli",acpArgs:["--acp"],authRequired:!0,supportsBaseUrlOverride:!0}},ak=["general","explore","plan","code","research","verify"];function lk(){return ak.map(r=>({id:`qlogicagent-${r}`,name:`qlogicagent (${r})`,category:"sub-agent",protocol:"internal",status:"available",authRequired:!1,hasConfig:!0,supportsBaseUrlOverride:!0,capabilities:{supportsMcp:!1,supportsResume:!0,supportsUsageUpdate:!0}}))}var ck=ik()==="win32";function wu(r){try{let e=ck?`where ${r}`:`which ${r}`;return vu(e,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim().split(/\r?\n/)[0]?.trim()||null}catch{return null}}function uk(r){try{return vu(`"${r}" --version`,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim().match(/(\d+\.\d+[\w.-]*)/)?.[1]??null}catch{return null}}var dk=6e4,lo=class{cache=null;configStore=null;setConfigStore(e){this.configStore=e}scan(e=!1){if(!e&&this.cache&&Date.now()-this.cache.timestamp<dk)return this.cache.agents;let t=[];t.push(...lk());for(let n of Object.values(Ss))t.push(this.detectBackend(n));if(this.configStore?.customAgents)for(let n of Object.values(this.configStore.customAgents))t.push(this.detectCustomAgent(n));return this.cache={agents:t,timestamp:Date.now()},t}list(){return this.cache?this.cache.agents:this.scan()}clearCache(){this.cache=null}detectBackend(e){let t=wu(e.cliCommand),n=this.hasAgentConfig(e.id);if(!t)return{id:e.id,name:e.name,category:"teammate",protocol:"acp",status:"not_installed",authRequired:e.authRequired,hasConfig:n,supportsBaseUrlOverride:e.supportsBaseUrlOverride,capabilities:{supportsMcp:!0,supportsResume:!1,supportsUsageUpdate:e.id==="claude"||e.id==="codex",skillsDirs:e.skillsDirs}};let o=uk(t);return{id:e.id,name:e.name,category:"teammate",protocol:"acp",status:"available",cliPath:t,version:o??void 0,authRequired:e.authRequired,hasConfig:n,supportsBaseUrlOverride:e.supportsBaseUrlOverride,capabilities:{supportsMcp:!0,supportsResume:e.id==="claude"||e.id==="goose",supportsUsageUpdate:e.id==="claude"||e.id==="codex",skillsDirs:e.skillsDirs}}}detectCustomAgent(e){let t=wu(e.cliCommand),n=this.hasAgentConfig(e.id);return{id:e.id,name:e.name,category:"teammate",protocol:"acp",status:t?"available":"not_installed",cliPath:t??void 0,authRequired:e.authRequired??!1,hasConfig:n,supportsBaseUrlOverride:e.supportsBaseUrlOverride??!1,capabilities:{supportsMcp:!0,supportsResume:!1,supportsUsageUpdate:!1,skillsDirs:e.skillsDirs}}}hasAgentConfig(e){if(!this.configStore)return!1;let t=this.configStore.agents[e];return!!(t?.apiKey||t?.baseUrl||t?.customCliPath)}buildExternalDescriptor(e){let t=this.list().find(s=>s.id===e);if(!t||t.protocol!=="acp"||t.status!=="available"||!t.cliPath)return null;let n=Ss[e],o=this.configStore?.agents[e];return{id:e,cliPath:o?.customCliPath??t.cliPath,acpArgs:o?.customArgs??n?.acpArgs??[],env:o?.env??n?.env,protocol:"acp"}}};var yk=1;function bk(r,e){return{jsonrpc:"2.0",id:yk++,method:r,params:e}}var kk=["NODE_ENV","HOME","PATH","TERM","OPENAI_API_KEY","OPENAI_BASE_URL","ANTHROPIC_API_KEY","ANTHROPIC_BASE_URL","HTTP_PROXY","HTTPS_PROXY","NO_PROXY","http_proxy","https_proxy","no_proxy"];function Tk(r){let e={};for(let t of kk)process.env[t]&&(e[t]=process.env[t]);return r.apiKey&&(e.OPENAI_API_KEY=r.apiKey),r.baseUrl&&(e.OPENAI_BASE_URL=r.baseUrl),e.QLOGICAGENT_MEMBER_ID=r.memberId,e.QLOGICAGENT_MEMBER_NAME=r.name,r.agentType&&(e.QLOGICAGENT_AGENT_TYPE=r.agentType),r.model&&(e.QLOGICAGENT_MODEL=r.model),r.env&&Object.assign(e,r.env),e}var Rs=2,wk=3e3,yt=3,xu=5e3;function vk(r){return new Promise(e=>setTimeout(e,r))}var bt=class r{processes=new Map;callbacks;cliBinaryPath;mcpBridgeScriptPath;constructor(e={}){this.callbacks=e;let t=pk(on(import.meta.url.startsWith("file://")?new URL(import.meta.url).pathname.replace(/^\/([A-Z]:)/,"$1"):process.cwd(),"..",".."));this.cliBinaryPath=on(t,"dist","cli.js"),this.mcpBridgeScriptPath=on(t,"dist","runtime","infra","mcp-bridge-server.js")}slog(e,t,n,o){let i=`[${new Date().toISOString()}] [${e}] [agent:${t}] [${n}] ${o}`;e==="warn"?this.callbacks.log?.warn(i):this.callbacks.log?.info(i)}async spawn(e){if(this.processes.has(e.memberId))throw new Error(`Agent process "${e.memberId}" already spawned`);let t=this.callbacks.log,n=Tk(e),o={memberId:e.memberId,name:e.name,pid:-1,cwd:e.cwd,state:"starting",startedAt:Date.now()};if(e.external)return this.spawnAcpAgentWithRetry(e,o,n);let s=[this.cliBinaryPath];e.verbose&&s.push("--verbose"),this.slog("info",e.memberId,"spawn",`spawning ${e.name} in ${e.cwd}`);let i=_s(process.execPath,s,{cwd:e.cwd,env:n,stdio:["pipe","pipe","pipe"],detached:!1});o.pid=i.pid??-1;let a=new Map;this.processes.set(e.memberId,{handle:o,child:i,pendingRpc:a}),co({input:i.stdout,crlfDelay:Number.POSITIVE_INFINITY}).on("line",u=>{let c=u.trim();if(c)try{let d=JSON.parse(c);if("id"in d&&typeof d.id=="number"){let p=a.get(d.id);if(p){clearTimeout(p.timer),a.delete(d.id);let m=d;m.error?p.reject(new Error(m.error.message)):p.resolve(m.result)}}if("method"in d&&!("id"in d)){let p=d;this.captureChildProgress(e.memberId,p.method,p.params),this.callbacks.onNotification?.(e.memberId,p.method,p.params)}}catch{this.slog("warn",e.memberId,"parse",`invalid JSON: ${c.slice(0,200)}`)}}),i.stderr&&co({input:i.stderr,crlfDelay:Number.POSITIVE_INFINITY}).on("line",c=>{this.callbacks.log?.debug?.(`[${new Date().toISOString()}] [debug] [agent:${e.memberId}] [stderr] ${c}`)}),i.on("exit",(u,c)=>{o.state!=="killed"&&(o.state=u===0?"completed":"failed"),o.endedAt=Date.now(),u!==0&&!o.error&&(o.error=`Process exited with code ${u} (signal: ${c})`);for(let[p,m]of a)clearTimeout(m.timer),m.reject(new Error(`Agent process exited (code=${u})`)),a.delete(p);this.callbacks.onStateChange?.(e.memberId,o.state),this.callbacks.onExit?.(e.memberId,u,c),this.slog("info",e.memberId,"exit",`exited (code=${u}, signal=${c})`)}),i.on("error",u=>{o.state="failed",o.error=u.message,o.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed"),this.slog("warn",e.memberId,"error",u.message)}),this.callbacks.onStateChange?.(e.memberId,"starting");try{let u=await this.sendRpc(e.memberId,"initialize",{protocolVersion:"1.0",clientInfo:{name:"qlogicagent-team-leader",version:"1.0.0"}},15e3);o.state="ready",this.callbacks.onStateChange?.(e.memberId,"ready"),this.slog("info",e.memberId,"handshake",`initialized (pid=${o.pid})`);let c=u;c&&typeof c.sessionId=="string"&&(o.sessionId=c.sessionId)}catch(u){throw o.state="failed",o.error=`Initialize handshake failed: ${u instanceof Error?u.message:String(u)}`,o.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed"),this.kill(e.memberId),new Error(o.error)}return o}async sendTask(e,t,n){let o=this.processes.get(e);if(!o)throw new Error(`No agent process: ${e}`);o.handle.state="running",this.callbacks.onStateChange?.(e,"running");try{let s;if(o.acpAdapter){let i=o.handle.sessionId??"default",a=await o.acpAdapter.sendPrompt(o.child,i,t,n?.timeout??3e5),u=(a.content?.map(c=>c.text).filter(Boolean)??[]).join(`
396
- `);o.handle.resultText=u,a.usage&&o.usageTracker&&o.usageTracker.onPromptResponseUsage(a.usage),s={content:u}}else{let i={content:t};n?.model&&(i.model=n.model),n?.apiKey&&(i.apiKey=n.apiKey),n?.baseUrl&&(i.baseUrl=n.baseUrl),n?.sessionId&&(i.sessionId=n.sessionId),s=await this.sendRpc(e,"thread.turn",i,n?.timeout??3e5);let a=s;a&&typeof a.content=="string"&&(o.handle.resultText=a.content)}return o.handle.state="completed",o.handle.endedAt=Date.now(),this.callbacks.onStateChange?.(e,"completed"),s}catch(s){throw o.handle.state="failed",o.handle.error=s instanceof Error?s.message:String(s),o.handle.endedAt=Date.now(),this.callbacks.onStateChange?.(e,"failed"),s}}async sendRpc(e,t,n,o=3e4){let s=this.processes.get(e);if(!s)throw new Error(`No agent process: ${e}`);let i=bk(t,n);return new Promise((a,l)=>{let u=setTimeout(()=>{s.pendingRpc.delete(i.id),l(new Error(`RPC timeout: ${t} (${o}ms)`))},o);s.pendingRpc.set(i.id,{resolve:a,reject:l,timer:u});try{s.child.stdin.write(`${JSON.stringify(i)}
397
- `)}catch(c){clearTimeout(u),s.pendingRpc.delete(i.id),l(c instanceof Error?c:new Error(String(c)))}})}async sendTaskAsync(e,t,n){let o=this.processes.get(e);if(!o)throw new Error(`No agent process: ${e}`);o.handle.state="running",this.callbacks.onStateChange?.(e,"running");let s={content:t};n?.model&&(s.model=n.model),n?.apiKey&&(s.apiKey=n.apiKey),n?.baseUrl&&(s.baseUrl=n.baseUrl),n?.sessionId&&(s.sessionId=n.sessionId);let i=n?.pingInterval??6e4,a=n?.pingTimeout??1e4,l=n?.timeout??0,u=Date.now(),c=l>0?l:1440*60*1e3,d=this.sendRpc(e,"thread.turn",s,c),p=setInterval(async()=>{if(l>0&&Date.now()-u>l){clearInterval(p),o.handle.state="failed",o.handle.error="Task timed out",o.handle.endedAt=Date.now(),this.callbacks.onStateChange?.(e,"failed");return}try{await this.sendRpc(e,"ping",void 0,a)}catch{this.slog("warn",o.handle.memberId,"heartbeat","ping failed")}},i);try{let m=await d;clearInterval(p),o.handle.state="completed",o.handle.endedAt=Date.now();let g=m;return g&&typeof g.content=="string"&&(o.handle.resultText=g.content),this.callbacks.onStateChange?.(e,"completed"),m}catch(m){throw clearInterval(p),o.handle.state="failed",o.handle.error=m instanceof Error?m.message:String(m),o.handle.endedAt=Date.now(),this.callbacks.onStateChange?.(e,"failed"),m}}async ping(e,t=5e3){let n=this.processes.get(e);if(!n)return!1;if(n.acpAdapter){try{let i=JSON.stringify({jsonrpc:"2.0",method:"notifications/ping",params:{timestamp:Date.now()}})+`
398
- `;n.child.stdin?.write(i)}catch{return!1}let o=n.handle.lastActivityAt??0,s=Date.now()+t;for(;Date.now()<s;)if(await new Promise(i=>setTimeout(i,500)),(n.handle.lastActivityAt??0)>o)return!0;try{return await this.sendRpc(e,"ping",void 0,Math.min(t,3e3)),!0}catch{return!1}}try{return await this.sendRpc(e,"ping",void 0,t),!0}catch{return!1}}getStatus(e){let t=this.processes.get(e);if(!t)return null;let{handle:n}=t,o=n.state==="starting"||n.state==="ready"||n.state==="running",s=o?Date.now()-n.startedAt:void 0,i=n.lastActivityAt&&o?Math.round((Date.now()-n.lastActivityAt)/1e3):void 0;return{alive:o,state:n.state,runningFor:s,resultText:n.resultText,error:n.error,mediaProgress:n.mediaProgress,lastToolCall:n.lastToolCall,idleFor:i}}captureChildProgress(e,t,n){let o=this.processes.get(e);if(!o)return;let{handle:s}=o;switch(s.lastActivityAt=Date.now(),t){case"turn.media_progress":{let i=n;i&&typeof i.taskId=="string"&&(s.mediaProgress={taskId:i.taskId,mediaType:i.mediaType??"unknown",percent:typeof i.percent=="number"?i.percent:0,status:i.status??"unknown",provider:i.provider,updatedAt:Date.now()});break}case"turn.tool_call":{let i=n;i&&typeof i.name=="string"&&(s.lastToolCall=i.name);break}case"turn.delta":{let i=n;i&&typeof i.text=="string"&&(s.lastDelta=i.text.slice(-200));break}case"turn.tool_result":{n&&s.mediaProgress&&s.mediaProgress.percent>=100&&(s.mediaProgress=void 0);break}}}async spawnAcpAgentWithRetry(e,t,n){let o=null;for(let s=0;s<=Rs;s++)try{if(s>0){this.processes.delete(e.memberId),t.state="starting",t.error=void 0,t.endedAt=void 0;let i=wk*s;this.slog("info",e.memberId,"spawn",`retry ${s}/${Rs} after ${i}ms`),await vk(i)}return await this.spawnAcpAgent(e,t,n)}catch(i){o=i instanceof Error?i:new Error(String(i)),this.slog("warn",e.memberId,"spawn",`attempt ${s+1} failed: ${o.message}`)}throw t.state="failed",t.error=`ACP spawn failed after ${Rs+1} attempts: ${o?.message}`,t.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed"),new Error(t.error)}async spawnAcpAgent(e,t,n){let o=this.callbacks.log,s=e.external;s.env&&Object.assign(n,s.env);let i=[...s.acpArgs];this.slog("info",e.memberId,"spawn",`spawning ACP ${e.name} via ${s.cliPath} ${i.join(" ")}`);let a=_s(s.cliPath,i,{cwd:e.cwd,env:n,stdio:["pipe","pipe","pipe"],detached:!1});t.pid=a.pid??-1;let l=new Map,u=new rt,c=new nn,{server:d,pipePath:p}=this.createMcpIpcServer(e.memberId);n.QLOGICAGENT_PARENT_RPC=p;let m;if(this.callbacks.sessionDir)try{fk(this.callbacks.sessionDir,{recursive:!0}),m=gk(on(this.callbacks.sessionDir,`${e.memberId}.stderr.log`),{flags:"a"})}catch{}this.processes.set(e.memberId,{handle:t,child:a,pendingRpc:l,acpAdapter:u,usageTracker:c,ipcServer:d,ipcPath:p,stderrStream:m}),u.attach(a,(g,f)=>{g==="usage_update"&&c.onUsageUpdate(f);let b=rt.translateNotification(g,f);b?(this.captureChildProgress(e.memberId,b.method,b.params),this.callbacks.onNotification?.(e.memberId,b.method,b.params)):(this.captureChildProgress(e.memberId,g,f),this.callbacks.onNotification?.(e.memberId,g,f))}),a.stderr&&co({input:a.stderr,crlfDelay:Number.POSITIVE_INFINITY}).on("line",f=>{this.callbacks.log?.debug?.(`[${new Date().toISOString()}] [debug] [agent:${e.memberId}] [stderr] ${f}`),m?.write(`${new Date().toISOString()} ${f}
399
- `)}),a.on("exit",(g,f)=>{u.detach();let b=t.state;if(b!=="killed"&&b!=="completed"&&g!==0){let w=this.processes.get(e.memberId)?.runtimeRestartCount??0;if(w<yt){let _=xu*2**w;this.slog("warn",e.memberId,"crash",`crashed (code=${g}), restarting ${w+1}/${yt} after ${_}ms`),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Process crashed (code=${g}, signal=${f}), restarting`,retriesLeft:yt-w-1}),setTimeout(()=>{this.attemptRuntimeRestart(e,n,w+1).catch(y=>{this.slog("warn",e.memberId,"restart",`failed: ${y instanceof Error?y.message:String(y)}`)})},_);return}}b!=="killed"&&(t.state=g===0?"completed":"failed"),t.endedAt=Date.now(),g!==0&&!t.error&&(t.error=`ACP process exited with code ${g} (signal: ${f})`),this.callbacks.onStateChange?.(e.memberId,t.state),this.callbacks.onExit?.(e.memberId,g,f),this.slog("info",e.memberId,"exit",`ACP exited (code=${g}, signal=${f})`)}),a.on("error",g=>{u.detach(),t.state="failed",t.error=g.message,t.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed"),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"spawn",error:g.message,retriesLeft:0}),this.slog("warn",e.memberId,"error",g.message)}),this.callbacks.onStateChange?.(e.memberId,"starting");try{let g=await u.initialize(a);t.state="ready",t.supportsResume=g.capabilities.supportsResume===!0,this.callbacks.onStateChange?.(e.memberId,"ready"),this.slog("info",e.memberId,"handshake",`ACP initialized (protocol=${g.protocolVersion}, resume=${t.supportsResume}, pid=${t.pid})`);try{let f={workspaceRoot:e.cwd},b=[...e.mcpServers??[]],T=this.processes.get(e.memberId);T?.ipcPath&&b.push({name:"qlogicagent-tools",command:process.execPath,args:[this.mcpBridgeScriptPath],env:{QLOGICAGENT_PARENT_RPC:T.ipcPath,QLOGICAGENT_SESSION_ID:e.memberId}}),b.length>0&&(f.mcpServers=b),e.systemPrompt&&(f.systemPrompt=e.systemPrompt);let w=await u.createSession(a,f);t.sessionId=w.id,this.slog("info",e.memberId,"session",`session created (id=${w.id})`)}catch(f){this.slog("warn",e.memberId,"session",`session creation failed: ${f instanceof Error?f.message:String(f)}`)}this.startHeartbeat(e.memberId,f=>{this.slog("warn",f,"heartbeat","hang detected \u2014 force-killing"),this.callbacks.onNotification?.(f,"agents.error",{agentId:f,phase:"heartbeat",error:`Agent ${e.name} stopped responding (${r.MAX_MISSED_BEATS} missed heartbeats)`,retriesLeft:0}),this.kill(f)})}catch(g){throw t.state="failed",t.error=`ACP handshake failed: ${g instanceof Error?g.message:String(g)}`,t.endedAt=Date.now(),u.detach(),this.callbacks.onStateChange?.(e.memberId,"failed"),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"handshake",error:t.error,retriesLeft:0}),this.kill(e.memberId),new Error(t.error)}return t}kill(e){let t=this.processes.get(e);if(t){this.stopHeartbeat(e),t.handle.state="killed",t.handle.endedAt=Date.now(),t.acpAdapter?.detach();try{t.ipcServer?.close()}catch{}try{t.stderrStream?.end()}catch{}try{t.child.kill("SIGTERM"),setTimeout(()=>{try{t.child.kill("SIGKILL")}catch{}},1e4)}catch{}this.callbacks.onStateChange?.(e,"killed"),this.slog("info",e,"kill",`killed (pid=${t.handle.pid})`)}}killAll(){for(let e of this.processes.keys())this.kill(e)}getHandle(e){return this.processes.get(e)?.handle}getAllHandles(){return[...this.processes.values()].map(e=>e.handle)}getUsageTracker(e){return this.processes.get(e)?.usageTracker??null}createMcpIpcServer(e){let t=e.replace(/[^a-zA-Z0-9-]/g,"-"),n=process.platform==="win32"?`\\\\.\\pipe\\qlogicagent-mcp-${t}-${Date.now()}`:on(hk(),`qlogicagent-mcp-${t}-${Date.now()}.sock`),o=mk(s=>{let i="";s.on("data",a=>{i+=a.toString();let l;for(;(l=i.indexOf(`
400
- `))!==-1;){let u=i.slice(0,l).trim();i=i.slice(l+1),u&&this.handleMcpIpcMessage(e,u,s)}})});return o.listen(n),o.on("error",s=>{this.slog("warn",e,"mcp-ipc",`server error: ${s.message}`)}),{server:o,pipePath:n}}handleMcpIpcMessage(e,t,n){let o;try{o=JSON.parse(t)}catch{return}if(o.method==="mcp.toolCall"&&o.id!==void 0){let s=typeof o.params?.tool=="string"?o.params.tool:"",i=o.params?.arguments??{};if(!this.callbacks.onMcpToolCall){let a=JSON.stringify({jsonrpc:"2.0",id:o.id,error:{code:-32601,message:"No onMcpToolCall handler"}})+`
401
- `;try{n.write(a)}catch{}return}this.callbacks.onMcpToolCall(e,s,i).then(a=>{let l=JSON.stringify({jsonrpc:"2.0",id:o.id,result:a})+`
402
- `;try{n.write(l)}catch{}}).catch(a=>{let l=JSON.stringify({jsonrpc:"2.0",id:o.id,error:{code:-32603,message:a instanceof Error?a.message:String(a)}})+`
403
- `;try{n.write(l)}catch{}})}else if(o.id!==void 0){let s=JSON.stringify({jsonrpc:"2.0",id:o.id,error:{code:-32601,message:`Unknown IPC method: ${o.method}`}})+`
404
- `;try{n.write(s)}catch{}}}async attemptRuntimeRestart(e,t,n){let o=this.callbacks.log,s=this.processes.get(e.memberId),i=s?.ipcServer,a=s?.ipcPath,l=s?.stderrStream;this.processes.delete(e.memberId);try{let u={memberId:e.memberId,name:e.name,pid:-1,cwd:e.cwd,state:"starting",startedAt:Date.now()},c=e.external,d=[...c.acpArgs];a&&(t.QLOGICAGENT_PARENT_RPC=a);let p=_s(c.cliPath,d,{cwd:e.cwd,env:t,stdio:["pipe","pipe","pipe"],detached:!1});u.pid=p.pid??-1;let m=new Map,g=new rt,f=new nn;this.processes.set(e.memberId,{handle:u,child:p,pendingRpc:m,acpAdapter:g,usageTracker:f,ipcServer:i,ipcPath:a,stderrStream:l,runtimeRestartCount:n}),g.attach(p,(w,_)=>{w==="usage_update"&&f.onUsageUpdate(_);let y=rt.translateNotification(w,_);y?(this.captureChildProgress(e.memberId,y.method,y.params),this.callbacks.onNotification?.(e.memberId,y.method,y.params)):(this.captureChildProgress(e.memberId,w,_),this.callbacks.onNotification?.(e.memberId,w,_))}),p.stderr&&co({input:p.stderr,crlfDelay:Number.POSITIVE_INFINITY}).on("line",_=>{this.callbacks.log?.debug?.(`[${new Date().toISOString()}] [debug] [agent:${e.memberId}] [stderr] ${_}`),l?.write(`${new Date().toISOString()} ${_}
405
- `)}),p.on("exit",(w,_)=>{g.detach();let y=u.state;if(y!=="killed"&&y!=="completed"&&w!==0){let E=this.processes.get(e.memberId)?.runtimeRestartCount??n;if(E<yt){let D=xu*2**E;this.slog("warn",e.memberId,"crash",`crashed again (code=${w}), restart ${E+1}/${yt}`),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Process crashed (code=${w}), restarting`,retriesLeft:yt-E-1}),setTimeout(()=>{this.attemptRuntimeRestart(e,t,E+1).catch(L=>{this.slog("warn",e.memberId,"restart",`failed: ${L instanceof Error?L.message:String(L)}`)})},D);return}}y!=="killed"&&(u.state=w===0?"completed":"failed"),u.endedAt=Date.now(),w!==0&&!u.error&&(u.error=`ACP process exited with code ${w} (signal: ${_})`),this.callbacks.onStateChange?.(e.memberId,u.state),this.callbacks.onExit?.(e.memberId,w,_)}),p.on("error",w=>{g.detach(),u.state="failed",u.error=w.message,u.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed")}),this.callbacks.onStateChange?.(e.memberId,"starting");let b=await g.initialize(p);u.state="ready",u.supportsResume=b.capabilities.supportsResume===!0,this.callbacks.onStateChange?.(e.memberId,"ready"),this.slog("info",e.memberId,"restart",`ACP restarted (attempt=${n}, protocol=${b.protocolVersion}, resume=${u.supportsResume}, pid=${u.pid})`);let T=[...e.mcpServers??[]];a&&T.push({name:"qlogicagent-tools",command:process.execPath,args:[this.mcpBridgeScriptPath],env:{QLOGICAGENT_PARENT_RPC:a,QLOGICAGENT_SESSION_ID:e.memberId}});try{if(u.supportsResume&&u.sessionId){let w=await g.resumeSession(p,u.sessionId,{workspaceRoot:e.cwd,mcpServers:T.length>0?T:void 0});u.sessionId=w.id,this.slog("info",e.memberId,"session",`session resumed (id=${u.sessionId})`)}else{let w={workspaceRoot:e.cwd};T.length>0&&(w.mcpServers=T),e.systemPrompt&&(w.systemPrompt=e.systemPrompt);let _=await g.createSession(p,w);u.sessionId=_.id,this.slog("info",e.memberId,"session",`new session on restart (id=${u.sessionId})`)}}catch{this.slog("warn",e.memberId,"session","session re-creation failed on restart")}this.startHeartbeat(e.memberId,w=>{this.slog("warn",w,"heartbeat","hang detected \u2014 force-killing"),this.callbacks.onNotification?.(w,"agents.error",{agentId:w,phase:"heartbeat",error:`Agent ${e.name} stopped responding`,retriesLeft:0}),this.kill(w)})}catch(u){let c=this.processes.get(e.memberId);c&&(c.handle.state="failed",c.handle.error=`Runtime restart failed: ${u instanceof Error?u.message:String(u)}`,c.handle.endedAt=Date.now()),this.callbacks.onStateChange?.(e.memberId,"failed"),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Restart failed after ${n} attempts: ${u instanceof Error?u.message:String(u)}`,retriesLeft:0})}}getMcpIpcPath(e){return this.processes.get(e)?.ipcPath}heartbeatTimers=new Map;missedBeats=new Map;static HEARTBEAT_INTERVAL=3e4;static MAX_MISSED_BEATS=3;startHeartbeat(e,t){this.stopHeartbeat(e),this.missedBeats.set(e,0);let n=setInterval(async()=>{let o=this.processes.get(e);if(!o||o.handle.state==="completed"||o.handle.state==="failed"||o.handle.state==="killed"){this.stopHeartbeat(e);return}if(await this.ping(e,1e4)){this.missedBeats.set(e,0);return}let i=(this.missedBeats.get(e)??0)+1;this.missedBeats.set(e,i),this.slog("warn",e,"heartbeat",`missed (${i}/${r.MAX_MISSED_BEATS})`),i>=r.MAX_MISSED_BEATS&&(this.slog("warn",e,"heartbeat","hang detected, force-killing"),this.stopHeartbeat(e),o.handle.error=`Hang detected: ${i} consecutive heartbeat failures`,this.kill(e),t?.(e))},r.HEARTBEAT_INTERVAL);this.heartbeatTimers.set(e,n)}stopHeartbeat(e){let t=this.heartbeatTimers.get(e);t&&(clearInterval(t),this.heartbeatTimers.delete(e)),this.missedBeats.delete(e)}getMissedBeats(e){return this.missedBeats.get(e)??0}activeCount(){return[...this.processes.values()].filter(e=>e.handle.state==="starting"||e.handle.state==="ready"||e.handle.state==="running").length}remove(e){let t=this.processes.get(e);t&&(this.stopHeartbeat(e),(t.handle.state==="running"||t.handle.state==="starting"||t.handle.state==="ready")&&this.kill(e),this.processes.delete(e))}dispose(){for(let e of this.heartbeatTimers.keys())this.stopHeartbeat(e);for(let e of this.processes.values()){try{e.ipcServer?.close()}catch{}try{e.stderrStream?.end()}catch{}}this.killAll(),this.processes.clear()}};import{join as Cu}from"node:path";import{chmod as Ek}from"node:fs/promises";import{readFile as xk,writeFile as Sk,mkdir as _k,rename as Rk,unlink as Ck}from"node:fs/promises";import{dirname as Ak,join as Su}from"node:path";import{randomUUID as Mk}from"node:crypto";async function Pk(r,e){let t=Ak(r);await _k(t,{recursive:!0});let n=Su(t,`.tmp-${Mk()}`);try{await Sk(n,e,"utf-8"),await Rk(n,r)}catch(o){throw await Ck(n).catch(()=>{}),o}}async function kt(r){try{let e=await xk(r,"utf-8");return JSON.parse(e)}catch(e){if(e.code==="ENOENT")return;throw e}}async function rn(r,e){await Pk(r,JSON.stringify(e,null,2)+`
406
- `)}var Ik="memory.json";function uo(){return Su(G(),Ik)}async function _u(){return kt(uo())}async function Cs(r){let e={...r,savedAt:new Date().toISOString()};await rn(uo(),e)}var Au="agent-configs.json";function Ru(){return Cu(G(),Au)}function Ok(r){return Cu(Fe(r),Au)}function Lk(){return{agents:{}}}var po=class{data=Lk();cwd;constructor(e){this.cwd=e}async load(){let e=await kt(Ru()),t=this.cwd?await kt(Ok(this.cwd)):void 0,n={gatewayUrl:e?.gatewayUrl,agents:{...e?.agents},customAgents:{...e?.customAgents}};if(t){t.gatewayUrl&&(n.gatewayUrl=t.gatewayUrl);for(let[o,s]of Object.entries(t.agents??{}))n.agents[o]={...n.agents[o],...s};for(let[o,s]of Object.entries(t.customAgents??{}))n.customAgents??={},n.customAgents[o]=s}this.data=n}getData(){return this.data}getAgentConfig(e){return this.data.agents[e]??null}async setAgentConfig(e,t){this.data.agents[e]={...this.data.agents[e],...t},await this.save()}async removeAgentConfig(e){delete this.data.agents[e],await this.save()}getGatewayUrl(){return this.data.gatewayUrl}async setGatewayUrl(e){this.data.gatewayUrl=e,await this.save()}registerCustomAgent(e){this.data.customAgents??={},this.data.customAgents[e.id]=e}unregisterCustomAgent(e){this.data.customAgents&&delete this.data.customAgents[e]}getCustomAgents(){return{...this.data.customAgents}}async save(){let e=Ru();await rn(e,this.data);try{await Ek(e,384)}catch{}}};import{randomUUID as jk}from"node:crypto";import{execFile as $k}from"node:child_process";import{promisify as Dk}from"node:util";import{join as Mu}from"node:path";import{mkdir as Uk,rm as Nk}from"node:fs/promises";var Tt=Dk($k);async function sn(r){try{let{stdout:e}=await Tt("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8"});return e.trim()}catch{return null}}async function mo(r,e,t){let n=Mu(r,".worktrees");await Uk(n,{recursive:!0});let o=Mu(n,e),i=["worktree","add","-B",`solo/${e}`,o];return t?i.push(t):i.push("HEAD"),await Tt("git",i,{cwd:r,encoding:"utf8"}),o}async function Pu(r){try{await Tt("git",["add","-A"],{cwd:r});let{stdout:e}=await Tt("git",["diff","--cached","--stat"],{cwd:r,encoding:"utf8"});return e.trim()}catch{return""}}async function Iu(r,e){try{await Tt("git",["worktree","remove","--force",e],{cwd:r,encoding:"utf8"})}catch{try{await Nk(e,{recursive:!0,force:!0})}catch{}}}async function Eu(r,e){let{stdout:t}=await Tt("git",["merge","--no-ff",e,"-m",`solo: merge ${e}`],{cwd:r,encoding:"utf8"});return t.trim()}var go=class{constructor(e,t,n,o={}){this.processManager=e;this.acpDetector=t;this.configStore=n;this.callbacks=o}processManager;acpDetector;configStore;callbacks;sessions=new Map;async start(e){let{task:t,agents:n,cwd:o}=e;if(n.length<2)throw new Error("Solo Mode requires at least 2 agents");let s=await sn(o);if(!s)throw new Error("Solo Mode requires a git repository");let i=`solo-${jk().slice(0,8)}`,a={soloId:i,state:"running",task:t,cwd:o,gitRoot:s,agents:[],createdAt:Date.now()};this.sessions.set(i,a),this.callbacks.log?.info(`[solo] starting ${i} with ${n.length} agents`);let l=n.map(async(c,d)=>{let p=`${i}-${c}-${d}`,m=`solo/${p}`,g=`${i}:${c}:${d}`,f;try{f=await mo(s,p)}catch(T){this.callbacks.log?.warn(`[solo] worktree creation failed for ${c}: ${T instanceof Error?T.message:String(T)}`);let w={agentId:c,memberId:g,worktreePath:"",worktreeBranch:m,state:"failed",error:`Worktree creation failed: ${T instanceof Error?T.message:String(T)}`};a.agents.push(w);return}let b={agentId:c,memberId:g,worktreePath:f,worktreeBranch:m,state:"pending"};a.agents.push(b);try{b.state="running",this.callbacks.onProgress?.(i,c,"running");let T=this.acpDetector.buildExternalDescriptor(c);if(!T)throw new Error(`Agent ${c} is not available or not ACP-compatible`);await this.processManager.spawn({memberId:g,name:`solo-${c}`,cwd:f,prompt:t,external:T});let w=this.processManager.getHandle(g);if(!w||w.state!=="ready")throw new Error(`Agent ${c} spawn did not reach ready state`);let _=await this.processManager.sendTask(g,t);b.state="completed",b.resultText=typeof _=="string"?_:JSON.stringify(_),b.diff=await Pu(f);let y=this.processManager.getUsageTracker(g);if(y?.hasData()){let C=y.getUsage();b.usage={inputTokens:C.inputTokens,outputTokens:C.outputTokens}}this.callbacks.onProgress?.(i,c,"completed"),this.callbacks.log?.info(`[solo] ${c} completed (diff: ${b.diff?"yes":"none"})`)}catch(T){b.state="failed",b.error=T instanceof Error?T.message:String(T),this.callbacks.onProgress?.(i,c,"failed",b.error),this.callbacks.log?.warn(`[solo] ${c} failed: ${b.error}`)}});await Promise.allSettled(l);let u=a.agents.filter(c=>c.state==="completed");if(u.length===0)return a.state="failed",this.callbacks.log?.warn(`[solo] all agents failed for ${i}`),i;a.state="evaluating",this.callbacks.log?.info(`[solo] evaluating ${u.length} results for ${i}`);try{let c=await this.evaluate(a,u);a.evaluation=c,a.state="completed",this.callbacks.onEvaluation?.(i,c)}catch(c){a.state="completed",this.callbacks.log?.warn(`[solo] evaluation failed for ${i}: ${c instanceof Error?c.message:String(c)}`)}return i}getStatus(e){let t=this.sessions.get(e);return t?{soloId:t.soloId,state:t.state,agents:t.agents.map(n=>({id:n.agentId,state:n.state,progress:n.state==="running"?"Working...":void 0,resultText:n.resultText,diff:n.diff,usage:n.usage,error:n.error,worktreePath:n.worktreePath})),evaluation:t.evaluation}:null}async cancel(e){let t=this.sessions.get(e);if(!t)throw new Error(`Solo session ${e} not found`);if(t.state!=="running"&&t.state!=="evaluating")throw new Error(`Solo session ${e} is not running (state: ${t.state})`);t.state="cancelled";for(let n of t.agents)if(n.state==="running"||n.state==="pending"){n.state="failed",n.error="Cancelled by user";try{this.processManager.kill(n.memberId)}catch{}}await this.cleanupWorktrees(t),this.callbacks.log?.info(`[solo] cancelled ${e}`)}async select(e){let t=this.sessions.get(e.soloId);if(!t)throw new Error(`Solo session ${e.soloId} not found`);if(t.state!=="completed")throw new Error(`Solo session ${e.soloId} is not completed (state: ${t.state})`);let n=t.agents.find(s=>s.agentId===e.winnerId&&s.state==="completed");if(!n)throw new Error(`Agent ${e.winnerId} is not a completed participant in ${e.soloId}`);let o=await Eu(t.gitRoot,n.worktreeBranch);return this.callbacks.log?.info(`[solo] merged ${n.worktreeBranch}: ${o}`),await this.cleanupWorktrees(t),n.worktreeBranch}listSessions(){return[...this.sessions.values()].map(e=>this.getStatus(e.soloId))}async delete(e){let t=this.sessions.get(e);if(!t)throw new Error(`Solo session ${e} not found`);if(t.state==="running"||t.state==="evaluating"){t.state="cancelled";for(let n of t.agents)if(n.state==="running"||n.state==="pending"){n.state="failed",n.error="Deleted";try{this.processManager.kill(n.memberId)}catch{}}await this.cleanupWorktrees(t)}this.sessions.delete(e),this.callbacks.log?.info(`[solo] deleted ${e}`)}async evaluate(e,t){if(t.length===1)return{winnerId:t[0].agentId,reasoning:`Only one agent (${t[0].agentId}) completed successfully.`};let n=["# Task Evaluation","","## Original Task",e.task,"","## Agent Results",""];for(let i of t)n.push(`### Agent: ${i.agentId}`,"","**Result:**",i.resultText??"(no output)","","**Changes (git diff stat):**",i.diff||"(no changes)","");n.push("## Instructions","","Review all agent results above. Select the best implementation and explain your reasoning.","Respond in this exact format:","","WINNER: <agent-id>","REASONING: <your explanation>");let o=n.join(`
407
- `),s=t[0].memberId;try{let i=await this.processManager.sendTask(s,o),a=typeof i=="string"?i:JSON.stringify(i);return this.parseEvaluationResponse(a,t)}catch{return{winnerId:t[0].agentId,reasoning:"Evaluation failed; defaulting to first completed agent."}}}parseEvaluationResponse(e,t){let n=e.match(/WINNER:\s*(\S+)/i),o=e.match(/REASONING:\s*(.+)/is),s=t.map(a=>a.agentId),i=n?.[1];if(i&&s.includes(i))return{winnerId:i,reasoning:o?.[1]?.trim()||"Selected by leader evaluation."};for(let a of s)if(e.includes(a))return{winnerId:a,reasoning:o?.[1]?.trim()||e.slice(0,500)};return{winnerId:t[0].agentId,reasoning:`Could not parse evaluation. Full response: ${e.slice(0,500)}`}}async cleanupWorktrees(e){for(let t of e.agents)if(t.worktreePath)try{try{this.processManager.kill(t.memberId)}catch{}this.processManager.remove(t.memberId),await Iu(e.gitRoot,t.worktreePath)}catch(n){this.callbacks.log?.warn(`[solo] failed to clean worktree for ${t.agentId}: ${n instanceof Error?n.message:String(n)}`)}}};import{randomUUID as Wk}from"node:crypto";var an=class{nodes=new Map;constructor(e){for(let t of e){if(this.nodes.has(t.taskId))throw new Error(`Duplicate task ID: ${t.taskId}`);this.nodes.set(t.taskId,{taskId:t.taskId,assignee:t.assignee,prompt:t.prompt,dependsOn:t.dependsOn??[],status:"pending"})}this.validateDag()}getAllTasks(){return[...this.nodes.values()]}getTask(e){return this.nodes.get(e)}getReadyTasks(){let e=[];for(let t of this.nodes.values()){if(t.status!=="pending")continue;t.dependsOn.every(o=>this.nodes.get(o)?.status==="completed")&&e.push(t)}return e}markRunning(e){let t=this.nodes.get(e);if(!t)throw new Error(`Unknown task: ${e}`);if(t.status!=="pending")throw new Error(`Task ${e} is ${t.status}, cannot start`);t.status="running",t.startedAt=Date.now()}markCompleted(e,t){let n=this.nodes.get(e);if(!n)throw new Error(`Unknown task: ${e}`);if(n.status!=="running")throw new Error(`Task ${e} is ${n.status}, cannot complete`);n.status="completed",n.result=t,n.completedAt=Date.now()}markFailed(e,t){let n=this.nodes.get(e);if(!n)throw new Error(`Unknown task: ${e}`);n.status="failed",n.error=t,n.completedAt=Date.now()}markPaused(e){let t=this.nodes.get(e);if(!t)throw new Error(`Unknown task: ${e}`);t.status==="running"&&(t.status="paused")}resumePaused(e){let t=this.nodes.get(e);if(!t)throw new Error(`Unknown task: ${e}`);t.status==="paused"&&(t.status="pending")}isFinished(){for(let e of this.nodes.values())if(e.status==="running"||e.status==="paused"||e.status==="pending"&&!e.dependsOn.some(n=>this.nodes.get(n)?.status==="failed"))return!1;return!0}isAllCompleted(){return[...this.nodes.values()].every(e=>e.status==="completed")}getBlockedTasks(){return[...this.nodes.values()].filter(e=>e.status!=="pending"?!1:e.dependsOn.some(t=>this.nodes.get(t)?.status==="failed"))}pauseAll(){for(let e of this.nodes.values())e.status==="running"&&(e.status="paused")}resumeAll(){for(let e of this.nodes.values())e.status==="paused"&&(e.status="pending")}serialize(){return[...this.nodes.values()].map(e=>({taskId:e.taskId,assignee:e.assignee,prompt:e.prompt,dependsOn:e.dependsOn,status:e.status,result:e.result,error:e.error,startedAt:e.startedAt,completedAt:e.completedAt}))}restore(e){for(let t of e){let n=this.nodes.get(t.taskId);n&&(n.status=t.status==="running"?"pending":t.status,n.result=t.result,n.error=t.error,n.startedAt=t.startedAt,n.completedAt=t.completedAt)}}validateDag(){for(let o of this.nodes.values())for(let s of o.dependsOn)if(!this.nodes.has(s))throw new Error(`Task "${o.taskId}" depends on unknown task "${s}"`);let e=new Set,t=new Set,n=o=>{if(t.has(o))throw new Error(`Cycle detected involving task "${o}"`);if(e.has(o))return;t.add(o);let s=this.nodes.get(o);for(let i of s.dependsOn)n(i);t.delete(o),e.add(o)};for(let o of this.nodes.keys())n(o)}};var ln=class{maxTotalTokens;maxDuration;usedTokens=0;startedAt;warningEmitted=!1;constructor(e){this.maxTotalTokens=e?.maxTotalTokens,this.maxDuration=e?.maxDuration,this.startedAt=Date.now()}addUsage(e,t){this.usedTokens+=e+t}addFromTracker(e){if(!e.hasData())return;let t=e.getUsage();this.usedTokens+=t.totalTokens}getElapsed(){return Date.now()-this.startedAt}getBudget(){return{maxTotalTokens:this.maxTotalTokens,maxDuration:this.maxDuration,usedTokens:this.usedTokens,elapsed:this.getElapsed()}}check(){let e=this.getElapsed();if(this.maxDuration&&e>=this.maxDuration)return{action:"exceeded",percentage:Math.round(e/this.maxDuration*100),usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration};if(this.maxTotalTokens){let n=Math.round(this.usedTokens/this.maxTotalTokens*100);if(this.usedTokens>=this.maxTotalTokens)return{action:"exceeded",percentage:n,usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration};if(n>=80&&!this.warningEmitted)return this.warningEmitted=!0,{action:"warning",percentage:n,usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration}}return{action:"ok",percentage:this.maxTotalTokens?Math.round(this.usedTokens/this.maxTotalTokens*100):0,usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration}}restore(e){this.usedTokens=e.usedTokens,this.startedAt=e.startedAt,this.warningEmitted=e.warningEmitted}serialize(){return{usedTokens:this.usedTokens,startedAt:this.startedAt,warningEmitted:this.warningEmitted}}};import{join as As}from"node:path";import{mkdir as Fk,readdir as Bk}from"node:fs/promises";function Ou(r){return As(Fe(r),"products")}function Lu(r,e){return As(Ou(e),r)}function $u(r,e){return As(Lu(r,e),"product-state.json")}async function Du(r,e){let t=Lu(r.productId,e);await Fk(t,{recursive:!0}),await rn($u(r.productId,e),r)}async function Ms(r,e){return kt($u(r,e))}async function Uu(r){let e=Ou(r),t;try{t=await Bk(e)}catch{return[]}let n=[];for(let o of t){let s=await Ms(o,r);s&&n.push(s)}return n}var cn=class r{constructor(e={}){this.callbacks=e}callbacks;static DEFAULT_INTERVAL=5*6e4;static LONG_RUNNING_INTERVAL=30*6e4;static LONG_RUNNING_THRESHOLD=2880*6e4;timer=null;lastCheckpointAt=0;cwd;start(e){this.cwd=e,this.stop(),this.timer=setInterval(()=>{let t=this.callbacks.getState?.();t&&this.checkpoint(t).catch(n=>{this.callbacks.log?.warn(`[checkpoint] periodic save failed: ${n instanceof Error?n.message:String(n)}`)})},r.DEFAULT_INTERVAL),this.timer.unref()}stop(){this.timer&&(clearInterval(this.timer),this.timer=null)}getInterval(e){return e>r.LONG_RUNNING_THRESHOLD?r.LONG_RUNNING_INTERVAL:r.DEFAULT_INTERVAL}isDue(e){if(this.lastCheckpointAt===0)return!0;let t=this.getInterval(e);return Date.now()-this.lastCheckpointAt>=t}async checkpoint(e){let t=new Date().toISOString();e.lastCheckpointAt=t,await Du(e,this.cwd),this.lastCheckpointAt=Date.now(),this.callbacks.onCheckpoint?.(e.productId,t),this.callbacks.log?.info(`[checkpoint] saved ${e.productId} at ${t}`)}getLastCheckpointAt(){return this.lastCheckpointAt}};var fo=class{constructor(e,t,n,o={}){this.processManager=e;this.acpDetector=t;this.configStore=n;this.callbacks=o}processManager;acpDetector;configStore;callbacks;sessions=new Map;async create(e){let{name:t,cwd:n,instances:o,tasks:s,budget:i}=e;if(o.length===0)throw new Error("Product requires at least 1 instance");if(s.length===0)throw new Error("Product requires at least 1 task");let a=new Set(o.map(f=>f.name));for(let f of s)if(!a.has(f.assignee))throw new Error(`Task "${f.taskId}" references unknown instance "${f.assignee}"`);let l=`product-${Wk().slice(0,8)}`,u=new an(s),c=new ln(i),d=new cn({onCheckpoint:(f,b)=>this.callbacks.onCheckpointed?.(f,b),getState:()=>{let f=this.sessions.get(l);return f?this.buildPersistedState(f):null},log:this.callbacks.log}),p=await sn(n),m=o.map((f,b)=>({instanceId:`${l}:${f.name}:${b}`,name:f.name,agentId:f.agentId,state:"idle"})),g={productId:l,name:t,cwd:n,phase:"active",instances:m,dag:u,budget:c,checkpoint:d,createdAt:new Date().toISOString(),gitRoot:p};return this.sessions.set(l,g),d.start(n),this.callbacks.log?.info(`[product] created ${l} "${t}" with ${o.length} instances, ${s.length} tasks`),this.scheduleNext(g),l}async resume(e,t){let n=await Ms(e,t);if(!n)throw new Error(`Product ${e} not found on disk`);let o=new an(n.tasks);o.restore(n.tasks);let s=new ln({maxTotalTokens:n.budget.maxTotalTokens,maxDuration:n.budget.maxDuration});s.restore(n.budget);let i=new cn({onCheckpoint:(c,d)=>this.callbacks.onCheckpointed?.(c,d),getState:()=>{let c=this.sessions.get(e);return c?this.buildPersistedState(c):null},log:this.callbacks.log}),a=await sn(n.cwd),l=n.instances.map((c,d)=>({instanceId:`${e}:${c.name}:${d}`,name:c.name,agentId:c.agentId,state:"idle"})),u={productId:n.productId,name:n.name,cwd:n.cwd,phase:"active",instances:l,dag:o,budget:s,checkpoint:i,createdAt:n.createdAt,gitRoot:a};this.sessions.set(e,u),i.start(n.cwd),this.callbacks.log?.info(`[product] resumed ${e}`),this.scheduleNext(u)}async pause(e){let t=this.sessions.get(e);if(!t)throw new Error(`Product ${e} not found`);if(t.phase!=="active")throw new Error(`Product ${e} is not active`);t.phase="paused",t.dag.pauseAll();for(let n of t.instances)if(n.state==="running"&&n.memberId){try{this.processManager.kill(n.memberId)}catch{}n.state="paused"}await t.checkpoint.checkpoint(this.buildPersistedState(t)),t.checkpoint.stop(),this.callbacks.log?.info(`[product] paused ${e}`)}async checkpoint(e){let t=this.sessions.get(e);if(!t)throw new Error(`Product ${e} not found`);await t.checkpoint.checkpoint(this.buildPersistedState(t))}async delete(e){let t=this.sessions.get(e);if(!t)throw new Error(`Product ${e} not found`);if(t.phase==="active"){t.phase="failed",t.dag.pauseAll();for(let n of t.instances)if(n.state==="running"&&n.memberId){try{this.processManager.kill(n.memberId)}catch{}n.state="failed"}}t.checkpoint.stop(),this.sessions.delete(e),this.callbacks.log?.info(`[product] deleted ${e}`)}getStatus(e){let t=this.sessions.get(e);return t?{productId:t.productId,name:t.name,phase:t.phase,instances:t.instances.map(n=>{let s=(n.memberId?this.processManager.getUsageTracker(n.memberId):null)?.getUsage();return{instanceId:n.instanceId,name:n.name,agentId:n.agentId,state:n.state,worktreePath:n.worktreePath,usage:s&&(s.inputTokens>0||s.outputTokens>0)?{inputTokens:s.inputTokens,outputTokens:s.outputTokens}:void 0}}),tasks:t.dag.getAllTasks().map(n=>({taskId:n.taskId,assignee:n.assignee,status:n.status,result:n.result,error:n.error,startedAt:n.startedAt?new Date(n.startedAt).toISOString():void 0,completedAt:n.completedAt?new Date(n.completedAt).toISOString():void 0})),budget:t.budget.getBudget(),lastCheckpointAt:new Date(t.checkpoint.getLastCheckpointAt()||Date.now()).toISOString()}:null}async list(e){let t=[];for(let o of this.sessions.values()){let s=o.dag.getAllTasks();t.push({productId:o.productId,name:o.name,phase:o.phase,instanceCount:o.instances.length,taskCount:s.length,completedTasks:s.filter(i=>i.status==="completed").length,createdAt:o.createdAt,lastCheckpointAt:new Date(o.checkpoint.getLastCheckpointAt()||Date.now()).toISOString()})}let n=await Uu(e);for(let o of n)this.sessions.has(o.productId)||t.push({productId:o.productId,name:o.name,phase:o.phase,instanceCount:o.instances.length,taskCount:o.tasks.length,completedTasks:o.tasks.filter(s=>s.status==="completed").length,createdAt:o.createdAt,lastCheckpointAt:o.lastCheckpointAt});return t}scheduleNext(e){if(e.phase!=="active")return;let t=e.budget.check();if(t.action==="exceeded"){this.callbacks.log?.warn(`[product] ${e.productId} budget exceeded, auto-pausing`),this.pause(e.productId).catch(o=>{this.callbacks.log?.warn(`[product] auto-pause failed: ${o instanceof Error?o.message:String(o)}`)});return}if(t.action==="warning"&&this.callbacks.onBudgetWarning?.(e.productId,t.usedTokens,t.maxTotalTokens,t.percentage),e.dag.isFinished()){this.finishProduct(e);return}let n=e.dag.getReadyTasks();for(let o of n)this.dispatchTask(e,o)}dispatchTask(e,t){let n=e.instances.find(o=>o.name===t.assignee);if(!n){e.dag.markFailed(t.taskId,`No instance found for assignee "${t.assignee}"`),this.callbacks.onTaskFailed?.(e.productId,t.taskId,`No instance for "${t.assignee}"`),this.scheduleNext(e);return}e.dag.markRunning(t.taskId),n.state="running",this.callbacks.onTaskStarted?.(e.productId,t.taskId,t.assignee),this.callbacks.log?.info(`[product] ${e.productId} dispatching task ${t.taskId} to ${t.assignee}`),this.runTask(e,n,t).catch(o=>{this.callbacks.log?.warn(`[product] task dispatch error: ${o instanceof Error?o.message:String(o)}`)})}async runTask(e,t,n){let o=`${e.productId}:${t.name}:${n.taskId}`;t.memberId=o;try{let s=this.acpDetector.buildExternalDescriptor(t.agentId);if(!s)throw new Error(`Agent ${t.agentId} is not available`);let i=e.cwd;if(e.gitRoot){let c=`${e.productId}-${t.name}-${n.taskId}`;try{i=await mo(e.gitRoot,c),t.worktreePath=i}catch{this.callbacks.log?.warn(`[product] worktree creation failed for ${n.taskId}, using project cwd`)}}await this.processManager.spawn({memberId:o,name:`product-${t.name}`,cwd:i,prompt:n.prompt,external:s});let a=await this.processManager.sendTask(o,n.prompt),l=typeof a=="string"?a:JSON.stringify(a),u=this.processManager.getUsageTracker(o);if(u?.hasData()){let c=u.getUsage();e.budget.addUsage(c.inputTokens,c.outputTokens)}e.dag.markCompleted(n.taskId,l),t.state="completed",this.callbacks.onTaskCompleted?.(e.productId,n.taskId,l);try{this.processManager.kill(o)}catch{}this.processManager.remove(o)}catch(s){let i=s instanceof Error?s.message:String(s);e.dag.markFailed(n.taskId,i),t.state="failed",this.callbacks.onTaskFailed?.(e.productId,n.taskId,i);try{this.processManager.kill(o)}catch{}try{this.processManager.remove(o)}catch{}}try{await e.checkpoint.checkpoint(this.buildPersistedState(e))}catch(s){this.callbacks.log?.warn(`[product] checkpoint failed: ${s instanceof Error?s.message:String(s)}`)}this.scheduleNext(e)}finishProduct(e){if(e.dag.isAllCompleted()){e.phase="completed";let t=e.dag.getAllTasks(),n=`Product "${e.name}" completed: ${t.length} tasks all done.`;this.callbacks.onCompleted?.(e.productId,n)}else{e.phase="failed";let n=e.dag.getAllTasks().filter(i=>i.status==="failed").length,o=e.dag.getBlockedTasks().length,s=`Product "${e.name}" finished with ${n} failed, ${o} blocked tasks.`;this.callbacks.onCompleted?.(e.productId,s)}e.checkpoint.stop(),e.checkpoint.checkpoint(this.buildPersistedState(e)).catch(t=>{this.callbacks.log?.warn(`[product] final checkpoint failed: ${t instanceof Error?t.message:String(t)}`)}),this.callbacks.log?.info(`[product] ${e.productId} finished (phase=${e.phase})`)}buildPersistedState(e){return{productId:e.productId,name:e.name,phase:e.phase,cwd:e.cwd,instances:e.instances.map(t=>({name:t.name,role:"",agentId:t.agentId})),tasks:e.dag.serialize(),budget:e.budget.serialize(),createdAt:e.createdAt,lastCheckpointAt:new Date(e.checkpoint.getLastCheckpointAt()||Date.now()).toISOString()}}};var Nu="memory";var Gk=["add","replace","remove","search"],ju={type:"object",properties:{action:{type:"string",enum:Gk,description:["The operation to perform:","\u2022 'add' \u2014 Save a concise note about this user (\u2192 local notes, always visible)","\u2022 'replace' \u2014 Update an existing note by matching a substring (\u2192 local notes)","\u2022 'remove' \u2014 Delete a note by matching a substring (\u2192 local notes)","\u2022 'search' \u2014 Search across long-term memory, recalled facts, user profile, and media preferences"].join(`
395
+ `)}],details:{type:"checkpoint",action:"list",count:n.checkpoints.length}}}case"restore":{if(!t.checkpointId)return{content:[{type:"text",text:"Error: checkpointId required for restore."}],details:{type:"checkpoint",error:"missing_id"}};if(!Sd.test(t.checkpointId))return{content:[{type:"text",text:"Error: invalid checkpoint ID format."}],details:{type:"checkpoint",error:"invalid_id"}};let n=await r.restoreCheckpoint(t.checkpointId,t.paths);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"checkpoint",error:n.error}};let o=t.paths?`(${t.paths.length} files)`:"(full workspace)";return{content:[{type:"text",text:`Restored to checkpoint ${t.checkpointId.slice(0,8)} ${o}`}],details:{type:"checkpoint",action:"restore",checkpointId:t.checkpointId}}}case"diff":{if(!t.checkpointId)return{content:[{type:"text",text:"Error: checkpointId required for diff."}],details:{type:"checkpoint",error:"missing_id"}};if(!Sd.test(t.checkpointId))return{content:[{type:"text",text:"Error: invalid checkpoint ID format."}],details:{type:"checkpoint",error:"invalid_id"}};let n=await r.diffCheckpoint(t.checkpointId);return n.success?{content:[{type:"text",text:n.diff||"(no changes since checkpoint)"}],details:{type:"checkpoint",action:"diff",checkpointId:t.checkpointId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"checkpoint",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"checkpoint",error:"unknown_action"}}}}}}import*as Te from"node:fs";import*as xt from"node:path";function Rd(r,e){let t=oa(e);return{createCheckpoint:async n=>{try{Te.mkdirSync(t,{recursive:!0});let{execSync:o}=await import("node:child_process"),s=xt.join(t,".git");Te.existsSync(s)||(o("git init",{cwd:t,stdio:"pipe"}),o('git config user.email "checkpoint@agent"',{cwd:t,stdio:"pipe"}),o('git config user.name "Checkpoint"',{cwd:t,stdio:"pipe"})),Te.cpSync(r,t,{recursive:!0,filter:d=>!d.includes(".git")&&!d.includes("node_modules")}),o("git add -A",{cwd:t,stdio:"pipe"});let i=n||`checkpoint ${new Date().toISOString()}`;o(`git commit --allow-empty -m "${i.replace(/"/g,'\\"')}"`,{cwd:t,stdio:"pipe"});let a=o("git rev-parse HEAD",{cwd:t,stdio:"pipe"}).toString().trim(),c=parseInt(o("git ls-files | wc -l",{cwd:t,stdio:"pipe"}).toString().trim(),10)||0;return{success:!0,checkpoint:{id:a,message:i,timestamp:new Date().toISOString(),fileCount:c}}}catch(o){return{success:!1,error:o.message}}},listCheckpoints:async()=>{try{let{execSync:n}=await import("node:child_process"),o=xt.join(t,".git");if(!Te.existsSync(o))return{success:!0,checkpoints:[]};let s=n('git log --format="%H|%aI|%s" --max-count=20',{cwd:t,stdio:"pipe"}).toString().trim();return s?{success:!0,checkpoints:s.split(`
396
+ `).map(a=>{let[c="",d="",...l]=a.split("|");return{id:c,timestamp:d,message:l.join("|"),fileCount:0}})}:{success:!0,checkpoints:[]}}catch(n){return{success:!1,error:n.message}}},restoreCheckpoint:async(n,o)=>{try{let{execSync:s}=await import("node:child_process");if(o&&o.length>0){s(`git checkout ${n} -- ${o.map(i=>`"${i.replace(/"/g,'\\"')}"`).join(" ")}`,{cwd:t,stdio:"pipe"});for(let i of o){let a=xt.join(t,i),c=xt.join(r,i);Te.existsSync(a)&&Te.cpSync(a,c,{recursive:!0})}}else{s(`git checkout ${n} -- .`,{cwd:t,stdio:"pipe"});let i=Te.readdirSync(r);for(let a of i){if(a===".git"||a==="node_modules")continue;let c=xt.join(r,a);Te.rmSync(c,{recursive:!0,force:!0})}Te.cpSync(t,r,{recursive:!0,filter:a=>!a.includes(".git")})}return{success:!0}}catch(s){return{success:!1,error:s.message}}},diffCheckpoint:async n=>{try{let{execSync:o}=await import("node:child_process");return{success:!0,diff:o(`git diff ${n} HEAD`,{cwd:t,stdio:"pipe"}).toString()}}catch(o){return{success:!1,error:o.message}}}}}import{spawn as Es}from"node:child_process";import{createInterface as bo}from"node:readline";import{resolve as wk,join as un}from"node:path";import{createServer as vk}from"node:net";import{createWriteStream as xk,mkdirSync as Sk}from"node:fs";import{tmpdir as _k}from"node:os";import{createInterface as uk}from"node:readline";var pk=1,mk=1,Ae={USER_MESSAGE_CHUNK:"user_message_chunk",AGENT_MESSAGE_CHUNK:"agent_message_chunk",AGENT_THOUGHT_CHUNK:"agent_thought_chunk",TOOL_CALL:"tool_call",TOOL_CALL_UPDATE:"tool_call_update",PLAN:"plan",AVAILABLE_COMMANDS_UPDATE:"available_commands_update",CURRENT_MODE_UPDATE:"current_mode_update",CONFIG_OPTION_UPDATE:"config_option_update",SESSION_INFO_UPDATE:"session_info_update",USAGE_UPDATE:"usage_update"},gk=1e4,ct=class{pendingRpcs=new Map;rl=null;child=null;onNotification=null;hostHandler=null;attach(e,t,n){this.onNotification=t??null,this.hostHandler=n??null,this.child=e,this.rl=uk({input:e.stdout,crlfDelay:Number.POSITIVE_INFINITY}),this.rl.on("line",o=>{let s=o.trim();if(!s)return;let i;try{i=JSON.parse(s)}catch{return}let a="id"in i&&(typeof i.id=="number"||typeof i.id=="string"),c="method"in i&&typeof i.method=="string";if(a&&!c){let d=this.pendingRpcs.get(i.id);if(d){clearTimeout(d.timer),this.pendingRpcs.delete(i.id);let l=i;l.error?d.reject(new Error(l.error.message)):d.resolve(l.result)}return}if(a&&c){this.handleAgentRequest(i.id,i.method,i.params);return}c&&!a&&this.onNotification?.(i.method,i.params)})}handleAgentRequest(e,t,n){let o=(c,d)=>{if(!this.child?.stdin?.writable)return;let l={jsonrpc:"2.0",id:e};d?l.error=d:l.result=c??{};try{this.child.stdin.write(`${JSON.stringify(l)}
397
+ `)}catch{}},s=this.hostHandler,i=n;(async()=>{switch(t){case"fs/read_text_file":return s?.readTextFile?.(i)??{};case"fs/write_text_file":return s?.writeTextFile?.(i)??{};case"session/request_permission":return s?.requestPermission?.(i??{})??{outcome:"cancelled"};case"session/elicitation":case"session/elicitation/complete":return s?.elicitation?.(i??{})??{};case"terminal/create":return s?.createTerminal?.(i??{})??{};case"terminal/output":return s?.terminalOutput?.(i??{})??{};case"terminal/release":return s?.releaseTerminal?.(i??{})??{};case"terminal/wait_for_exit":return s?.waitForTerminalExit?.(i??{})??{};case"terminal/kill":return s?.killTerminal?.(i??{})??{};default:if(s?.extMethod)return s.extMethod(t,n);throw new Error(`Method not found: ${t}`)}})().then(c=>o(c)).catch(c=>o(null,{code:-32601,message:c instanceof Error?c.message:String(c)}))}detach(){this.rl?.close(),this.rl=null,this.child=null,this.hostHandler=null;for(let[e,t]of this.pendingRpcs)clearTimeout(t.timer),t.reject(new Error("ACP adapter detached")),this.pendingRpcs.delete(e)}sendRpc(e,t,n,o=3e4){let s=pk++,i={jsonrpc:"2.0",id:s,method:t,params:n};return new Promise((a,c)=>{let d=setTimeout(()=>{this.pendingRpcs.delete(s),c(new Error(`ACP RPC timeout: ${t} (${o}ms)`))},o);this.pendingRpcs.set(s,{resolve:a,reject:c,timer:d});try{e.stdin.write(`${JSON.stringify(i)}
398
+ `)}catch(l){clearTimeout(d),this.pendingRpcs.delete(s),c(l instanceof Error?l:new Error(String(l)))}})}async initialize(e){let t=await this.sendRpc(e,"initialize",{protocolVersion:mk,clientInfo:{name:"qlogicagent",version:"1.0.0"},clientCapabilities:{fs:{readTextFile:!0,writeTextFile:!0},terminal:!0,auth:{terminal:!1}}},gk),n=t?.agentCapabilities??{};return{protocolVersion:typeof t?.protocolVersion=="number"?t.protocolVersion:0,agentCapabilities:{loadSession:n.loadSession===!0,mcpCapabilities:n.mcpCapabilities,promptCapabilities:n.promptCapabilities,sessionCapabilities:n.sessionCapabilities},agentInfo:t?.agentInfo,authMethods:t?.authMethods}}async createSession(e,t){let n={cwd:t.cwd,mcpServers:t.mcpServers??[]};t.additionalDirectories?.length&&(n.additionalDirectories=t.additionalDirectories),t.systemPrompt&&(n.systemPrompt=t.systemPrompt);let o=await this.sendRpc(e,"session/new",n);if(typeof o?.sessionId!="string")throw new Error("ACP session/new: agent did not return sessionId");return{sessionId:o.sessionId}}async sendPrompt(e,t,n,o=3e5){let s=await this.sendRpc(e,"session/prompt",{sessionId:t,prompt:[{type:"text",text:n}]},o);return{stopReason:s?.stopReason??"end_turn",usage:s?.usage,userMessageId:s?.userMessageId}}async resumeSession(e,t,n){let o={sessionId:t,cwd:n?.cwd??process.cwd(),mcpServers:n?.mcpServers??[]},s=await this.sendRpc(e,"session/load",o,3e4);if(typeof s?.sessionId!="string")throw new Error("ACP session/load: agent did not return sessionId");return{sessionId:s.sessionId}}async closeSession(e,t){try{await this.sendRpc(e,"session/close",{sessionId:t},5e3)}catch{}}static translateNotification(e,t){let n=t;if(e==="session/update"){if(!n)return null;let o=n.update;if(!o)return null;let s=o.sessionUpdate,i=n.sessionId;switch(s){case Ae.AGENT_MESSAGE_CHUNK:{let a=o.content;return{method:"turn.delta",params:{text:a?.text??a?.content??"",sessionId:i,messageId:o.messageId}}}case Ae.AGENT_THOUGHT_CHUNK:return{method:"turn.thought_delta",params:{text:o.content?.text??"",sessionId:i}};case Ae.TOOL_CALL:return{method:"turn.tool_call",params:{callId:o.toolCallId,toolName:o.title,status:o.status??"running",content:o.content,kind:o.kind,rawInput:o.rawInput,sessionId:i}};case Ae.TOOL_CALL_UPDATE:return{method:"turn.tool_result",params:{callId:o.toolCallId,toolName:o.title,status:o.status??"completed",content:o.content,rawOutput:o.rawOutput,sessionId:i}};case Ae.USAGE_UPDATE:return{method:"turn.usage_update",params:o??{}};case Ae.PLAN:return{method:"turn.plan",params:{steps:o.steps,sessionId:i}};case Ae.AVAILABLE_COMMANDS_UPDATE:case Ae.CURRENT_MODE_UPDATE:case Ae.CONFIG_OPTION_UPDATE:case Ae.SESSION_INFO_UPDATE:return{method:"turn.session_info",params:{type:s,...o,sessionId:i}};case Ae.USER_MESSAGE_CHUNK:return null;default:return{method:`turn.${s??"unknown"}`,params:{...o,sessionId:i}}}}return null}};var dn=class{usage={inputTokens:0,outputTokens:0,totalTokens:0,cachedReadTokens:0,thoughtTokens:0,cost:0,hasTier1:!1,turnCount:0};onUsageUpdate(e){this.usage.hasTier1=!0,typeof e.inputTokens=="number"&&(this.usage.inputTokens+=e.inputTokens),typeof e.outputTokens=="number"&&(this.usage.outputTokens+=e.outputTokens),typeof e.totalTokens=="number"&&(this.usage.totalTokens+=e.totalTokens),typeof e.cost=="number"&&(this.usage.cost+=e.cost)}onPromptResponseUsage(e){e&&(this.usage.hasTier1||(this.usage.turnCount++,typeof e.inputTokens=="number"&&(this.usage.inputTokens+=e.inputTokens),typeof e.outputTokens=="number"&&(this.usage.outputTokens+=e.outputTokens),typeof e.totalTokens=="number"&&(this.usage.totalTokens+=e.totalTokens),typeof e.cachedReadTokens=="number"&&(this.usage.cachedReadTokens+=e.cachedReadTokens),typeof e.thoughtTokens=="number"&&(this.usage.thoughtTokens+=e.thoughtTokens)))}getUsage(){return{...this.usage}}reset(){this.usage={inputTokens:0,outputTokens:0,totalTokens:0,cachedReadTokens:0,thoughtTokens:0,cost:0,hasTier1:!1,turnCount:0}}hasData(){return this.usage.hasTier1||this.usage.turnCount>0}};import{execSync as Ad}from"node:child_process";import{platform as fk}from"node:os";var Is={claude:{id:"claude",name:"Claude Code",cliCommand:"claude",acpArgs:["--experimental-acp"],authRequired:!0,skillsDirs:[".claude/skills"],supportsBaseUrlOverride:!0,apiKeyEnvVar:"ANTHROPIC_API_KEY",baseUrlEnvVar:"ANTHROPIC_BASE_URL"},codex:{id:"codex",name:"OpenAI Codex CLI",cliCommand:"codex-acp",acpArgs:[],authRequired:!0,supportsBaseUrlOverride:!0,apiKeyEnvVar:"OPENAI_API_KEY",baseUrlEnvVar:"OPENAI_BASE_URL"},qwen:{id:"qwen",name:"Qwen Code",cliCommand:"qwen-code",acpArgs:["--acp","--experimental-skills"],defaultCliPath:"npx @qwen-code/qwen-code",authRequired:!0,skillsDirs:[".qwen/skills"],supportsBaseUrlOverride:!0,apiKeyEnvVar:"DASHSCOPE_API_KEY"},kimi:{id:"kimi",name:"Kimi CLI",cliCommand:"kimi",acpArgs:["acp"],authRequired:!1,skillsDirs:[".kimi/skills"],supportsBaseUrlOverride:!0},opencode:{id:"opencode",name:"OpenCode",cliCommand:"opencode",acpArgs:["acp"],authRequired:!1,skillsDirs:[".opencode/skills"],supportsBaseUrlOverride:!0},cursor:{id:"cursor",name:"Cursor Agent",cliCommand:"cursor-agent",acpArgs:["acp"],authRequired:!0,skillsDirs:[".cursor/skills"],supportsBaseUrlOverride:!1},hermes:{id:"hermes",name:"Hermes Agent",cliCommand:"hermes",acpArgs:["acp"],authRequired:!1,supportsBaseUrlOverride:!0},copilot:{id:"copilot",name:"GitHub Copilot",cliCommand:"copilot",acpArgs:["--acp"],authRequired:!0,supportsBaseUrlOverride:!1},codebuddy:{id:"codebuddy",name:"CodeBuddy",cliCommand:"codebuddy",acpArgs:["--acp"],authRequired:!0,skillsDirs:[".codebuddy/skills"],supportsBaseUrlOverride:!0},kiro:{id:"kiro",name:"Kiro CLI",cliCommand:"kiro-cli",acpArgs:["acp"],authRequired:!0,supportsBaseUrlOverride:!0},snow:{id:"snow",name:"Snow",cliCommand:"snow",acpArgs:["--acp"],authRequired:!0,supportsBaseUrlOverride:!0},qoder:{id:"qoder",name:"Qoder",cliCommand:"qodercli",acpArgs:["--acp"],authRequired:!0,supportsBaseUrlOverride:!0},gemini:{id:"gemini",name:"Gemini CLI",cliCommand:"gemini",acpArgs:["--acp"],defaultCliPath:"npx @google/gemini-cli",authRequired:!0,supportsBaseUrlOverride:!1},glm:{id:"glm",name:"GLM Agent",cliCommand:"glm-acp-agent",acpArgs:[],defaultCliPath:"npx glm-acp-agent",authRequired:!0,supportsBaseUrlOverride:!0,apiKeyEnvVar:"ZHIPU_API_KEY"},cline:{id:"cline",name:"Cline",cliCommand:"cline",acpArgs:["--acp"],defaultCliPath:"npx cline",authRequired:!0,supportsBaseUrlOverride:!0},nova:{id:"nova",name:"Nova",cliCommand:"nova",acpArgs:["acp"],defaultCliPath:"npx @compass-ai/nova",authRequired:!0,supportsBaseUrlOverride:!0},openclaw:{id:"openclaw",name:"OpenClaw",cliCommand:"openclaw",acpArgs:["--acp"],authRequired:!0,supportsBaseUrlOverride:!0,apiKeyEnvVar:"OPENCLAW_API_KEY",baseUrlEnvVar:"OPENCLAW_BASE_URL"}},hk=["general","explore","plan","code","research","verify"];function yk(){return hk.map(r=>({id:`qlogicagent-${r}`,name:`qlogicagent (${r})`,category:"sub-agent",protocol:"internal",status:"available",authRequired:!1,hasConfig:!0,supportsBaseUrlOverride:!0,capabilities:{supportsMcp:!1,supportsResume:!0,supportsUsageUpdate:!0}}))}var bk=fk()==="win32";function Cd(r){try{let e=bk?`where ${r}`:`which ${r}`;return Ad(e,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim().split(/\r?\n/)[0]?.trim()||null}catch{return null}}function kk(r){try{return Ad(`"${r}" --version`,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim().match(/(\d+\.\d+[\w.-]*)/)?.[1]??null}catch{return null}}var Tk=6e4,yo=class{cache=null;configStore=null;setConfigStore(e){this.configStore=e}scan(e=!1){if(!e&&this.cache&&Date.now()-this.cache.timestamp<Tk)return this.cache.agents;let t=[];t.push(...yk());for(let n of Object.values(Is))t.push(this.detectBackend(n));if(this.configStore?.customAgents)for(let n of Object.values(this.configStore.customAgents))t.push(this.detectCustomAgent(n));return this.cache={agents:t,timestamp:Date.now()},t}list(){return this.cache?this.cache.agents:this.scan()}clearCache(){this.cache=null}detectBackend(e){let t=Cd(e.cliCommand),n=this.hasAgentConfig(e.id);if(!t)return{id:e.id,name:e.name,category:"teammate",protocol:"acp",status:"not_installed",authRequired:e.authRequired,hasConfig:n,supportsBaseUrlOverride:e.supportsBaseUrlOverride,capabilities:{supportsMcp:!0,supportsResume:!1,supportsUsageUpdate:e.id==="claude"||e.id==="codex",skillsDirs:e.skillsDirs}};let o=kk(t);return{id:e.id,name:e.name,category:"teammate",protocol:"acp",status:"available",cliPath:t,version:o??void 0,authRequired:e.authRequired,hasConfig:n,supportsBaseUrlOverride:e.supportsBaseUrlOverride,capabilities:{supportsMcp:!0,supportsResume:e.id==="claude"||e.id==="goose",supportsUsageUpdate:e.id==="claude"||e.id==="codex",skillsDirs:e.skillsDirs}}}detectCustomAgent(e){let t=Cd(e.cliCommand),n=this.hasAgentConfig(e.id);return{id:e.id,name:e.name,category:"teammate",protocol:"acp",status:t?"available":"not_installed",cliPath:t??void 0,authRequired:e.authRequired??!1,hasConfig:n,supportsBaseUrlOverride:e.supportsBaseUrlOverride??!1,capabilities:{supportsMcp:!0,supportsResume:!1,supportsUsageUpdate:!1,skillsDirs:e.skillsDirs}}}hasAgentConfig(e){if(!this.configStore)return!1;let t=this.configStore.agents[e];return!!(t?.apiKey||t?.baseUrl||t?.customCliPath)}buildExternalDescriptor(e){let t=this.list().find(s=>s.id===e);if(!t||t.protocol!=="acp"||t.status!=="available"||!t.cliPath)return null;let n=Is[e],o=this.configStore?.agents[e];return{id:e,cliPath:o?.customCliPath??t.cliPath,acpArgs:o?.customArgs??n?.acpArgs??[],env:o?.env??n?.env,protocol:"acp"}}};var Rk=1;function Ck(r,e){return{jsonrpc:"2.0",id:Rk++,method:r,params:e}}var Ak=["NODE_ENV","HOME","PATH","TERM","OPENAI_API_KEY","OPENAI_BASE_URL","ANTHROPIC_API_KEY","ANTHROPIC_BASE_URL","HTTP_PROXY","HTTPS_PROXY","NO_PROXY","http_proxy","https_proxy","no_proxy"];function Pk(r){let e={};for(let t of Ak)process.env[t]&&(e[t]=process.env[t]);return r.apiKey&&(e.OPENAI_API_KEY=r.apiKey),r.baseUrl&&(e.OPENAI_BASE_URL=r.baseUrl),e.QLOGICAGENT_MEMBER_ID=r.memberId,e.QLOGICAGENT_MEMBER_NAME=r.name,r.agentType&&(e.QLOGICAGENT_AGENT_TYPE=r.agentType),r.model&&(e.QLOGICAGENT_MODEL=r.model),r.env&&Object.assign(e,r.env),e}var Os=2,Mk=3e3,St=3,Pd=5e3;function Ik(r){return new Promise(e=>setTimeout(e,r))}var _t=class r{processes=new Map;callbacks;cliBinaryPath;mcpBridgeScriptPath;constructor(e={}){this.callbacks=e;let t=wk(un(import.meta.url.startsWith("file://")?new URL(import.meta.url).pathname.replace(/^\/([A-Z]:)/,"$1"):process.cwd(),"..",".."));this.cliBinaryPath=un(t,"dist","cli.js"),this.mcpBridgeScriptPath=un(t,"dist","runtime","infra","mcp-bridge-server.js")}slog(e,t,n,o){let i=`[${new Date().toISOString()}] [${e}] [agent:${t}] [${n}] ${o}`;e==="warn"?this.callbacks.log?.warn(i):this.callbacks.log?.info(i)}async spawn(e){if(this.processes.has(e.memberId))throw new Error(`Agent process "${e.memberId}" already spawned`);let t=this.callbacks.log,n=Pk(e),o={memberId:e.memberId,name:e.name,pid:-1,cwd:e.cwd,state:"starting",startedAt:Date.now()};if(e.external)return this.spawnAcpAgentWithRetry(e,o,n);let s=[this.cliBinaryPath];e.verbose&&s.push("--verbose"),this.slog("info",e.memberId,"spawn",`spawning ${e.name} in ${e.cwd}`);let i=Es(process.execPath,s,{cwd:e.cwd,env:n,stdio:["pipe","pipe","pipe"],detached:!1});o.pid=i.pid??-1;let a=new Map;this.processes.set(e.memberId,{handle:o,child:i,pendingRpc:a}),bo({input:i.stdout,crlfDelay:Number.POSITIVE_INFINITY}).on("line",d=>{let l=d.trim();if(l)try{let u=JSON.parse(l);if("id"in u&&typeof u.id=="number"){let p=a.get(u.id);if(p){clearTimeout(p.timer),a.delete(u.id);let m=u;m.error?p.reject(new Error(m.error.message)):p.resolve(m.result)}}if("method"in u&&!("id"in u)){let p=u;this.captureChildProgress(e.memberId,p.method,p.params),this.callbacks.onNotification?.(e.memberId,p.method,p.params)}}catch{this.slog("warn",e.memberId,"parse",`invalid JSON: ${l.slice(0,200)}`)}}),i.stderr&&bo({input:i.stderr,crlfDelay:Number.POSITIVE_INFINITY}).on("line",l=>{this.callbacks.log?.debug?.(`[${new Date().toISOString()}] [debug] [agent:${e.memberId}] [stderr] ${l}`)}),i.on("exit",(d,l)=>{o.state!=="killed"&&(o.state=d===0?"completed":"failed"),o.endedAt=Date.now(),d!==0&&!o.error&&(o.error=`Process exited with code ${d} (signal: ${l})`);for(let[p,m]of a)clearTimeout(m.timer),m.reject(new Error(`Agent process exited (code=${d})`)),a.delete(p);this.callbacks.onStateChange?.(e.memberId,o.state),this.callbacks.onExit?.(e.memberId,d,l),this.slog("info",e.memberId,"exit",`exited (code=${d}, signal=${l})`)}),i.on("error",d=>{o.state="failed",o.error=d.message,o.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed"),this.slog("warn",e.memberId,"error",d.message)}),this.callbacks.onStateChange?.(e.memberId,"starting");try{let d=await this.sendRpc(e.memberId,"initialize",{protocolVersion:"1.0",clientInfo:{name:"qlogicagent-team-leader",version:"1.0.0"}},15e3);o.state="ready",this.callbacks.onStateChange?.(e.memberId,"ready"),this.slog("info",e.memberId,"handshake",`initialized (pid=${o.pid})`);let l=d;l&&typeof l.sessionId=="string"&&(o.sessionId=l.sessionId)}catch(d){throw o.state="failed",o.error=`Initialize handshake failed: ${d instanceof Error?d.message:String(d)}`,o.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed"),this.kill(e.memberId),new Error(o.error)}return o}async sendTask(e,t,n){let o=this.processes.get(e);if(!o)throw new Error(`No agent process: ${e}`);o.handle.state="running",this.callbacks.onStateChange?.(e,"running");try{let s;if(o.acpAdapter){let i=o.handle.sessionId??"default",a=await o.acpAdapter.sendPrompt(o.child,i,t,n?.timeout??3e5),c=o.handle.resultText??"";a.usage&&o.usageTracker&&o.usageTracker.onPromptResponseUsage(a.usage),s={content:c,stopReason:a.stopReason}}else{let i={content:t};n?.model&&(i.model=n.model),n?.apiKey&&(i.apiKey=n.apiKey),n?.baseUrl&&(i.baseUrl=n.baseUrl),n?.sessionId&&(i.sessionId=n.sessionId),s=await this.sendRpc(e,"thread.turn",i,n?.timeout??3e5);let a=s;a&&typeof a.content=="string"&&(o.handle.resultText=a.content)}return o.handle.state="completed",o.handle.endedAt=Date.now(),this.callbacks.onStateChange?.(e,"completed"),s}catch(s){throw o.handle.state="failed",o.handle.error=s instanceof Error?s.message:String(s),o.handle.endedAt=Date.now(),this.callbacks.onStateChange?.(e,"failed"),s}}async sendRpc(e,t,n,o=3e4){let s=this.processes.get(e);if(!s)throw new Error(`No agent process: ${e}`);let i=Ck(t,n);return new Promise((a,c)=>{let d=setTimeout(()=>{s.pendingRpc.delete(i.id),c(new Error(`RPC timeout: ${t} (${o}ms)`))},o);s.pendingRpc.set(i.id,{resolve:a,reject:c,timer:d});try{s.child.stdin.write(`${JSON.stringify(i)}
399
+ `)}catch(l){clearTimeout(d),s.pendingRpc.delete(i.id),c(l instanceof Error?l:new Error(String(l)))}})}async sendTaskAsync(e,t,n){let o=this.processes.get(e);if(!o)throw new Error(`No agent process: ${e}`);o.handle.state="running",this.callbacks.onStateChange?.(e,"running");let s={content:t};n?.model&&(s.model=n.model),n?.apiKey&&(s.apiKey=n.apiKey),n?.baseUrl&&(s.baseUrl=n.baseUrl),n?.sessionId&&(s.sessionId=n.sessionId);let i=n?.pingInterval??6e4,a=n?.pingTimeout??1e4,c=n?.timeout??0,d=Date.now(),l=c>0?c:1440*60*1e3,u=this.sendRpc(e,"thread.turn",s,l),p=setInterval(async()=>{if(c>0&&Date.now()-d>c){clearInterval(p),o.handle.state="failed",o.handle.error="Task timed out",o.handle.endedAt=Date.now(),this.callbacks.onStateChange?.(e,"failed");return}try{await this.sendRpc(e,"ping",void 0,a)}catch{this.slog("warn",o.handle.memberId,"heartbeat","ping failed")}},i);try{let m=await u;clearInterval(p),o.handle.state="completed",o.handle.endedAt=Date.now();let g=m;return g&&typeof g.content=="string"&&(o.handle.resultText=g.content),this.callbacks.onStateChange?.(e,"completed"),m}catch(m){throw clearInterval(p),o.handle.state="failed",o.handle.error=m instanceof Error?m.message:String(m),o.handle.endedAt=Date.now(),this.callbacks.onStateChange?.(e,"failed"),m}}async ping(e,t=5e3){let n=this.processes.get(e);if(!n)return!1;if(n.acpAdapter){try{let i=JSON.stringify({jsonrpc:"2.0",method:"notifications/ping",params:{timestamp:Date.now()}})+`
400
+ `;n.child.stdin?.write(i)}catch{return!1}let o=n.handle.lastActivityAt??0,s=Date.now()+t;for(;Date.now()<s;)if(await new Promise(i=>setTimeout(i,500)),(n.handle.lastActivityAt??0)>o)return!0;try{return await this.sendRpc(e,"ping",void 0,Math.min(t,3e3)),!0}catch{return!1}}try{return await this.sendRpc(e,"ping",void 0,t),!0}catch{return!1}}getStatus(e){let t=this.processes.get(e);if(!t)return null;let{handle:n}=t,o=n.state==="starting"||n.state==="ready"||n.state==="running",s=o?Date.now()-n.startedAt:void 0,i=n.lastActivityAt&&o?Math.round((Date.now()-n.lastActivityAt)/1e3):void 0;return{alive:o,state:n.state,runningFor:s,resultText:n.resultText,error:n.error,mediaProgress:n.mediaProgress,lastToolCall:n.lastToolCall,idleFor:i}}captureChildProgress(e,t,n){let o=this.processes.get(e);if(!o)return;let{handle:s}=o;switch(s.lastActivityAt=Date.now(),t){case"turn.media_progress":{let i=n;i&&typeof i.taskId=="string"&&(s.mediaProgress={taskId:i.taskId,mediaType:i.mediaType??"unknown",percent:typeof i.percent=="number"?i.percent:0,status:i.status??"unknown",provider:i.provider,updatedAt:Date.now()});break}case"turn.tool_call":{let i=n;i&&typeof i.name=="string"&&(s.lastToolCall=i.name);break}case"turn.delta":{let i=n;i&&typeof i.text=="string"&&(s.lastDelta=i.text.slice(-200));break}case"turn.tool_result":{n&&s.mediaProgress&&s.mediaProgress.percent>=100&&(s.mediaProgress=void 0);break}}}async spawnAcpAgentWithRetry(e,t,n){let o=null;for(let s=0;s<=Os;s++)try{if(s>0){this.processes.delete(e.memberId),t.state="starting",t.error=void 0,t.endedAt=void 0;let i=Mk*s;this.slog("info",e.memberId,"spawn",`retry ${s}/${Os} after ${i}ms`),await Ik(i)}return await this.spawnAcpAgent(e,t,n)}catch(i){o=i instanceof Error?i:new Error(String(i)),this.slog("warn",e.memberId,"spawn",`attempt ${s+1} failed: ${o.message}`)}throw t.state="failed",t.error=`ACP spawn failed after ${Os+1} attempts: ${o?.message}`,t.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed"),new Error(t.error)}async spawnAcpAgent(e,t,n){let o=this.callbacks.log,s=e.external;s.env&&Object.assign(n,s.env);let i=[...s.acpArgs];this.slog("info",e.memberId,"spawn",`spawning ACP ${e.name} via ${s.cliPath} ${i.join(" ")}`);let a=Es(s.cliPath,i,{cwd:e.cwd,env:n,stdio:["pipe","pipe","pipe"],detached:!1});t.pid=a.pid??-1;let c=new Map,d=new ct,l=new dn,{server:u,pipePath:p}=this.createMcpIpcServer(e.memberId);n.QLOGICAGENT_PARENT_RPC=p;let m;if(this.callbacks.sessionDir)try{Sk(this.callbacks.sessionDir,{recursive:!0}),m=xk(un(this.callbacks.sessionDir,`${e.memberId}.stderr.log`),{flags:"a"})}catch{}this.processes.set(e.memberId,{handle:t,child:a,pendingRpc:c,acpAdapter:d,usageTracker:l,ipcServer:u,ipcPath:p,stderrStream:m}),d.attach(a,(g,f)=>{g==="usage_update"&&l.onUsageUpdate(f);let b=ct.translateNotification(g,f);b?(this.captureChildProgress(e.memberId,b.method,b.params),this.callbacks.onNotification?.(e.memberId,b.method,b.params)):(this.captureChildProgress(e.memberId,g,f),this.callbacks.onNotification?.(e.memberId,g,f))}),a.stderr&&bo({input:a.stderr,crlfDelay:Number.POSITIVE_INFINITY}).on("line",f=>{this.callbacks.log?.debug?.(`[${new Date().toISOString()}] [debug] [agent:${e.memberId}] [stderr] ${f}`),m?.write(`${new Date().toISOString()} ${f}
401
+ `)}),a.on("exit",(g,f)=>{d.detach();let b=t.state;if(b!=="killed"&&b!=="completed"&&g!==0){let T=this.processes.get(e.memberId)?.runtimeRestartCount??0;if(T<St){let _=Pd*2**T;this.slog("warn",e.memberId,"crash",`crashed (code=${g}), restarting ${T+1}/${St} after ${_}ms`),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Process crashed (code=${g}, signal=${f}), restarting`,retriesLeft:St-T-1}),setTimeout(()=>{this.attemptRuntimeRestart(e,n,T+1).catch(R=>{this.slog("warn",e.memberId,"restart",`failed: ${R instanceof Error?R.message:String(R)}`)})},_);return}}b!=="killed"&&(t.state=g===0?"completed":"failed"),t.endedAt=Date.now(),g!==0&&!t.error&&(t.error=`ACP process exited with code ${g} (signal: ${f})`),this.callbacks.onStateChange?.(e.memberId,t.state),this.callbacks.onExit?.(e.memberId,g,f),this.slog("info",e.memberId,"exit",`ACP exited (code=${g}, signal=${f})`)}),a.on("error",g=>{d.detach(),t.state="failed",t.error=g.message,t.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed"),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"spawn",error:g.message,retriesLeft:0}),this.slog("warn",e.memberId,"error",g.message)}),this.callbacks.onStateChange?.(e.memberId,"starting");try{let g=await d.initialize(a);t.state="ready",t.supportsResume=g.agentCapabilities.loadSession===!0,this.callbacks.onStateChange?.(e.memberId,"ready"),this.slog("info",e.memberId,"handshake",`ACP initialized (protocol=${g.protocolVersion}, loadSession=${t.supportsResume}, pid=${t.pid})`);try{let f={cwd:e.cwd},b=[...e.mcpServers??[]],w=this.processes.get(e.memberId);w?.ipcPath&&b.push({name:"qlogicagent-tools",command:process.execPath,args:[this.mcpBridgeScriptPath],env:{QLOGICAGENT_PARENT_RPC:w.ipcPath,QLOGICAGENT_SESSION_ID:e.memberId}}),b.length>0&&(f.mcpServers=b),e.systemPrompt&&(f.systemPrompt=e.systemPrompt);let T=await d.createSession(a,f);t.sessionId=T.sessionId,this.slog("info",e.memberId,"session",`session created (id=${T.sessionId})`)}catch(f){this.slog("warn",e.memberId,"session",`session creation failed: ${f instanceof Error?f.message:String(f)}`)}this.startHeartbeat(e.memberId,f=>{this.slog("warn",f,"heartbeat","hang detected \u2014 force-killing"),this.callbacks.onNotification?.(f,"agents.error",{agentId:f,phase:"heartbeat",error:`Agent ${e.name} stopped responding (${r.MAX_MISSED_BEATS} missed heartbeats)`,retriesLeft:0}),this.kill(f)})}catch(g){throw t.state="failed",t.error=`ACP handshake failed: ${g instanceof Error?g.message:String(g)}`,t.endedAt=Date.now(),d.detach(),this.callbacks.onStateChange?.(e.memberId,"failed"),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"handshake",error:t.error,retriesLeft:0}),this.kill(e.memberId),new Error(t.error)}return t}kill(e){let t=this.processes.get(e);if(t){this.stopHeartbeat(e),t.handle.state="killed",t.handle.endedAt=Date.now(),t.acpAdapter?.detach();try{t.ipcServer?.close()}catch{}try{t.stderrStream?.end()}catch{}try{t.child.kill("SIGTERM"),setTimeout(()=>{try{t.child.kill("SIGKILL")}catch{}},1e4)}catch{}this.callbacks.onStateChange?.(e,"killed"),this.slog("info",e,"kill",`killed (pid=${t.handle.pid})`)}}killAll(){for(let e of this.processes.keys())this.kill(e)}getHandle(e){return this.processes.get(e)?.handle}getAllHandles(){return[...this.processes.values()].map(e=>e.handle)}getUsageTracker(e){return this.processes.get(e)?.usageTracker??null}createMcpIpcServer(e){let t=e.replace(/[^a-zA-Z0-9-]/g,"-"),n=process.platform==="win32"?`\\\\.\\pipe\\qlogicagent-mcp-${t}-${Date.now()}`:un(_k(),`qlogicagent-mcp-${t}-${Date.now()}.sock`),o=vk(s=>{let i="";s.on("data",a=>{i+=a.toString();let c;for(;(c=i.indexOf(`
402
+ `))!==-1;){let d=i.slice(0,c).trim();i=i.slice(c+1),d&&this.handleMcpIpcMessage(e,d,s)}})});return o.listen(n),o.on("error",s=>{this.slog("warn",e,"mcp-ipc",`server error: ${s.message}`)}),{server:o,pipePath:n}}handleMcpIpcMessage(e,t,n){let o;try{o=JSON.parse(t)}catch{return}if(o.method==="mcp.toolCall"&&o.id!==void 0){let s=typeof o.params?.tool=="string"?o.params.tool:"",i=o.params?.arguments??{};if(!this.callbacks.onMcpToolCall){let a=JSON.stringify({jsonrpc:"2.0",id:o.id,error:{code:-32601,message:"No onMcpToolCall handler"}})+`
403
+ `;try{n.write(a)}catch{}return}this.callbacks.onMcpToolCall(e,s,i).then(a=>{let c=JSON.stringify({jsonrpc:"2.0",id:o.id,result:a})+`
404
+ `;try{n.write(c)}catch{}}).catch(a=>{let c=JSON.stringify({jsonrpc:"2.0",id:o.id,error:{code:-32603,message:a instanceof Error?a.message:String(a)}})+`
405
+ `;try{n.write(c)}catch{}})}else if(o.id!==void 0){let s=JSON.stringify({jsonrpc:"2.0",id:o.id,error:{code:-32601,message:`Unknown IPC method: ${o.method}`}})+`
406
+ `;try{n.write(s)}catch{}}}async attemptRuntimeRestart(e,t,n){let o=this.callbacks.log,s=this.processes.get(e.memberId),i=s?.ipcServer,a=s?.ipcPath,c=s?.stderrStream;this.processes.delete(e.memberId);try{let d={memberId:e.memberId,name:e.name,pid:-1,cwd:e.cwd,state:"starting",startedAt:Date.now()},l=e.external,u=[...l.acpArgs];a&&(t.QLOGICAGENT_PARENT_RPC=a);let p=Es(l.cliPath,u,{cwd:e.cwd,env:t,stdio:["pipe","pipe","pipe"],detached:!1});d.pid=p.pid??-1;let m=new Map,g=new ct,f=new dn;this.processes.set(e.memberId,{handle:d,child:p,pendingRpc:m,acpAdapter:g,usageTracker:f,ipcServer:i,ipcPath:a,stderrStream:c,runtimeRestartCount:n}),g.attach(p,(T,_)=>{T==="usage_update"&&f.onUsageUpdate(_);let R=ct.translateNotification(T,_);R?(this.captureChildProgress(e.memberId,R.method,R.params),this.callbacks.onNotification?.(e.memberId,R.method,R.params)):(this.captureChildProgress(e.memberId,T,_),this.callbacks.onNotification?.(e.memberId,T,_))}),p.stderr&&bo({input:p.stderr,crlfDelay:Number.POSITIVE_INFINITY}).on("line",_=>{this.callbacks.log?.debug?.(`[${new Date().toISOString()}] [debug] [agent:${e.memberId}] [stderr] ${_}`),c?.write(`${new Date().toISOString()} ${_}
407
+ `)}),p.on("exit",(T,_)=>{g.detach();let R=d.state;if(R!=="killed"&&R!=="completed"&&T!==0){let I=this.processes.get(e.memberId)?.runtimeRestartCount??n;if(I<St){let O=Pd*2**I;this.slog("warn",e.memberId,"crash",`crashed again (code=${T}), restart ${I+1}/${St}`),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Process crashed (code=${T}), restarting`,retriesLeft:St-I-1}),setTimeout(()=>{this.attemptRuntimeRestart(e,t,I+1).catch($=>{this.slog("warn",e.memberId,"restart",`failed: ${$ instanceof Error?$.message:String($)}`)})},O);return}}R!=="killed"&&(d.state=T===0?"completed":"failed"),d.endedAt=Date.now(),T!==0&&!d.error&&(d.error=`ACP process exited with code ${T} (signal: ${_})`),this.callbacks.onStateChange?.(e.memberId,d.state),this.callbacks.onExit?.(e.memberId,T,_)}),p.on("error",T=>{g.detach(),d.state="failed",d.error=T.message,d.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed")}),this.callbacks.onStateChange?.(e.memberId,"starting");let b=await g.initialize(p);d.state="ready",d.supportsResume=b.agentCapabilities.loadSession===!0,this.callbacks.onStateChange?.(e.memberId,"ready"),this.slog("info",e.memberId,"restart",`ACP restarted (attempt=${n}, protocol=${b.protocolVersion}, loadSession=${d.supportsResume}, pid=${d.pid})`);let w=[...e.mcpServers??[]];a&&w.push({name:"qlogicagent-tools",command:process.execPath,args:[this.mcpBridgeScriptPath],env:{QLOGICAGENT_PARENT_RPC:a,QLOGICAGENT_SESSION_ID:e.memberId}});try{if(d.supportsResume&&d.sessionId){let T=await g.resumeSession(p,d.sessionId,{cwd:e.cwd,mcpServers:w.length>0?w:void 0});d.sessionId=T.sessionId,this.slog("info",e.memberId,"session",`session resumed (id=${d.sessionId})`)}else{let T={cwd:e.cwd};w.length>0&&(T.mcpServers=w),e.systemPrompt&&(T.systemPrompt=e.systemPrompt);let _=await g.createSession(p,T);d.sessionId=_.sessionId,this.slog("info",e.memberId,"session",`new session on restart (id=${d.sessionId})`)}}catch{this.slog("warn",e.memberId,"session","session re-creation failed on restart")}this.startHeartbeat(e.memberId,T=>{this.slog("warn",T,"heartbeat","hang detected \u2014 force-killing"),this.callbacks.onNotification?.(T,"agents.error",{agentId:T,phase:"heartbeat",error:`Agent ${e.name} stopped responding`,retriesLeft:0}),this.kill(T)})}catch(d){let l=this.processes.get(e.memberId);l&&(l.handle.state="failed",l.handle.error=`Runtime restart failed: ${d instanceof Error?d.message:String(d)}`,l.handle.endedAt=Date.now()),this.callbacks.onStateChange?.(e.memberId,"failed"),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Restart failed after ${n} attempts: ${d instanceof Error?d.message:String(d)}`,retriesLeft:0})}}getMcpIpcPath(e){return this.processes.get(e)?.ipcPath}heartbeatTimers=new Map;missedBeats=new Map;static HEARTBEAT_INTERVAL=3e4;static MAX_MISSED_BEATS=3;startHeartbeat(e,t){this.stopHeartbeat(e),this.missedBeats.set(e,0);let n=setInterval(async()=>{let o=this.processes.get(e);if(!o||o.handle.state==="completed"||o.handle.state==="failed"||o.handle.state==="killed"){this.stopHeartbeat(e);return}if(await this.ping(e,1e4)){this.missedBeats.set(e,0);return}let i=(this.missedBeats.get(e)??0)+1;this.missedBeats.set(e,i),this.slog("warn",e,"heartbeat",`missed (${i}/${r.MAX_MISSED_BEATS})`),i>=r.MAX_MISSED_BEATS&&(this.slog("warn",e,"heartbeat","hang detected, force-killing"),this.stopHeartbeat(e),o.handle.error=`Hang detected: ${i} consecutive heartbeat failures`,this.kill(e),t?.(e))},r.HEARTBEAT_INTERVAL);this.heartbeatTimers.set(e,n)}stopHeartbeat(e){let t=this.heartbeatTimers.get(e);t&&(clearInterval(t),this.heartbeatTimers.delete(e)),this.missedBeats.delete(e)}getMissedBeats(e){return this.missedBeats.get(e)??0}activeCount(){return[...this.processes.values()].filter(e=>e.handle.state==="starting"||e.handle.state==="ready"||e.handle.state==="running").length}remove(e){let t=this.processes.get(e);t&&(this.stopHeartbeat(e),(t.handle.state==="running"||t.handle.state==="starting"||t.handle.state==="ready")&&this.kill(e),this.processes.delete(e))}dispose(){for(let e of this.heartbeatTimers.keys())this.stopHeartbeat(e);for(let e of this.processes.values()){try{e.ipcServer?.close()}catch{}try{e.stderrStream?.end()}catch{}}this.killAll(),this.processes.clear()}};import{join as Od}from"node:path";import{chmod as Bk}from"node:fs/promises";import{readFile as Ek,writeFile as Ok,mkdir as Lk,rename as Dk,unlink as $k}from"node:fs/promises";import{dirname as Nk,join as Md}from"node:path";import{randomUUID as Uk}from"node:crypto";async function jk(r,e){let t=Nk(r);await Lk(t,{recursive:!0});let n=Md(t,`.tmp-${Uk()}`);try{await Ok(n,e,"utf-8"),await Dk(n,r)}catch(o){throw await $k(n).catch(()=>{}),o}}async function Rt(r){try{let e=await Ek(r,"utf-8");return JSON.parse(e)}catch(e){if(e.code==="ENOENT")return;throw e}}async function pn(r,e){await jk(r,JSON.stringify(e,null,2)+`
408
+ `)}var Fk="memory.json";function ko(){return Md(W(),Fk)}async function Id(){return Rt(ko())}async function Ls(r){let e={...r,savedAt:new Date().toISOString()};await pn(ko(),e)}var Ld="agent-configs.json";function Ed(){return Od(W(),Ld)}function Gk(r){return Od(Ve(r),Ld)}function Wk(){return{agents:{}}}var To=class{data=Wk();cwd;constructor(e){this.cwd=e}async load(){let e=await Rt(Ed()),t=this.cwd?await Rt(Gk(this.cwd)):void 0,n={gatewayUrl:e?.gatewayUrl,agents:{...e?.agents},customAgents:{...e?.customAgents}};if(t){t.gatewayUrl&&(n.gatewayUrl=t.gatewayUrl);for(let[o,s]of Object.entries(t.agents??{}))n.agents[o]={...n.agents[o],...s};for(let[o,s]of Object.entries(t.customAgents??{}))n.customAgents??={},n.customAgents[o]=s}this.data=n}getData(){return this.data}getAgentConfig(e){return this.data.agents[e]??null}async setAgentConfig(e,t){this.data.agents[e]={...this.data.agents[e],...t},await this.save()}async removeAgentConfig(e){delete this.data.agents[e],await this.save()}getGatewayUrl(){return this.data.gatewayUrl}async setGatewayUrl(e){this.data.gatewayUrl=e,await this.save()}registerCustomAgent(e){this.data.customAgents??={},this.data.customAgents[e.id]=e}unregisterCustomAgent(e){this.data.customAgents&&delete this.data.customAgents[e]}getCustomAgents(){return{...this.data.customAgents}}async save(){let e=Ed();await pn(e,this.data);try{await Bk(e,384)}catch{}}};import{randomUUID as Kk}from"node:crypto";import{execFile as Hk}from"node:child_process";import{promisify as zk}from"node:util";import{join as Dd}from"node:path";import{mkdir as Vk,rm as qk}from"node:fs/promises";var Ct=zk(Hk);async function mn(r){try{let{stdout:e}=await Ct("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8"});return e.trim()}catch{return null}}async function wo(r,e,t){let n=Dd(r,".worktrees");await Vk(n,{recursive:!0});let o=Dd(n,e),i=["worktree","add","-B",`solo/${e}`,o];return t?i.push(t):i.push("HEAD"),await Ct("git",i,{cwd:r,encoding:"utf8"}),o}async function $d(r){try{await Ct("git",["add","-A"],{cwd:r});let{stdout:e}=await Ct("git",["diff","--cached","--stat"],{cwd:r,encoding:"utf8"});return e.trim()}catch{return""}}async function Nd(r,e){try{await Ct("git",["worktree","remove","--force",e],{cwd:r,encoding:"utf8"})}catch{try{await qk(e,{recursive:!0,force:!0})}catch{}}}async function Ud(r,e){let{stdout:t}=await Ct("git",["merge","--no-ff",e,"-m",`solo: merge ${e}`],{cwd:r,encoding:"utf8"});return t.trim()}var vo=class{constructor(e,t,n,o={}){this.processManager=e;this.acpDetector=t;this.configStore=n;this.callbacks=o}processManager;acpDetector;configStore;callbacks;sessions=new Map;async start(e){let{task:t,agents:n,cwd:o}=e;if(n.length<2)throw new Error("Solo Mode requires at least 2 agents");let s=await mn(o);if(!s)throw new Error("Solo Mode requires a git repository");let i=`solo-${Kk().slice(0,8)}`,a={soloId:i,state:"running",task:t,cwd:o,gitRoot:s,agents:[],createdAt:Date.now()};this.sessions.set(i,a),this.callbacks.log?.info(`[solo] starting ${i} with ${n.length} agents`);let c=n.map(async(l,u)=>{let p=`${i}-${l}-${u}`,m=`solo/${p}`,g=`${i}:${l}:${u}`,f;try{f=await wo(s,p)}catch(w){this.callbacks.log?.warn(`[solo] worktree creation failed for ${l}: ${w instanceof Error?w.message:String(w)}`);let T={agentId:l,memberId:g,worktreePath:"",worktreeBranch:m,state:"failed",error:`Worktree creation failed: ${w instanceof Error?w.message:String(w)}`};a.agents.push(T);return}let b={agentId:l,memberId:g,worktreePath:f,worktreeBranch:m,state:"pending"};a.agents.push(b);try{b.state="running",this.callbacks.onProgress?.(i,l,"running");let w=this.acpDetector.buildExternalDescriptor(l);if(!w)throw new Error(`Agent ${l} is not available or not ACP-compatible`);await this.processManager.spawn({memberId:g,name:`solo-${l}`,cwd:f,prompt:t,external:w});let T=this.processManager.getHandle(g);if(!T||T.state!=="ready")throw new Error(`Agent ${l} spawn did not reach ready state`);let _=await this.processManager.sendTask(g,t);b.state="completed",b.resultText=typeof _=="string"?_:JSON.stringify(_),b.diff=await $d(f);let R=this.processManager.getUsageTracker(g);if(R?.hasData()){let y=R.getUsage();b.usage={inputTokens:y.inputTokens,outputTokens:y.outputTokens}}this.callbacks.onProgress?.(i,l,"completed"),this.callbacks.log?.info(`[solo] ${l} completed (diff: ${b.diff?"yes":"none"})`)}catch(w){b.state="failed",b.error=w instanceof Error?w.message:String(w),this.callbacks.onProgress?.(i,l,"failed",b.error),this.callbacks.log?.warn(`[solo] ${l} failed: ${b.error}`)}});await Promise.allSettled(c);let d=a.agents.filter(l=>l.state==="completed");if(d.length===0)return a.state="failed",this.callbacks.log?.warn(`[solo] all agents failed for ${i}`),i;a.state="evaluating",this.callbacks.log?.info(`[solo] evaluating ${d.length} results for ${i}`);try{let l=await this.evaluate(a,d);a.evaluation=l,a.state="completed",this.callbacks.onEvaluation?.(i,l)}catch(l){a.state="completed",this.callbacks.log?.warn(`[solo] evaluation failed for ${i}: ${l instanceof Error?l.message:String(l)}`)}return i}getStatus(e){let t=this.sessions.get(e);return t?{soloId:t.soloId,state:t.state,agents:t.agents.map(n=>({id:n.agentId,state:n.state,progress:n.state==="running"?"Working...":void 0,resultText:n.resultText,diff:n.diff,usage:n.usage,error:n.error,worktreePath:n.worktreePath})),evaluation:t.evaluation}:null}async cancel(e){let t=this.sessions.get(e);if(!t)throw new Error(`Solo session ${e} not found`);if(t.state!=="running"&&t.state!=="evaluating")throw new Error(`Solo session ${e} is not running (state: ${t.state})`);t.state="cancelled";for(let n of t.agents)if(n.state==="running"||n.state==="pending"){n.state="failed",n.error="Cancelled by user";try{this.processManager.kill(n.memberId)}catch{}}await this.cleanupWorktrees(t),this.callbacks.log?.info(`[solo] cancelled ${e}`)}async select(e){let t=this.sessions.get(e.soloId);if(!t)throw new Error(`Solo session ${e.soloId} not found`);if(t.state!=="completed")throw new Error(`Solo session ${e.soloId} is not completed (state: ${t.state})`);let n=t.agents.find(s=>s.agentId===e.winnerId&&s.state==="completed");if(!n)throw new Error(`Agent ${e.winnerId} is not a completed participant in ${e.soloId}`);let o=await Ud(t.gitRoot,n.worktreeBranch);return this.callbacks.log?.info(`[solo] merged ${n.worktreeBranch}: ${o}`),await this.cleanupWorktrees(t),n.worktreeBranch}listSessions(){return[...this.sessions.values()].map(e=>this.getStatus(e.soloId))}async delete(e){let t=this.sessions.get(e);if(!t)throw new Error(`Solo session ${e} not found`);if(t.state==="running"||t.state==="evaluating"){t.state="cancelled";for(let n of t.agents)if(n.state==="running"||n.state==="pending"){n.state="failed",n.error="Deleted";try{this.processManager.kill(n.memberId)}catch{}}await this.cleanupWorktrees(t)}this.sessions.delete(e),this.callbacks.log?.info(`[solo] deleted ${e}`)}async evaluate(e,t){if(t.length===1)return{winnerId:t[0].agentId,reasoning:`Only one agent (${t[0].agentId}) completed successfully.`};let n=["# Task Evaluation","","## Original Task",e.task,"","## Agent Results",""];for(let i of t)n.push(`### Agent: ${i.agentId}`,"","**Result:**",i.resultText??"(no output)","","**Changes (git diff stat):**",i.diff||"(no changes)","");n.push("## Instructions","","Review all agent results above. Select the best implementation and explain your reasoning.","Respond in this exact format:","","WINNER: <agent-id>","REASONING: <your explanation>");let o=n.join(`
409
+ `),s=t[0].memberId;try{let i=await this.processManager.sendTask(s,o),a=typeof i=="string"?i:JSON.stringify(i);return this.parseEvaluationResponse(a,t)}catch{return{winnerId:t[0].agentId,reasoning:"Evaluation failed; defaulting to first completed agent."}}}parseEvaluationResponse(e,t){let n=e.match(/WINNER:\s*(\S+)/i),o=e.match(/REASONING:\s*(.+)/is),s=t.map(a=>a.agentId),i=n?.[1];if(i&&s.includes(i))return{winnerId:i,reasoning:o?.[1]?.trim()||"Selected by leader evaluation."};for(let a of s)if(e.includes(a))return{winnerId:a,reasoning:o?.[1]?.trim()||e.slice(0,500)};return{winnerId:t[0].agentId,reasoning:`Could not parse evaluation. Full response: ${e.slice(0,500)}`}}async cleanupWorktrees(e){for(let t of e.agents)if(t.worktreePath)try{try{this.processManager.kill(t.memberId)}catch{}this.processManager.remove(t.memberId),await Nd(e.gitRoot,t.worktreePath)}catch(n){this.callbacks.log?.warn(`[solo] failed to clean worktree for ${t.agentId}: ${n instanceof Error?n.message:String(n)}`)}}};import{randomUUID as Xk}from"node:crypto";var gn=class{nodes=new Map;constructor(e){for(let t of e){if(this.nodes.has(t.taskId))throw new Error(`Duplicate task ID: ${t.taskId}`);this.nodes.set(t.taskId,{taskId:t.taskId,assignee:t.assignee,prompt:t.prompt,dependsOn:t.dependsOn??[],status:"pending"})}this.validateDag()}getAllTasks(){return[...this.nodes.values()]}getTask(e){return this.nodes.get(e)}getReadyTasks(){let e=[];for(let t of this.nodes.values()){if(t.status!=="pending")continue;t.dependsOn.every(o=>this.nodes.get(o)?.status==="completed")&&e.push(t)}return e}markRunning(e){let t=this.nodes.get(e);if(!t)throw new Error(`Unknown task: ${e}`);if(t.status!=="pending")throw new Error(`Task ${e} is ${t.status}, cannot start`);t.status="running",t.startedAt=Date.now()}markCompleted(e,t){let n=this.nodes.get(e);if(!n)throw new Error(`Unknown task: ${e}`);if(n.status!=="running")throw new Error(`Task ${e} is ${n.status}, cannot complete`);n.status="completed",n.result=t,n.completedAt=Date.now()}markFailed(e,t){let n=this.nodes.get(e);if(!n)throw new Error(`Unknown task: ${e}`);n.status="failed",n.error=t,n.completedAt=Date.now()}markPaused(e){let t=this.nodes.get(e);if(!t)throw new Error(`Unknown task: ${e}`);t.status==="running"&&(t.status="paused")}resumePaused(e){let t=this.nodes.get(e);if(!t)throw new Error(`Unknown task: ${e}`);t.status==="paused"&&(t.status="pending")}isFinished(){for(let e of this.nodes.values())if(e.status==="running"||e.status==="paused"||e.status==="pending"&&!e.dependsOn.some(n=>this.nodes.get(n)?.status==="failed"))return!1;return!0}isAllCompleted(){return[...this.nodes.values()].every(e=>e.status==="completed")}getBlockedTasks(){return[...this.nodes.values()].filter(e=>e.status!=="pending"?!1:e.dependsOn.some(t=>this.nodes.get(t)?.status==="failed"))}pauseAll(){for(let e of this.nodes.values())e.status==="running"&&(e.status="paused")}resumeAll(){for(let e of this.nodes.values())e.status==="paused"&&(e.status="pending")}serialize(){return[...this.nodes.values()].map(e=>({taskId:e.taskId,assignee:e.assignee,prompt:e.prompt,dependsOn:e.dependsOn,status:e.status,result:e.result,error:e.error,startedAt:e.startedAt,completedAt:e.completedAt}))}restore(e){for(let t of e){let n=this.nodes.get(t.taskId);n&&(n.status=t.status==="running"?"pending":t.status,n.result=t.result,n.error=t.error,n.startedAt=t.startedAt,n.completedAt=t.completedAt)}}validateDag(){for(let o of this.nodes.values())for(let s of o.dependsOn)if(!this.nodes.has(s))throw new Error(`Task "${o.taskId}" depends on unknown task "${s}"`);let e=new Set,t=new Set,n=o=>{if(t.has(o))throw new Error(`Cycle detected involving task "${o}"`);if(e.has(o))return;t.add(o);let s=this.nodes.get(o);for(let i of s.dependsOn)n(i);t.delete(o),e.add(o)};for(let o of this.nodes.keys())n(o)}};var fn=class{maxTotalTokens;maxDuration;usedTokens=0;startedAt;warningEmitted=!1;constructor(e){this.maxTotalTokens=e?.maxTotalTokens,this.maxDuration=e?.maxDuration,this.startedAt=Date.now()}addUsage(e,t){this.usedTokens+=e+t}addFromTracker(e){if(!e.hasData())return;let t=e.getUsage();this.usedTokens+=t.totalTokens}getElapsed(){return Date.now()-this.startedAt}getBudget(){return{maxTotalTokens:this.maxTotalTokens,maxDuration:this.maxDuration,usedTokens:this.usedTokens,elapsed:this.getElapsed()}}check(){let e=this.getElapsed();if(this.maxDuration&&e>=this.maxDuration)return{action:"exceeded",percentage:Math.round(e/this.maxDuration*100),usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration};if(this.maxTotalTokens){let n=Math.round(this.usedTokens/this.maxTotalTokens*100);if(this.usedTokens>=this.maxTotalTokens)return{action:"exceeded",percentage:n,usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration};if(n>=80&&!this.warningEmitted)return this.warningEmitted=!0,{action:"warning",percentage:n,usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration}}return{action:"ok",percentage:this.maxTotalTokens?Math.round(this.usedTokens/this.maxTotalTokens*100):0,usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration}}restore(e){this.usedTokens=e.usedTokens,this.startedAt=e.startedAt,this.warningEmitted=e.warningEmitted}serialize(){return{usedTokens:this.usedTokens,startedAt:this.startedAt,warningEmitted:this.warningEmitted}}};import{join as Ds}from"node:path";import{mkdir as Jk,readdir as Yk}from"node:fs/promises";function jd(r){return Ds(Ve(r),"products")}function Fd(r,e){return Ds(jd(e),r)}function Bd(r,e){return Ds(Fd(r,e),"product-state.json")}async function Gd(r,e){let t=Fd(r.productId,e);await Jk(t,{recursive:!0}),await pn(Bd(r.productId,e),r)}async function $s(r,e){return Rt(Bd(r,e))}async function Wd(r){let e=jd(r),t;try{t=await Yk(e)}catch{return[]}let n=[];for(let o of t){let s=await $s(o,r);s&&n.push(s)}return n}var hn=class r{constructor(e={}){this.callbacks=e}callbacks;static DEFAULT_INTERVAL=5*6e4;static LONG_RUNNING_INTERVAL=30*6e4;static LONG_RUNNING_THRESHOLD=2880*6e4;timer=null;lastCheckpointAt=0;cwd;start(e){this.cwd=e,this.stop(),this.timer=setInterval(()=>{let t=this.callbacks.getState?.();t&&this.checkpoint(t).catch(n=>{this.callbacks.log?.warn(`[checkpoint] periodic save failed: ${n instanceof Error?n.message:String(n)}`)})},r.DEFAULT_INTERVAL),this.timer.unref()}stop(){this.timer&&(clearInterval(this.timer),this.timer=null)}getInterval(e){return e>r.LONG_RUNNING_THRESHOLD?r.LONG_RUNNING_INTERVAL:r.DEFAULT_INTERVAL}isDue(e){if(this.lastCheckpointAt===0)return!0;let t=this.getInterval(e);return Date.now()-this.lastCheckpointAt>=t}async checkpoint(e){let t=new Date().toISOString();e.lastCheckpointAt=t,await Gd(e,this.cwd),this.lastCheckpointAt=Date.now(),this.callbacks.onCheckpoint?.(e.productId,t),this.callbacks.log?.info(`[checkpoint] saved ${e.productId} at ${t}`)}getLastCheckpointAt(){return this.lastCheckpointAt}};var xo=class{constructor(e,t,n,o={}){this.processManager=e;this.acpDetector=t;this.configStore=n;this.callbacks=o}processManager;acpDetector;configStore;callbacks;sessions=new Map;async create(e){let{name:t,cwd:n,instances:o,tasks:s,budget:i}=e;if(o.length===0)throw new Error("Product requires at least 1 instance");if(s.length===0)throw new Error("Product requires at least 1 task");let a=new Set(o.map(f=>f.name));for(let f of s)if(!a.has(f.assignee))throw new Error(`Task "${f.taskId}" references unknown instance "${f.assignee}"`);let c=`product-${Xk().slice(0,8)}`,d=new gn(s),l=new fn(i),u=new hn({onCheckpoint:(f,b)=>this.callbacks.onCheckpointed?.(f,b),getState:()=>{let f=this.sessions.get(c);return f?this.buildPersistedState(f):null},log:this.callbacks.log}),p=await mn(n),m=o.map((f,b)=>({instanceId:`${c}:${f.name}:${b}`,name:f.name,agentId:f.agentId,state:"idle"})),g={productId:c,name:t,cwd:n,phase:"active",instances:m,dag:d,budget:l,checkpoint:u,createdAt:new Date().toISOString(),gitRoot:p};return this.sessions.set(c,g),u.start(n),this.callbacks.log?.info(`[product] created ${c} "${t}" with ${o.length} instances, ${s.length} tasks`),this.scheduleNext(g),c}async resume(e,t){let n=await $s(e,t);if(!n)throw new Error(`Product ${e} not found on disk`);let o=new gn(n.tasks);o.restore(n.tasks);let s=new fn({maxTotalTokens:n.budget.maxTotalTokens,maxDuration:n.budget.maxDuration});s.restore(n.budget);let i=new hn({onCheckpoint:(l,u)=>this.callbacks.onCheckpointed?.(l,u),getState:()=>{let l=this.sessions.get(e);return l?this.buildPersistedState(l):null},log:this.callbacks.log}),a=await mn(n.cwd),c=n.instances.map((l,u)=>({instanceId:`${e}:${l.name}:${u}`,name:l.name,agentId:l.agentId,state:"idle"})),d={productId:n.productId,name:n.name,cwd:n.cwd,phase:"active",instances:c,dag:o,budget:s,checkpoint:i,createdAt:n.createdAt,gitRoot:a};this.sessions.set(e,d),i.start(n.cwd),this.callbacks.log?.info(`[product] resumed ${e}`),this.scheduleNext(d)}async pause(e){let t=this.sessions.get(e);if(!t)throw new Error(`Product ${e} not found`);if(t.phase!=="active")throw new Error(`Product ${e} is not active`);t.phase="paused",t.dag.pauseAll();for(let n of t.instances)if(n.state==="running"&&n.memberId){try{this.processManager.kill(n.memberId)}catch{}n.state="paused"}await t.checkpoint.checkpoint(this.buildPersistedState(t)),t.checkpoint.stop(),this.callbacks.log?.info(`[product] paused ${e}`)}async checkpoint(e){let t=this.sessions.get(e);if(!t)throw new Error(`Product ${e} not found`);await t.checkpoint.checkpoint(this.buildPersistedState(t))}async delete(e){let t=this.sessions.get(e);if(!t)throw new Error(`Product ${e} not found`);if(t.phase==="active"){t.phase="failed",t.dag.pauseAll();for(let n of t.instances)if(n.state==="running"&&n.memberId){try{this.processManager.kill(n.memberId)}catch{}n.state="failed"}}t.checkpoint.stop(),this.sessions.delete(e),this.callbacks.log?.info(`[product] deleted ${e}`)}getStatus(e){let t=this.sessions.get(e);return t?{productId:t.productId,name:t.name,phase:t.phase,instances:t.instances.map(n=>{let s=(n.memberId?this.processManager.getUsageTracker(n.memberId):null)?.getUsage();return{instanceId:n.instanceId,name:n.name,agentId:n.agentId,state:n.state,worktreePath:n.worktreePath,usage:s&&(s.inputTokens>0||s.outputTokens>0)?{inputTokens:s.inputTokens,outputTokens:s.outputTokens}:void 0}}),tasks:t.dag.getAllTasks().map(n=>({taskId:n.taskId,assignee:n.assignee,status:n.status,result:n.result,error:n.error,startedAt:n.startedAt?new Date(n.startedAt).toISOString():void 0,completedAt:n.completedAt?new Date(n.completedAt).toISOString():void 0})),budget:t.budget.getBudget(),lastCheckpointAt:new Date(t.checkpoint.getLastCheckpointAt()||Date.now()).toISOString()}:null}async list(e){let t=[];for(let o of this.sessions.values()){let s=o.dag.getAllTasks();t.push({productId:o.productId,name:o.name,phase:o.phase,instanceCount:o.instances.length,taskCount:s.length,completedTasks:s.filter(i=>i.status==="completed").length,createdAt:o.createdAt,lastCheckpointAt:new Date(o.checkpoint.getLastCheckpointAt()||Date.now()).toISOString()})}let n=await Wd(e);for(let o of n)this.sessions.has(o.productId)||t.push({productId:o.productId,name:o.name,phase:o.phase,instanceCount:o.instances.length,taskCount:o.tasks.length,completedTasks:o.tasks.filter(s=>s.status==="completed").length,createdAt:o.createdAt,lastCheckpointAt:o.lastCheckpointAt});return t}scheduleNext(e){if(e.phase!=="active")return;let t=e.budget.check();if(t.action==="exceeded"){this.callbacks.log?.warn(`[product] ${e.productId} budget exceeded, auto-pausing`),this.pause(e.productId).catch(o=>{this.callbacks.log?.warn(`[product] auto-pause failed: ${o instanceof Error?o.message:String(o)}`)});return}if(t.action==="warning"&&this.callbacks.onBudgetWarning?.(e.productId,t.usedTokens,t.maxTotalTokens,t.percentage),e.dag.isFinished()){this.finishProduct(e);return}let n=e.dag.getReadyTasks();for(let o of n)this.dispatchTask(e,o)}dispatchTask(e,t){let n=e.instances.find(o=>o.name===t.assignee);if(!n){e.dag.markFailed(t.taskId,`No instance found for assignee "${t.assignee}"`),this.callbacks.onTaskFailed?.(e.productId,t.taskId,`No instance for "${t.assignee}"`),this.scheduleNext(e);return}e.dag.markRunning(t.taskId),n.state="running",this.callbacks.onTaskStarted?.(e.productId,t.taskId,t.assignee),this.callbacks.log?.info(`[product] ${e.productId} dispatching task ${t.taskId} to ${t.assignee}`),this.runTask(e,n,t).catch(o=>{this.callbacks.log?.warn(`[product] task dispatch error: ${o instanceof Error?o.message:String(o)}`)})}async runTask(e,t,n){let o=`${e.productId}:${t.name}:${n.taskId}`;t.memberId=o;try{let s=this.acpDetector.buildExternalDescriptor(t.agentId);if(!s)throw new Error(`Agent ${t.agentId} is not available`);let i=e.cwd;if(e.gitRoot){let l=`${e.productId}-${t.name}-${n.taskId}`;try{i=await wo(e.gitRoot,l),t.worktreePath=i}catch{this.callbacks.log?.warn(`[product] worktree creation failed for ${n.taskId}, using project cwd`)}}await this.processManager.spawn({memberId:o,name:`product-${t.name}`,cwd:i,prompt:n.prompt,external:s});let a=await this.processManager.sendTask(o,n.prompt),c=typeof a=="string"?a:JSON.stringify(a),d=this.processManager.getUsageTracker(o);if(d?.hasData()){let l=d.getUsage();e.budget.addUsage(l.inputTokens,l.outputTokens)}e.dag.markCompleted(n.taskId,c),t.state="completed",this.callbacks.onTaskCompleted?.(e.productId,n.taskId,c);try{this.processManager.kill(o)}catch{}this.processManager.remove(o)}catch(s){let i=s instanceof Error?s.message:String(s);e.dag.markFailed(n.taskId,i),t.state="failed",this.callbacks.onTaskFailed?.(e.productId,n.taskId,i);try{this.processManager.kill(o)}catch{}try{this.processManager.remove(o)}catch{}}try{await e.checkpoint.checkpoint(this.buildPersistedState(e))}catch(s){this.callbacks.log?.warn(`[product] checkpoint failed: ${s instanceof Error?s.message:String(s)}`)}this.scheduleNext(e)}finishProduct(e){if(e.dag.isAllCompleted()){e.phase="completed";let t=e.dag.getAllTasks(),n=`Product "${e.name}" completed: ${t.length} tasks all done.`;this.callbacks.onCompleted?.(e.productId,n)}else{e.phase="failed";let n=e.dag.getAllTasks().filter(i=>i.status==="failed").length,o=e.dag.getBlockedTasks().length,s=`Product "${e.name}" finished with ${n} failed, ${o} blocked tasks.`;this.callbacks.onCompleted?.(e.productId,s)}e.checkpoint.stop(),e.checkpoint.checkpoint(this.buildPersistedState(e)).catch(t=>{this.callbacks.log?.warn(`[product] final checkpoint failed: ${t instanceof Error?t.message:String(t)}`)}),this.callbacks.log?.info(`[product] ${e.productId} finished (phase=${e.phase})`)}buildPersistedState(e){return{productId:e.productId,name:e.name,phase:e.phase,cwd:e.cwd,instances:e.instances.map(t=>({name:t.name,role:"",agentId:t.agentId})),tasks:e.dag.serialize(),budget:e.budget.serialize(),createdAt:e.createdAt,lastCheckpointAt:new Date(e.checkpoint.getLastCheckpointAt()||Date.now()).toISOString()}}};var Hd="memory";var Qk=["add","replace","remove","search"],zd={type:"object",properties:{action:{type:"string",enum:Qk,description:["The operation to perform:","\u2022 'add' \u2014 Save a concise note about this user (\u2192 local notes, always visible)","\u2022 'replace' \u2014 Update an existing note by matching a substring (\u2192 local notes)","\u2022 'remove' \u2014 Delete a note by matching a substring (\u2192 local notes)","\u2022 'search' \u2014 Search across long-term memory, recalled facts, user profile, and media preferences"].join(`
408
410
  `)},target:{type:"string",enum:["memory","user"],description:["Which note target to operate on (for add/replace/remove):","\u2022 'memory' \u2014 Your personal observations/notes about this user (default)","\u2022 'user' \u2014 User profile facts (preferences, timezone, etc.)"].join(`
409
411
  `)},content:{type:"string",description:["Required for 'add' and 'replace'. The note content to store.","Write a concise, factual statement.","Good: '\u7528\u6237\u662F\u540E\u7AEF\u5DE5\u7A0B\u5E08\uFF0C\u4E3B\u8981\u4F7F\u7528 TypeScript \u548C Go'","Good: 'User prefers dark UI themes and minimalist design'","Bad: '\u7528\u6237\u8BF4\u4E86\u5F88\u591A\u8BDD' (too vague)","Bad: entire conversation transcripts (too long)"].join(`
410
412
  `)},old_text:{type:"string",description:"Required for 'replace' and 'remove'. A substring that uniquely identifies the note entry to modify."},query:{type:"string",description:"Required for 'search'. Natural language query to find relevant memories."},category:{type:"string",enum:["profile","facts","media","projects"],description:["Optional for 'search': narrow the search to a specific category.","\u2022 'profile' \u2014 user preferences, expertise, communication style","\u2022 'facts' \u2014 recalled long-term memories","\u2022 'media' \u2014 media generation preferences (image style, music genre, etc.)","\u2022 'projects' \u2014 project context and tech stack","If omitted, searches across all sources."].join(`
411
- `)}},required:["action"]},Fu=["Manage your notes about this user and search long-term memory.","","Your notes (add/replace/remove) are always visible in the system prompt.","Long-term memories are automatically extracted from every conversation","and searchable via 'search'.","","Guidelines:","- Use 'add' to record important user preferences, facts, or context","- Use 'replace' to update outdated notes (match by substring)","- Use 'remove' to delete incorrect notes (match by substring)","- Use 'search' to recall conversation history, user profile, and media preferences","- Keep notes concise \u2014 there's a character limit"].join(`
412
- `),Bu="Memory",Hk=[/ignore\s+(previous|all|above|prior)\s+instructions/i,/you\s+are\s+now\s+/i,/do\s+not\s+tell\s+the\s+user/i,/system\s+prompt\s+override/i];function Ps(r){return!Hk.some(e=>e.test(r))}async function Wu(r,e){let{action:t}=r,n=r.target??"memory";if(t==="add"){if(!e.store)return{ok:!1,message:"Local memory store is not available.",action:t,errorCode:"no_store"};let o=r.content?.trim();if(!o)return{ok:!1,message:"content is required for 'add' action.",action:t,errorCode:"empty_content"};if(o.length>2e3)return{ok:!1,message:`Content too long (${o.length} chars, max 2000).`,action:t,errorCode:"too_long"};let s=e.store.add(n,o);return{ok:s.ok,message:s.ok?`${s.message} [${s.usage}]`:s.message,action:t,entryCount:s.entryCount,usage:s.usage,storeModified:s.ok,errorCode:s.errorCode}}if(t==="replace"){if(!e.store)return{ok:!1,message:"Local memory store is not available.",action:t,errorCode:"no_store"};let o=r.old_text?.trim(),s=r.content?.trim();if(!o)return{ok:!1,message:"old_text is required for 'replace' action.",action:t,errorCode:"empty_old_text"};if(!s)return{ok:!1,message:"content is required for 'replace' action.",action:t,errorCode:"empty_content"};if(s.length>2e3)return{ok:!1,message:`Content too long (${s.length} chars, max 2000).`,action:t,errorCode:"too_long"};let i=e.store.replace(n,o,s);return{ok:i.ok,message:i.ok?`${i.message} [${i.usage}]`:i.message,action:t,entryCount:i.entryCount,usage:i.usage,storeModified:i.ok,errorCode:i.errorCode}}if(t==="remove"){if(!e.store)return{ok:!1,message:"Local memory store is not available.",action:t,errorCode:"no_store"};let o=r.old_text?.trim();if(!o)return{ok:!1,message:"old_text is required for 'remove' action.",action:t,errorCode:"empty_old_text"};let s=e.store.remove(n,o);return{ok:s.ok,message:s.ok?`${s.message} [${s.usage}]`:s.message,action:t,entryCount:s.entryCount,usage:s.usage,storeModified:s.ok,errorCode:s.errorCode}}if(t==="search"){let o=r.query?.trim();if(!o)return{ok:!1,message:"query is required for 'search' action.",action:t,errorCode:"empty_query"};let s=r.category,i=[],a;if(e.store&&(!s||s==="facts"||s==="profile")){let l=o.toLowerCase(),u=l.split(/\s+/).filter(d=>d.length>2),c=[];for(let d of["memory","user"])for(let p of e.store.getEntries(d)){let m=p.toLowerCase();(m.includes(l)||u.some(g=>m.includes(g)))&&c.push(`[${d}] ${p}`)}c.length>0&&i.push(`## Local Notes
413
- `+c.map(d=>`\u2022 ${d}`).join(`
414
- `))}if(!s||s==="facts"||s==="projects")try{let l=await e.provider.search(o,e.userId,{limit:10});a=l,l.length>0&&i.push(`## Long-term Memory
415
- `+l.map((u,c)=>`${c+1}. [${u.blockId}] ${u.text}`).join(`
416
- `))}catch{}if((!s||s==="facts"||s==="projects")&&e.queryGraph)try{let l=e.queryGraph(o,e.userId);l.length>0&&i.push(`## Recalled Facts
413
+ `)}},required:["action"]},Vd=["Manage your notes about this user and search long-term memory.","","Your notes (add/replace/remove) are always visible in the system prompt.","Long-term memories are automatically extracted from every conversation","and searchable via 'search'.","","Guidelines:","- Use 'add' to record important user preferences, facts, or context","- Use 'replace' to update outdated notes (match by substring)","- Use 'remove' to delete incorrect notes (match by substring)","- Use 'search' to recall conversation history, user profile, and media preferences","- Keep notes concise \u2014 there's a character limit"].join(`
414
+ `),qd="Memory",Zk=[/ignore\s+(previous|all|above|prior)\s+instructions/i,/you\s+are\s+now\s+/i,/do\s+not\s+tell\s+the\s+user/i,/system\s+prompt\s+override/i];function Ns(r){return!Zk.some(e=>e.test(r))}async function Kd(r,e){let{action:t}=r,n=r.target??"memory";if(t==="add"){if(!e.store)return{ok:!1,message:"Local memory store is not available.",action:t,errorCode:"no_store"};let o=r.content?.trim();if(!o)return{ok:!1,message:"content is required for 'add' action.",action:t,errorCode:"empty_content"};if(o.length>2e3)return{ok:!1,message:`Content too long (${o.length} chars, max 2000).`,action:t,errorCode:"too_long"};let s=e.store.add(n,o);return{ok:s.ok,message:s.ok?`${s.message} [${s.usage}]`:s.message,action:t,entryCount:s.entryCount,usage:s.usage,storeModified:s.ok,errorCode:s.errorCode}}if(t==="replace"){if(!e.store)return{ok:!1,message:"Local memory store is not available.",action:t,errorCode:"no_store"};let o=r.old_text?.trim(),s=r.content?.trim();if(!o)return{ok:!1,message:"old_text is required for 'replace' action.",action:t,errorCode:"empty_old_text"};if(!s)return{ok:!1,message:"content is required for 'replace' action.",action:t,errorCode:"empty_content"};if(s.length>2e3)return{ok:!1,message:`Content too long (${s.length} chars, max 2000).`,action:t,errorCode:"too_long"};let i=e.store.replace(n,o,s);return{ok:i.ok,message:i.ok?`${i.message} [${i.usage}]`:i.message,action:t,entryCount:i.entryCount,usage:i.usage,storeModified:i.ok,errorCode:i.errorCode}}if(t==="remove"){if(!e.store)return{ok:!1,message:"Local memory store is not available.",action:t,errorCode:"no_store"};let o=r.old_text?.trim();if(!o)return{ok:!1,message:"old_text is required for 'remove' action.",action:t,errorCode:"empty_old_text"};let s=e.store.remove(n,o);return{ok:s.ok,message:s.ok?`${s.message} [${s.usage}]`:s.message,action:t,entryCount:s.entryCount,usage:s.usage,storeModified:s.ok,errorCode:s.errorCode}}if(t==="search"){let o=r.query?.trim();if(!o)return{ok:!1,message:"query is required for 'search' action.",action:t,errorCode:"empty_query"};let s=r.category,i=[],a;if(e.store&&(!s||s==="facts"||s==="profile")){let c=o.toLowerCase(),d=c.split(/\s+/).filter(u=>u.length>2),l=[];for(let u of["memory","user"])for(let p of e.store.getEntries(u)){let m=p.toLowerCase();(m.includes(c)||d.some(g=>m.includes(g)))&&l.push(`[${u}] ${p}`)}l.length>0&&i.push(`## Local Notes
417
415
  `+l.map(u=>`\u2022 ${u}`).join(`
418
- `))}catch{}if((!s||s==="profile"||s==="projects")&&e.getProfileSummary)try{let l=e.getProfileSummary(e.userId);l&&i.push(`## User Profile
419
- `+l)}catch{}if((!s||s==="media")&&e.getMediaPreferences)try{let l=e.getMediaPreferences(e.userId);if(l){let u=[];l.imageStyle&&u.push(`\u2022 Image style: ${l.imageStyle}`),l.videoStyle&&u.push(`\u2022 Video style: ${l.videoStyle}`),l.musicGenre&&u.push(`\u2022 Music genre: ${l.musicGenre}`),l.musicMood&&u.push(`\u2022 Music mood: ${l.musicMood}`),l.primaryPurpose&&u.push(`\u2022 Primary purpose: ${l.primaryPurpose}`),l.colorPreference&&u.push(`\u2022 Color preference: ${l.colorPreference}`),u.length>0&&i.push(`## Media Preferences
420
- `+u.join(`
416
+ `))}if(!s||s==="facts"||s==="projects")try{let c=await e.provider.search(o,e.userId,{limit:10});a=c,c.length>0&&i.push(`## Long-term Memory
417
+ `+c.map((d,l)=>`${l+1}. [${d.blockId}] ${d.text}`).join(`
418
+ `))}catch{}if((!s||s==="facts"||s==="projects")&&e.queryGraph)try{let c=e.queryGraph(o,e.userId);c.length>0&&i.push(`## Recalled Facts
419
+ `+c.map(d=>`\u2022 ${d}`).join(`
420
+ `))}catch{}if((!s||s==="profile"||s==="projects")&&e.getProfileSummary)try{let c=e.getProfileSummary(e.userId);c&&i.push(`## User Profile
421
+ `+c)}catch{}if((!s||s==="media")&&e.getMediaPreferences)try{let c=e.getMediaPreferences(e.userId);if(c){let d=[];c.imageStyle&&d.push(`\u2022 Image style: ${c.imageStyle}`),c.videoStyle&&d.push(`\u2022 Video style: ${c.videoStyle}`),c.musicGenre&&d.push(`\u2022 Music genre: ${c.musicGenre}`),c.musicMood&&d.push(`\u2022 Music mood: ${c.musicMood}`),c.primaryPurpose&&d.push(`\u2022 Primary purpose: ${c.primaryPurpose}`),c.colorPreference&&d.push(`\u2022 Color preference: ${c.colorPreference}`),d.length>0&&i.push(`## Media Preferences
422
+ `+d.join(`
421
423
  `))}}catch{}return i.length===0?{ok:!0,message:"No matching memories found.",action:t,results:[]}:{ok:!0,message:i.join(`
422
424
 
423
- `),action:t,results:a}}return{ok:!1,message:`Unknown action: ${t}. Use 'add', 'replace', 'remove', or 'search'.`,action:t,errorCode:"unknown_action"}}import{readFileSync as Vk,existsSync as zk}from"node:fs";var st=`
425
+ `),action:t,results:a}}return{ok:!1,message:`Unknown action: ${t}. Use 'add', 'replace', 'remove', or 'search'.`,action:t,errorCode:"unknown_action"}}import{readFileSync as eT,existsSync as tT}from"node:fs";var dt=`
424
426
  \xA7
425
- `,qk=2200,Kk=1375,ho=class{memoryEntries=[];userEntries=[];frozenSnapshot={memory:"",user:""};snapshotFrozen=!1;saveTimer=null;memoryCharLimit;userCharLimit;persistToDisk;constructor(e){this.memoryCharLimit=e?.memoryCharLimit??qk,this.userCharLimit=e?.userCharLimit??Kk,this.persistToDisk=e?.persistToDisk??!1}loadFromSerialized(e){this.memoryEntries=Hu(Gu(e.memory??"")),this.userEntries=Hu(Gu(e.user??""))}serialize(){return{memory:this.memoryEntries.join(st),user:this.userEntries.join(st)}}async loadFromDisk(){let e=await _u();e&&this.loadFromSerialized(e)}loadFromDiskSync(){let e=uo();try{if(!zk(e))return;let t=Vk(e,"utf-8"),n=JSON.parse(t);this.loadFromSerialized(n)}catch{}}scheduleSave(){this.persistToDisk&&(this.saveTimer&&clearTimeout(this.saveTimer),this.saveTimer=setTimeout(()=>{this.saveTimer=null,Cs(this.serialize()).catch(()=>{})},500))}async flush(){this.saveTimer&&(clearTimeout(this.saveTimer),this.saveTimer=null),this.persistToDisk&&await Cs(this.serialize())}freezeSnapshot(){this.frozenSnapshot={memory:this.renderBlock("memory",this.memoryEntries),user:this.renderBlock("user",this.userEntries)},this.snapshotFrozen=!0}getSystemPromptBlock(e){return this.snapshotFrozen||this.freezeSnapshot(),this.frozenSnapshot[e]}add(e,t){let n=t.trim();if(!n)return this.errorResult(e,"Content cannot be empty.","empty_content");if(!Ps(n))return this.errorResult(e,"Content rejected: potential injection detected.","unsafe_content");let o=this.entriesFor(e);if(o.includes(n))return this.successResult(e,"Entry already exists (no change).");if([...o,n].join(st).length>this.charLimitFor(e)){let a=this.formatUsage(e);return this.errorResult(e,`Memory full (${a}). Remove old entries first.`,"over_limit")}return o.push(n),this.scheduleSave(),this.successResult(e,"Entry added.")}replace(e,t,n){let o=t.trim(),s=n.trim();if(!o)return this.errorResult(e,"old_text cannot be empty.","empty_old_text");if(!s)return this.errorResult(e,"content cannot be empty.","empty_content");if(!Ps(s))return this.errorResult(e,"Content rejected: potential injection detected.","unsafe_content");let i=this.entriesFor(e),a=i.map((d,p)=>d.includes(o)?p:-1).filter(d=>d>=0);if(a.length===0)return this.errorResult(e,`No entry contains: "${Is(o)}"`,"not_found");if(a.length>1&&new Set(a.map(p=>i[p])).size>1)return this.errorResult(e,`Multiple entries match: "${Is(o)}" (${a.length} matches). Be more specific.`,"ambiguous_match");let l=a[0],u=[...i];if(u[l]=s,u.join(st).length>this.charLimitFor(e)){let d=this.formatUsage(e);return this.errorResult(e,`Replacement would exceed limit (${d}).`,"over_limit")}return i[l]=s,this.scheduleSave(),this.successResult(e,"Entry replaced.")}remove(e,t){let n=t.trim();if(!n)return this.errorResult(e,"old_text cannot be empty.","empty_old_text");let o=this.entriesFor(e),s=o.map((i,a)=>i.includes(n)?a:-1).filter(i=>i>=0);if(s.length===0)return this.errorResult(e,`No entry contains: "${Is(n)}"`,"not_found");for(let i=s.length-1;i>=0;i--)o.splice(s[i],1);return this.scheduleSave(),this.successResult(e,s.length===1?"Entry removed.":`${s.length} entries removed.`)}getEntries(e){return this.entriesFor(e)}getUsage(e){let t=this.entriesFor(e),n=t.length>0?t.join(st).length:0,o=this.charLimitFor(e);return{used:n,limit:o,percent:o>0?Math.round(n/o*100):0}}isEmpty(){return this.memoryEntries.length===0&&this.userEntries.length===0}entriesFor(e){return e==="user"?this.userEntries:this.memoryEntries}charLimitFor(e){return e==="user"?this.userCharLimit:this.memoryCharLimit}formatUsage(e){let{used:t,limit:n,percent:o}=this.getUsage(e);return`${o}% \u2014 ${t}/${n} chars`}renderBlock(e,t){if(t.length===0)return"";let n=e==="user"?"USER PROFILE":"MEMORY",o=this.formatUsage(e),s="\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550",i=t.join(st);return`${s}
427
+ `,nT=2200,oT=1375,So=class{memoryEntries=[];userEntries=[];frozenSnapshot={memory:"",user:""};snapshotFrozen=!1;saveTimer=null;memoryCharLimit;userCharLimit;persistToDisk;constructor(e){this.memoryCharLimit=e?.memoryCharLimit??nT,this.userCharLimit=e?.userCharLimit??oT,this.persistToDisk=e?.persistToDisk??!1}loadFromSerialized(e){this.memoryEntries=Yd(Jd(e.memory??"")),this.userEntries=Yd(Jd(e.user??""))}serialize(){return{memory:this.memoryEntries.join(dt),user:this.userEntries.join(dt)}}async loadFromDisk(){let e=await Id();e&&this.loadFromSerialized(e)}loadFromDiskSync(){let e=ko();try{if(!tT(e))return;let t=eT(e,"utf-8"),n=JSON.parse(t);this.loadFromSerialized(n)}catch{}}scheduleSave(){this.persistToDisk&&(this.saveTimer&&clearTimeout(this.saveTimer),this.saveTimer=setTimeout(()=>{this.saveTimer=null,Ls(this.serialize()).catch(()=>{})},500))}async flush(){this.saveTimer&&(clearTimeout(this.saveTimer),this.saveTimer=null),this.persistToDisk&&await Ls(this.serialize())}freezeSnapshot(){this.frozenSnapshot={memory:this.renderBlock("memory",this.memoryEntries),user:this.renderBlock("user",this.userEntries)},this.snapshotFrozen=!0}getSystemPromptBlock(e){return this.snapshotFrozen||this.freezeSnapshot(),this.frozenSnapshot[e]}add(e,t){let n=t.trim();if(!n)return this.errorResult(e,"Content cannot be empty.","empty_content");if(!Ns(n))return this.errorResult(e,"Content rejected: potential injection detected.","unsafe_content");let o=this.entriesFor(e);if(o.includes(n))return this.successResult(e,"Entry already exists (no change).");if([...o,n].join(dt).length>this.charLimitFor(e)){let a=this.formatUsage(e);return this.errorResult(e,`Memory full (${a}). Remove old entries first.`,"over_limit")}return o.push(n),this.scheduleSave(),this.successResult(e,"Entry added.")}replace(e,t,n){let o=t.trim(),s=n.trim();if(!o)return this.errorResult(e,"old_text cannot be empty.","empty_old_text");if(!s)return this.errorResult(e,"content cannot be empty.","empty_content");if(!Ns(s))return this.errorResult(e,"Content rejected: potential injection detected.","unsafe_content");let i=this.entriesFor(e),a=i.map((u,p)=>u.includes(o)?p:-1).filter(u=>u>=0);if(a.length===0)return this.errorResult(e,`No entry contains: "${Us(o)}"`,"not_found");if(a.length>1&&new Set(a.map(p=>i[p])).size>1)return this.errorResult(e,`Multiple entries match: "${Us(o)}" (${a.length} matches). Be more specific.`,"ambiguous_match");let c=a[0],d=[...i];if(d[c]=s,d.join(dt).length>this.charLimitFor(e)){let u=this.formatUsage(e);return this.errorResult(e,`Replacement would exceed limit (${u}).`,"over_limit")}return i[c]=s,this.scheduleSave(),this.successResult(e,"Entry replaced.")}remove(e,t){let n=t.trim();if(!n)return this.errorResult(e,"old_text cannot be empty.","empty_old_text");let o=this.entriesFor(e),s=o.map((i,a)=>i.includes(n)?a:-1).filter(i=>i>=0);if(s.length===0)return this.errorResult(e,`No entry contains: "${Us(n)}"`,"not_found");for(let i=s.length-1;i>=0;i--)o.splice(s[i],1);return this.scheduleSave(),this.successResult(e,s.length===1?"Entry removed.":`${s.length} entries removed.`)}getEntries(e){return this.entriesFor(e)}getUsage(e){let t=this.entriesFor(e),n=t.length>0?t.join(dt).length:0,o=this.charLimitFor(e);return{used:n,limit:o,percent:o>0?Math.round(n/o*100):0}}isEmpty(){return this.memoryEntries.length===0&&this.userEntries.length===0}entriesFor(e){return e==="user"?this.userEntries:this.memoryEntries}charLimitFor(e){return e==="user"?this.userCharLimit:this.memoryCharLimit}formatUsage(e){let{used:t,limit:n,percent:o}=this.getUsage(e);return`${o}% \u2014 ${t}/${n} chars`}renderBlock(e,t){if(t.length===0)return"";let n=e==="user"?"USER PROFILE":"MEMORY",o=this.formatUsage(e),s="\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550",i=t.join(dt);return`${s}
426
428
  ${n} (your personal notes) [${o}]
427
429
  ${s}
428
- ${i}`}successResult(e,t){let n=this.entriesFor(e);return{ok:!0,message:t,target:e,entries:n,entryCount:n.length,usage:this.formatUsage(e)}}errorResult(e,t,n){let o=this.entriesFor(e);return{ok:!1,message:t,target:e,entries:o,entryCount:o.length,usage:this.formatUsage(e),errorCode:n}}};function Gu(r){return r.trim()?r.split(st).map(e=>e.trim()).filter(Boolean):[]}function Hu(r){let e=new Set;return r.filter(t=>e.has(t)?!1:(e.add(t),!0))}function Is(r,e=60){return r.length<=e?r:`${r.slice(0,e-1).trimEnd()}\u2026`}qo();Vo();import{readFile as Jk}from"node:fs/promises";import{watch as Yk}from"node:fs";import{join as Xk}from"node:path";var Qk=ye,Zk="settings.json";function eT(r){return Xk(r,Qk,Zk)}async function tT(r){try{let e=await Jk(r,"utf-8");return JSON.parse(e)}catch{return null}}function nT(r,e,t,n){let o=!1;r.permissionMode&&r.permissionMode!==e.getMode()&&(e.setMode(r.permissionMode),n?.(`settings: permission mode \u2192 ${r.permissionMode}`),o=!0),r.permissionRules&&(e.replaceRules(r.permissionRules),n?.(`settings: ${r.permissionRules.length} permission rules loaded`),o=!0),r.defaultBehavior&&(e.setDefaultBehavior(r.defaultBehavior),n?.(`settings: default behavior \u2192 ${r.defaultBehavior}`),o=!0),o&&t&&t.invoke("config.changed",{sessionId:"",key:"permissions",oldValue:void 0,newValue:r}).catch(()=>{})}function Vu(r){let e=eT(r.projectRoot),t=null,n=null,o=async()=>{let s=await tT(e);s&&nT(s,r.ruleEngine,r.hooks,r.log)};o().catch(()=>{});try{t=Yk(e,{persistent:!1},s=>{n&&clearTimeout(n),n=setTimeout(()=>{o().catch(()=>{})},200)}),t.on("error",()=>{})}catch{}return()=>{n&&clearTimeout(n),t?.close(),t=null}}var Es=new Set;function it(r){return Es.add(r),()=>{Es.delete(r)}}async function zu(){await Promise.all(Array.from(Es).map(r=>r()))}import*as N from"node:fs";import*as J from"node:path";import{AGENT_RPC_ERROR_CODES as P,AGENT_RPC_PROTOCOL_VERSION as bo,isAgentRpcRequest as oT}from"qlogicagent-runtime-contracts";var qu=["initialize","thread.create","thread.list","thread.turn","session.resume","session.getInfo","memory.list","memory.read","memory.write","memory.search","memory.delete","memory.dream","tools.list","config.get","config.update","todos.list","tasks.list","tasks.cancel","agent.ping","agent.abort","tool.approval.response","agents.scan","agents.list","agents.config","agents.setConfig","agents.getConfig","agents.removeConfig","agents.setGateway","solo.start","solo.status","solo.cancel","solo.select","product.create","product.resume","product.pause","product.checkpoint","product.status","product.list"];var yo=class{capabilities=["web_search","reader","tokenizer","moderations"];baseUrl;apiKey;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.apiKey=e.apiKey,this.timeoutMs=e.timeoutMs??3e4}async webSearch(e,t){let n=`${this.baseUrl}/tools/web-search`,o={tool:"web-search-pro",messages:[{role:"user",content:e}],stream:!1},s=await this.postJSON(n,o),i=[],a=t?.maxResults??10;if(s.web_search){for(let l of s.web_search.slice(0,a))i.push({title:l.title??"",url:l.link??"",snippet:(l.content??"").slice(0,500),content:l.content});return i}for(let l of s.choices??[])for(let u of l.message?.tool_calls??[])for(let c of u.search_result??[]){if(i.length>=a)break;i.push({title:c.title??"",url:c.link??"",snippet:(c.content??"").slice(0,500),content:c.content})}return i}async reader(e){let t=`${this.baseUrl}/tools/reader`,n={tool:"reader",messages:[{role:"user",content:e}],stream:!1};return{title:"",content:(await this.postJSON(t,n)).choices?.[0]?.message?.content??"",url:e}}async tokenize(e,t){let n=`${this.baseUrl}/tokenizer`,o={model:t,messages:[{role:"user",content:e}]};return{tokenCount:(await this.postJSON(n,o)).usage?.total_tokens??0,model:t}}async moderate(e){let t=`${this.baseUrl}/moderations`,n={input:e},s=(await this.postJSON(t,n)).results?.[0];return{flagged:s?.flagged??!1,categories:s?.categories??{},scores:s?.category_scores}}async postJSON(e,t){let n=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(t),signal:AbortSignal.timeout(this.timeoutMs)});if(!n.ok){let o=await n.text().catch(()=>"");throw new Error(`Zhipu Tool API error ${n.status}: ${o}`)}return n.json()}};var rT=new Set(["zhipu","zhipu-openai","zhipu-coding"]),sT="https://open.bigmodel.cn/api/paas/v4";function iT(r,e){if(!(!r||!e)&&rT.has(r))return new yo({baseUrl:sT,apiKey:e})}var Os=class r{running=!1;activeTurn=null;verbose;transport;registry;mediaClient;agent=null;lastLlmConfigKey="";currentSessionId="";currentProjectRoot;currentHooks=null;mcpManager=null;mcpReady=Promise.resolve();pluginLoader=null;permissionChecker=null;permissionUnregister=null;currentTransport=null;currentApiKey="";currentModel="";sessionState=null;currentMediaApiKeys=null;taskStore=new Dn;memoryPrefetchState=Wt();qmemoryAdapter=null;qmemoryUserId="";fileWatcher=null;pendingAskUser=new Map;sessionTaskDomain;acpDetector=new lo;agentConfigStore=null;soloEvaluator=null;productOrchestrator=null;soloProcessManager=null;productProcessManager=null;constructor(e){this.verbose=e.verbose,this.registry=new mt,this.mediaClient=new Dt({registry:this.registry}),this.transport=e.transport??new Et({verbose:e.verbose}),this.taskStore.onTaskChange((t,n)=>{n&&this.sendNotification("task.updated",{taskId:t,type:n.type,lifecycle:n.lifecycle,label:n.label})}),Vc({log:{info:t=>this.log(t),warn:t=>this.log(`[warn] ${t}`),error:t=>this.log(`[error] ${t}`),debug:t=>{e.verbose&&this.log(`[debug] ${t}`)}},onExecProgress:t=>{this.sendNotification("turn.exec_progress",{output:t.output,elapsedTimeSeconds:t.elapsedTimeSeconds,totalLines:t.totalLines,totalBytes:t.totalBytes})}})}start(){this.running=!0,this.log("qlogicagent started, waiting for JSON-RPC messages..."),this.transport.onMessage(e=>{if(!oT(e)){this.log("[warn] ignoring non-request message");return}this.handleMessage(e)}),this.transport.onClose(()=>{this.log("transport closed, shutting down"),this.stop()}),this.transport.start()}stop(){if(this.running){this.running=!1,this.currentSessionId&&this.currentHooks&&(this.currentHooks.invoke("stop",{sessionId:this.currentSessionId,reason:"shutdown"}).catch(()=>{}),this.currentHooks.invoke("session.ended",{sessionId:this.currentSessionId}).catch(()=>{}));try{zu().catch(()=>{}),this.fileWatcher&&(this.fileWatcher.stop(),this.fileWatcher=null),this.mcpManager&&(this.mcpManager.disconnectAll().catch(()=>{}),this.mcpManager=null),this.permissionUnregister&&(this.permissionUnregister(),this.permissionUnregister=null),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null),this.transport.close()}catch(e){this.currentSessionId&&this.currentHooks&&this.currentHooks.invoke("stop.failed",{sessionId:this.currentSessionId,reason:"cleanup_error",error:e.message}).catch(()=>{})}this.log("stopped")}}handleMessage(e){switch(e.method){case"initialize":this.handleInitialize(e);break;case"agent.ping":this.handlePing(e);break;case"thread.turn":this.handleTurn(e);break;case"memory.dream":this.handleDream(e);break;case"agent.abort":this.handleAbort(e);break;case"tool.approval.response":this.handleApprovalResponse(e);break;case"thread.user_response":this.handleUserResponse(e);break;case"thread.list":this.handleThreadList(e);break;case"session.resume":this.handleSessionResume(e);break;case"thread.create":this.handleThreadCreate(e);break;case"session.getInfo":this.handleSessionGetInfo(e);break;case"memory.list":this.handleMemoryList(e);break;case"memory.read":this.handleMemoryRead(e);break;case"memory.write":this.handleMemoryWrite(e);break;case"memory.search":this.handleMemorySearch(e);break;case"memory.delete":this.handleMemoryDelete(e);break;case"tools.list":this.handleToolsList(e);break;case"media.listModels":this.handleMediaListModels(e);break;case"media.cancel":this.handleMediaCancel(e);break;case"media.status":this.handleMediaStatus(e);break;case"provider.list":this.handleProviderList(e);break;case"config.get":this.handleConfigGet(e);break;case"config.update":this.handleConfigUpdate(e);break;case"todos.list":this.handleTodosList(e);break;case"tasks.list":this.handleTasksList(e);break;case"tasks.cancel":this.handleTasksCancel(e);break;case"agents.scan":this.handleAgentsScan(e);break;case"agents.list":this.handleAgentsList(e);break;case"agents.config":this.handleAgentsConfig(e);break;case"agents.setConfig":this.handleAgentsSetConfig(e);break;case"agents.getConfig":this.handleAgentsGetConfig(e);break;case"agents.removeConfig":this.handleAgentsRemoveConfig(e);break;case"agents.setGateway":this.handleAgentsSetGateway(e);break;case"agents.getGateway":this.handleAgentsGetGateway(e);break;case"agents.processes":this.handleAgentsProcesses(e);break;case"agents.kill":this.handleAgentsKill(e);break;case"agents.listConfigured":this.handleAgentsListConfigured(e);break;case"agents.getLog":this.handleAgentsGetLog(e);break;case"agents.testConnection":this.handleAgentsTestConnection(e);break;case"solo.start":this.handleSoloStart(e);break;case"solo.status":this.handleSoloStatus(e);break;case"solo.cancel":this.handleSoloCancel(e);break;case"solo.select":this.handleSoloSelect(e);break;case"solo.list":this.handleSoloList(e);break;case"solo.delete":this.handleSoloDelete(e);break;case"product.create":this.handleProductCreate(e);break;case"product.resume":this.handleProductResume(e);break;case"product.pause":this.handleProductPause(e);break;case"product.checkpoint":this.handleProductCheckpoint(e);break;case"product.status":this.handleProductStatus(e);break;case"product.list":this.handleProductList(e);break;case"product.delete":this.handleProductDelete(e);break;default:e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.METHOD_NOT_FOUND,message:`Unknown method: ${e.method}`})}}handleInitialize(e){let t=e.params,n=t?.protocolVersion??"unknown",o=t?.host?.name??t?.hostName??"unknown",s=t?.host?.version??t?.hostVersion??"?",i=n.split(".")[0],a=bo.split(".")[0];if(i!==a){this.log(`[initialize] protocol mismatch: host=${n} agent=${bo}`),e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${n}, agent=${bo}`});return}this.log(`[initialize] host=${o} v${s}`),e.id!==void 0&&this.sendResponse(e.id,{protocolVersion:bo,agent:{name:"qlogicagent",version:"0.1.0"},capabilities:{tools:We().map(l=>l.function.name),streaming:!0,threads:!0,notifications:["turn.start","turn.delta","turn.end","turn.error","turn.recovery","turn.tool_call","turn.tool_result","turn.tool_blocked","turn.reasoning_delta","turn.plan_update","turn.suggestions","turn.subagent_started","turn.subagent_delta","turn.subagent_ended","turn.media_result","turn.todos_updated","task.updated","turn.exec_progress","turn.artifact","tool.approval.request","turn.skill_instruction","turn.ask_user","memory.updated","session.info","permission.rule_updated","team.updated","turn.usage_update","pong"],methods:[...qu]}})}handleThreadCreate(e){let t=e.params,n=t?.id??xe();this.log(`[thread.create] id=${n} title=${t?.title??"(none)"}`),t?.cwd&&typeof t.cwd=="string"&&(fs(t.cwd),this.currentProjectRoot=t.cwd),this.currentSessionId=n,this.sessionState=new Gt(n),this.sessionTaskDomain=void 0,this.memoryPrefetchState=Wt(),e.id!==void 0&&this.sendResponse(e.id,{id:n,title:t?.title,status:"active",createdAt:new Date().toISOString()})}async handleThreadList(e){let n=e.params?.limit??20;try{let s=(await Wa(n,this.currentProjectRoot)).map(i=>({id:i.sessionId,title:i.title,status:"active",turnCount:i.messageCount,createdAt:new Date(i.lastActiveAt).toISOString(),lastActiveAt:new Date(i.lastActiveAt).toISOString()}));e.id!==void 0&&this.sendResponse(e.id,{threads:s})}catch(o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:`Failed to list threads: ${o.message}`})}}handlePing(e){e.id!==void 0&&this.sendResponse(e.id,{status:"ok"}),this.sendNotification("pong",{})}handleAbort(e){let t=e.params?.turnId??"";this.log(`abort requested for turn ${t}`),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null),e.id!==void 0&&this.sendResponse(e.id,{aborted:!0})}handleApprovalResponse(e){let t=e.params;if(!t)return;let n=t.approvalId,o=t.decision;if(!n||!o){this.log("[warn] tool.approval.response missing approvalId or decision");return}let s={approvalId:n,decision:o==="approved"?"approved":"denied",updatedInput:t.updatedInput,permissionUpdate:t.permissionUpdate};this.permissionChecker&&this.permissionChecker.resolveApproval(s),e.id!==void 0&&this.sendResponse(e.id,{received:!0})}handleUserResponse(e){let t=e.params,n=t?.requestId;if(!n){this.log("[warn] thread.user_response missing requestId"),e.id!==void 0&&this.sendResponse(e.id,{received:!1});return}let o=this.pendingAskUser.get(n);if(!o){this.log(`[warn] thread.user_response: no pending request ${n}`),e.id!==void 0&&this.sendResponse(e.id,{received:!1});return}if(this.pendingAskUser.delete(n),t?.declined===!0)o.resolve(null);else{let i=t?.answers??{};o.resolve(i)}e.id!==void 0&&this.sendResponse(e.id,{received:!0})}async handleSessionResume(e){let n=e.params?.sessionId;if(!n){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"sessionId is required"});return}try{let o=await Ba(n,this.currentProjectRoot);if(!o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:`Session not found: ${n}`});return}e.id!==void 0&&this.sendResponse(e.id,{metadata:o.metadata,messages:o.messages,costSnapshot:o.costSnapshot})}catch(o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:`Failed to resume session: ${o.message}`})}}async handleTurn(e){let t=e.params??{},n=t.turnId??xe(),o=t.sessionId,s=t.messages??[],i=t.tools??[],a=t.config;a?.workdir&&typeof a.workdir=="string"&&(fs(a.workdir),this.currentProjectRoot=a.workdir);{let u={},c=a?.provider,d=a?.apiKey;c&&d&&(u[c]=d);let p=a?.mediaApiKeys;p&&Object.assign(u,p),this.currentMediaApiKeys=u,Wc(this.mediaClient,u,(m,g,f)=>{this.sessionState?.addMediaUsage(m,g,f)},a?.mediaProviders,(m,g,f,b,T)=>{this.sendNotification("turn.media_progress",{turnId:n,taskId:m,mediaType:g,percent:f,status:b,...T?{provider:T}:{}})}),jc(iT(c,d))}Bc(async u=>{let c=`ask-${xe().slice(0,8)}`;return new Promise(d=>{this.pendingAskUser.set(c,{resolve:d}),this.sendNotification("turn.ask_user",{requestId:c,questions:u.map(p=>({header:p.header,question:p.question,options:p.options}))})})}),e.id!==void 0&&this.sendResponse(e.id,{accepted:!0,turnId:n}),o&&o!==this.currentSessionId&&(this.currentSessionId&&this.currentHooks&&(this.currentHooks.invoke("session.ended",{sessionId:this.currentSessionId}).catch(()=>{}),Qa()),this.currentSessionId=o,this.sessionState=new Gt(o),this.sessionTaskDomain=void 0,this.memoryPrefetchState=Wt());let l=new AbortController;this.activeTurn=l,this.log(`turn ${n} starting (session: ${o})`),this.sendNotification("turn.start",{turnId:n,model:a?.model??(this.currentModel||void 0),provider:a?.provider||void 0});try{let u={provider:a?.provider,model:a?.model,apiKey:a?.apiKey,baseUrl:a?.baseUrl,maxRounds:a?.maxRounds,temperature:a?.temperature,contextWindowTokens:a?.contextWindowTokens,maxOutputTokens:a?.maxOutputTokens,modelMaxOutputTokens:a?.modelMaxOutputTokens,summaryModel:a?.summaryModel??process.env.QLOGICAGENT_SUMMARY_MODEL,maxConcurrentTools:a?.maxConcurrentTools,mediaProviders:a?.mediaProviders,reasoning:a?.reasoning,promptCacheKey:a?.promptCacheKey,promptCacheRetention:a?.promptCacheRetention,serviceTier:a?.serviceTier,openaiBuiltinTools:a?.openaiBuiltinTools,maxToolCalls:a?.maxToolCalls,parallelToolCalls:a?.parallelToolCalls,textVerbosity:a?.textVerbosity,mcpServers:a?.mcpServers};{let y=u.provider??"",C=u.model??"";y&&C&&this.registry.getModelInfo(y,C)?.streamRequired&&(u.streamRequired=!0)}let c=this.resolveAgent(u);if(this.permissionChecker&&a?.permissions){let y=a.permissions,C=bs(y);this.permissionChecker.ruleEngineRef.setMode(C.mode),C.rules.length>0&&this.permissionChecker.ruleEngineRef.replaceRules(C.rules),C.defaultBehavior&&this.permissionChecker.ruleEngineRef.setDefaultBehavior(C.defaultBehavior)}if(!c){this.sendNotification("turn.error",{turnId:n,error:"No LLM provider configured. Provide provider/model/apiKey in agent.turn config, or set DEEPSEEK_API_KEY / OPENAI_API_KEY / ANTHROPIC_API_KEY environment variable.",code:"NO_PROVIDER"});return}let d,p=a?.workdir??process.cwd();try{let y=await Ja(p,this.currentHooks??void 0);y.length>0&&(d=Ka(y))}catch{}let m=s.filter(y=>y.role==="user").map(y=>typeof y.content=="string"?y.content:"").join(" "),{domain:g,source:f}=il({cwd:p,hostOverride:a?.taskDomain,sessionDomain:this.sessionTaskDomain,userText:m});this.sessionTaskDomain=g,f==="auto-detect"&&ll(m,g)&&al(p,g);let b=await Za({basePrompt:a?.systemPrompt,instructionBlock:d,customSystemPrompt:a?.customSystemPrompt,appendSystemPrompt:a?.appendSystemPrompt,sections:[el(p),tl(g),nl()]});for(let y of s)y.role==="user"&&Sr(o,y,this.currentProjectRoot).catch(()=>{});await this.mcpReady;let T=We(),w=new Set(T.map(y=>y.function.name)),_=[...T,...i.filter(y=>!w.has(y.function.name))];for await(let y of c.run({turnId:n,sessionId:o,messages:s,tools:_,systemPrompt:b,config:u},l.signal)){let C=new Date().toISOString();switch(y.type){case"start":break;case"delta":this.sendNotification("turn.delta",{turnId:y.turnId,text:y.text,item:{id:`${n}-delta`,type:"message",role:"assistant",text:y.text,createdAt:C}});break;case"end":if(this.sendNotification("turn.end",{turnId:y.turnId,content:y.content,usage:y.usage,model:y.model,provider:y.provider,item:{id:`${n}-end`,type:"message",role:"assistant",text:y.content,createdAt:C}}),y.usage&&this.sessionState){this.sessionState.addUsage(y.usage,y.model??this.currentModel);let E=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:y.turnId,usage:y.usage,model:y.model??this.currentModel,sessionCostUSD:E.totalInputTokens*3e-6+E.totalOutputTokens*15e-6})}y.content&&Sr(o,{role:"assistant",content:y.content},this.currentProjectRoot).catch(()=>{});break;case"error":if(this.sendNotification("turn.error",{turnId:y.turnId,error:y.error,code:y.code}),y.usage&&this.sessionState){this.sessionState.addUsage(y.usage,this.currentModel);let E=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:y.turnId,usage:y.usage,model:this.currentModel,sessionCostUSD:E.totalInputTokens*3e-6+E.totalOutputTokens*15e-6})}break;case"skill_instruction":this.sendNotification("turn.skill_instruction",{turnId:y.turnId,instruction:y.instruction});break;case"tool_call":this.sendNotification("turn.tool_call",{turnId:y.turnId,callId:y.callId,name:y.name,arguments:y.arguments,item:{id:y.callId,type:"tool_call",role:"assistant",toolName:y.name,toolCallId:y.callId,arguments:y.arguments,createdAt:C}}),this.sessionState?.recordToolCall();break;case"tool_result":this.sendNotification("turn.tool_result",{turnId:y.turnId,callId:y.callId,name:y.name,ok:y.ok,...y.error?{error:y.error}:{},...y.outputPreview?{outputPreview:y.outputPreview}:{},item:{id:`${y.callId}-result`,type:"tool_result",role:"assistant",toolName:y.name,toolCallId:y.callId,output:y.ok?y.outputPreview??"":y.error,approved:y.ok,createdAt:C}});break;case"tool_blocked":this.sendNotification("turn.tool_blocked",{turnId:y.turnId,callId:y.callId,name:y.name,reason:y.reason,item:{id:`${y.callId}-blocked`,type:"tool_blocked",role:"system",toolName:y.name,toolCallId:y.callId,text:y.reason,approved:!1,createdAt:C}});break;case"recovery":this.sendNotification("turn.recovery",{turnId:y.turnId,action:y.action,...y.detail?{detail:y.detail}:{},item:{id:`${n}-recovery-${xe().slice(0,8)}`,type:"recovery",role:"system",strategy:y.action,text:y.detail,createdAt:C}});break;case"plan_update":this.sendNotification("turn.plan_update",{turnId:y.turnId,slug:y.slug,content:y.content,item:{id:`${n}-plan-${xe().slice(0,8)}`,type:"plan_update",role:"assistant",text:y.content,createdAt:C}});break;case"reasoning_delta":this.sendNotification("turn.reasoning_delta",{turnId:y.turnId,text:y.text});break;case"suggestions":this.sendNotification("turn.suggestions",{turnId:y.turnId,items:y.items});break;case"media_result":this.sendNotification("turn.media_result",{turnId:y.turnId,mediaType:y.mediaType,url:y.url,...y.model?{model:y.model}:{},...y.provider?{provider:y.provider}:{},...y.taskId?{taskId:y.taskId}:{}});break;case"artifact":this.sendNotification("turn.artifact",{turnId:y.turnId,artifactId:y.artifactId,type:y.artifactType,title:y.title,...y.filePath?{filePath:y.filePath}:{},...y.language?{language:y.language}:{},...y.content?{content:y.content}:{},...y.mimeType?{mimeType:y.mimeType}:{}});break;case"subagent_started":this.sendNotification("turn.subagent_started",{turnId:y.turnId,subagentId:y.subagentId,agentType:y.agentType,...y.prompt?{prompt:y.prompt}:{}});break;case"subagent_ended":this.sendNotification("turn.subagent_ended",{turnId:y.turnId,subagentId:y.subagentId,agentType:y.agentType,ok:y.ok,...y.outputPreview?{outputPreview:y.outputPreview}:{},...y.error?{error:y.error}:{}});break;case"annotations":this.sendNotification("turn.annotations",{turnId:y.turnId,annotations:y.annotations});break;case"heartbeat":this.sendNotification("turn.heartbeat",{turnId:y.turnId,message:y.message});break;case"tool_use_summary":this.sendNotification("turn.tool_use_summary",{turnId:y.turnId,summary:y.summary});break}}if(this.log(`turn ${n} completed`),this.sessionState?.recordTurnCompleted(),this.sessionState){Fa(o,this.sessionState.createSnapshot(),{model:this.currentModel,cwd:this.currentProjectRoot??process.cwd(),messageCount:s.length},this.currentProjectRoot).catch(()=>{});let y=this.sessionState.createSnapshot();this.sendNotification("session.info",{sessionId:o,model:this.currentModel||void 0,cwd:this.currentProjectRoot??process.cwd(),turnCount:y.turnCount}),this.currentTransport&&this.currentApiKey&&u.summaryModel&&Ga(o,{sessionId:o,createdAt:0,lastActiveAt:0,turnCount:y.turnCount,messageCount:s.length},s,{transport:this.currentTransport,apiKey:this.currentApiKey,model:u.summaryModel},this.currentProjectRoot),this.currentTransport&&this.currentApiKey&&this.currentModel&&this.generateSuggestions(n,s,this.currentTransport,this.currentApiKey,this.currentModel)}}catch(u){if(l.signal.aborted)this.sendNotification("turn.error",{turnId:n,error:"Turn aborted",code:"ABORTED"});else{let c=u instanceof Error?u.message:String(u);this.sendNotification("turn.error",{turnId:n,error:c,code:"INTERNAL_ERROR"})}}finally{this.activeTurn===l&&(this.activeTurn=null)}}static SUGGESTION_PROMPT=`[SUGGESTION MODE]
430
+ ${i}`}successResult(e,t){let n=this.entriesFor(e);return{ok:!0,message:t,target:e,entries:n,entryCount:n.length,usage:this.formatUsage(e)}}errorResult(e,t,n){let o=this.entriesFor(e);return{ok:!1,message:t,target:e,entries:o,entryCount:o.length,usage:this.formatUsage(e),errorCode:n}}};function Jd(r){return r.trim()?r.split(dt).map(e=>e.trim()).filter(Boolean):[]}function Yd(r){let e=new Set;return r.filter(t=>e.has(t)?!1:(e.add(t),!0))}function Us(r,e=60){return r.length<=e?r:`${r.slice(0,e-1).trimEnd()}\u2026`}tr();er();import{readFile as rT}from"node:fs/promises";import{watch as sT}from"node:fs";import{join as iT}from"node:path";var aT=ke,lT="settings.json";function cT(r){return iT(r,aT,lT)}async function dT(r){try{let e=await rT(r,"utf-8");return JSON.parse(e)}catch{return null}}function uT(r,e,t,n){let o=!1;r.permissionMode&&r.permissionMode!==e.getMode()&&(e.setMode(r.permissionMode),n?.(`settings: permission mode \u2192 ${r.permissionMode}`),o=!0),r.permissionRules&&(e.replaceRules(r.permissionRules),n?.(`settings: ${r.permissionRules.length} permission rules loaded`),o=!0),r.defaultBehavior&&(e.setDefaultBehavior(r.defaultBehavior),n?.(`settings: default behavior \u2192 ${r.defaultBehavior}`),o=!0),o&&t&&t.invoke("config.changed",{sessionId:"",key:"permissions",oldValue:void 0,newValue:r}).catch(()=>{})}function Xd(r){let e=cT(r.projectRoot),t=null,n=null,o=async()=>{let s=await dT(e);s&&uT(s,r.ruleEngine,r.hooks,r.log)};o().catch(()=>{});try{t=sT(e,{persistent:!1},s=>{n&&clearTimeout(n),n=setTimeout(()=>{o().catch(()=>{})},200)}),t.on("error",()=>{})}catch{}return()=>{n&&clearTimeout(n),t?.close(),t=null}}var js=new Set;function ut(r){return js.add(r),()=>{js.delete(r)}}async function Qd(){await Promise.all(Array.from(js).map(r=>r()))}import*as U from"node:fs";import*as Y from"node:path";import{AGENT_RPC_ERROR_CODES as P,AGENT_RPC_PROTOCOL_VERSION as Co,isAgentRpcRequest as bT,isAcpJsonRpcRequest as kT,isAcpJsonRpcNotification as TT,isAcpJsonRpcResponse as wT,ACP_PROTOCOL_VERSION as vT}from"qlogicagent-runtime-contracts";import{randomUUID as pT}from"node:crypto";import{ACP_METHODS as Ge,ACP_EXTENDED_METHODS as We,isAcpJsonRpcRequest as mT,isAcpJsonRpcNotification as gT}from"qlogicagent-runtime-contracts";var yn={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,PROTOCOL_MISMATCH:-32001,SESSION_NOT_FOUND:-32002,AGENT_BUSY:-32003},_o=class{transport;handler;verbose;hostCapabilities={};hostSupportsExtendedEvents=!1;hostSupportsExtendedMethods=!1;activeSessionId=null;pendingPermissions=new Map;constructor(e,t,n){this.transport=e,this.handler=t,this.verbose=n?.verbose??!1}dispatchMessage(e){if(this.isJsonRpcResponse(e))return this.handleResponse(e),!0;if(mT(e)){let t=e;return process.stderr.write(`[acp-server] \u2192 recv id=${String(t.id)} method=${t.method}
431
+ `),this.handleRequest(t),!0}return gT(e)?(this.handleNotification(e),!0):!1}emitSessionUpdate(e,t,n){if(t.startsWith("x_")&&!this.hostSupportsExtendedEvents)return;let o={jsonrpc:"2.0",method:Ge.SESSION_UPDATE,params:{sessionId:e,update:{sessionUpdate:t,...n}}};this.transport.send(o)}async requestPermission(e){let t=`perm-${pT().slice(0,8)}`,n={jsonrpc:"2.0",method:Ge.SESSION_REQUEST_PERMISSION,params:e,id:t};return new Promise(o=>{this.pendingPermissions.set(e.permissionId,{resolve:s=>o({optionId:s})}),this.transport.send(n)})}get supportsExtendedEvents(){return this.hostSupportsExtendedEvents}get supportsExtendedMethods(){return this.hostSupportsExtendedMethods}get sessionId(){return this.activeSessionId}async handleRequest(e){let{method:t,params:n,id:o}=e,s=n??{};try{switch(t){case Ge.INITIALIZE:await this.onInitialize(o,s);break;case Ge.SESSION_NEW:await this.onSessionNew(o,s);break;case Ge.SESSION_PROMPT:await this.onSessionPrompt(o,s);break;case Ge.SESSION_END:await this.onSessionEnd(o,s);break;case Ge.SESSION_SET_CONFIG:await this.onSessionSetConfig(o,s);break;case Ge.SESSION_SET_MODEL:await this.handler.handleAcpSessionSetModel(s.sessionId??this.activeSessionId??"",s.modelId??s.model??""),this.sendResult(o,{});break;case Ge.SESSION_SET_MODE:await this.handler.handleAcpSessionSetMode(s.sessionId??this.activeSessionId??"",s.modeId??s.mode??""),this.sendResult(o,{});break;case We.ABORT:await this.onAbort(o,s);break;case We.DREAM:await this.onDream(o,s);break;case We.SOLO_START:{let i=await this.handler.handleAcpSoloStart(s);this.sendResult(o,i);break}case We.SOLO_STATUS:{let i=await this.handler.handleAcpSoloStatus(s);this.sendResult(o,i);break}case We.SOLO_SELECT:{let i=await this.handler.handleAcpSoloSelect(s);this.sendResult(o,i);break}case We.PRODUCT_CREATE:{let i=await this.handler.handleAcpProductCreate(s);this.sendResult(o,i);break}case We.PRODUCT_RESUME:{let i=await this.handler.handleAcpProductResume(s);this.sendResult(o,i);break}case We.PRODUCT_STATUS:{let i=await this.handler.handleAcpProductStatus(s);this.sendResult(o,i);break}case We.TEAM_DELEGATE:{let i=await this.handler.handleAcpTeamDelegate(s);this.sendResult(o,i);break}default:this.sendError(o,yn.METHOD_NOT_FOUND,`Unknown method: ${t}`)}}catch(i){this.sendError(o,yn.INTERNAL_ERROR,i.message)}}handleNotification(e){this.log(`received notification: ${e.method}`)}handleResponse(e){this.log(`received response for id=${e.id}`)}async onInitialize(e,t){this.hostCapabilities=t.clientCapabilities??{},this.hostSupportsExtendedEvents=this.hostCapabilities.extendedEvents??!1,this.hostSupportsExtendedMethods=this.hostCapabilities.extendedMethods??!1;let n=t.clientInfo?.name??"unknown",o=t.clientInfo?.version??"unknown";this.log(`initialize: host=${n} v=${o}, proto=${String(t.protocolVersion)}, extendedEvents=${this.hostSupportsExtendedEvents}, extendedMethods=${this.hostSupportsExtendedMethods}`);let s=await this.handler.handleAcpInitialize(t);this.sendResult(e,s)}async onSessionNew(e,t){let n=await this.handler.handleAcpSessionNew(t);this.activeSessionId=n.sessionId,this.sendResult(e,n)}async onSessionPrompt(e,t){if(!this.activeSessionId||this.activeSessionId!==t.sessionId){this.sendError(e,yn.SESSION_NOT_FOUND,`No active session with id: ${t.sessionId}`);return}let n=await this.handler.handleAcpSessionPrompt(t);this.sendResult(e,n)}async onSessionEnd(e,t){if(this.activeSessionId!==t.sessionId){this.sendError(e,yn.SESSION_NOT_FOUND,`No active session with id: ${t.sessionId}`);return}await this.handler.handleAcpSessionEnd(t),this.activeSessionId=null,this.sendResult(e,{})}async onSessionSetConfig(e,t){if(this.activeSessionId!==t.sessionId){this.sendError(e,yn.SESSION_NOT_FOUND,`No active session with id: ${t.sessionId}`);return}await this.handler.handleAcpSessionSetConfig(t),this.sendResult(e,{})}async onAbort(e,t){await this.handler.handleAcpAbort(t),this.sendResult(e,{aborted:!0})}async onDream(e,t){let n=await this.handler.handleAcpDream(t);this.sendResult(e,n)}sendResult(e,t){process.stderr.write(`[acp-server] \u2190 send id=${String(e)} result
432
+ `);let n={jsonrpc:"2.0",id:e,result:t};this.transport.send(n)}sendError(e,t,n,o){process.stderr.write(`[acp-server] \u2190 send id=${String(e)} error=${n}
433
+ `);let s={jsonrpc:"2.0",id:e,error:{code:t,message:n,...o!==void 0?{data:o}:{}}};this.transport.send(s)}isJsonRpcResponse(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&"id"in t&&("result"in t||"error"in t)&&!("method"in t)}log(e){this.verbose&&process.stderr.write(`[acp-server] ${e}
434
+ `)}};import{ACP_SESSION_UPDATE_TYPES as He,ACP_EXTENDED_SESSION_UPDATE_TYPES as ae}from"qlogicagent-runtime-contracts";function Zd(r,e,t,n){let o=fT(t,n);o&&r.emitSessionUpdate(e,o.type,o.payload)}function fT(r,e){switch(r){case"turn.delta":return{type:He.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:e.text}}};case"turn.reasoning_delta":return{type:He.AGENT_THOUGHT_CHUNK,payload:{content:{type:"text",text:e.text}}};case"turn.tool_call":return{type:He.TOOL_CALL,payload:{toolCallId:e.callId,status:"in_progress",title:e.name,kind:"execute",rawInput:hT(e.arguments)}};case"turn.tool_result":return{type:He.TOOL_CALL_UPDATE,payload:{toolCallId:e.callId,status:e.ok?"completed":"failed",...e.outputPreview?{content:[{type:"content",content:{type:"text",text:e.outputPreview}}]}:{},...e.error?{content:[{type:"content",content:{type:"text",text:e.error}}]}:{}}};case"turn.tool_blocked":return{type:He.TOOL_CALL_UPDATE,payload:{toolCallId:e.callId,status:"failed",content:[{type:"content",content:{type:"text",text:e.reason??"blocked"}}]}};case"turn.plan_update":return{type:He.PLAN,payload:{entries:[{content:e.content,priority:"medium",status:"in_progress"}]}};case"turn.usage_update":{let t=e.usage,n=t?.inputTokens??t?.input_tokens??0,o=t?.outputTokens??t?.output_tokens??0;return{type:He.USAGE_UPDATE,payload:{used:n+o,size:t?.contextWindow??2e5}}}case"turn.end":return null;case"turn.error":return{type:He.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:`[Error] ${e.error??"Unknown error"}`}}};case"turn.suggestions":return{type:He.AVAILABLE_COMMANDS_UPDATE,payload:{availableCommands:(e.items??[]).map(t=>({name:t.text,description:t.description??""}))}};case"turn.subagent_started":return{type:ae.X_SUBAGENT_STARTED,payload:{agentId:e.subagentId,agentName:e.agentType,task:e.prompt}};case"turn.subagent_delta":return{type:ae.X_SUBAGENT_DELTA,payload:{agentId:e.subagentId??e.agentType,text:e.text}};case"turn.subagent_ended":return{type:ae.X_SUBAGENT_ENDED,payload:{agentId:e.subagentId,result:e.outputPreview}};case"turn.media_result":return{type:ae.X_MEDIA_RESULT,payload:{mediaId:e.taskId??yT(),type:e.mediaType,url:e.url,metadata:{model:e.model,provider:e.provider}}};case"turn.media_progress":return{type:ae.X_MEDIA_PROGRESS,payload:{mediaId:e.taskId,progress:e.percent,stage:e.status}};case"turn.skill_instruction":return{type:ae.X_SKILL_INSTRUCTION,payload:{skillId:"unknown",instruction:String(e.instruction??"")}};case"turn.recovery":return{type:ae.X_RECOVERY,payload:{errorType:e.action,message:e.detail??"",action:"retry"}};case"turn.ask_user":return{type:ae.X_ASK_USER,payload:{question:(e.questions??[])[0]?.question??"",options:(e.questions??[])[0]?.options?.map(t=>t.label)}};case"session.info":return{type:ae.X_SESSION_INFO,payload:{sessionId:e.sessionId,model:e.model,metadata:{cwd:e.cwd,turnCount:e.turnCount}}};case"memory.updated":return{type:ae.X_MEMORY_UPDATED,payload:{memoryId:e.source,action:"updated",summary:e.summary}};case"team.member.notification":return{type:ae.X_TEAM_MEMBER_UPDATE,payload:{memberId:e.memberId,type:e.method,payload:e.params??{}}};case"solo.progress":return{type:ae.X_SOLO_STARTED,payload:{evaluationId:e.soloId,agents:[e.agentId],task:e.progress??""}};case"solo.agentDelta":return{type:ae.X_SUBAGENT_DELTA,payload:{agentId:e.agentId,text:e.text}};case"solo.evaluation":return{type:ae.X_SOLO_SELECTED,payload:{evaluationId:e.soloId,winnerId:e.winnerId,reason:e.reasoning}};case"product.taskStarted":return{type:ae.X_PRODUCT_TASK_STARTED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:e.assignee}};case"product.taskCompleted":return{type:ae.X_PRODUCT_TASK_COMPLETED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:"",result:e.result,status:"completed"}};case"product.taskFailed":return{type:ae.X_PRODUCT_TASK_COMPLETED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:"",status:"failed"}};case"product.checkpointed":return{type:ae.X_PRODUCT_CHECKPOINT,payload:{workflowId:e.productId,checkpointId:e.timestamp,completedTasks:[]}};case"turn.start":case"turn.todos_updated":case"task.updated":case"turn.exec_progress":case"turn.heartbeat":case"turn.tool_use_summary":case"turn.artifact":case"turn.annotations":case"tool.approval.request":case"permission.rule_updated":case"team.updated":case"team.member.state":case"pong":case"agents.status":case"agents.error":case"product.budgetWarning":case"product.completed":return null;default:return null}}function hT(r){if(r)try{return JSON.parse(r)}catch{return{raw:r}}}function yT(){return Math.random().toString(36).slice(2,10)}var eu=["initialize","thread.create","thread.list","thread.turn","session.resume","session.getInfo","memory.list","memory.read","memory.write","memory.search","memory.delete","memory.dream","tools.list","config.get","config.update","todos.list","tasks.list","tasks.cancel","agent.ping","agent.abort","tool.approval.response","agents.scan","agents.list","agents.config","agents.setConfig","agents.getConfig","agents.removeConfig","agents.setGateway","solo.start","solo.status","solo.cancel","solo.select","product.create","product.resume","product.pause","product.checkpoint","product.status","product.list"];var Ro=class{capabilities=["web_search","reader","tokenizer","moderations"];baseUrl;apiKey;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.apiKey=e.apiKey,this.timeoutMs=e.timeoutMs??3e4}async webSearch(e,t){let n=`${this.baseUrl}/tools/web-search`,o={tool:"web-search-pro",messages:[{role:"user",content:e}],stream:!1},s=await this.postJSON(n,o),i=[],a=t?.maxResults??10;if(s.web_search){for(let c of s.web_search.slice(0,a))i.push({title:c.title??"",url:c.link??"",snippet:(c.content??"").slice(0,500),content:c.content});return i}for(let c of s.choices??[])for(let d of c.message?.tool_calls??[])for(let l of d.search_result??[]){if(i.length>=a)break;i.push({title:l.title??"",url:l.link??"",snippet:(l.content??"").slice(0,500),content:l.content})}return i}async reader(e){let t=`${this.baseUrl}/tools/reader`,n={tool:"reader",messages:[{role:"user",content:e}],stream:!1};return{title:"",content:(await this.postJSON(t,n)).choices?.[0]?.message?.content??"",url:e}}async tokenize(e,t){let n=`${this.baseUrl}/tokenizer`,o={model:t,messages:[{role:"user",content:e}]};return{tokenCount:(await this.postJSON(n,o)).usage?.total_tokens??0,model:t}}async moderate(e){let t=`${this.baseUrl}/moderations`,n={input:e},s=(await this.postJSON(t,n)).results?.[0];return{flagged:s?.flagged??!1,categories:s?.categories??{},scores:s?.category_scores}}async postJSON(e,t){let n=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(t),signal:AbortSignal.timeout(this.timeoutMs)});if(!n.ok){let o=await n.text().catch(()=>"");throw new Error(`Zhipu Tool API error ${n.status}: ${o}`)}return n.json()}};var xT=new Set(["zhipu","zhipu-openai","zhipu-coding"]),ST="https://open.bigmodel.cn/api/paas/v4";function _T(r,e){if(!(!r||!e)&&xT.has(r))return new Ro({baseUrl:ST,apiKey:e})}var Fs=class r{running=!1;activeTurn=null;verbose;transport;registry;mediaClient;agent=null;lastLlmConfigKey="";currentSessionId="";currentProjectRoot;currentHooks=null;mcpManager=null;mcpReady=Promise.resolve();pluginLoader=null;permissionChecker=null;permissionUnregister=null;currentTransport=null;currentApiKey="";currentModel="";currentProvider="";currentBaseUrl="";sessionState=null;currentMediaApiKeys=null;taskStore=new Gn;memoryPrefetchState=Tt();qmemoryAdapter=null;qmemoryUserId="";memoryStore=null;fileWatcher=null;pendingAskUser=new Map;sessionTaskDomain;acpDetector=new yo;agentConfigStore=null;soloEvaluator=null;productOrchestrator=null;soloProcessManager=null;productProcessManager=null;acpServer=null;idleDreamTimer=null;idleDreamMinutes=30;idleDreamEnabled=!1;lastDreamAt=0;dreamCooldownMs=14400*1e3;dreamMaxDurationMs=300*1e3;constructor(e){this.verbose=e.verbose,this.registry=new bt,this.mediaClient=new Ht({registry:this.registry});let t=Number(process.env.QLOGICAGENT_IDLE_DREAM_MS);t>0&&(this.idleDreamMinutes=t/6e4);let n=Number(process.env.QLOGICAGENT_DREAM_COOLDOWN_MS);n>=0&&(this.dreamCooldownMs=n),this.transport=e.transport??new Ft({verbose:e.verbose}),this.taskStore.onTaskChange((o,s)=>{s&&this.sendNotification("task.updated",{taskId:o,type:s.type,lifecycle:s.lifecycle,label:s.label})}),Xc({log:{info:o=>this.log(o),warn:o=>this.log(`[warn] ${o}`),error:o=>this.log(`[error] ${o}`),debug:o=>{e.verbose&&this.log(`[debug] ${o}`)}},onExecProgress:o=>{this.sendNotification("turn.exec_progress",{output:o.output,elapsedTimeSeconds:o.elapsedTimeSeconds,totalLines:o.totalLines,totalBytes:o.totalBytes})}})}start(){this.running=!0,this.log("qlogicagent started, waiting for JSON-RPC messages..."),this.transport.onMessage(e=>{if(this.acpServer){if(wT(e)||TT(e)){this.acpServer.dispatchMessage(e);return}if(kT(e)){let t=e.method;if(t==="initialize"||t.startsWith("session/")||t.startsWith("x/")||t.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!bT(e)){this.log("[warn] ignoring non-request message");return}this.handleMessage(e)}),this.transport.onClose(()=>{this.log("transport closed, shutting down"),this.stop()}),this.transport.start()}stop(){if(this.running){this.running=!1,this.cancelIdleDreamTimer(),this.currentSessionId&&this.currentHooks&&(this.currentHooks.invoke("stop",{sessionId:this.currentSessionId,reason:"shutdown"}).catch(()=>{}),this.currentHooks.invoke("session.ended",{sessionId:this.currentSessionId}).catch(()=>{}));try{Qd().catch(()=>{}),this.fileWatcher&&(this.fileWatcher.stop(),this.fileWatcher=null),this.mcpManager&&(this.mcpManager.disconnectAll().catch(()=>{}),this.mcpManager=null),this.permissionUnregister&&(this.permissionUnregister(),this.permissionUnregister=null),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null),this.transport.close()}catch(e){this.currentSessionId&&this.currentHooks&&this.currentHooks.invoke("stop.failed",{sessionId:this.currentSessionId,reason:"cleanup_error",error:e.message}).catch(()=>{})}this.log("stopped")}}handleMessage(e){switch(e.method){case"initialize":this.handleInitialize(e);break;case"agent.ping":this.handlePing(e);break;case"thread.turn":this.handleTurn(e);break;case"memory.dream":this.handleDream(e);break;case"agent.abort":this.handleAbort(e);break;case"tool.approval.response":this.handleApprovalResponse(e);break;case"thread.user_response":this.handleUserResponse(e);break;case"thread.list":this.handleThreadList(e);break;case"session.resume":this.handleSessionResume(e);break;case"thread.create":this.handleThreadCreate(e);break;case"session.getInfo":this.handleSessionGetInfo(e);break;case"memory.list":this.handleMemoryList(e);break;case"memory.read":this.handleMemoryRead(e);break;case"memory.write":this.handleMemoryWrite(e);break;case"memory.search":this.handleMemorySearch(e);break;case"memory.delete":this.handleMemoryDelete(e);break;case"tools.list":this.handleToolsList(e);break;case"media.listModels":this.handleMediaListModels(e);break;case"media.cancel":this.handleMediaCancel(e);break;case"media.status":this.handleMediaStatus(e);break;case"provider.list":this.handleProviderList(e);break;case"config.get":this.handleConfigGet(e);break;case"config.update":this.handleConfigUpdate(e);break;case"todos.list":this.handleTodosList(e);break;case"tasks.list":this.handleTasksList(e);break;case"tasks.cancel":this.handleTasksCancel(e);break;case"agents.scan":this.handleAgentsScan(e);break;case"agents.list":this.handleAgentsList(e);break;case"agents.config":this.handleAgentsConfig(e);break;case"agents.setConfig":this.handleAgentsSetConfig(e);break;case"agents.getConfig":this.handleAgentsGetConfig(e);break;case"agents.removeConfig":this.handleAgentsRemoveConfig(e);break;case"agents.setGateway":this.handleAgentsSetGateway(e);break;case"agents.getGateway":this.handleAgentsGetGateway(e);break;case"agents.processes":this.handleAgentsProcesses(e);break;case"agents.kill":this.handleAgentsKill(e);break;case"agents.listConfigured":this.handleAgentsListConfigured(e);break;case"agents.getLog":this.handleAgentsGetLog(e);break;case"agents.testConnection":this.handleAgentsTestConnection(e);break;case"solo.start":this.handleSoloStart(e);break;case"solo.status":this.handleSoloStatus(e);break;case"solo.cancel":this.handleSoloCancel(e);break;case"solo.select":this.handleSoloSelect(e);break;case"solo.list":this.handleSoloList(e);break;case"solo.delete":this.handleSoloDelete(e);break;case"product.create":this.handleProductCreate(e);break;case"product.resume":this.handleProductResume(e);break;case"product.pause":this.handleProductPause(e);break;case"product.checkpoint":this.handleProductCheckpoint(e);break;case"product.status":this.handleProductStatus(e);break;case"product.list":this.handleProductList(e);break;case"product.delete":this.handleProductDelete(e);break;default:e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.METHOD_NOT_FOUND,message:`Unknown method: ${e.method}`})}}handleInitialize(e){let t=e.params,n=t?.protocolVersion??"unknown",o=t?.host?.name??t?.hostName??"unknown",s=t?.host?.version??t?.hostVersion??"?",i=n.split(".")[0],a=Co.split(".")[0];if(i!==a){this.log(`[initialize] protocol mismatch: host=${n} agent=${Co}`),e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${n}, agent=${Co}`});return}this.log(`[initialize] host=${o} v${s}`),e.id!==void 0&&this.sendResponse(e.id,{protocolVersion:Co,agent:{name:"qlogicagent",version:"0.1.0"},capabilities:{tools:Fe().map(c=>c.function.name),streaming:!0,threads:!0,notifications:["turn.start","turn.delta","turn.end","turn.error","turn.recovery","turn.tool_call","turn.tool_result","turn.tool_blocked","turn.reasoning_delta","turn.plan_update","turn.suggestions","turn.subagent_started","turn.subagent_delta","turn.subagent_ended","turn.media_result","turn.todos_updated","task.updated","turn.exec_progress","turn.artifact","tool.approval.request","turn.skill_instruction","turn.ask_user","memory.updated","session.info","permission.rule_updated","team.updated","turn.usage_update","pong"],methods:[...eu]}})}handleThreadCreate(e){let t=e.params,n=t?.id??le();this.log(`[thread.create] id=${n} title=${t?.title??"(none)"}`),t?.cwd&&typeof t.cwd=="string"&&(ao(t.cwd),this.currentProjectRoot=t.cwd),this.currentSessionId=n,this.sessionState=new wt(n),this.sessionTaskDomain=void 0,this.memoryPrefetchState=Tt(),this.enableIdleDream(),e.id!==void 0&&this.sendResponse(e.id,{id:n,title:t?.title,status:"active",createdAt:new Date().toISOString()})}async handleThreadList(e){let n=e.params?.limit??20;try{let s=(await Ja(n,this.currentProjectRoot)).map(i=>({id:i.sessionId,title:i.title,status:"active",turnCount:i.messageCount,createdAt:new Date(i.lastActiveAt).toISOString(),lastActiveAt:new Date(i.lastActiveAt).toISOString()}));e.id!==void 0&&this.sendResponse(e.id,{threads:s})}catch(o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:`Failed to list threads: ${o.message}`})}}handlePing(e){e.id!==void 0&&this.sendResponse(e.id,{status:"ok"}),this.sendNotification("pong",{})}handleAbort(e){let t=e.params?.turnId??"";this.log(`abort requested for turn ${t}`),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null),e.id!==void 0&&this.sendResponse(e.id,{aborted:!0})}handleApprovalResponse(e){let t=e.params;if(!t)return;let n=t.approvalId,o=t.decision;if(!n||!o){this.log("[warn] tool.approval.response missing approvalId or decision");return}let s={approvalId:n,decision:o==="approved"?"approved":"denied",updatedInput:t.updatedInput,permissionUpdate:t.permissionUpdate};this.permissionChecker&&this.permissionChecker.resolveApproval(s),e.id!==void 0&&this.sendResponse(e.id,{received:!0})}handleUserResponse(e){let t=e.params,n=t?.requestId;if(!n){this.log("[warn] thread.user_response missing requestId"),e.id!==void 0&&this.sendResponse(e.id,{received:!1});return}let o=this.pendingAskUser.get(n);if(!o){this.log(`[warn] thread.user_response: no pending request ${n}`),e.id!==void 0&&this.sendResponse(e.id,{received:!1});return}if(this.pendingAskUser.delete(n),t?.declined===!0)o.resolve(null);else{let i=t?.answers??{};o.resolve(i)}e.id!==void 0&&this.sendResponse(e.id,{received:!0})}async handleSessionResume(e){let n=e.params?.sessionId;if(!n){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"sessionId is required"});return}try{let o=await Ka(n,this.currentProjectRoot);if(!o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:`Session not found: ${n}`});return}e.id!==void 0&&this.sendResponse(e.id,{metadata:o.metadata,messages:o.messages,costSnapshot:o.costSnapshot})}catch(o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:`Failed to resume session: ${o.message}`})}}async handleTurn(e){let t=e.params??{},n=t.turnId??le(),o=t.sessionId,s=t.messages??[],i=t.tools??[],a=t.config;a?.workdir&&typeof a.workdir=="string"&&(ao(a.workdir),this.currentProjectRoot=a.workdir);{let d={},l=a?.provider,u=a?.apiKey;l&&u&&(d[l]=u);let p=a?.mediaApiKeys;p&&Object.assign(d,p),this.currentMediaApiKeys=d,Kc(this.mediaClient,d,(m,g,f)=>{this.sessionState?.addMediaUsage(m,g,f)},a?.mediaProviders,(m,g,f,b,w)=>{this.sendNotification("turn.media_progress",{turnId:n,taskId:m,mediaType:g,percent:f,status:b,...w?{provider:w}:{}})}),zc(_T(l,u))}qc(async d=>{let l=`ask-${le().slice(0,8)}`;return new Promise(u=>{this.pendingAskUser.set(l,{resolve:u}),this.sendNotification("turn.ask_user",{requestId:l,questions:d.map(p=>({header:p.header,question:p.question,options:p.options}))})})}),e.id!==void 0&&this.sendResponse(e.id,{accepted:!0,turnId:n}),o&&o!==this.currentSessionId&&(this.currentSessionId&&this.currentHooks&&(this.currentHooks.invoke("session.ended",{sessionId:this.currentSessionId}).catch(()=>{}),rl()),this.currentSessionId=o,this.sessionState=new wt(o),this.sessionTaskDomain=void 0,this.memoryPrefetchState=Tt(),this.enableIdleDream());let c=new AbortController;this.activeTurn&&this.activeTurn.abort(),this.activeTurn=c,this.log(`turn ${n} starting (session: ${o})`),this.sendNotification("turn.start",{turnId:n,model:a?.model??(this.currentModel||void 0),provider:a?.provider||void 0});try{let d={provider:a?.provider,model:a?.model,apiKey:a?.apiKey,baseUrl:a?.baseUrl,maxRounds:a?.maxRounds,temperature:a?.temperature,contextWindowTokens:a?.contextWindowTokens,maxOutputTokens:a?.maxOutputTokens,modelMaxOutputTokens:a?.modelMaxOutputTokens,summaryModel:a?.summaryModel??process.env.QLOGICAGENT_SUMMARY_MODEL,maxConcurrentTools:a?.maxConcurrentTools,mediaProviders:a?.mediaProviders,reasoning:a?.reasoning,promptCacheKey:a?.promptCacheKey,promptCacheRetention:a?.promptCacheRetention,serviceTier:a?.serviceTier,openaiBuiltinTools:a?.openaiBuiltinTools,maxToolCalls:a?.maxToolCalls,parallelToolCalls:a?.parallelToolCalls,textVerbosity:a?.textVerbosity,mcpServers:a?.mcpServers};{let y=d.provider??"",I=d.model??"";y&&I&&this.registry.getModelInfo(y,I)?.streamRequired&&(d.streamRequired=!0)}let l=this.resolveAgent(d);if(this.permissionChecker&&a?.permissions){let y=a.permissions,I=_s(y);this.permissionChecker.ruleEngineRef.setMode(I.mode),I.rules.length>0&&this.permissionChecker.ruleEngineRef.replaceRules(I.rules),I.defaultBehavior&&this.permissionChecker.ruleEngineRef.setDefaultBehavior(I.defaultBehavior)}if(!l){this.sendNotification("turn.error",{turnId:n,error:"No LLM provider configured. Provide provider/model/apiKey in agent.turn config, or set DEEPSEEK_API_KEY / OPENAI_API_KEY / ANTHROPIC_API_KEY environment variable.",code:"NO_PROVIDER"});return}let u,p=a?.workdir??process.cwd();try{let y=await nl(p,this.currentHooks??void 0);y.length>0&&(u=tl(y))}catch{}let m=s.filter(y=>y.role==="user").map(y=>typeof y.content=="string"?y.content:"").join(" "),{domain:g,source:f}=pl({cwd:p,hostOverride:a?.taskDomain,sessionDomain:this.sessionTaskDomain,userText:m});this.sessionTaskDomain=g,f==="auto-detect"&&gl(m,g)&&ml(p,g);let b=this.memoryStore,w=await sl({basePrompt:a?.systemPrompt,instructionBlock:u,customSystemPrompt:a?.customSystemPrompt,appendSystemPrompt:a?.appendSystemPrompt,sections:[il(p),al(g),ll(),zn("memory",()=>b&&b.getSystemPromptBlock("memory")||null,"memory entries may change between turns")]});for(let y of s)y.role==="user"&&Er(o,y,this.currentProjectRoot).catch(()=>{});await this.mcpReady;let T=Fe(),_=new Set(T.map(y=>y.function.name)),R=[...T,...i.filter(y=>!_.has(y.function.name))];for await(let y of l.run({turnId:n,sessionId:o,messages:s,tools:R,systemPrompt:w,config:d},c.signal)){let I=new Date().toISOString();switch(y.type){case"start":break;case"delta":this.sendNotification("turn.delta",{turnId:y.turnId,text:y.text,item:{id:`${n}-delta`,type:"message",role:"assistant",text:y.text,createdAt:I}});break;case"end":if(this.sendNotification("turn.end",{turnId:y.turnId,content:y.content,usage:y.usage,model:y.model,provider:y.provider,item:{id:`${n}-end`,type:"message",role:"assistant",text:y.content,createdAt:I}}),y.usage&&this.sessionState){this.sessionState.addUsage(y.usage,y.model??this.currentModel);let O=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:y.turnId,usage:y.usage,model:y.model??this.currentModel,sessionCostUSD:O.totalInputTokens*3e-6+O.totalOutputTokens*15e-6})}y.content&&Er(o,{role:"assistant",content:y.content},this.currentProjectRoot).catch(()=>{});break;case"error":if(this.sendNotification("turn.error",{turnId:y.turnId,error:y.error,code:y.code}),y.usage&&this.sessionState){this.sessionState.addUsage(y.usage,this.currentModel);let O=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:y.turnId,usage:y.usage,model:this.currentModel,sessionCostUSD:O.totalInputTokens*3e-6+O.totalOutputTokens*15e-6})}break;case"skill_instruction":this.sendNotification("turn.skill_instruction",{turnId:y.turnId,instruction:y.instruction});break;case"tool_call":this.sendNotification("turn.tool_call",{turnId:y.turnId,callId:y.callId,name:y.name,arguments:y.arguments,item:{id:y.callId,type:"tool_call",role:"assistant",toolName:y.name,toolCallId:y.callId,arguments:y.arguments,createdAt:I}}),this.sessionState?.recordToolCall();break;case"tool_result":this.sendNotification("turn.tool_result",{turnId:y.turnId,callId:y.callId,name:y.name,ok:y.ok,...y.error?{error:y.error}:{},...y.outputPreview?{outputPreview:y.outputPreview}:{},item:{id:`${y.callId}-result`,type:"tool_result",role:"assistant",toolName:y.name,toolCallId:y.callId,output:y.ok?y.outputPreview??"":y.error,approved:y.ok,createdAt:I}});break;case"tool_blocked":this.sendNotification("turn.tool_blocked",{turnId:y.turnId,callId:y.callId,name:y.name,reason:y.reason,item:{id:`${y.callId}-blocked`,type:"tool_blocked",role:"system",toolName:y.name,toolCallId:y.callId,text:y.reason,approved:!1,createdAt:I}});break;case"recovery":this.sendNotification("turn.recovery",{turnId:y.turnId,action:y.action,...y.detail?{detail:y.detail}:{},item:{id:`${n}-recovery-${le().slice(0,8)}`,type:"recovery",role:"system",strategy:y.action,text:y.detail,createdAt:I}});break;case"plan_update":this.sendNotification("turn.plan_update",{turnId:y.turnId,slug:y.slug,content:y.content,item:{id:`${n}-plan-${le().slice(0,8)}`,type:"plan_update",role:"assistant",text:y.content,createdAt:I}});break;case"reasoning_delta":this.sendNotification("turn.reasoning_delta",{turnId:y.turnId,text:y.text});break;case"suggestions":this.sendNotification("turn.suggestions",{turnId:y.turnId,items:y.items});break;case"media_result":this.sendNotification("turn.media_result",{turnId:y.turnId,mediaType:y.mediaType,url:y.url,...y.model?{model:y.model}:{},...y.provider?{provider:y.provider}:{},...y.taskId?{taskId:y.taskId}:{}});break;case"artifact":this.sendNotification("turn.artifact",{turnId:y.turnId,artifactId:y.artifactId,type:y.artifactType,title:y.title,...y.filePath?{filePath:y.filePath}:{},...y.language?{language:y.language}:{},...y.content?{content:y.content}:{},...y.mimeType?{mimeType:y.mimeType}:{}});break;case"subagent_started":this.sendNotification("turn.subagent_started",{turnId:y.turnId,subagentId:y.subagentId,agentType:y.agentType,...y.prompt?{prompt:y.prompt}:{}});break;case"subagent_ended":this.sendNotification("turn.subagent_ended",{turnId:y.turnId,subagentId:y.subagentId,agentType:y.agentType,ok:y.ok,...y.outputPreview?{outputPreview:y.outputPreview}:{},...y.error?{error:y.error}:{}});break;case"annotations":this.sendNotification("turn.annotations",{turnId:y.turnId,annotations:y.annotations});break;case"heartbeat":this.sendNotification("turn.heartbeat",{turnId:y.turnId,message:y.message});break;case"tool_use_summary":this.sendNotification("turn.tool_use_summary",{turnId:y.turnId,summary:y.summary});break}}if(this.log(`turn ${n} completed`),this.sessionState?.recordTurnCompleted(),this.sessionState){qa(o,this.sessionState.createSnapshot(),{model:this.currentModel,cwd:this.currentProjectRoot??process.cwd(),messageCount:s.length},this.currentProjectRoot).catch(()=>{});let y=this.sessionState.createSnapshot();this.sendNotification("session.info",{sessionId:o,model:this.currentModel||void 0,cwd:this.currentProjectRoot??process.cwd(),turnCount:y.turnCount}),this.currentTransport&&this.currentApiKey&&d.summaryModel&&Ya(o,{sessionId:o,createdAt:0,lastActiveAt:0,turnCount:y.turnCount,messageCount:s.length},s,{transport:this.currentTransport,apiKey:this.currentApiKey,model:d.summaryModel},this.currentProjectRoot),this.currentTransport&&this.currentApiKey&&this.currentModel&&this.generateSuggestions(n,s,this.currentTransport,this.currentApiKey,this.currentModel)}}catch(d){if(c.signal.aborted)this.sendNotification("turn.error",{turnId:n,error:"Turn aborted",code:"ABORTED"});else{let l=d instanceof Error?d.message:String(d);this.sendNotification("turn.error",{turnId:n,error:l,code:"INTERNAL_ERROR"})}}finally{this.activeTurn===c&&(this.activeTurn=null)}}static SUGGESTION_PROMPT=`[SUGGESTION MODE]
429
435
  Based on the conversation, suggest 1-3 short follow-up actions the user might naturally do next.
430
436
  Be specific: "run the tests" beats "continue".
431
437
  Stay silent if the next step isn't obvious.
432
- Reply with ONLY a JSON array: [{"text":"short suggestion"}]. No explanation.`;async generateSuggestions(e,t,n,o,s){if(t.filter(u=>u.role==="assistant").length<1)return;let l=[...t.slice(-6),{role:"user",content:r.SUGGESTION_PROMPT}];try{let u="";for await(let d of n.stream({model:s,messages:l,temperature:.3,maxTokens:200},o))d.type==="delta"&&(u+=d.text);let c=u.match(/\[[\s\S]*\]/);if(c){let d=JSON.parse(c[0]),p=Array.isArray(d)?d.filter(m=>typeof m.text=="string"&&m.text.length>0).slice(0,5):[];p.length>0&&this.sendNotification("turn.suggestions",{turnId:e,items:p})}}catch{}}async handleDream(e){let t=e.params??{},n=t.turnId??xe(),o=t.sessionId,s=t.config,i=s?.memoryRoot??"",a=s?.transcriptDir??"",l=s?.dreamSessionIds??[];e.id!==void 0&&this.sendResponse(e.id,{accepted:!0,turnId:n});let u=new AbortController;this.activeTurn=u,this.log(`dream ${n} starting (session: ${o}, sessions reviewing: ${l.length})`);let c={provider:s?.provider,model:s?.model,apiKey:s?.apiKey,baseUrl:s?.baseUrl,maxRounds:s?.maxRounds,temperature:s?.temperature,contextWindowTokens:s?.contextWindowTokens,maxOutputTokens:s?.maxOutputTokens,modelMaxOutputTokens:s?.modelMaxOutputTokens,reasoning:s?.reasoning,promptCacheKey:s?.promptCacheKey,promptCacheRetention:s?.promptCacheRetention,serviceTier:s?.serviceTier,openaiBuiltinTools:s?.openaiBuiltinTools,maxToolCalls:s?.maxToolCalls,parallelToolCalls:s?.parallelToolCalls,textVerbosity:s?.textVerbosity};{let p=c.provider??"",m=c.model??"";p&&m&&this.registry.getModelInfo(p,m)?.streamRequired&&(c.streamRequired=!0)}if(!this.resolveAgent(c)){this.sendNotification("turn.start",{turnId:n}),this.sendNotification("turn.error",{turnId:n,error:"No LLM provider configured for dream.",code:"NO_PROVIDER"});return}this.sendNotification("turn.start",{turnId:n});try{let p={context:{memoryRoot:i,transcriptDir:a,currentSessionId:o,listSessionsSince:async()=>l},triggerConfig:{force:!0},transport:this.currentTransport,toolInvoker:{invoke:async(g,f,b,T)=>{if(f.startsWith("$"))return{result:b};let w=we(f);if(!w)return{result:"",error:`Unknown tool: ${f}`};let _=`tc_${xe().slice(0,8)}`;try{let y=JSON.parse(b),C=await w.execute(_,y,T);return{result:C.content.map(D=>D.text??"").join(`
433
- `),error:C.details?.error}}catch(y){return{result:"",error:y instanceof Error?y.message:String(y)}}}},tools:We(),apiKey:this.currentApiKey,model:c.model??this.currentModel,log:{info:g=>this.log(g),warn:g=>this.log(`[warn] ${g}`),error:g=>this.log(`[error] ${g}`),debug:g=>{this.verbose&&this.log(`[debug] ${g}`)}},hooks:this.currentHooks??void 0,parentSignal:u.signal,qmemoryAdapter:this.qmemoryAdapter??void 0,qmemoryUserId:this.qmemoryUserId||void 0},m=await Ua(p);m.ok?this.sendNotification("turn.end",{turnId:n,content:`Dream consolidation completed. ${m.sessionsReviewed} sessions reviewed, ${m.filesTouched.length} files touched. Duration: ${m.durationMs}ms.`,usage:{prompt:0,completion:0}}):this.sendNotification("turn.error",{turnId:n,error:m.error??"Dream consolidation failed",code:"DREAM_FAILED"}),this.log(`dream ${n} completed`)}catch(p){if(u.signal.aborted)this.sendNotification("turn.error",{turnId:n,error:"Dream aborted",code:"ABORTED"});else{let m=p instanceof Error?p.message:String(p);this.sendNotification("turn.error",{turnId:n,error:m,code:"INTERNAL_ERROR"})}}finally{this.activeTurn===u&&(this.activeTurn=null)}}resolveAgent(e){let t=`${e.provider??""}:${e.model??""}:${e.apiKey?.slice(0,8)??""}:${e.baseUrl??""}`;if(this.agent&&this.lastLlmConfigKey===t)return this.agent;let n=e.provider,o=e.model,s=e.apiKey,i=e.baseUrl;if(!n||!s){let h=Mn(this.registry);h&&(n=n??h.providerId,s=s??h.apiKey,o=o??h.defaultModel,this.log(`auto-detected provider: ${n}, model: ${o}`))}if(!n||!s){let h=this.loadSettingsSync();h&&(n=n??h.provider,s=s??h.apiKey,o=o??h.model,n&&s&&this.log(`loaded provider from settings.json: ${n}, model: ${o}`))}if(!n||!s)return null;o=o??this.registry.getProvider(n)?.defaultModel??"";let a=An({provider:n,model:o,apiKey:s,baseUrl:i},this.registry);br()&&(a.transport=kr(a.transport,this.currentSessionId||"default"));let l={info:h=>this.log(h),warn:h=>this.log(`[warn] ${h}`),error:h=>this.log(`[error] ${h}`),debug:h=>{this.verbose&&this.log(`[debug] ${h}`)}},u={invoke:async(h,k,x,R)=>{if(k.startsWith("$"))return{result:x};let A=we(k);if(!A)return{result:"",error:`Unknown tool: ${k}`};let O=`tc_${xe().slice(0,8)}`;try{let q=JSON.parse(x),W=await A.execute(O,q,R),ae=W.content.map(X=>X.text??"").join(`
434
- `),Q=W.details?.error,I=W.details?.type,se=I?.split("_")[0];if(I==="three_d_generate"&&(se="3d"),se&&["image","tts","video","music","3d"].includes(se)){let X=W.details?.mediaUrls??[],un=se;for(let Se of X)this.sendNotification("turn.media_result",{turnId:h,mediaType:un,url:Se,model:W.details?.model,provider:W.details?.provider,...W.details?.durationMs?{durationSeconds:W.details.durationMs/1e3}:{},...W.details?.taskId?{taskId:W.details.taskId}:{}})}if(I==="todo"&&!Q)try{let X=JSON.parse(ae);X.todoList&&this.sendNotification("turn.todos_updated",{turnId:h,items:X.todoList,summary:{total:X.total??X.todoList.length,completed:X.completed??0,inProgress:X.inProgress??0,notStarted:X.notStarted??0}})}catch{}let ze=Array.isArray(W.details?.matches)?W.details.matches:void 0;return{result:ae,error:Q,toolReferences:ze}}catch(q){return{result:"",error:q instanceof Error?q.message:String(q)}}}},c=wr(l);this.currentHooks=c,this.taskStore.setHooks(c,this.currentSessionId??"");let d=(process.env.QMEMORY_BASE_URL??process.env.QLOGICAGENT_QMEMORY_BASE_URL??"").trim().replace(/\/+$/,"");if(d){let h=ka({baseUrl:d,apiKey:(process.env.QMEMORY_API_KEY??"").trim()||void 0,timeoutMs:5e3});this.qmemoryAdapter=h,this.qmemoryUserId=this.currentSessionId??"default",ya(c,{memoryProvider:h,userId:this.currentSessionId??"default",log:{debug:k=>l.debug(k),warn:k=>l.warn(k)}},this.memoryPrefetchState)}Di(c,l,{transport:a.transport,apiKey:a.apiKey});let p=e?.mcpServers,m=hs(p??{}),g=Qi();try{if(N.existsSync(g)){let h=JSON.parse(N.readFileSync(g,"utf8")),k=hs(h),x=new Set(m.map(R=>R.name));m=[...m,...k.filter(R=>!x.has(R.name))]}}catch{}if(m.length>0){this.mcpManager&&this.mcpManager.disconnectAll().catch(()=>{}),this.mcpManager=new no({servers:m,log:l}),it(async()=>{await this.mcpManager?.disconnectAll()});let h=()=>this.mcpManager;me(zc(h)),me(qc(h)),me(yu({listServers:async()=>{let k=this.mcpManager;return k?k.getConnectedServers().map(R=>({name:R,status:"connected",transport:"stdio",toolCount:0,resourceCount:0,promptCount:0})):[]},listTools:async k=>{if(!this.mcpManager)return[];let R=`mcp__${k.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`;return Be().filter(A=>A.startsWith(R)).map(A=>({name:A.slice(R.length),prefixedName:A}))},callTool:async(k,x,R,A)=>{let q=`mcp__${k.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`+x,W=we(q);if(!W)return{success:!1,error:`Tool not found: ${q}`};try{return{success:!0,content:(await W.execute(`mcp_${Date.now()}`,R??{},A)).content.map(I=>I.text??"").join(`
435
- `)}}catch(ae){return{success:!1,error:ae.message}}},listResources:async k=>{let x=this.mcpManager;return x?(await x.listResources(k)).map(A=>({uri:A.uri,name:A.name,mimeType:A.mimeType,description:A.description,server:A.server})):[]},readResource:async(k,x)=>{let R=this.mcpManager;if(!R)throw new Error("MCP not initialized");return(await R.readResource(k,x)).map(O=>({uri:O.uri,mimeType:O.mimeType,text:O.text}))},authenticate:async()=>({status:"unsupported",message:"OAuth not yet implemented in McpManager"})})),this.mcpReady=this.mcpManager.connectAll().then(()=>{this.mcpManager?.injectTools(),l.info(`[mcp] ${this.mcpManager?.getToolCount()??0} tools from ${this.mcpManager?.getConnectedServers().length??0} servers`)}).catch(k=>{l.warn(`[mcp] connection error: ${k instanceof Error?k.message:k}`)})}let f=[],b=Ki();N.existsSync(b)&&f.push(b);let T=e?.pluginPaths;if(Array.isArray(T))for(let h of T)typeof h=="string"&&N.existsSync(h)&&f.push(h);Xc(f,l).then(h=>{if(h.length===0)return;this.pluginLoader=new ro({pluginDirs:h,hookRegistry:c,log:l}),this.pluginLoader.loadAll().then(x=>{l.info(`[plugins] ${x.length} loaded, ${this.pluginLoader?.getPluginSkills().length??0} skills`)}).catch(x=>{l.warn(`[plugins] load error: ${x instanceof Error?x.message:x}`)});let k=this.pluginLoader;c.register({point:"turn.submitted",handler:async()=>(await k.refreshActivations(),{action:"continue"}),label:"plugin-activation-refresh",priority:50})}).catch(h=>{l.warn(`[plugins] marketplace resolve error: ${h instanceof Error?h.message:h}`)});let w=e?.permissions,_=bs(w),y=new so(_);this.permissionUnregister&&this.permissionUnregister(),this.permissionChecker=new ao({ruleEngine:y,hookRegistry:c,onRequestApproval:async h=>(this.sendNotification("tool.approval.request",{approvalId:h.approvalId,callId:h.callId,toolName:h.toolName,arguments:h.arguments?JSON.stringify(h.arguments):"",message:h.message,suggestions:h.suggestions?.map(k=>`${k.pattern}:${k.behavior}`)}),new Promise(()=>{})),onPermissionUpdate:h=>{l.info(`[permissions] rule saved: ${h.pattern} \u2192 ${h.behavior}`),this.sendNotification("permission.rule_updated",{pattern:h.pattern,behavior:h.behavior})},onDenied:(h,k)=>{l.warn(`[permissions] blocked "${h}": ${k}`)}});let C=We();this.permissionChecker.setToolMeta(C),this.permissionUnregister=this.permissionChecker.register();let E=[dr(),...Array.isArray(e?.skillPaths)?e.skillPaths:[]];me(lu({listSkills:()=>{let h=[];this.pluginLoader&&h.push(...this.pluginLoader.getPluginSkills());let k=e?.skillPaths;if(Array.isArray(k)){for(let x of k)if(typeof x=="string"){let R=J.basename(x);h.some(A=>A.name===R)||h.push({name:R,source:"gateway",filePath:J.join(x,"SKILL.md"),baseDir:x})}}return h},listSkillsFull:async h=>{let k=[],x=new Set;for(let R of E)try{let A=await N.promises.readdir(R,{withFileTypes:!0});for(let O of A){if(!O.isDirectory())continue;let q=J.join(R,O.name,"SKILL.md");try{await N.promises.access(q);let W=J.basename(R);if(h&&W!==h)continue;x.add(W),k.push({name:O.name,description:`Skill from ${R}`,category:W})}catch{}}}catch{}if(this.pluginLoader)for(let R of this.pluginLoader.getPluginSkills())h&&R.source!==h||(x.add(R.source??"plugin"),k.push({name:R.name,description:`Plugin skill (${R.source})`,category:R.source}));return{skills:k,categories:[...x]}},readSkillContent:async h=>{for(let k of E){let x=J.join(k,h,"SKILL.md");try{return await N.promises.readFile(x,"utf8")}catch{}}return null},viewSkill:async(h,k)=>{for(let x of E){let R=k?J.join(x,h,k):J.join(x,h,"SKILL.md");try{let A=await N.promises.readFile(R,"utf8");return{name:h,content:A}}catch{}}return null},executeSkillSubturn:async(h,k,x,R)=>{let A=`skill_${h}_${xe().slice(0,8)}`,O=this.agent;if(!O)return"[skill] Cannot execute: no LLM provider configured";let q=this.currentSessionId??"skill";this.currentHooks?.invoke("subagent.started",{sessionId:q,turnId:A,subagentId:A,agentType:`skill:${h}`}).catch(()=>{});let W=We(),ae=x??`Execute skill "${h}" instructions.`,Q=[],I;for await(let se of O.run({turnId:A,sessionId:q,messages:[{role:"user",content:ae}],tools:W,systemPrompt:k,config:{parentDepth:1}},R)){if(se.type==="end"&&se.content)return this.currentHooks?.invoke("subagent.stopped",{sessionId:q,turnId:A,subagentId:A,agentType:`skill:${h}`,reason:"normal"}).catch(()=>{}),se.content;if(se.type==="delta"&&se.text&&Q.push(se.text),se.type==="error"){I=se.error;break}}return this.currentHooks?.invoke("subagent.stopped",{sessionId:q,turnId:A,subagentId:A,agentType:`skill:${h}`,reason:I?"error":"normal",error:I}).catch(()=>{}),I?`[skill "${h}"] error: ${I}`:Q.join("")||`[skill "${h}"] completed (no output)`},manageSkill:async h=>{let k=J.join(E[0]??dr(),h.name),x=J.join(k,"SKILL.md");switch(h.action){case"create":return await N.promises.mkdir(k,{recursive:!0}),await N.promises.writeFile(x,h.content??"","utf8"),{success:!0,message:`Skill "${h.name}" created`,path:k};case"edit":return await N.promises.writeFile(x,h.content??"","utf8"),{success:!0,message:`Skill "${h.name}" updated`,path:x};case"patch":{let R=await N.promises.readFile(x,"utf8");return!h.oldString||!R.includes(h.oldString)?{success:!1,message:"oldString not found in SKILL.md"}:(await N.promises.writeFile(x,R.replace(h.oldString,h.newString??""),"utf8"),{success:!0,message:`Skill "${h.name}" patched`,path:x})}case"delete":return await N.promises.rm(k,{recursive:!0,force:!0}),{success:!0,message:`Skill "${h.name}" deleted`};default:return{success:!1,message:`Unknown action: ${h.action}`}}}})),me(du({abortSignal:void 0,currentForkDepth:0,forkAgent:async h=>{let k=zo(h.agent);if(!k)return{agentId:"",status:"failed",error:`Unknown agent type: ${h.agent}`};if(!this.agent||!this.currentTransport||!this.currentApiKey||!this.currentModel)return{agentId:"",status:"failed",error:"No LLM provider configured"};let x=Be(),R=Ho(x,k),O=We().filter(I=>R.includes(I.function.name)),q=Er(O,!0),W=h.maxTurns??k.maxTurns??200,ae=await In({promptMessages:[{role:"user",content:h.prompt}],tools:q,transport:this.currentTransport,toolInvoker:u,apiKey:this.currentApiKey,model:this.currentModel,log:l,hooks:c,forkLabel:`agent-${h.agent}`,maxTurns:W,parentSignal:h.abortSignal,parentDepth:0,onEvent:I=>{I.type==="delta"&&I.text&&this.sendNotification("turn.subagent_delta",{agentType:h.agent,text:I.text})}}),Q=ae.events.filter(I=>I.type==="end"&&"content"in I).map(I=>I.content??"").join("")||ae.events.filter(I=>I.type==="delta"&&"text"in I).map(I=>I.text).join("");return{agentId:`fork-${h.agent}-${xe().slice(0,8)}`,status:ae.ok?"completed":"failed",output:Q||void 0,error:ae.error,tokensUsed:ae.totalUsage.prompt+ae.totalUsage.completion}}}));let D=pt(),L=new Map([["model",{key:"model",value:this.currentModel??"",type:"string",description:"Default LLM model"}],["language",{key:"language",value:"zh-cn",type:"string",description:"UI / response language"}],["verbose",{key:"verbose",value:this.verbose,type:"boolean",description:"Enable verbose logging"}],["maxRounds",{key:"maxRounds",value:25,type:"number",description:"Default max tool-call rounds per turn"}],["theme",{key:"theme",value:"auto",type:"enum",description:"Color theme",options:["auto","light","dark"]}]]),v=async()=>{try{return JSON.parse(await N.promises.readFile(D,"utf8"))}catch{return{}}},ce=async h=>{await N.promises.mkdir(J.dirname(D),{recursive:!0}),await N.promises.writeFile(D,JSON.stringify(h,null,2),"utf8")};me(pu({getConfig:async h=>{let k=L.get(h);if(!k)return{success:!1,error:`Unknown key: ${h}`};let x=await v(),R=h in x?x[h]:k.value;return{success:!0,setting:{...k,value:R,readOnly:en.includes(h)}}},setConfig:async(h,k)=>{let x=L.get(h);if(!x)return{success:!1,error:`Unknown key: ${h}`};let R=await v(),A=h in R?R[h]:x.value;return R[h]=k,await ce(R),{success:!0,previousValue:A,setting:{...x,value:k}}},listConfig:async()=>{let h=await v();return{success:!0,settings:[...L.values()].map(x=>({...x,value:x.key in h?h[x.key]:x.value,readOnly:en.includes(x.key)}))}},resetConfig:async h=>{let k=L.get(h);if(!k)return{success:!1,error:`Unknown key: ${h}`};let x=await v();return delete x[h],await ce(x),{success:!0,setting:k}},isValidKey:h=>L.has(h)}));let F=new Map,j=h=>{let k=/^(\d+)([smhd])$/.exec(h.trim());if(!k)return null;let x=parseInt(k[1],10),R=k[2];return x*({s:1e3,m:6e4,h:36e5,d:864e5}[R]??6e4)},ne=h=>{h.timerId&&clearTimeout(h.timerId);let k=j(h.schedule);if(!k)return;let x=Date.now(),R=k-x%k||k;h.timerId=setTimeout(()=>{h.lastRunAt=new Date().toISOString(),h.repeat.completed++,h.lastStatus="success",l.info(`[cron] triggered job ${h.id} (${h.name})`),h.repeat.times===null||h.repeat.completed<h.repeat.times?ne(h):(h.state="paused",h.enabled=!1)},R),h.nextRunAt=new Date(x+R).toISOString()};it(async()=>{for(let h of F.values())h.timerId&&clearTimeout(h.timerId)}),me(gu({createJob:async h=>{let k=`cron_${xe().slice(0,8)}`,x={id:k,name:h.name??`Job ${k}`,prompt:h.prompt,schedule:h.schedule,scheduleDisplay:h.schedule,state:"scheduled",enabled:!0,repeat:{times:h.repeat??null,completed:0},allowedTools:h.allowedTools};return F.set(k,x),ne(x),{success:!0,job:{...x,timerId:void 0}}},listJobs:async()=>({success:!0,jobs:[...F.values()].map(k=>({...k,timerId:void 0}))}),getJob:async h=>{let k=F.get(h);return k?{success:!0,job:{...k,timerId:void 0}}:{success:!1,error:`Job not found: ${h}`}},updateJob:async(h,k)=>{let x=F.get(h);return x?(k.prompt!==void 0&&(x.prompt=k.prompt),k.schedule!==void 0&&(x.schedule=k.schedule,x.scheduleDisplay=k.schedule),k.name!==void 0&&(x.name=k.name),k.enabled!==void 0&&(x.enabled=k.enabled,x.state=k.enabled?"scheduled":"paused"),k.repeat!==void 0&&(x.repeat.times=k.repeat),k.allowedTools!==void 0&&(x.allowedTools=k.allowedTools),x.enabled?ne(x):x.timerId&&(clearTimeout(x.timerId),x.timerId=void 0),{success:!0,job:{...x,timerId:void 0}}):{success:!1,error:`Job not found: ${h}`}},deleteJob:async h=>{let k=F.get(h);return k?(k.timerId&&clearTimeout(k.timerId),F.delete(h),{success:!0}):{success:!1,error:`Job not found: ${h}`}},pauseJob:async h=>{let k=F.get(h);return k?(k.state="paused",k.enabled=!1,k.timerId&&(clearTimeout(k.timerId),k.timerId=void 0),{success:!0,job:{...k,timerId:void 0}}):{success:!1,error:`Job not found: ${h}`}},resumeJob:async h=>{let k=F.get(h);return k?(k.state="scheduled",k.enabled=!0,ne(k),{success:!0,job:{...k,timerId:void 0}}):{success:!1,error:`Job not found: ${h}`}},triggerJob:async h=>{let k=F.get(h);return k?(k.lastRunAt=new Date().toISOString(),k.repeat.completed++,k.lastStatus="success",{success:!0,job:{...k,timerId:void 0}}):{success:!1,error:`Job not found: ${h}`}},validateSchedule:h=>j(h)!==null||/^\d{1,2}\s/.test(h)?null:`Invalid schedule: ${h}. Use shorthand (5m, 1h, 1d) or cron expression.`}));let re=new Map;it(async()=>{for(let h of re.values())h.cleanup();re.clear()}),me(fu({startMonitor:async h=>{if(re.has(h.monitorId))return{action:"start",success:!1,error:`Monitor "${h.monitorId}" already exists.`};let k={monitorId:h.monitorId,source:h.source,target:h.target,conditions:h.conditions,startedAt:Date.now(),timeoutSeconds:h.timeoutSeconds,eventCount:0},x=()=>{};if(h.source==="file")try{let R=N.watch(h.target,{persistent:!1},()=>{k.eventCount++,l.info(`[monitor] file change detected: ${h.target}`)});x=()=>R.close()}catch{return{action:"start",success:!1,error:`Cannot watch: ${h.target}`}}if(h.timeoutSeconds>0){let R=setTimeout(()=>{let O=re.get(h.monitorId);O&&(O.cleanup(),re.delete(h.monitorId))},h.timeoutSeconds*1e3),A=x;x=()=>{clearTimeout(R),A()}}return re.set(h.monitorId,{info:k,cleanup:x}),{action:"start",success:!0,monitorId:h.monitorId}},stopMonitor:async h=>{let k=re.get(h);return k?(k.cleanup(),re.delete(h),{action:"stop",success:!0,monitorId:h}):{action:"stop",success:!1,error:`Monitor "${h}" not found.`}},listMonitors:async()=>[...re.values()].map(h=>h.info)}));let ue=new Map,V={info:h=>l.info(h),warn:h=>l.warn(h)},B=new bt({onNotification:(h,k,x)=>{this.sendNotification("team.member.notification",{memberId:h,method:k,params:x})},onStateChange:(h,k)=>{this.sendNotification("team.member.state",{memberId:h,state:k});let x=B.getHandle(h),A=B.getUsageTracker(h)?.getUsage();this.emitAgentStatus(h,k,{missedBeats:B.getMissedBeats(h),lastActivityAt:x?.lastActivityAt,usage:A&&A.totalTokens>0?{inputTokens:A.inputTokens,outputTokens:A.outputTokens,totalTokens:A.totalTokens}:void 0})},onExit:(h,k,x)=>{for(let R of ue.values()){let A=R.members.find(O=>O.cwd&&`team-${R.name}-${O.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase()===h.replace(/^team-/,""));A&&(A.isActive=!1)}l.info(`[team] member ${h} exited (code=${k}, signal=${x})`)},onMcpToolCall:(h,k,x)=>this.handleMcpToolCall(h,k,x),log:{info:h=>l.info(h),warn:h=>l.warn(h),debug:h=>l.debug(h)},sessionDir:J.join(G(),"agent-logs")});it(async()=>{B.dispose()}),me(hu({createTeam:async h=>{if(ue.has(h.teamName))return{success:!1,error:`Team "${h.teamName}" already exists.`};let k=await Yt(),x=[];for(let A of h.members??[]){let O={...A,isActive:!0};if(k){let q=`team-${h.teamName}-${A.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),W=await ic(k,q,V);W?(O.worktreePath=W.worktreePath,O.worktreeBranch=W.branch,O.cwd=W.worktreePath,l.info(`[team] provisioned worktree for ${A.name}: ${W.worktreePath}`)):(O.cwd=process.cwd(),l.warn(`[team] worktree provision failed for ${A.name}, using shared cwd`))}else O.cwd=process.cwd();x.push(O)}let R={name:h.teamName,description:h.description,leadId:this.currentSessionId??"default",members:x,createdAt:new Date().toISOString()};ue.set(h.teamName,R);for(let A of x){if(!A.cwd)continue;let O=`team-${h.teamName}-${A.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase();try{await B.spawn({memberId:O,name:A.name,cwd:A.cwd,prompt:`You are the "${A.name}" team member. Role: ${A.role}.`,agentType:A.role,verbose:this.verbose}),l.info(`[team] spawned child process for ${A.name} in ${A.cwd}`)}catch(q){l.warn(`[team] failed to spawn child process for ${A.name}: ${q instanceof Error?q.message:String(q)}`),A.isActive=!1}}return this.sendNotification("team.updated",{teamName:h.teamName,action:"created",members:R.members.map(A=>({agentName:A.name,role:A.role,worktreePath:A.worktreePath,pid:B.getHandle(`team-${h.teamName}-${A.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase())?.pid}))}),{success:!0,team:R}},deleteTeam:async h=>{let k=ue.get(h);if(!k)return{success:!1,error:`Team "${h}" not found.`};for(let R of k.members){let A=`team-${h}-${R.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase();B.kill(A),B.remove(A)}let x=await Yt();if(x)for(let R of k.members)R.worktreePath&&R.worktreeBranch&&(await ac(x,R.worktreePath,R.worktreeBranch,V),l.info(`[team] cleaned up worktree for ${R.name}: ${R.worktreePath}`));return ue.delete(h),this.sendNotification("team.updated",{teamName:h,action:"destroyed",members:[]}),{success:!0}},listTeams:async()=>({success:!0,teams:[...ue.values()]}),getTeamStatus:async h=>{let k=ue.get(h);if(!k)return{success:!1,error:`Team "${h}" not found.`};let x={};for(let R of k.members){let A=`team-${h}-${R.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),O=B.getStatus(A);O&&(R.isActive=O.alive,x[R.name]={mediaProgress:O.mediaProgress,lastToolCall:O.lastToolCall,idleFor:O.idleFor,runningFor:O.runningFor})}return{success:!0,team:k,memberProgress:x}}}));{let h=new ho({persistToDisk:!0});h.loadFromDiskSync();let k={providerId:"null",search:async()=>[],ingest:async()=>{}},x=this.qmemoryAdapter??k;me({name:Nu,label:Bu,description:Fu,parameters:ju,execute:async(R,A)=>{let O=await Wu(A,{provider:x,store:h,userId:this.qmemoryUserId||this.currentSessionId||"default",sessionId:this.currentSessionId});return{content:[{type:"text",text:O.message}],details:{type:"memory",action:O.action,ok:O.ok}}}})}{let h=e?.workdir??process.cwd(),k=Tu(h,this.currentSessionId||"default");me(ku(k))}let fe=e?.workdir??process.cwd(),Oe=Vu({projectRoot:fe,ruleEngine:y,hooks:c,log:h=>l.info(`[settings] ${h}`)});it(async()=>{Oe()}),this.currentSessionId&&c.invoke("session.created",{sessionId:this.currentSessionId}).catch(()=>{}),this.fileWatcher&&this.fileWatcher.stop();let he=e?.workdir??process.cwd();return Va({projectRoot:he,sessionId:this.currentSessionId,hooks:c,log:h=>l.debug(h),onInstructionCacheReset:Ya}).then(h=>{this.fileWatcher=h,it(async()=>{this.fileWatcher?.stop()})}).catch(h=>{l.warn(`[file-watcher] init error: ${h instanceof Error?h.message:h}`)}),this.agent=new dt({llmTransport:a.transport,apiKey:a.apiKey,toolInvoker:u,log:l,hooks:c,maxRounds:e.maxRounds,verbose:this.verbose}),this.lastLlmConfigKey=t,this.currentTransport=a.transport,this.currentApiKey=a.apiKey,this.currentModel=o,this.log(`created Agent (provider: ${n}, model: ${o})`),this.agent}loadSettingsSync(){try{let e=pt();if(!N.existsSync(e))return;let t=N.readFileSync(e,"utf-8"),n=JSON.parse(t);return{provider:n.provider,model:n.model,apiKey:n.apiKey,baseUrl:n.baseUrl}}catch{return}}handleSessionGetInfo(e){let t=this.currentSessionId||"default",n=this.sessionState?.createSnapshot(),o={sessionId:t,model:this.currentModel||void 0,cwd:process.cwd(),paths:{sessionDir:qi(t),agentHome:G(),settings:pt()},usage:n?{turnCount:n.turnCount,inputTokens:n.totalInputTokens,outputTokens:n.totalOutputTokens}:void 0};e.id!==void 0&&this.sendResponse(e.id,o)}async handleMemoryList(e){let t=[],n=J.join(G(),"memory.json");N.existsSync(n)&&t.push({id:"local",type:"json",path:n}),this.qmemoryAdapter&&t.push({id:"qmemory",type:"vector"}),e.id!==void 0&&this.sendResponse(e.id,{sources:t})}async handleMemoryRead(e){let t=e.params,n=t?.source??"local",o=t?.target??"memory";if(n==="local")try{let s=J.join(G(),"memory.json"),i=await N.promises.readFile(s,"utf-8"),a=JSON.parse(i);e.id!==void 0&&this.sendResponse(e.id,{source:"local",target:o,content:a[o]??""})}catch{e.id!==void 0&&this.sendResponse(e.id,{source:"local",target:o,content:""})}else e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:`Unknown memory source: ${n}`})}async handleMemoryWrite(e){let t=e.params,n=t?.target??"memory",o=t?.content;if(n!=="memory"&&n!=="user"){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:`Invalid memory target: ${n}. Must be "memory" or "user".`});return}if(o==null){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"content is required."});return}try{let s=J.join(G(),"memory.json"),i={};try{let a=await N.promises.readFile(s,"utf-8");i=JSON.parse(a)}catch{}i[n]=o,i.savedAt=new Date().toISOString(),await N.promises.mkdir(G(),{recursive:!0}),await N.promises.writeFile(s,JSON.stringify(i,null,2),"utf-8"),e.id!==void 0&&this.sendResponse(e.id,{ok:!0,target:n}),this.sendNotification("memory.updated",{target:n,source:"rpc"})}catch(s){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:s instanceof Error?s.message:String(s)})}}handleToolsList(e){let t=e.params,o=We(t?.includeDeferred??!1).map(s=>({name:s.function.name,description:s.function.description??"",parameters:s.function.parameters,source:"builtin"}));if(t?.category){let s=o.filter(i=>i.name.startsWith(t.category)||i.description.toLowerCase().includes(t.category.toLowerCase()));e.id!==void 0&&this.sendResponse(e.id,{tools:s,total:s.length})}else e.id!==void 0&&this.sendResponse(e.id,{tools:o,total:o.length})}handleMediaListModels(e){let n=e.params?.mediaType,s=this.mediaClient.listMediaModels(n).map(i=>({providerId:i.providerId,providerName:i.providerDef.name,modelId:i.modelInfo.id,modelName:i.modelInfo.name,mediaType:i.mediaType,capabilities:i.modelInfo.mediaCapabilities}));e.id!==void 0&&this.sendResponse(e.id,{models:s})}async handleMediaCancel(e){let t=e.params;if(!t?.taskId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"taskId is required."});return}let n=t.provider??"doubao",o=this.mediaClient.getTransport(n);if(!o){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`No transport for provider: ${n}`});return}if(!Tr(o)){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`Provider ${n} does not support task cancellation.`});return}try{let s=this.resolveMediaApiKey(n);if(!s){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`No API key for provider: ${n}`});return}await o.deleteVideoTask(t.taskId,s),e.id!==void 0&&this.sendResponse(e.id,{ok:!0,taskId:t.taskId,message:"Task cancelled."})}catch(s){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:s instanceof Error?s.message:String(s)})}}async handleMediaStatus(e){let t=e.params;if(!t?.taskId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"taskId is required."});return}let n=t.provider??"doubao",o=this.mediaClient.getTransport(n);if(!o){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`No transport for provider: ${n}`});return}if(!Tr(o)){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`Provider ${n} does not support task status queries.`});return}try{let s=this.resolveMediaApiKey(n);if(!s){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`No API key for provider: ${n}`});return}if(o.getTaskStatus){let{status:u,task:c}=await o.getTaskStatus(t.taskId,s);e.id!==void 0&&this.sendResponse(e.id,{ok:!0,taskId:t.taskId,status:u,task:c});return}let i=await o.listVideoTasks(s,{limit:100}),l=(i.data??i.tasks??[]).find(u=>u.id===t.taskId||u.task_id===t.taskId);e.id!==void 0&&this.sendResponse(e.id,{ok:!0,taskId:t.taskId,...l?{status:l.status,task:l}:{status:"unknown",message:"Task not found in recent list."}})}catch(s){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:s instanceof Error?s.message:String(s)})}}resolveMediaApiKey(e){return this.currentMediaApiKeys?.[e]}handleProviderList(e){let t=this.registry.listProviders(),n=new Map;for(let s of t){let i=s.group??s.id;n.has(i)||n.set(i,[]);let a=!!this.registry.resolveApiKey(s.id);n.get(i).push({id:s.id,name:s.name,transport:s.transport,baseUrl:s.baseUrl,defaultModel:s.defaultModel,modelCount:s.models?.length??0,available:a})}let o=[...n.entries()].map(([s,i])=>({group:s,variants:i}));e.id!==void 0&&this.sendResponse(e.id,{providers:o})}handleConfigGet(e){try{let t=pt(),n={};if(N.existsSync(t)){let o=N.readFileSync(t,"utf-8");n=JSON.parse(o)}e.id!==void 0&&this.sendResponse(e.id,{config:n,paths:{userSettings:t,agentHome:G()}})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleConfigUpdate(e){let t=e.params;if(!t?.updates||typeof t.updates!="object"){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"updates (object) is required."});return}try{let n=pt(),o={};try{let s=await N.promises.readFile(n,"utf-8");o=JSON.parse(s)}catch{}Object.assign(o,t.updates),await N.promises.mkdir(J.dirname(n),{recursive:!0}),await N.promises.writeFile(n,JSON.stringify(o,null,2),"utf-8"),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(n){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:n instanceof Error?n.message:String(n)})}}async handleTodosList(e){let t=we("todo");if(!t){e.id!==void 0&&this.sendResponse(e.id,{items:[],summary:ft([])});return}try{let o=(await t.execute("rpc-todos-list",{action:"list"},void 0)).content.map(a=>a.text??"").join(""),i=JSON.parse(o).todoList??[];e.id!==void 0&&this.sendResponse(e.id,{items:i,summary:ft(i)})}catch{e.id!==void 0&&this.sendResponse(e.id,{items:[],summary:ft([])})}}async handleMemorySearch(e){let t=e.params;if(!t?.query){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"query is required."});return}if(!this.qmemoryAdapter){try{let n=J.join(G(),"memory.json"),o=await N.promises.readFile(n,"utf-8"),s=JSON.parse(o),i=[],a=t.query.toLowerCase();for(let[l,u]of Object.entries(s)){if(typeof u!="string")continue;let c=u.split(`
438
+ Reply with ONLY a JSON array: [{"text":"short suggestion"}]. No explanation.`;async generateSuggestions(e,t,n,o,s){if(t.filter(d=>d.role==="assistant").length<1)return;let c=[...t.slice(-6),{role:"user",content:r.SUGGESTION_PROMPT}];try{let d="";for await(let u of n.stream({model:s,messages:c,temperature:.3,maxTokens:200},o))u.type==="delta"&&(d+=u.text);let l=d.match(/\[[\s\S]*\]/);if(l){let u=JSON.parse(l[0]),p=Array.isArray(u)?u.filter(m=>typeof m.text=="string"&&m.text.length>0).slice(0,5):[];p.length>0&&this.sendNotification("turn.suggestions",{turnId:e,items:p})}}catch{}}async handleDream(e){let t=e.params??{},n=t.turnId??le(),o=t.sessionId,s=t.config,i=s?.memoryRoot??"",a=s?.transcriptDir??"",c=s?.dreamSessionIds??[];e.id!==void 0&&this.sendResponse(e.id,{accepted:!0,turnId:n});let d=new AbortController;this.activeTurn=d,this.log(`dream ${n} starting (session: ${o}, sessions reviewing: ${c.length})`);let l={provider:s?.provider,model:s?.model,apiKey:s?.apiKey,baseUrl:s?.baseUrl,maxRounds:s?.maxRounds,temperature:s?.temperature,contextWindowTokens:s?.contextWindowTokens,maxOutputTokens:s?.maxOutputTokens,modelMaxOutputTokens:s?.modelMaxOutputTokens,reasoning:s?.reasoning,promptCacheKey:s?.promptCacheKey,promptCacheRetention:s?.promptCacheRetention,serviceTier:s?.serviceTier,openaiBuiltinTools:s?.openaiBuiltinTools,maxToolCalls:s?.maxToolCalls,parallelToolCalls:s?.parallelToolCalls,textVerbosity:s?.textVerbosity};{let p=l.provider??"",m=l.model??"";p&&m&&this.registry.getModelInfo(p,m)?.streamRequired&&(l.streamRequired=!0)}if(!this.resolveAgent(l)){this.sendNotification("turn.start",{turnId:n}),this.sendNotification("turn.error",{turnId:n,error:"No LLM provider configured for dream.",code:"NO_PROVIDER"});return}this.sendNotification("turn.start",{turnId:n});try{let p={context:{memoryRoot:i,transcriptDir:a,currentSessionId:o,listSessionsSince:async()=>c},triggerConfig:{force:s?.force!==!1},transport:this.currentTransport,toolInvoker:{invoke:async(g,f,b,w)=>{if(f.startsWith("$"))return{result:b};let T=xe(f);if(!T)return{result:"",error:`Unknown tool: ${f}`};let _=`tc_${le().slice(0,8)}`;try{let R=JSON.parse(b),y=await T.execute(_,R,w);return{result:y.content.map(O=>O.text??"").join(`
439
+ `),error:y.details?.error}}catch(R){return{result:"",error:R instanceof Error?R.message:String(R)}}}},tools:Fe(),apiKey:this.currentApiKey,model:l.model??this.currentModel,log:{info:g=>this.log(g),warn:g=>this.log(`[warn] ${g}`),error:g=>this.log(`[error] ${g}`),debug:g=>{this.verbose&&this.log(`[debug] ${g}`)}},hooks:this.currentHooks??void 0,parentSignal:d.signal,qmemoryAdapter:this.qmemoryAdapter??void 0,qmemoryUserId:this.qmemoryUserId||void 0},m=await Ha(p);m.ok?this.sendNotification("turn.end",{turnId:n,content:`Dream consolidation completed. ${m.sessionsReviewed} sessions reviewed, ${m.filesTouched.length} files touched. Duration: ${m.durationMs}ms.`,usage:{prompt:0,completion:0}}):this.sendNotification("turn.error",{turnId:n,error:m.error??"Dream consolidation failed",code:"DREAM_FAILED"}),this.log(`dream ${n} completed`)}catch(p){if(d.signal.aborted)this.sendNotification("turn.error",{turnId:n,error:"Dream aborted",code:"ABORTED"});else{let m=p instanceof Error?p.message:String(p);this.sendNotification("turn.error",{turnId:n,error:m,code:"INTERNAL_ERROR"})}}finally{this.activeTurn===d&&(this.activeTurn=null)}}resolveAgent(e){let t=`${e.provider??""}:${e.model??""}:${e.apiKey?.slice(0,8)??""}:${e.baseUrl??""}`;if(this.agent&&this.lastLlmConfigKey===t)return this.agent;let n=e.provider,o=e.model,s=e.apiKey,i=e.baseUrl;if(!n||!s){let h=this.loadSettingsSync();h&&(n=n??h.provider,s=s??h.apiKey,o=o??h.model,i=i??h.baseUrl,n&&s&&this.log(`loaded provider from settings.json: ${n}, model: ${o}`))}if(!n||!s)return null;o=o??this.registry.getProvider(n)?.defaultModel??"",e.model=o,e.provider=n,e.apiKey=s,i&&(e.baseUrl=i);let a=$n({provider:n,model:o,apiKey:s,baseUrl:i},this.registry);Rr()&&(a.transport=Cr(a.transport,this.currentSessionId||"default"));let c={info:h=>this.log(h),warn:h=>this.log(`[warn] ${h}`),error:h=>this.log(`[error] ${h}`),debug:h=>{this.verbose&&this.log(`[debug] ${h}`)}},d={invoke:async(h,k,x,C)=>{if(k.startsWith("$"))return{result:x};let A=xe(k);if(!A)return{result:"",error:`Unknown tool: ${k}`};let L=`tc_${le().slice(0,8)}`;try{let K=JSON.parse(x),G=await A.execute(L,K,C),ce=G.content.map(X=>X.text??"").join(`
440
+ `),Z=G.details?.error,E=G.details?.type,se=E?.split("_")[0];if(E==="three_d_generate"&&(se="3d"),se&&["image","tts","video","music","3d"].includes(se)){let X=G.details?.mediaUrls??[],bn=se;for(let _e of X)this.sendNotification("turn.media_result",{turnId:h,mediaType:bn,url:_e,model:G.details?.model,provider:G.details?.provider,...G.details?.durationMs?{durationSeconds:G.details.durationMs/1e3}:{},...G.details?.taskId?{taskId:G.details.taskId}:{}})}if(E==="todo"&&!Z)try{let X=JSON.parse(ce);X.todoList&&this.sendNotification("turn.todos_updated",{turnId:h,items:X.todoList,summary:{total:X.total??X.todoList.length,completed:X.completed??0,inProgress:X.inProgress??0,notStarted:X.notStarted??0}})}catch{}let Xe=Array.isArray(G.details?.matches)?G.details.matches:void 0;return{result:ce,error:Z,toolReferences:Xe}}catch(K){return{result:"",error:K instanceof Error?K.message:String(K)}}}},l=Pr(c);this.currentHooks=l,this.taskStore.setHooks(l,this.currentSessionId??"");let u=(process.env.QMEMORY_BASE_URL??process.env.QLOGICAGENT_QMEMORY_BASE_URL??"").trim().replace(/\/+$/,"");if(u){let h=Ra({baseUrl:u,apiKey:(process.env.QMEMORY_API_KEY??"").trim()||void 0,timeoutMs:5e3});this.qmemoryAdapter=h,this.qmemoryUserId=this.currentSessionId??"default",Sa(l,{memoryProvider:h,userId:this.currentSessionId??"default",log:{debug:k=>c.debug(k),warn:k=>c.warn(k)}},this.memoryPrefetchState)}Wi(l,c,{transport:a.transport,apiKey:a.apiKey});let p=e?.mcpServers,m=xs(p??{}),g=sa();try{if(U.existsSync(g)){let h=JSON.parse(U.readFileSync(g,"utf8")),k=xs(h),x=new Set(m.map(C=>C.name));m=[...m,...k.filter(C=>!x.has(C.name))]}}catch{}if(m.length>0){this.mcpManager&&this.mcpManager.disconnectAll().catch(()=>{}),this.mcpManager=new uo({servers:m,log:c}),ut(async()=>{await this.mcpManager?.disconnectAll()});let h=()=>this.mcpManager;fe(Qc(h)),fe(Zc(h)),fe(xd({listServers:async()=>{let k=this.mcpManager;return k?k.getConnectedServers().map(C=>({name:C,status:"connected",transport:"stdio",toolCount:0,resourceCount:0,promptCount:0})):[]},listTools:async k=>{if(!this.mcpManager)return[];let C=`mcp__${k.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`;return qe().filter(A=>A.startsWith(C)).map(A=>({name:A.slice(C.length),prefixedName:A}))},callTool:async(k,x,C,A)=>{let K=`mcp__${k.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`+x,G=xe(K);if(!G)return{success:!1,error:`Tool not found: ${K}`};try{return{success:!0,content:(await G.execute(`mcp_${Date.now()}`,C??{},A)).content.map(E=>E.text??"").join(`
441
+ `)}}catch(ce){return{success:!1,error:ce.message}}},listResources:async k=>{let x=this.mcpManager;return x?(await x.listResources(k)).map(A=>({uri:A.uri,name:A.name,mimeType:A.mimeType,description:A.description,server:A.server})):[]},readResource:async(k,x)=>{let C=this.mcpManager;if(!C)throw new Error("MCP not initialized");return(await C.readResource(k,x)).map(L=>({uri:L.uri,mimeType:L.mimeType,text:L.text}))},authenticate:async()=>({status:"unsupported",message:"OAuth not yet implemented in McpManager"})})),this.mcpReady=this.mcpManager.connectAll().then(()=>{this.mcpManager?.injectTools(),c.info(`[mcp] ${this.mcpManager?.getToolCount()??0} tools from ${this.mcpManager?.getConnectedServers().length??0} servers`)}).catch(k=>{c.warn(`[mcp] connection error: ${k instanceof Error?k.message:k}`)})}let f=[],b=ta();U.existsSync(b)&&f.push(b);let w=e?.pluginPaths;if(Array.isArray(w))for(let h of w)typeof h=="string"&&U.existsSync(h)&&f.push(h);od(f,c).then(h=>{if(h.length===0)return;this.pluginLoader=new mo({pluginDirs:h,hookRegistry:l,log:c}),this.pluginLoader.loadAll().then(x=>{c.info(`[plugins] ${x.length} loaded, ${this.pluginLoader?.getPluginSkills().length??0} skills`)}).catch(x=>{c.warn(`[plugins] load error: ${x instanceof Error?x.message:x}`)});let k=this.pluginLoader;l.register({point:"turn.submitted",handler:async()=>(await k.refreshActivations(),{action:"continue"}),label:"plugin-activation-refresh",priority:50})}).catch(h=>{c.warn(`[plugins] marketplace resolve error: ${h instanceof Error?h.message:h}`)});let T=e?.permissions,_=_s(T),R=new go(_);this.permissionUnregister&&this.permissionUnregister(),this.permissionChecker=new ho({ruleEngine:R,hookRegistry:l,onRequestApproval:async h=>(this.sendNotification("tool.approval.request",{approvalId:h.approvalId,callId:h.callId,toolName:h.toolName,arguments:h.arguments?JSON.stringify(h.arguments):"",message:h.message,suggestions:h.suggestions?.map(k=>`${k.pattern}:${k.behavior}`)}),new Promise(()=>{})),onPermissionUpdate:h=>{c.info(`[permissions] rule saved: ${h.pattern} \u2192 ${h.behavior}`),this.sendNotification("permission.rule_updated",{pattern:h.pattern,behavior:h.behavior})},onDenied:(h,k)=>{c.warn(`[permissions] blocked "${h}": ${k}`)}});let y=Fe();this.permissionChecker.setToolMeta(y),this.permissionUnregister=this.permissionChecker.register();let I=[kr(),...Array.isArray(e?.skillPaths)?e.skillPaths:[]];fe(gd({listSkills:()=>{let h=[];this.pluginLoader&&h.push(...this.pluginLoader.getPluginSkills());let k=e?.skillPaths;if(Array.isArray(k)){for(let x of k)if(typeof x=="string"){let C=Y.basename(x);h.some(A=>A.name===C)||h.push({name:C,source:"gateway",filePath:Y.join(x,"SKILL.md"),baseDir:x})}}return h},listSkillsFull:async h=>{let k=[],x=new Set;for(let C of I)try{let A=await U.promises.readdir(C,{withFileTypes:!0});for(let L of A){if(!L.isDirectory())continue;let K=Y.join(C,L.name,"SKILL.md");try{await U.promises.access(K);let G=Y.basename(C);if(h&&G!==h)continue;x.add(G),k.push({name:L.name,description:`Skill from ${C}`,category:G})}catch{}}}catch{}if(this.pluginLoader)for(let C of this.pluginLoader.getPluginSkills())h&&C.source!==h||(x.add(C.source??"plugin"),k.push({name:C.name,description:`Plugin skill (${C.source})`,category:C.source}));return{skills:k,categories:[...x]}},readSkillContent:async h=>{for(let k of I){let x=Y.join(k,h,"SKILL.md");try{return await U.promises.readFile(x,"utf8")}catch{}}return null},viewSkill:async(h,k)=>{for(let x of I){let C=k?Y.join(x,h,k):Y.join(x,h,"SKILL.md");try{let A=await U.promises.readFile(C,"utf8");return{name:h,content:A}}catch{}}return null},executeSkillSubturn:async(h,k,x,C)=>{let A=`skill_${h}_${le().slice(0,8)}`,L=this.agent;if(!L)return"[skill] Cannot execute: no LLM provider configured";let K=this.currentSessionId??"skill";this.currentHooks?.invoke("subagent.started",{sessionId:K,turnId:A,subagentId:A,agentType:`skill:${h}`}).catch(()=>{});let G=Fe(),ce=x??`Execute skill "${h}" instructions.`,Z=[],E;for await(let se of L.run({turnId:A,sessionId:K,messages:[{role:"user",content:ce}],tools:G,systemPrompt:k,config:{parentDepth:1}},C)){if(se.type==="end"&&se.content)return this.currentHooks?.invoke("subagent.stopped",{sessionId:K,turnId:A,subagentId:A,agentType:`skill:${h}`,reason:"normal"}).catch(()=>{}),se.content;if(se.type==="delta"&&se.text&&Z.push(se.text),se.type==="error"){E=se.error;break}}return this.currentHooks?.invoke("subagent.stopped",{sessionId:K,turnId:A,subagentId:A,agentType:`skill:${h}`,reason:E?"error":"normal",error:E}).catch(()=>{}),E?`[skill "${h}"] error: ${E}`:Z.join("")||`[skill "${h}"] completed (no output)`},manageSkill:async h=>{let k=Y.join(I[0]??kr(),h.name),x=Y.join(k,"SKILL.md");switch(h.action){case"create":return await U.promises.mkdir(k,{recursive:!0}),await U.promises.writeFile(x,h.content??"","utf8"),{success:!0,message:`Skill "${h.name}" created`,path:k};case"edit":return await U.promises.writeFile(x,h.content??"","utf8"),{success:!0,message:`Skill "${h.name}" updated`,path:x};case"patch":{let C=await U.promises.readFile(x,"utf8");return!h.oldString||!C.includes(h.oldString)?{success:!1,message:"oldString not found in SKILL.md"}:(await U.promises.writeFile(x,C.replace(h.oldString,h.newString??""),"utf8"),{success:!0,message:`Skill "${h.name}" patched`,path:x})}case"delete":return await U.promises.rm(k,{recursive:!0,force:!0}),{success:!0,message:`Skill "${h.name}" deleted`};default:return{success:!1,message:`Unknown action: ${h.action}`}}}})),fe(yd({abortSignal:void 0,currentForkDepth:0,forkAgent:async h=>{let k=Sn(h.agent);if(!k)return{agentId:"",status:"failed",error:`Unknown agent type: ${h.agent}`};if(!this.agent||!this.currentTransport||!this.currentApiKey||!this.currentModel)return{agentId:"",status:"failed",error:"No LLM provider configured"};let x=qe(),C=Zo(x,k),L=Fe().filter(E=>C.includes(E.function.name)),K=Fr(L,!0),G=h.maxTurns??k.maxTurns??200,ce=await Yt({promptMessages:[{role:"user",content:h.prompt}],tools:K,transport:this.currentTransport,toolInvoker:d,apiKey:this.currentApiKey,model:this.currentModel,log:c,hooks:l,forkLabel:`agent-${h.agent}`,maxTurns:G,parentSignal:h.abortSignal,parentDepth:0,onEvent:E=>{E.type==="delta"&&E.text&&this.sendNotification("turn.subagent_delta",{agentType:h.agent,text:E.text})}}),Z=ce.events.filter(E=>E.type==="end"&&"content"in E).map(E=>E.content??"").join("")||ce.events.filter(E=>E.type==="delta"&&"text"in E).map(E=>E.text).join("");return{agentId:`fork-${h.agent}-${le().slice(0,8)}`,status:ce.ok?"completed":"failed",output:Z||void 0,error:ce.error,tokensUsed:ce.totalUsage.prompt+ce.totalUsage.completion}}}));let O=yt(),$=new Map([["model",{key:"model",value:this.currentModel??"",type:"string",description:"Default LLM model"}],["language",{key:"language",value:"zh-cn",type:"string",description:"UI / response language"}],["verbose",{key:"verbose",value:this.verbose,type:"boolean",description:"Enable verbose logging"}],["maxRounds",{key:"maxRounds",value:25,type:"number",description:"Default max tool-call rounds per turn"}],["theme",{key:"theme",value:"auto",type:"enum",description:"Color theme",options:["auto","light","dark"]}]]),v=async()=>{try{return JSON.parse(await U.promises.readFile(O,"utf8"))}catch{return{}}},pe=async h=>{await U.promises.mkdir(Y.dirname(O),{recursive:!0}),await U.promises.writeFile(O,JSON.stringify(h,null,2),"utf8")};fe(bd({getConfig:async h=>{let k=$.get(h);if(!k)return{success:!1,error:`Unknown key: ${h}`};let x=await v(),C=h in x?x[h]:k.value;return{success:!0,setting:{...k,value:C,readOnly:ln.includes(h)}}},setConfig:async(h,k)=>{let x=$.get(h);if(!x)return{success:!1,error:`Unknown key: ${h}`};let C=await v(),A=h in C?C[h]:x.value;return C[h]=k,await pe(C),{success:!0,previousValue:A,setting:{...x,value:k}}},listConfig:async()=>{let h=await v();return{success:!0,settings:[...$.values()].map(x=>({...x,value:x.key in h?h[x.key]:x.value,readOnly:ln.includes(x.key)}))}},resetConfig:async h=>{let k=$.get(h);if(!k)return{success:!1,error:`Unknown key: ${h}`};let x=await v();return delete x[h],await pe(x),{success:!0,setting:k}},isValidKey:h=>$.has(h)}));let F=new Map,j=h=>{let k=/^(\d+)([smhd])$/.exec(h.trim());if(!k)return null;let x=parseInt(k[1],10),C=k[2];return x*({s:1e3,m:6e4,h:36e5,d:864e5}[C]??6e4)},oe=h=>{h.timerId&&clearTimeout(h.timerId);let k=j(h.schedule);if(!k)return;let x=Date.now(),C=k-x%k||k;h.timerId=setTimeout(()=>{h.lastRunAt=new Date().toISOString(),h.repeat.completed++,h.lastStatus="success",c.info(`[cron] triggered job ${h.id} (${h.name})`),h.repeat.times===null||h.repeat.completed<h.repeat.times?oe(h):(h.state="paused",h.enabled=!1)},C),h.nextRunAt=new Date(x+C).toISOString()};ut(async()=>{for(let h of F.values())h.timerId&&clearTimeout(h.timerId)}),fe(Td({createJob:async h=>{let k=`cron_${le().slice(0,8)}`,x={id:k,name:h.name??`Job ${k}`,prompt:h.prompt,schedule:h.schedule,scheduleDisplay:h.schedule,state:"scheduled",enabled:!0,repeat:{times:h.repeat??null,completed:0},allowedTools:h.allowedTools};return F.set(k,x),oe(x),{success:!0,job:{...x,timerId:void 0}}},listJobs:async()=>({success:!0,jobs:[...F.values()].map(k=>({...k,timerId:void 0}))}),getJob:async h=>{let k=F.get(h);return k?{success:!0,job:{...k,timerId:void 0}}:{success:!1,error:`Job not found: ${h}`}},updateJob:async(h,k)=>{let x=F.get(h);return x?(k.prompt!==void 0&&(x.prompt=k.prompt),k.schedule!==void 0&&(x.schedule=k.schedule,x.scheduleDisplay=k.schedule),k.name!==void 0&&(x.name=k.name),k.enabled!==void 0&&(x.enabled=k.enabled,x.state=k.enabled?"scheduled":"paused"),k.repeat!==void 0&&(x.repeat.times=k.repeat),k.allowedTools!==void 0&&(x.allowedTools=k.allowedTools),x.enabled?oe(x):x.timerId&&(clearTimeout(x.timerId),x.timerId=void 0),{success:!0,job:{...x,timerId:void 0}}):{success:!1,error:`Job not found: ${h}`}},deleteJob:async h=>{let k=F.get(h);return k?(k.timerId&&clearTimeout(k.timerId),F.delete(h),{success:!0}):{success:!1,error:`Job not found: ${h}`}},pauseJob:async h=>{let k=F.get(h);return k?(k.state="paused",k.enabled=!1,k.timerId&&(clearTimeout(k.timerId),k.timerId=void 0),{success:!0,job:{...k,timerId:void 0}}):{success:!1,error:`Job not found: ${h}`}},resumeJob:async h=>{let k=F.get(h);return k?(k.state="scheduled",k.enabled=!0,oe(k),{success:!0,job:{...k,timerId:void 0}}):{success:!1,error:`Job not found: ${h}`}},triggerJob:async h=>{let k=F.get(h);return k?(k.lastRunAt=new Date().toISOString(),k.repeat.completed++,k.lastStatus="success",{success:!0,job:{...k,timerId:void 0}}):{success:!1,error:`Job not found: ${h}`}},validateSchedule:h=>j(h)!==null||/^\d{1,2}\s/.test(h)?null:`Invalid schedule: ${h}. Use shorthand (5m, 1h, 1d) or cron expression.`}));let re=new Map;ut(async()=>{for(let h of re.values())h.cleanup();re.clear()}),fe(wd({startMonitor:async h=>{if(re.has(h.monitorId))return{action:"start",success:!1,error:`Monitor "${h.monitorId}" already exists.`};let k={monitorId:h.monitorId,source:h.source,target:h.target,conditions:h.conditions,startedAt:Date.now(),timeoutSeconds:h.timeoutSeconds,eventCount:0},x=()=>{};if(h.source==="file")try{let C=U.watch(h.target,{persistent:!1},()=>{k.eventCount++,c.info(`[monitor] file change detected: ${h.target}`)});x=()=>C.close()}catch{return{action:"start",success:!1,error:`Cannot watch: ${h.target}`}}if(h.timeoutSeconds>0){let C=setTimeout(()=>{let L=re.get(h.monitorId);L&&(L.cleanup(),re.delete(h.monitorId))},h.timeoutSeconds*1e3),A=x;x=()=>{clearTimeout(C),A()}}return re.set(h.monitorId,{info:k,cleanup:x}),{action:"start",success:!0,monitorId:h.monitorId}},stopMonitor:async h=>{let k=re.get(h);return k?(k.cleanup(),re.delete(h),{action:"stop",success:!0,monitorId:h}):{action:"stop",success:!1,error:`Monitor "${h}" not found.`}},listMonitors:async()=>[...re.values()].map(h=>h.info)}));let me=new Map,V={info:h=>c.info(h),warn:h=>c.warn(h)},B=new _t({onNotification:(h,k,x)=>{this.sendNotification("team.member.notification",{memberId:h,method:k,params:x})},onStateChange:(h,k)=>{this.sendNotification("team.member.state",{memberId:h,state:k});let x=B.getHandle(h),A=B.getUsageTracker(h)?.getUsage();this.emitAgentStatus(h,k,{missedBeats:B.getMissedBeats(h),lastActivityAt:x?.lastActivityAt,usage:A&&A.totalTokens>0?{inputTokens:A.inputTokens,outputTokens:A.outputTokens,totalTokens:A.totalTokens}:void 0})},onExit:(h,k,x)=>{for(let C of me.values()){let A=C.members.find(L=>L.cwd&&`team-${C.name}-${L.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase()===h.replace(/^team-/,""));A&&(A.isActive=!1)}c.info(`[team] member ${h} exited (code=${k}, signal=${x})`)},onMcpToolCall:(h,k,x)=>this.handleMcpToolCall(h,k,x),log:{info:h=>c.info(h),warn:h=>c.warn(h),debug:h=>c.debug(h)},sessionDir:Y.join(W(),"agent-logs")});ut(async()=>{B.dispose()}),fe(vd({createTeam:async h=>{if(me.has(h.teamName))return{success:!1,error:`Team "${h.teamName}" already exists.`};let k=await on(),x=[];for(let A of h.members??[]){let L={...A,isActive:!0};if(k){let K=`team-${h.teamName}-${A.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),G=await pc(k,K,V);G?(L.worktreePath=G.worktreePath,L.worktreeBranch=G.branch,L.cwd=G.worktreePath,c.info(`[team] provisioned worktree for ${A.name}: ${G.worktreePath}`)):(L.cwd=process.cwd(),c.warn(`[team] worktree provision failed for ${A.name}, using shared cwd`))}else L.cwd=process.cwd();x.push(L)}let C={name:h.teamName,description:h.description,leadId:this.currentSessionId??"default",members:x,createdAt:new Date().toISOString()};me.set(h.teamName,C);for(let A of x){if(!A.cwd)continue;let L=`team-${h.teamName}-${A.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase();try{await B.spawn({memberId:L,name:A.name,cwd:A.cwd,prompt:`You are the "${A.name}" team member. Role: ${A.role}.`,agentType:A.role,verbose:this.verbose}),c.info(`[team] spawned child process for ${A.name} in ${A.cwd}`)}catch(K){c.warn(`[team] failed to spawn child process for ${A.name}: ${K instanceof Error?K.message:String(K)}`),A.isActive=!1}}return this.sendNotification("team.updated",{teamName:h.teamName,action:"created",members:C.members.map(A=>({agentName:A.name,role:A.role,worktreePath:A.worktreePath,pid:B.getHandle(`team-${h.teamName}-${A.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase())?.pid}))}),{success:!0,team:C}},deleteTeam:async h=>{let k=me.get(h);if(!k)return{success:!1,error:`Team "${h}" not found.`};for(let C of k.members){let A=`team-${h}-${C.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase();B.kill(A),B.remove(A)}let x=await on();if(x)for(let C of k.members)C.worktreePath&&C.worktreeBranch&&(await mc(x,C.worktreePath,C.worktreeBranch,V),c.info(`[team] cleaned up worktree for ${C.name}: ${C.worktreePath}`));return me.delete(h),this.sendNotification("team.updated",{teamName:h,action:"destroyed",members:[]}),{success:!0}},listTeams:async()=>({success:!0,teams:[...me.values()]}),getTeamStatus:async h=>{let k=me.get(h);if(!k)return{success:!1,error:`Team "${h}" not found.`};let x={};for(let C of k.members){let A=`team-${h}-${C.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),L=B.getStatus(A);L&&(C.isActive=L.alive,x[C.name]={mediaProgress:L.mediaProgress,lastToolCall:L.lastToolCall,idleFor:L.idleFor,runningFor:L.runningFor})}return{success:!0,team:k,memberProgress:x}}}));{let h=new So({persistToDisk:!0});h.loadFromDiskSync(),this.memoryStore=h;let k={providerId:"null",search:async()=>[],ingest:async()=>{}},x=this.qmemoryAdapter??k;fe({name:Hd,label:qd,description:Vd,parameters:zd,execute:async(C,A)=>{let L=await Kd(A,{provider:x,store:h,userId:this.qmemoryUserId||this.currentSessionId||"default",sessionId:this.currentSessionId});return{content:[{type:"text",text:L.message}],details:{type:"memory",action:L.action,ok:L.ok}}}})}{let h=e?.workdir??process.cwd(),k=Rd(h,this.currentSessionId||"default");fe(_d(k))}let ye=e?.workdir??process.cwd(),De=Xd({projectRoot:ye,ruleEngine:R,hooks:l,log:h=>c.info(`[settings] ${h}`)});ut(async()=>{De()}),this.currentSessionId&&l.invoke("session.created",{sessionId:this.currentSessionId}).catch(()=>{}),this.fileWatcher&&this.fileWatcher.stop();let be=e?.workdir??process.cwd();return Qa({projectRoot:be,sessionId:this.currentSessionId,hooks:l,log:h=>c.debug(h),onInstructionCacheReset:ol}).then(h=>{this.fileWatcher=h,ut(async()=>{this.fileWatcher?.stop()})}).catch(h=>{c.warn(`[file-watcher] init error: ${h instanceof Error?h.message:h}`)}),this.agent=new ht({llmTransport:a.transport,apiKey:a.apiKey,toolInvoker:d,log:c,hooks:l,maxRounds:e.maxRounds,verbose:this.verbose}),this.lastLlmConfigKey=t,this.currentTransport=a.transport,this.currentApiKey=a.apiKey,this.currentModel=o,this.log(`created Agent (provider: ${n}, model: ${o})`),this.agent}loadSettingsSync(){try{let e=yt();if(!U.existsSync(e))return;let t=U.readFileSync(e,"utf-8"),n=JSON.parse(t);return{provider:n.provider,model:n.model,apiKey:n.apiKey,baseUrl:n.baseUrl}}catch{return}}handleSessionGetInfo(e){let t=this.currentSessionId||"default",n=this.sessionState?.createSnapshot(),o={sessionId:t,model:this.currentModel||void 0,cwd:process.cwd(),paths:{sessionDir:ea(t),agentHome:W(),settings:yt()},usage:n?{turnCount:n.turnCount,inputTokens:n.totalInputTokens,outputTokens:n.totalOutputTokens}:void 0};e.id!==void 0&&this.sendResponse(e.id,o)}async handleMemoryList(e){let t=[],n=Y.join(W(),"memory.json");U.existsSync(n)&&t.push({id:"local",type:"json",path:n}),this.qmemoryAdapter&&t.push({id:"qmemory",type:"vector"}),e.id!==void 0&&this.sendResponse(e.id,{sources:t})}async handleMemoryRead(e){let t=e.params,n=t?.source??"local",o=t?.target??"memory";if(n==="local")try{let s=Y.join(W(),"memory.json"),i=await U.promises.readFile(s,"utf-8"),a=JSON.parse(i);e.id!==void 0&&this.sendResponse(e.id,{source:"local",target:o,content:a[o]??""})}catch{e.id!==void 0&&this.sendResponse(e.id,{source:"local",target:o,content:""})}else e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:`Unknown memory source: ${n}`})}async handleMemoryWrite(e){let t=e.params,n=t?.target??"memory",o=t?.content;if(n!=="memory"&&n!=="user"){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:`Invalid memory target: ${n}. Must be "memory" or "user".`});return}if(o==null){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"content is required."});return}try{let s=Y.join(W(),"memory.json"),i={};try{let a=await U.promises.readFile(s,"utf-8");i=JSON.parse(a)}catch{}i[n]=o,i.savedAt=new Date().toISOString(),await U.promises.mkdir(W(),{recursive:!0}),await U.promises.writeFile(s,JSON.stringify(i,null,2),"utf-8"),e.id!==void 0&&this.sendResponse(e.id,{ok:!0,target:n}),this.sendNotification("memory.updated",{target:n,source:"rpc"})}catch(s){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:s instanceof Error?s.message:String(s)})}}handleToolsList(e){let t=e.params,o=Fe(t?.includeDeferred??!1).map(s=>({name:s.function.name,description:s.function.description??"",parameters:s.function.parameters,source:"builtin"}));if(t?.category){let s=o.filter(i=>i.name.startsWith(t.category)||i.description.toLowerCase().includes(t.category.toLowerCase()));e.id!==void 0&&this.sendResponse(e.id,{tools:s,total:s.length})}else e.id!==void 0&&this.sendResponse(e.id,{tools:o,total:o.length})}handleMediaListModels(e){let n=e.params?.mediaType,s=this.mediaClient.listMediaModels(n).map(i=>({providerId:i.providerId,providerName:i.providerDef.name,modelId:i.modelInfo.id,modelName:i.modelInfo.name,mediaType:i.mediaType,capabilities:i.modelInfo.mediaCapabilities}));e.id!==void 0&&this.sendResponse(e.id,{models:s})}async handleMediaCancel(e){let t=e.params;if(!t?.taskId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"taskId is required."});return}let n=t.provider??"doubao",o=this.mediaClient.getTransport(n);if(!o){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`No transport for provider: ${n}`});return}if(!Ar(o)){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`Provider ${n} does not support task cancellation.`});return}try{let s=this.resolveMediaApiKey(n);if(!s){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`No API key for provider: ${n}`});return}await o.deleteVideoTask(t.taskId,s),e.id!==void 0&&this.sendResponse(e.id,{ok:!0,taskId:t.taskId,message:"Task cancelled."})}catch(s){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:s instanceof Error?s.message:String(s)})}}async handleMediaStatus(e){let t=e.params;if(!t?.taskId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"taskId is required."});return}let n=t.provider??"doubao",o=this.mediaClient.getTransport(n);if(!o){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`No transport for provider: ${n}`});return}if(!Ar(o)){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`Provider ${n} does not support task status queries.`});return}try{let s=this.resolveMediaApiKey(n);if(!s){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`No API key for provider: ${n}`});return}if(o.getTaskStatus){let{status:d,task:l}=await o.getTaskStatus(t.taskId,s);e.id!==void 0&&this.sendResponse(e.id,{ok:!0,taskId:t.taskId,status:d,task:l});return}let i=await o.listVideoTasks(s,{limit:100}),c=(i.data??i.tasks??[]).find(d=>d.id===t.taskId||d.task_id===t.taskId);e.id!==void 0&&this.sendResponse(e.id,{ok:!0,taskId:t.taskId,...c?{status:c.status,task:c}:{status:"unknown",message:"Task not found in recent list."}})}catch(s){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:s instanceof Error?s.message:String(s)})}}resolveMediaApiKey(e){return this.currentMediaApiKeys?.[e]}handleProviderList(e){let t=this.registry.listProviders(),n=new Map;for(let s of t){let i=s.group??s.id;n.has(i)||n.set(i,[]);let a=!!this.registry.resolveApiKey(s.id);n.get(i).push({id:s.id,name:s.name,transport:s.transport,baseUrl:s.baseUrl,defaultModel:s.defaultModel,modelCount:s.models?.length??0,available:a})}let o=[...n.entries()].map(([s,i])=>({group:s,variants:i}));e.id!==void 0&&this.sendResponse(e.id,{providers:o})}handleConfigGet(e){try{let t=yt(),n={};if(U.existsSync(t)){let o=U.readFileSync(t,"utf-8");n=JSON.parse(o)}e.id!==void 0&&this.sendResponse(e.id,{config:n,paths:{userSettings:t,agentHome:W()}})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleConfigUpdate(e){let t=e.params;if(!t?.updates||typeof t.updates!="object"){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"updates (object) is required."});return}try{let n=yt(),o={};try{let s=await U.promises.readFile(n,"utf-8");o=JSON.parse(s)}catch{}Object.assign(o,t.updates),await U.promises.mkdir(Y.dirname(n),{recursive:!0}),await U.promises.writeFile(n,JSON.stringify(o,null,2),"utf-8"),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(n){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:n instanceof Error?n.message:String(n)})}}async handleTodosList(e){let t=xe("todo");if(!t){e.id!==void 0&&this.sendResponse(e.id,{items:[],summary:vt([])});return}try{let o=(await t.execute("rpc-todos-list",{action:"list"},void 0)).content.map(a=>a.text??"").join(""),i=JSON.parse(o).todoList??[];e.id!==void 0&&this.sendResponse(e.id,{items:i,summary:vt(i)})}catch{e.id!==void 0&&this.sendResponse(e.id,{items:[],summary:vt([])})}}async handleMemorySearch(e){let t=e.params;if(!t?.query){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"query is required."});return}if(!this.qmemoryAdapter){try{let n=Y.join(W(),"memory.json"),o=await U.promises.readFile(n,"utf-8"),s=JSON.parse(o),i=[],a=t.query.toLowerCase();for(let[c,d]of Object.entries(s)){if(typeof d!="string")continue;let l=d.split(`
436
442
  \xA7
437
- `).filter(d=>d.trim());for(let d=0;d<c.length;d++)c[d].toLowerCase().includes(a)&&i.push({id:`local-${l}-${d}`,text:c[d],score:1,source:"local"})}e.id!==void 0&&this.sendResponse(e.id,{results:i.slice(0,t.limit??10)})}catch{e.id!==void 0&&this.sendResponse(e.id,{results:[]})}return}try{let n=t.userId??(this.qmemoryUserId||"default"),o=await this.qmemoryAdapter.search(t.query,n,{limit:t.limit??10});e.id!==void 0&&this.sendResponse(e.id,{results:o.map(s=>({id:s.blockId??"",text:s.text,score:s.score,source:"qmemory",metadata:s.metadata}))})}catch(n){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:n instanceof Error?n.message:String(n)})}}async handleMemoryDelete(e){let t=e.params;if(!t?.match){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"match is required."});return}let n=t.source??"local";if(n==="local"){let o=t.target??"memory";try{let s=J.join(G(),"memory.json"),i=await N.promises.readFile(s,"utf-8"),a=JSON.parse(i),u=(a[o]??"").split(`
443
+ `).filter(u=>u.trim());for(let u=0;u<l.length;u++)l[u].toLowerCase().includes(a)&&i.push({id:`local-${c}-${u}`,text:l[u],score:1,source:"local"})}e.id!==void 0&&this.sendResponse(e.id,{results:i.slice(0,t.limit??10)})}catch{e.id!==void 0&&this.sendResponse(e.id,{results:[]})}return}try{let n=t.userId??(this.qmemoryUserId||"default"),o=await this.qmemoryAdapter.search(t.query,n,{limit:t.limit??10});e.id!==void 0&&this.sendResponse(e.id,{results:o.map(s=>({id:s.blockId??"",text:s.text,score:s.score,source:"qmemory",metadata:s.metadata}))})}catch(n){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:n instanceof Error?n.message:String(n)})}}async handleMemoryDelete(e){let t=e.params;if(!t?.match){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"match is required."});return}let n=t.source??"local";if(n==="local"){let o=t.target??"memory";try{let s=Y.join(W(),"memory.json"),i=await U.promises.readFile(s,"utf-8"),a=JSON.parse(i),d=(a[o]??"").split(`
438
444
  \xA7
439
- `).filter(m=>m.trim()),c=u.length,d=u.filter(m=>!m.includes(t.match));a[o]=d.join(`
445
+ `).filter(m=>m.trim()),l=d.length,u=d.filter(m=>!m.includes(t.match));a[o]=u.join(`
440
446
  \xA7
441
- `),a.savedAt=new Date().toISOString(),await N.promises.writeFile(s,JSON.stringify(a,null,2),"utf-8");let p=c-d.length;e.id!==void 0&&this.sendResponse(e.id,{ok:!0,removedCount:p,message:`Removed ${p} entries.`}),p>0&&this.sendNotification("memory.updated",{source:"local",target:o})}catch(s){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:s instanceof Error?s.message:String(s)})}}else if(n==="qmemory"&&this.qmemoryAdapter)try{await this.qmemoryAdapter.remove(t.match),e.id!==void 0&&this.sendResponse(e.id,{ok:!0,removedCount:1,message:"Removed from QMemory."}),this.sendNotification("memory.updated",{source:"qmemory"})}catch(o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:o instanceof Error?o.message:String(o)})}else e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:n==="qmemory"?"QMemory not configured.":`Unknown source: ${n}`})}handleTasksList(e){let n=e.params?.lifecycle??"all",o=this.taskStore.getAllTasks(),s=n==="all"?o:o.filter(i=>i.lifecycle===n);e.id!==void 0&&this.sendResponse(e.id,{tasks:s.map(i=>({taskId:i.taskId,type:i.type,lifecycle:i.lifecycle,label:i.label}))})}handleTasksCancel(e){let t=e.params;if(!t?.taskId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"taskId is required."});return}let o=this.taskStore.getAllTasks().find(s=>s.taskId===t.taskId);if(!o){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`Task ${t.taskId} not found.`});return}if(o.lifecycle!=="running"&&o.lifecycle!=="pending"){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`Task ${t.taskId} is already ${o.lifecycle}.`});return}this.taskStore.updateTask(t.taskId,s=>(s.lifecycle="cancelled",s)),e.id!==void 0&&this.sendResponse(e.id,{ok:!0,message:`Task ${t.taskId} cancelled.`})}static STATE_TO_STATUS={starting:"spawning",ready:"available",running:"running",completed:"available",failed:"failed",killed:"unavailable"};emitAgentStatus(e,t,n){let o=r.STATE_TO_STATUS[t]??"unavailable",s={agentId:e,status:o};(n?.missedBeats!==void 0||n?.lastActivityAt!==void 0)&&(s.health={missedBeats:n.missedBeats??0,lastActiveAt:n.lastActivityAt?new Date(n.lastActivityAt).toISOString():new Date().toISOString()}),n?.usage&&(s.usage=n.usage),this.sendNotification("agents.status",s)}async handleMcpToolCall(e,t,n){let o=we(t);if(!o)return`Error: Unknown tool "${t}"`;let s=`mcp_${e}_${xe().slice(0,8)}`;try{return(await o.execute(s,n)).content.map(a=>a.text??"").join(`
442
- `)||"OK"}catch(i){return`Error: ${i instanceof Error?i.message:String(i)}`}}async ensureAgentConfigStore(){return this.agentConfigStore||(this.agentConfigStore=new po(this.currentProjectRoot),await this.agentConfigStore.load(),this.acpDetector.setConfigStore(this.agentConfigStore.getData())),this.agentConfigStore}async handleAgentsScan(e){try{let t=e.params,n=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(n.getData());let o=this.acpDetector.scan(t?.force);e.id!==void 0&&this.sendResponse(e.id,o)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsList(e){try{let t=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(t.getData());let n=this.acpDetector.list();e.id!==void 0&&this.sendResponse(e.id,n)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsConfig(e){try{let t=e.params;if(!t?.action||!t?.agent){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"action and agent are required."});return}let n=await this.ensureAgentConfigStore();switch(t.action){case"register":n.registerCustomAgent(t.agent);break;case"unregister":n.unregisterCustomAgent(t.agent.id);break;case"update":n.registerCustomAgent(t.agent);break}this.acpDetector.setConfigStore(n.getData()),this.acpDetector.clearCache(),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsSetConfig(e){try{let t=e.params;if(!t?.agentId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"agentId is required."});return}let n=await this.ensureAgentConfigStore(),{agentId:o,...s}=t;await n.setAgentConfig(o,s),this.acpDetector.setConfigStore(n.getData()),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsGetConfig(e){try{let t=e.params;if(!t?.agentId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"agentId is required."});return}let o=(await this.ensureAgentConfigStore()).getAgentConfig(t.agentId);e.id!==void 0&&this.sendResponse(e.id,o)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsRemoveConfig(e){try{let t=e.params;if(!t?.agentId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"agentId is required."});return}let n=await this.ensureAgentConfigStore();await n.removeAgentConfig(t.agentId),this.acpDetector.setConfigStore(n.getData()),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsSetGateway(e){try{let t=e.params;if(!t?.url){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"url is required."});return}await(await this.ensureAgentConfigStore()).setGatewayUrl(t.url),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}ensureSoloEvaluator(){if(!this.soloEvaluator){let e=new bt({log:{info:n=>process.stderr.write(`[solo:pm] ${n}
447
+ `),a.savedAt=new Date().toISOString(),await U.promises.writeFile(s,JSON.stringify(a,null,2),"utf-8");let p=l-u.length;e.id!==void 0&&this.sendResponse(e.id,{ok:!0,removedCount:p,message:`Removed ${p} entries.`}),p>0&&this.sendNotification("memory.updated",{source:"local",target:o})}catch(s){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:s instanceof Error?s.message:String(s)})}}else if(n==="qmemory"&&this.qmemoryAdapter)try{await this.qmemoryAdapter.remove(t.match),e.id!==void 0&&this.sendResponse(e.id,{ok:!0,removedCount:1,message:"Removed from QMemory."}),this.sendNotification("memory.updated",{source:"qmemory"})}catch(o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:o instanceof Error?o.message:String(o)})}else e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:n==="qmemory"?"QMemory not configured.":`Unknown source: ${n}`})}handleTasksList(e){let n=e.params?.lifecycle??"all",o=this.taskStore.getAllTasks(),s=n==="all"?o:o.filter(i=>i.lifecycle===n);e.id!==void 0&&this.sendResponse(e.id,{tasks:s.map(i=>({taskId:i.taskId,type:i.type,lifecycle:i.lifecycle,label:i.label}))})}handleTasksCancel(e){let t=e.params;if(!t?.taskId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"taskId is required."});return}let o=this.taskStore.getAllTasks().find(s=>s.taskId===t.taskId);if(!o){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`Task ${t.taskId} not found.`});return}if(o.lifecycle!=="running"&&o.lifecycle!=="pending"){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,message:`Task ${t.taskId} is already ${o.lifecycle}.`});return}this.taskStore.updateTask(t.taskId,s=>(s.lifecycle="cancelled",s)),e.id!==void 0&&this.sendResponse(e.id,{ok:!0,message:`Task ${t.taskId} cancelled.`})}static STATE_TO_STATUS={starting:"spawning",ready:"available",running:"running",completed:"available",failed:"failed",killed:"unavailable"};emitAgentStatus(e,t,n){let o=r.STATE_TO_STATUS[t]??"unavailable",s={agentId:e,status:o};(n?.missedBeats!==void 0||n?.lastActivityAt!==void 0)&&(s.health={missedBeats:n.missedBeats??0,lastActiveAt:n.lastActivityAt?new Date(n.lastActivityAt).toISOString():new Date().toISOString()}),n?.usage&&(s.usage=n.usage),this.sendNotification("agents.status",s)}async handleMcpToolCall(e,t,n){let o=xe(t);if(!o)return`Error: Unknown tool "${t}"`;let s=`mcp_${e}_${le().slice(0,8)}`;try{return(await o.execute(s,n)).content.map(a=>a.text??"").join(`
448
+ `)||"OK"}catch(i){return`Error: ${i instanceof Error?i.message:String(i)}`}}async ensureAgentConfigStore(){return this.agentConfigStore||(this.agentConfigStore=new To(this.currentProjectRoot),await this.agentConfigStore.load(),this.acpDetector.setConfigStore(this.agentConfigStore.getData())),this.agentConfigStore}async handleAgentsScan(e){try{let t=e.params,n=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(n.getData());let o=this.acpDetector.scan(t?.force);e.id!==void 0&&this.sendResponse(e.id,o)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsList(e){try{let t=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(t.getData());let n=this.acpDetector.list();e.id!==void 0&&this.sendResponse(e.id,n)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsConfig(e){try{let t=e.params;if(!t?.action||!t?.agent){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"action and agent are required."});return}let n=await this.ensureAgentConfigStore();switch(t.action){case"register":n.registerCustomAgent(t.agent);break;case"unregister":n.unregisterCustomAgent(t.agent.id);break;case"update":n.registerCustomAgent(t.agent);break}this.acpDetector.setConfigStore(n.getData()),this.acpDetector.clearCache(),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsSetConfig(e){try{let t=e.params;if(!t?.agentId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"agentId is required."});return}let n=await this.ensureAgentConfigStore(),{agentId:o,...s}=t;await n.setAgentConfig(o,s),this.acpDetector.setConfigStore(n.getData()),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsGetConfig(e){try{let t=e.params;if(!t?.agentId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"agentId is required."});return}let o=(await this.ensureAgentConfigStore()).getAgentConfig(t.agentId);e.id!==void 0&&this.sendResponse(e.id,o)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsRemoveConfig(e){try{let t=e.params;if(!t?.agentId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"agentId is required."});return}let n=await this.ensureAgentConfigStore();await n.removeAgentConfig(t.agentId),this.acpDetector.setConfigStore(n.getData()),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsSetGateway(e){try{let t=e.params;if(!t?.url){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"url is required."});return}await(await this.ensureAgentConfigStore()).setGatewayUrl(t.url),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}ensureSoloEvaluator(){if(!this.soloEvaluator){let e=new _t({log:{info:n=>process.stderr.write(`[solo:pm] ${n}
443
449
  `),warn:n=>process.stderr.write(`[solo:pm] WARN ${n}
444
- `)},onNotification:(n,o,s)=>{(o==="agents.error"||o==="agents.status")&&this.sendNotification(o,s)},onStateChange:(n,o)=>{let s=e.getHandle(n),a=e.getUsageTracker(n)?.getUsage();this.emitAgentStatus(n,o,{missedBeats:e.getMissedBeats(n),lastActivityAt:s?.lastActivityAt,usage:a&&a.totalTokens>0?{inputTokens:a.inputTokens,outputTokens:a.outputTokens,totalTokens:a.totalTokens}:void 0})},onMcpToolCall:(n,o,s)=>this.handleMcpToolCall(n,o,s),sessionDir:J.join(G(),"agent-logs")}),t={log:{info:n=>process.stderr.write(`${n}
450
+ `)},onNotification:(n,o,s)=>{(o==="agents.error"||o==="agents.status")&&this.sendNotification(o,s),this.sendNotification("team.member.notification",{memberId:n,method:o,params:s})},onStateChange:(n,o)=>{let s=e.getHandle(n),a=e.getUsageTracker(n)?.getUsage();this.emitAgentStatus(n,o,{missedBeats:e.getMissedBeats(n),lastActivityAt:s?.lastActivityAt,usage:a&&a.totalTokens>0?{inputTokens:a.inputTokens,outputTokens:a.outputTokens,totalTokens:a.totalTokens}:void 0})},onMcpToolCall:(n,o,s)=>this.handleMcpToolCall(n,o,s),sessionDir:Y.join(W(),"agent-logs")}),t={log:{info:n=>process.stderr.write(`${n}
445
451
  `),warn:n=>process.stderr.write(`${n}
446
- `)},onProgress:(n,o,s,i)=>{this.sendNotification("solo.progress",{soloId:n,agentId:o,state:s,progress:i})},onEvaluation:(n,o)=>{this.sendNotification("solo.evaluation",{soloId:n,winnerId:o.winnerId,reasoning:o.reasoning})},onAgentDelta:(n,o,s)=>{this.sendNotification("solo.agentDelta",{soloId:n,agentId:o,text:s})}};this.soloEvaluator=new go(e,this.acpDetector,this.agentConfigStore,t),this.soloProcessManager=e}return this.soloEvaluator}async handleSoloStart(e){try{let t=e.params;if(!t?.task||!t?.agents||!t?.cwd){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"task, agents, and cwd are required."});return}let n=this.ensureSoloEvaluator(),o=await n.start(t),s=n.getStatus(o);e.id!==void 0&&this.sendResponse(e.id,s)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleSoloStatus(e){try{let t=e.params;if(!t?.soloId){this.soloEvaluator?e.id!==void 0&&this.sendResponse(e.id,this.soloEvaluator.listSessions()):e.id!==void 0&&this.sendResponse(e.id,[]);return}let o=this.ensureSoloEvaluator().getStatus(t.soloId);if(!o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:`Solo session ${t.soloId} not found.`});return}e.id!==void 0&&this.sendResponse(e.id,o)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleSoloCancel(e){try{let t=e.params;if(!t?.soloId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"soloId is required."});return}await this.ensureSoloEvaluator().cancel(t.soloId),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleSoloSelect(e){try{let t=e.params;if(!t?.soloId||!t?.winnerId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"soloId and winnerId are required."});return}let o=await this.ensureSoloEvaluator().select(t);e.id!==void 0&&this.sendResponse(e.id,{ok:!0,mergedBranch:o})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}ensureProductOrchestrator(){if(!this.productOrchestrator){let e=new bt({log:{info:n=>process.stderr.write(`[product:pm] ${n}
452
+ `)},onProgress:(n,o,s,i)=>{this.sendNotification("solo.progress",{soloId:n,agentId:o,state:s,progress:i})},onEvaluation:(n,o)=>{this.sendNotification("solo.evaluation",{soloId:n,winnerId:o.winnerId,reasoning:o.reasoning})},onAgentDelta:(n,o,s)=>{this.sendNotification("solo.agentDelta",{soloId:n,agentId:o,text:s})}};this.soloEvaluator=new vo(e,this.acpDetector,this.agentConfigStore,t),this.soloProcessManager=e}return this.soloEvaluator}async handleSoloStart(e){try{let t=e.params;if(!t?.task||!t?.agents||!t?.cwd){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"task, agents, and cwd are required."});return}let n=this.ensureSoloEvaluator(),o=await n.start(t),s=n.getStatus(o);e.id!==void 0&&this.sendResponse(e.id,s)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleSoloStatus(e){try{let t=e.params;if(!t?.soloId){this.soloEvaluator?e.id!==void 0&&this.sendResponse(e.id,this.soloEvaluator.listSessions()):e.id!==void 0&&this.sendResponse(e.id,[]);return}let o=this.ensureSoloEvaluator().getStatus(t.soloId);if(!o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:`Solo session ${t.soloId} not found.`});return}e.id!==void 0&&this.sendResponse(e.id,o)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleSoloCancel(e){try{let t=e.params;if(!t?.soloId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"soloId is required."});return}await this.ensureSoloEvaluator().cancel(t.soloId),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleSoloSelect(e){try{let t=e.params;if(!t?.soloId||!t?.winnerId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"soloId and winnerId are required."});return}let o=await this.ensureSoloEvaluator().select(t);e.id!==void 0&&this.sendResponse(e.id,{ok:!0,mergedBranch:o})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}ensureProductOrchestrator(){if(!this.productOrchestrator){let e=new _t({log:{info:n=>process.stderr.write(`[product:pm] ${n}
447
453
  `),warn:n=>process.stderr.write(`[product:pm] WARN ${n}
448
- `)},onNotification:(n,o,s)=>{(o==="agents.error"||o==="agents.status")&&this.sendNotification(o,s)},onStateChange:(n,o)=>{let s=e.getHandle(n),a=e.getUsageTracker(n)?.getUsage();this.emitAgentStatus(n,o,{missedBeats:e.getMissedBeats(n),lastActivityAt:s?.lastActivityAt,usage:a&&a.totalTokens>0?{inputTokens:a.inputTokens,outputTokens:a.outputTokens,totalTokens:a.totalTokens}:void 0})},onMcpToolCall:(n,o,s)=>this.handleMcpToolCall(n,o,s),sessionDir:J.join(G(),"agent-logs")}),t={log:{info:n=>process.stderr.write(`${n}
454
+ `)},onNotification:(n,o,s)=>{(o==="agents.error"||o==="agents.status")&&this.sendNotification(o,s),this.sendNotification("team.member.notification",{memberId:n,method:o,params:s})},onStateChange:(n,o)=>{let s=e.getHandle(n),a=e.getUsageTracker(n)?.getUsage();this.emitAgentStatus(n,o,{missedBeats:e.getMissedBeats(n),lastActivityAt:s?.lastActivityAt,usage:a&&a.totalTokens>0?{inputTokens:a.inputTokens,outputTokens:a.outputTokens,totalTokens:a.totalTokens}:void 0})},onMcpToolCall:(n,o,s)=>this.handleMcpToolCall(n,o,s),sessionDir:Y.join(W(),"agent-logs")}),t={log:{info:n=>process.stderr.write(`${n}
449
455
  `),warn:n=>process.stderr.write(`${n}
450
- `)},onTaskStarted:(n,o,s)=>{this.sendNotification("product.taskStarted",{productId:n,taskId:o,assignee:s})},onTaskCompleted:(n,o,s)=>{this.sendNotification("product.taskCompleted",{productId:n,taskId:o,result:s})},onTaskFailed:(n,o,s)=>{this.sendNotification("product.taskFailed",{productId:n,taskId:o,error:s})},onCheckpointed:(n,o)=>{this.sendNotification("product.checkpointed",{productId:n,timestamp:o})},onBudgetWarning:(n,o,s,i)=>{this.sendNotification("product.budgetWarning",{productId:n,usedTokens:o,maxTotalTokens:s,percentage:i})},onCompleted:(n,o)=>{this.sendNotification("product.completed",{productId:n,summary:o})}};this.productOrchestrator=new fo(e,this.acpDetector,this.agentConfigStore,t),this.productProcessManager=e}return this.productOrchestrator}async handleProductCreate(e){try{let t=e.params;if(!t?.name||!t?.cwd||!t?.instances||!t?.tasks){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"name, cwd, instances, and tasks are required."});return}let o=await this.ensureProductOrchestrator().create(t);e.id!==void 0&&this.sendResponse(e.id,{productId:o})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleProductResume(e){try{let t=e.params;if(!t?.productId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"productId is required."});return}await this.ensureProductOrchestrator().resume(t.productId,this.currentProjectRoot),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleProductPause(e){try{let t=e.params;if(!t?.productId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"productId is required."});return}await this.ensureProductOrchestrator().pause(t.productId),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleProductCheckpoint(e){try{let t=e.params;if(!t?.productId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"productId is required."});return}await this.ensureProductOrchestrator().checkpoint(t.productId),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleProductStatus(e){try{let t=e.params;if(!t?.productId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"productId is required."});return}let o=this.ensureProductOrchestrator().getStatus(t.productId);e.id!==void 0&&this.sendResponse(e.id,o)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleProductList(e){try{let n=await this.ensureProductOrchestrator().list(this.currentProjectRoot);e.id!==void 0&&this.sendResponse(e.id,n)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsGetGateway(e){try{let n=(await this.ensureAgentConfigStore()).getGatewayUrl();e.id!==void 0&&this.sendResponse(e.id,{url:n})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsListConfigured(e){try{let n=(await this.ensureAgentConfigStore()).getData(),o=Object.entries(n.agents).map(([s,i])=>({agentId:s,hasApiKey:!!i.apiKey,hasBaseUrl:!!i.baseUrl,hasModel:!!i.model}));e.id!==void 0&&this.sendResponse(e.id,o)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}handleAgentsProcesses(e){try{let t=[],n=(o,s)=>{if(o)for(let i of o.getAllHandles())t.push({memberId:i.memberId,name:i.name,pid:i.pid,state:i.state,startedAt:i.startedAt,endedAt:i.endedAt,source:s})};n(this.soloProcessManager,"solo"),n(this.productProcessManager,"product"),e.id!==void 0&&this.sendResponse(e.id,t)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}handleAgentsKill(e){try{let t=e.params;if(!t?.memberId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"memberId is required."});return}let n=!1;for(let o of[this.soloProcessManager,this.productProcessManager])if(o?.getHandle(t.memberId)){o.kill(t.memberId),n=!0;break}e.id!==void 0&&this.sendResponse(e.id,{ok:n})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsGetLog(e){try{let t=e.params;if(!t?.agentId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"agentId is required."});return}let n=J.join(G(),"agent-logs"),o=J.join(n,`${t.agentId}.stderr.log`),s="";try{s=N.readFileSync(o,"utf-8")}catch{}t.tail&&t.tail>0&&s&&(s=s.split(`
456
+ `)},onTaskStarted:(n,o,s)=>{this.sendNotification("product.taskStarted",{productId:n,taskId:o,assignee:s})},onTaskCompleted:(n,o,s)=>{this.sendNotification("product.taskCompleted",{productId:n,taskId:o,result:s})},onTaskFailed:(n,o,s)=>{this.sendNotification("product.taskFailed",{productId:n,taskId:o,error:s})},onCheckpointed:(n,o)=>{this.sendNotification("product.checkpointed",{productId:n,timestamp:o})},onBudgetWarning:(n,o,s,i)=>{this.sendNotification("product.budgetWarning",{productId:n,usedTokens:o,maxTotalTokens:s,percentage:i})},onCompleted:(n,o)=>{this.sendNotification("product.completed",{productId:n,summary:o})}};this.productOrchestrator=new xo(e,this.acpDetector,this.agentConfigStore,t),this.productProcessManager=e}return this.productOrchestrator}async handleProductCreate(e){try{let t=e.params;if(!t?.name||!t?.cwd||!t?.instances||!t?.tasks){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"name, cwd, instances, and tasks are required."});return}let o=await this.ensureProductOrchestrator().create(t);e.id!==void 0&&this.sendResponse(e.id,{productId:o})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleProductResume(e){try{let t=e.params;if(!t?.productId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"productId is required."});return}await this.ensureProductOrchestrator().resume(t.productId,this.currentProjectRoot),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleProductPause(e){try{let t=e.params;if(!t?.productId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"productId is required."});return}await this.ensureProductOrchestrator().pause(t.productId),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleProductCheckpoint(e){try{let t=e.params;if(!t?.productId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"productId is required."});return}await this.ensureProductOrchestrator().checkpoint(t.productId),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleProductStatus(e){try{let t=e.params;if(!t?.productId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"productId is required."});return}let o=this.ensureProductOrchestrator().getStatus(t.productId);e.id!==void 0&&this.sendResponse(e.id,o)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleProductList(e){try{let n=await this.ensureProductOrchestrator().list(this.currentProjectRoot);e.id!==void 0&&this.sendResponse(e.id,n)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsGetGateway(e){try{let n=(await this.ensureAgentConfigStore()).getGatewayUrl();e.id!==void 0&&this.sendResponse(e.id,{url:n})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsListConfigured(e){try{let n=(await this.ensureAgentConfigStore()).getData(),o=Object.entries(n.agents).map(([s,i])=>({agentId:s,hasApiKey:!!i.apiKey,hasBaseUrl:!!i.baseUrl,hasModel:!!i.model}));e.id!==void 0&&this.sendResponse(e.id,o)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}handleAgentsProcesses(e){try{let t=[],n=(o,s)=>{if(o)for(let i of o.getAllHandles())t.push({memberId:i.memberId,name:i.name,pid:i.pid,state:i.state,startedAt:i.startedAt,endedAt:i.endedAt,source:s})};n(this.soloProcessManager,"solo"),n(this.productProcessManager,"product"),e.id!==void 0&&this.sendResponse(e.id,t)}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}handleAgentsKill(e){try{let t=e.params;if(!t?.memberId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"memberId is required."});return}let n=!1;for(let o of[this.soloProcessManager,this.productProcessManager])if(o?.getHandle(t.memberId)){o.kill(t.memberId),n=!0;break}e.id!==void 0&&this.sendResponse(e.id,{ok:n})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsGetLog(e){try{let t=e.params;if(!t?.agentId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"agentId is required."});return}let n=Y.join(W(),"agent-logs"),o=Y.join(n,`${t.agentId}.stderr.log`),s="";try{s=U.readFileSync(o,"utf-8")}catch{}t.tail&&t.tail>0&&s&&(s=s.split(`
451
457
  `).slice(-t.tail).join(`
452
- `)),e.id!==void 0&&this.sendResponse(e.id,{log:s})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsTestConnection(e){try{let t=e.params;if(!t?.agentId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"agentId is required."});return}let n=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(n.getData());let s=this.acpDetector.list().find(a=>a.id===t.agentId);if(!s){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,error:`Agent ${t.agentId} not found`,durationMs:0});return}if(s.status==="not_installed"){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,error:`Agent ${t.agentId} is not installed`,durationMs:0});return}let i=Date.now();e.id!==void 0&&this.sendResponse(e.id,{ok:s.status==="available",version:s.version,capabilities:s.capabilities,error:s.status!=="available"?`Agent status: ${s.status}`:void 0,durationMs:Date.now()-i})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}handleSoloList(e){try{this.soloEvaluator?e.id!==void 0&&this.sendResponse(e.id,this.soloEvaluator.listSessions()):e.id!==void 0&&this.sendResponse(e.id,[])}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleSoloDelete(e){try{let t=e.params;if(!t?.soloId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"soloId is required."});return}await this.ensureSoloEvaluator().delete(t.soloId),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleProductDelete(e){try{let t=e.params;if(!t?.productId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"productId is required."});return}await this.ensureProductOrchestrator().delete(t.productId),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}sendResponse(e,t,n){let o={jsonrpc:"2.0",id:e};n?o.error=n:o.result=t,this.writeStdout(o)}sendNotification(e,t){let n={jsonrpc:"2.0",method:e,params:t};this.writeStdout(n)}writeStdout(e){this.transport.send(e)}log(e){this.verbose&&process.stderr.write(`[qlogicagent] ${e}
453
- `)}};ut();export{dt as Agent,mt as ProviderRegistry,Os as StdioServer,Et as StdioTransport,Mn as autoDetectProvider,Mt as buildSkillInstruction,wr as createHookRegistry,An as createLLMClient,Bp as parseCliArgs};
458
+ `)),e.id!==void 0&&this.sendResponse(e.id,{log:s})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleAgentsTestConnection(e){try{let t=e.params;if(!t?.agentId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"agentId is required."});return}let n=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(n.getData());let s=this.acpDetector.list().find(a=>a.id===t.agentId);if(!s){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,error:`Agent ${t.agentId} not found`,durationMs:0});return}if(s.status==="not_installed"){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,error:`Agent ${t.agentId} is not installed`,durationMs:0});return}let i=Date.now();e.id!==void 0&&this.sendResponse(e.id,{ok:s.status==="available",version:s.version,capabilities:s.capabilities,error:s.status!=="available"?`Agent status: ${s.status}`:void 0,durationMs:Date.now()-i})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}handleSoloList(e){try{this.soloEvaluator?e.id!==void 0&&this.sendResponse(e.id,this.soloEvaluator.listSessions()):e.id!==void 0&&this.sendResponse(e.id,[])}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleSoloDelete(e){try{let t=e.params;if(!t?.soloId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"soloId is required."});return}await this.ensureSoloEvaluator().delete(t.soloId),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}async handleProductDelete(e){try{let t=e.params;if(!t?.productId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INVALID_PARAMS,message:"productId is required."});return}await this.ensureProductOrchestrator().delete(t.productId),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}sendResponse(e,t,n){let o={jsonrpc:"2.0",id:e};n?o.error=n:o.result=t,this.writeStdout(o)}sendNotification(e,t){if(this.acpServer&&this.acpServer.sessionId)Zd(this.acpServer,this.acpServer.sessionId,e,t);else{let n={jsonrpc:"2.0",method:e,params:t};this.writeStdout(n)}e==="turn.end"&&this.resetIdleDreamTimer(),e==="turn.start"&&this.cancelIdleDreamTimer()}writeStdout(e){this.transport.send(e)}log(e){this.verbose&&process.stderr.write(`[qlogicagent] ${e}
459
+ `)}enableIdleDream(e){this.idleDreamEnabled=!0,e&&e>0&&(this.idleDreamMinutes=e),this.resetIdleDreamTimer()}resetIdleDreamTimer(){this.cancelIdleDreamTimer(),this.idleDreamEnabled&&this.currentSessionId&&(this.idleDreamTimer=setTimeout(()=>{this.triggerIdleDream()},this.idleDreamMinutes*6e4),this.idleDreamTimer.unref?.())}cancelIdleDreamTimer(){this.idleDreamTimer&&(clearTimeout(this.idleDreamTimer),this.idleDreamTimer=null)}async triggerIdleDream(){if(Date.now()-this.lastDreamAt<this.dreamCooldownMs){this.log("[dream:idle] Skipped \u2014 cooldown not elapsed");return}if(!this.currentTransport||!this.currentModel){this.log("[dream:idle] Skipped \u2014 no LLM transport configured");return}if(this.activeTurn){this.log("[dream:idle] Skipped \u2014 turn in progress");return}this.log("[dream:idle] Triggering idle dream consolidation"),this.lastDreamAt=Date.now();let e=setTimeout(()=>{this.activeTurn&&(this.log("[dream:idle] Aborting \u2014 max duration reached"),this.activeTurn.abort())},this.dreamMaxDurationMs);e.unref?.();let t=W(),n={jsonrpc:"2.0",id:void 0,method:"memory.dream",params:{turnId:`idle-dream-${le().slice(0,8)}`,sessionId:this.currentSessionId,config:{memoryRoot:t,transcriptDir:Y.join(t,"agent-logs"),model:this.currentModel,apiKey:this.currentApiKey,force:!1}}};try{await this.handleDream(n)}finally{clearTimeout(e)}this.resetIdleDreamTimer()}initAcpServer(){let e={handleAcpInitialize:t=>this.acpHandleInitialize(t),handleAcpSessionNew:t=>this.acpHandleSessionNew(t),handleAcpSessionPrompt:t=>this.acpHandleSessionPrompt(t),handleAcpSessionEnd:t=>this.acpHandleSessionEnd(t),handleAcpSessionSetConfig:t=>this.acpHandleSessionSetConfig(t),handleAcpSessionSetModel:(t,n)=>this.acpHandleSessionSetModel(t,n),handleAcpSessionSetMode:(t,n)=>this.acpHandleSessionSetMode(t,n),handleAcpPermissionResponse:(t,n)=>this.acpHandlePermissionResponse(t,n),handleAcpAbort:t=>this.acpHandleAbort(t),handleAcpDream:t=>this.acpHandleDream(t),handleAcpSoloStart:t=>this.acpHandleSoloStart(t),handleAcpSoloStatus:t=>this.acpHandleSoloStatus(t),handleAcpSoloSelect:t=>this.acpHandleSoloSelect(t),handleAcpProductCreate:t=>this.acpHandleProductCreate(t),handleAcpProductResume:t=>this.acpHandleProductResume(t),handleAcpProductStatus:t=>this.acpHandleProductStatus(t),handleAcpTeamDelegate:t=>this.acpHandleTeamDelegate(t)};this.acpServer=new _o(this.transport,e,{verbose:this.verbose})}getAcpServer(){return this.acpServer}async acpHandleInitialize(e){let t=e.clientInfo?.name??"unknown";return this.log(`[acp] initialize: host=${t}`),{protocolVersion:vT,agentInfo:{name:"qlogicagent",version:"0.1.0"},agentCapabilities:{extendedEvents:!0,extendedMethods:!0,orchestration:!0,configOptions:[{name:"model",type:"string",description:"LLM model identifier"},{name:"provider",type:"string",description:"LLM provider identifier"},{name:"maxRounds",type:"number",description:"Max tool loop rounds"},{name:"temperature",type:"number",description:"Sampling temperature"}]}}}async acpHandleSessionNew(e){let t=e.sessionId??le();return this.log(`[acp] session/new: id=${t}`),this.currentSessionId=t,this.sessionState=new wt(t),this.sessionTaskDomain=void 0,this.memoryPrefetchState=Tt(),e.cwd&&typeof e.cwd=="string"&&(ao(e.cwd),this.currentProjectRoot=e.cwd),this.enableIdleDream(),{sessionId:t}}async acpHandleSessionPrompt(e){let t=le(),n=e.sessionId,s=[{role:"user",content:e.prompt.map(c=>c.type==="text"?c.text:`[${c.type}]`).join("")}],i={jsonrpc:"2.0",id:t,method:"thread.turn",params:{turnId:t,sessionId:n,messages:s,config:{}}};return await this.runAcpTurn(t,n,s)}async runAcpTurn(e,t,n){let o=new AbortController;this.activeTurn=o,this.sendNotification("turn.start",{turnId:e,model:this.currentModel||void 0});try{let s={model:this.currentModel||void 0,provider:this.currentProvider||void 0,apiKey:this.currentApiKey||void 0,baseUrl:this.currentBaseUrl||void 0},i=this.resolveAgent(s);if(!i)return this.sendNotification("turn.delta",{turnId:e,text:"Error: No LLM provider configured. Configure via ~/.qlogicagent/settings.json or pass provider/apiKey in session config.",item:{id:`${e}-err`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),this.sendNotification("turn.end",{turnId:e,content:"",item:{id:`${e}-end`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),this.activeTurn=null,{stopReason:"end_turn"};await this.mcpReady;let a=Fe(),c,d="end_turn";for await(let l of i.run({turnId:e,sessionId:t,messages:n,tools:a,config:s},o.signal)){let u=new Date().toISOString();switch(l.type){case"start":break;case"delta":this.sendNotification("turn.delta",{turnId:l.turnId,text:l.text,item:{id:`${e}-delta`,type:"message",role:"assistant",text:l.text,createdAt:u}});break;case"end":l.usage&&(c={inputTokens:l.usage.prompt??0,outputTokens:l.usage.completion??0,cacheReadTokens:l.usage.cacheRead,cacheWriteTokens:l.usage.cacheCreation}),this.sendNotification("turn.end",{turnId:l.turnId,content:l.content,usage:l.usage,model:l.model,provider:l.provider,item:{id:`${e}-end`,type:"message",role:"assistant",text:l.content,createdAt:u}});break;case"error":d="end_turn",this.sendNotification("turn.error",{turnId:l.turnId,error:l.error,code:l.code});break;case"tool_call":this.sendNotification("turn.tool_call",{turnId:l.turnId,callId:l.callId,name:l.name,arguments:l.arguments,item:{id:l.callId,type:"tool_call",role:"assistant",toolName:l.name,toolCallId:l.callId,arguments:l.arguments,createdAt:u}});break;case"tool_result":this.sendNotification("turn.tool_result",{turnId:l.turnId,callId:l.callId,name:l.name,ok:l.ok,...l.error?{error:l.error}:{},...l.outputPreview?{outputPreview:l.outputPreview}:{},item:{id:`${l.callId}-result`,type:"tool_result",role:"assistant",toolName:l.name,toolCallId:l.callId,output:l.ok?l.outputPreview??"":l.error,approved:l.ok,createdAt:u}});break;case"tool_blocked":this.sendNotification("turn.tool_blocked",{turnId:l.turnId,callId:l.callId,name:l.name,reason:l.reason,item:{id:`${l.callId}-blocked`,type:"tool_blocked",role:"system",toolName:l.name,toolCallId:l.callId,text:l.reason,approved:!1,createdAt:u}});break;case"recovery":this.sendNotification("turn.recovery",{turnId:l.turnId,action:l.action,...l.detail?{detail:l.detail}:{},item:{id:`${e}-recovery-${le().slice(0,8)}`,type:"recovery",role:"system",strategy:l.action,text:l.detail,createdAt:u}});break;case"reasoning_delta":this.sendNotification("turn.reasoning_delta",{turnId:l.turnId,text:l.text});break;case"subagent_started":this.sendNotification("turn.subagent_started",{turnId:l.turnId,subagentId:l.subagentId,agentType:l.agentType,...l.prompt?{prompt:l.prompt}:{}});break;case"subagent_ended":this.sendNotification("turn.subagent_ended",{turnId:l.turnId,subagentId:l.subagentId,agentType:l.agentType,ok:l.ok,...l.outputPreview?{outputPreview:l.outputPreview}:{},...l.error?{error:l.error}:{}});break;case"media_result":this.sendNotification("turn.media_result",{turnId:l.turnId,mediaType:l.mediaType,url:l.url,...l.model?{model:l.model}:{},...l.provider?{provider:l.provider}:{},...l.taskId?{taskId:l.taskId}:{}});break}}return this.activeTurn=null,{stopReason:d,usage:c}}catch(s){this.activeTurn=null;let i=s instanceof Error?s.message:String(s);return this.log(`[acp] runAcpTurn error: ${i}`),this.sendNotification("turn.error",{turnId:e,error:i,code:"INTERNAL_ERROR"}),{stopReason:"end_turn"}}}async acpHandleSessionEnd(e){this.log(`[acp] session/end: id=${e.sessionId}`),this.currentSessionId===e.sessionId&&(this.cancelIdleDreamTimer(),this.currentHooks&&await this.currentHooks.invoke("session.ended",{sessionId:e.sessionId}).catch(()=>{}),this.currentSessionId="",this.sessionState=null)}async acpHandleSessionSetConfig(e){let t=e.configId??e.option;this.log(`[acp] session/set_config: ${t}=${JSON.stringify(e.value)}`);let n=typeof e.value=="string"?e.value:"";switch(t){case"model":this.currentModel=n;break;case"provider":this.currentProvider=n;break;case"apiKey":this.currentApiKey=n;break;case"baseUrl":this.currentBaseUrl=n;break}}async acpHandleSessionSetModel(e,t){this.log(`[acp] session/set_model: ${t}`),t&&(this.currentModel=t)}async acpHandleSessionSetMode(e,t){this.log(`[acp] session/set_mode: ${t}`)}acpHandlePermissionResponse(e,t){this.log(`[acp] permission response: ${e} \u2192 ${t}`),this.permissionChecker&&this.permissionChecker.resolveApproval({approvalId:e,decision:t==="allow"?"approved":"denied"})}async acpHandleAbort(e){this.log(`[acp] abort: session=${e.sessionId}`),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null)}async acpHandleDream(e){if(this.log(`[acp] x/dream: session=${e.sessionId}`),!this.currentTransport||!this.currentApiKey||!this.currentModel)return{ok:!1,summary:"No LLM transport configured for dream"};let t=W(),n={jsonrpc:"2.0",id:`acp-dream-${le().slice(0,8)}`,method:"memory.dream",params:{turnId:`dream-${le().slice(0,8)}`,sessionId:e.sessionId||this.currentSessionId,config:{memoryRoot:e.config?.memoryRoot||t,transcriptDir:e.config?.transcriptDir||Y.join(t,"agent-logs"),model:this.currentModel,apiKey:this.currentApiKey,...e.config}}};return await this.handleDream(n),{ok:!0,summary:"Dream consolidation triggered"}}async acpHandleSoloStart(e){this.log("[acp] x/solo.start");let t=this.ensureSoloEvaluator(),n=await t.start(e);return t.getStatus(n)}async acpHandleSoloStatus(e){this.log("[acp] x/solo.status");let t=e.soloId;if(!t)return this.soloEvaluator?this.soloEvaluator.listSessions():[];let o=this.ensureSoloEvaluator().getStatus(t);if(!o)throw new Error(`Solo session ${t} not found`);return o}async acpHandleSoloSelect(e){return this.log("[acp] x/solo.select"),{ok:!0,mergedBranch:await this.ensureSoloEvaluator().select(e)}}async acpHandleProductCreate(e){return this.log("[acp] x/product.create"),{productId:await this.ensureProductOrchestrator().create(e)}}async acpHandleProductResume(e){this.log("[acp] x/product.resume");let t=this.ensureProductOrchestrator(),n=e.productId;return await t.resume(n,this.currentProjectRoot),{ok:!0}}async acpHandleProductStatus(e){this.log("[acp] x/product.status");let t=e.productId;if(!this.productOrchestrator)return t?null:[];if(!t)return this.productOrchestrator.list(this.currentProjectRoot);let n=this.productOrchestrator.getStatus(t);if(!n)throw new Error(`Product session ${t} not found`);return n}async acpHandleTeamDelegate(e){let t=e.agentType,n=e.prompt,o=e.maxTurns;if(!n)throw new Error("Missing required param: prompt");if(!t)throw new Error("Missing required param: agentType");let s=Sn(t);if(!s)throw new Error(`Unknown agent type: ${t}`);if(!this.currentTransport||!this.currentModel)throw new Error("No LLM provider configured \u2014 send a prompt first to configure the model");this.log(`[acp] x/team.delegate: agent=${t}, maxTurns=${o??s.maxTurns}`);let i={invoke:async()=>({result:"Tool execution not available in delegated mode"})},a={info:l=>this.log(`[delegate:${t}] ${l}`),warn:l=>this.log(`[delegate:${t}] WARN: ${l}`),error:l=>this.log(`[delegate:${t}] ERROR: ${l}`),debug:l=>this.log(`[delegate:${t}] ${l}`)},c=await Yt({promptMessages:[{role:"user",content:n}],tools:[],transport:this.currentTransport,toolInvoker:i,apiKey:this.currentApiKey,model:this.currentModel,log:a,forkLabel:`team-delegate-${t}`,maxTurns:o??s.maxTurns,parentSignal:this.activeTurn?.signal,parentDepth:0}),d=c.events.filter(l=>l.type==="end"&&"content"in l).map(l=>l.content??"").join("")||c.events.filter(l=>l.type==="delta"&&"text"in l).map(l=>l.text).join("");return{ok:c.ok,agentType:t,output:d||void 0,error:c.error,tokensUsed:c.totalUsage.prompt+c.totalUsage.completion}}};ft();export{ht as Agent,bt as ProviderRegistry,Fs as StdioServer,Ft as StdioTransport,$t as buildSkillInstruction,Pr as createHookRegistry,$n as createLLMClient,Jp as parseCliArgs};