qlogicagent 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +8 -8
  2. package/dist/agent.js +8 -8
  3. package/dist/cli.js +238 -208
  4. package/dist/index.js +237 -207
  5. package/dist/types/cli/stdio-server.d.ts +9 -8
  6. package/dist/types/contracts/hooks.d.ts +3 -0
  7. package/dist/types/llm/transports/media-resolve.d.ts +25 -0
  8. package/dist/types/runtime/execution/dream-agent.d.ts +2 -0
  9. package/dist/types/runtime/execution/dream-category-context.d.ts +47 -0
  10. package/dist/types/runtime/execution/dream-category-context.test.d.ts +1 -0
  11. package/dist/types/runtime/execution/index.d.ts +1 -0
  12. package/dist/types/runtime/execution/memory-decay.d.ts +57 -0
  13. package/dist/types/runtime/execution/memory-decay.test.d.ts +1 -0
  14. package/dist/types/runtime/hooks/index.d.ts +1 -0
  15. package/dist/types/runtime/hooks/memory-hooks.d.ts +20 -0
  16. package/dist/types/runtime/hooks/skill-recall-hooks.d.ts +36 -0
  17. package/dist/types/runtime/infra/agent-paths.d.ts +14 -2
  18. package/dist/types/runtime/infra/disk-storage.d.ts +0 -16
  19. package/dist/types/runtime/infra/index.d.ts +2 -2
  20. package/dist/types/runtime/session/session-persistence.d.ts +3 -1
  21. package/dist/types/skills/index.d.ts +5 -5
  22. package/dist/types/skills/memory/find-relevant-memories.d.ts +70 -0
  23. package/dist/types/skills/memory/memdir.d.ts +80 -0
  24. package/dist/types/skills/memory/memory-tool.d.ts +16 -44
  25. package/dist/types/skills/memory/memory-write-gate.d.ts +46 -0
  26. package/dist/types/skills/memory/memory-write-hook.d.ts +44 -0
  27. package/dist/types/skills/memory/qmemory-adapter.d.ts +12 -0
  28. package/dist/types/skills/memory/recall-category-filter.d.ts +54 -0
  29. package/dist/types/skills/tools/skill-tool.d.ts +16 -3
  30. package/package.json +1 -1
  31. package/dist/types/skills/memory/memory-store.d.ts +0 -86
  32. package/dist/types/skills/tools/skill-invoke-tool.d.ts +0 -46
  33. package/dist/types/skills/tools/skill-list-tool.d.ts +0 -33
  34. package/dist/types/skills/tools/skill-manage-tool.d.ts +0 -73
  35. package/dist/types/skills/tools/skill-view-tool.d.ts +0 -37
package/dist/cli.js CHANGED
@@ -1,45 +1,45 @@
1
1
  #!/usr/bin/env node
2
- var mu=Object.defineProperty;var J=(r,e)=>()=>(r&&(e=r(r=0)),e);var Vs=(r,e)=>{for(var t in e)mu(r,t,{get:e[t],enumerable:!0})};function Ie(r){if(!r||typeof r!="object")return r;if(Array.isArray(r))return r.map(n=>Ie(n));let e=r,t={};for(let[n,o]of Object.entries(e))if(!fu.has(n)){if(n==="properties"&&o&&typeof o=="object"&&!Array.isArray(o)){t[n]=Object.fromEntries(Object.entries(o).map(([s,i])=>[s,Ie(i)]));continue}if(n==="items"&&o&&typeof o=="object"){t[n]=Array.isArray(o)?o.map(s=>Ie(s)):Ie(o);continue}if((n==="anyOf"||n==="oneOf"||n==="allOf")&&Array.isArray(o)){t[n]=o.map(s=>Ie(s));continue}if(o&&typeof o=="object"&&!Array.isArray(o)){t[n]=Ie(o);continue}if(Array.isArray(o)){t[n]=o.map(s=>Ie(s));continue}t[n]=o}return t}var fu,Mo=J(()=>{"use strict";fu=new Set(["patternProperties","additionalProperties","$schema","$id","$ref","$defs","definitions","examples","minLength","maxLength","minimum","maximum","multipleOf","pattern","format","minItems","maxItems","uniqueItems","minProperties","maxProperties","const"])});function Eo(r,e,t,n){return{role:"assistant",content:e||null,tool_calls:r,...t&&t.length>0?{thinkingBlocks:t}:{},...n?{reasoning_content:n}:{}}}function At(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 qs=J(()=>{"use strict";Mo()});function tt(r,e){if(!r)return!1;let t=r.toLowerCase();return e.some(n=>n instanceof RegExp?n.test(t):t.includes(n))}function Mu(r){return tt(r,et.format)}function Ks(r){return tt(r,et.rateLimit)}function Eu(r){return tt(r,et.timeout)}function Ou(r){return hu.test(r)}function Oo(r){let e=r.toLowerCase();return e?r.length>ku?bu.test(e):tt(e,et.billing)?!0:yu.test(r)?e.includes("upgrade")||e.includes("credits")||e.includes("payment")||e.includes("plan"):!1:!1}function Js(r){return tt(r,et.authPermanent)}function Lu(r){return tt(r,et.auth)}function Ys(r){return tt(r,et.overloaded)}function Ze(r,e){return e.some(t=>r.includes(t))}function Du(r){return Ze(r,vu)||Ze(r,xu)&&r.includes("limit")||r.includes("billing hard limit")||r.includes("hard limit reached")||r.includes("maximum allowed")&&r.includes("limit")}function $u(r){let e=Ze(r,Su),t=r.includes("spend limit")||r.includes("spending limit"),n=Ze(r,Cu);return Ze(r,_u)&&Ze(r,Ru)||e&&(r.includes("usage limit")||t)||e&&r.includes("limit")&&r.includes("reset")||n&&r.includes("limit")&&(t||Ze(r,Au))}function Nu(r){return r.trim().toLowerCase().replace(Iu,"").trim()}function Xs(r){let e=Nu(r);return!e||Du(e)?"billing":Ks(e)||$u(e)?"rate_limit":"billing"}function Uu(r){return Pu.test(r)?Xs(r):null}function Qs(r){let e=r.match(Tu);if(!e)return null;let t=Number(e[1]);return Number.isFinite(t)?{code:t,rest:(e[2]??"").trim()}:null}function ju(r){if(!r)return!1;let e=r.toLowerCase();return e.includes('"type":"api_error"')&&e.includes("internal server error")}function Fu(r){let e=r.trim();if(!e)return!1;let t=Qs(e);return t?wu.has(t.code):!1}function Zs(r,e){return typeof r!="number"||!Number.isFinite(r)?null:r===402?e?Xs(e):"billing":r===429?"rate_limit":r===401||r===403?e&&Js(e)?"auth_permanent":"auth":r===408?"timeout":r===503?e&&Ys(e)?"overloaded":"timeout":r===502||r===504?"timeout":r===529?"overloaded":r===400?e&&Oo(e)?"billing":"format":null}function Bu(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 Gu(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 ei(r){if(Gu(r))return"session_expired";if(Bu(r))return"model_not_found";let e=Uu(r);return e||(Ou(r)?Oo(r)?"billing":"rate_limit":Ks(r)?"rate_limit":Ys(r)?"overloaded":Fu(r)?Qs(r.trim())?.code===529?"overloaded":"timeout":ju(r)?"timeout":Mu(r)?"format":Oo(r)?"billing":Eu(r)?"timeout":Js(r)?"auth_permanent":Lu(r)?"auth":null)}var hu,et,yu,bu,ku,Tu,wu,vu,xu,Su,_u,Ru,Cu,Au,Pu,Iu,ti=J(()=>{"use strict";hu=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,et={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]},yu=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,bu=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,ku=512,Tu=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i,wu=new Set([500,502,503,504,521,522,523,524,529]),vu=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],xu=["upgrade your plan","upgrade plan","current plan","subscription"],Su=["daily","weekly","monthly"],_u=["try again","retry","temporary","cooldown"],Ru=["usage limit","rate limit","organization usage"],Cu=["organization","workspace"],Au=["billing period","exceeded","reached","exhausted"],Pu=/["']?(?: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,Iu=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i});function gt(r,e){let t=Zs(r,e)??(e?ei(e):null);return t?Wu[t]:typeof r=="number"&&r>=400&&r<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function Lo(r){return Hu.has(r)}var Wu,Hu,ni=J(()=>{"use strict";ti();Wu={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"},Hu=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"])});function Ot(r){return typeof r.compressAsync=="function"}function zu(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
+ var op=Object.defineProperty;var rp=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var Q=(r,e)=>()=>(r&&(e=r(r=0)),e);var yi=(r,e)=>{for(var t in e)op(r,t,{get:e[t],enumerable:!0})};function Ue(r){if(!r||typeof r!="object")return r;if(Array.isArray(r))return r.map(n=>Ue(n));let e=r,t={};for(let[n,o]of Object.entries(e))if(!ip.has(n)){if(n==="properties"&&o&&typeof o=="object"&&!Array.isArray(o)){t[n]=Object.fromEntries(Object.entries(o).map(([s,i])=>[s,Ue(i)]));continue}if(n==="items"&&o&&typeof o=="object"){t[n]=Array.isArray(o)?o.map(s=>Ue(s)):Ue(o);continue}if((n==="anyOf"||n==="oneOf"||n==="allOf")&&Array.isArray(o)){t[n]=o.map(s=>Ue(s));continue}if(o&&typeof o=="object"&&!Array.isArray(o)){t[n]=Ue(o);continue}if(Array.isArray(o)){t[n]=o.map(s=>Ue(s));continue}t[n]=o}return t}var ip,Qo=Q(()=>{"use strict";ip=new Set(["patternProperties","additionalProperties","$schema","$id","$ref","$defs","definitions","examples","minLength","maxLength","minimum","maximum","multipleOf","pattern","format","minItems","maxItems","uniqueItems","minProperties","maxProperties","const"])});function Zo(r,e,t,n){return{role:"assistant",content:e||null,tool_calls:r,...t&&t.length>0?{thinkingBlocks:t}:{},...n?{reasoning_content:n}:{}}}function Ut(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 bi=Q(()=>{"use strict";Qo()});function ct(r,e){if(!r)return!1;let t=r.toLowerCase();return e.some(n=>n instanceof RegExp?n.test(t):t.includes(n))}function vp(r){return ct(r,lt.format)}function ki(r){return ct(r,lt.rateLimit)}function xp(r){return ct(r,lt.timeout)}function Sp(r){return ap.test(r)}function er(r){let e=r.toLowerCase();return e?r.length>dp?cp.test(e):ct(e,lt.billing)?!0:lp.test(r)?e.includes("upgrade")||e.includes("credits")||e.includes("payment")||e.includes("plan"):!1:!1}function Ti(r){return ct(r,lt.authPermanent)}function Rp(r){return ct(r,lt.auth)}function wi(r){return ct(r,lt.overloaded)}function at(r,e){return e.some(t=>r.includes(t))}function _p(r){return at(r,mp)||at(r,gp)&&r.includes("limit")||r.includes("billing hard limit")||r.includes("hard limit reached")||r.includes("maximum allowed")&&r.includes("limit")}function Cp(r){let e=at(r,fp),t=r.includes("spend limit")||r.includes("spending limit"),n=at(r,bp);return at(r,hp)&&at(r,yp)||e&&(r.includes("usage limit")||t)||e&&r.includes("limit")&&r.includes("reset")||n&&r.includes("limit")&&(t||at(r,kp))}function Ap(r){return r.trim().toLowerCase().replace(wp,"").trim()}function vi(r){let e=Ap(r);return!e||_p(e)?"billing":ki(e)||Cp(e)?"rate_limit":"billing"}function Ip(r){return Tp.test(r)?vi(r):null}function xi(r){let e=r.match(up);if(!e)return null;let t=Number(e[1]);return Number.isFinite(t)?{code:t,rest:(e[2]??"").trim()}:null}function Mp(r){if(!r)return!1;let e=r.toLowerCase();return e.includes('"type":"api_error"')&&e.includes("internal server error")}function Pp(r){let e=r.trim();if(!e)return!1;let t=xi(e);return t?pp.has(t.code):!1}function Si(r,e){return typeof r!="number"||!Number.isFinite(r)?null:r===402?e?vi(e):"billing":r===429?"rate_limit":r===401||r===403?e&&Ti(e)?"auth_permanent":"auth":r===408?"timeout":r===503?e&&wi(e)?"overloaded":"timeout":r===502||r===504?"timeout":r===529?"overloaded":r===400?e&&er(e)?"billing":"format":null}function Ep(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 Op(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 Ri(r){if(Op(r))return"session_expired";if(Ep(r))return"model_not_found";let e=Ip(r);return e||(Sp(r)?er(r)?"billing":"rate_limit":ki(r)?"rate_limit":wi(r)?"overloaded":Pp(r)?xi(r.trim())?.code===529?"overloaded":"timeout":Mp(r)?"timeout":vp(r)?"format":er(r)?"billing":xp(r)?"timeout":Ti(r)?"auth_permanent":Rp(r)?"auth":null)}var ap,lt,lp,cp,dp,up,pp,mp,gp,fp,hp,yp,bp,kp,Tp,wp,_i=Q(()=>{"use strict";ap=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,lt={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]},lp=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,cp=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,dp=512,up=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i,pp=new Set([500,502,503,504,521,522,523,524,529]),mp=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],gp=["upgrade your plan","upgrade plan","current plan","subscription"],fp=["daily","weekly","monthly"],hp=["try again","retry","temporary","cooldown"],yp=["usage limit","rate limit","organization usage"],bp=["organization","workspace"],kp=["billing period","exceeded","reached","exhausted"],Tp=/["']?(?: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,wp=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i});function vt(r,e){let t=Si(r,e)??(e?Ri(e):null);return t?Dp[t]:typeof r=="number"&&r>=400&&r<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function tr(r){return $p.has(r)}var Dp,$p,Ci=Q(()=>{"use strict";_i();Dp={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"},$p=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"])});function Wt(r){return typeof r.compressAsync=="function"}function Lp(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(`}
3
3
  `),t.lastIndexOf(`]
4
4
  `));if(s>e*.5)return t.slice(0,s+1)+`
5
5
  [...truncated: ${r.length-s-1} chars omitted]`}let o=t.lastIndexOf(`
6
6
  `);return o>e*.7?t.slice(0,o)+`
7
7
  [...truncated: ${r.length-o} chars omitted]`:t+`
8
- [...truncated: ${r.length-e} chars omitted]`}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"}}}}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"}},async compressAsync(e,t){let n=e,o=0,s=[],i=0,a=!1,c=!1;for(let d of r){let l=Ot(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 ri(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(`
9
- `)}function Tn(r={}){let e={...si,...r},t=Math.floor(e.modelContextWindow*e.targetUsageRatio);return Math.max(e.minBudget,Math.min(t,e.maxBudget))}function Lt(r,e){let t=r/e;return t<=.8?"none":t<=1?"trim-only":t<=1.5?"sliding-window":"llm-summarize"}function Vu(r){let e=[],t=[];for(let n of r)n.role==="system"?e.push(n):t.push(n);return{system:e,nonSystem:t}}function No(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 Ku(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 Uo(r,e,t){let n=t.estimateTokens??(p=>Math.ceil(p.length/4)),o=Ku(e);if(o.length===0)return r;let s=r.map(p=>typeof p.content=="string"?p.content:"").join(`
10
- `),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}]
8
+ [...truncated: ${r.length-e} chars omitted]`}function nr(...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 or(...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=Wt(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 Ii(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(`
9
+ `)}function On(r={}){let e={...Mi,...r},t=Math.floor(e.modelContextWindow*e.targetUsageRatio);return Math.max(e.minBudget,Math.min(t,e.maxBudget))}function Gt(r,e){let t=r/e;return t<=.8?"none":t<=1?"trim-only":t<=1.5?"sliding-window":"llm-summarize"}function Up(r){let e=[],t=[];for(let n of r)n.role==="system"?e.push(n):t.push(n);return{system:e,nonSystem:t}}function rr(r){let e=typeof r.content=="string"?r.content:r.content!=null?JSON.stringify(r.content):"";return Math.ceil(e.length/4)}function En(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 jp(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 sr(r,e,t){let n=t.estimateTokens??(u=>Math.ceil(u.length/4)),o=jp(e);if(o.length===0)return r;let s=r.map(u=>typeof u.content=="string"?u.content:"").join(`
10
+ `),i=o.filter(u=>!s.includes(u));if(i.length===0)return r;let a=t.maxTokenBudget,c=[],d=0;for(let u of i){if(d>=t.maxFiles||a<=0)break;let m=await t.readFile(u);if(!m)continue;let g=n(m);g>a||(a-=g,d++,c.push({role:"system",content:`[Post-compact file recovery: ${u}]
11
11
 
12
- ${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 jo(r,e,t=No){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 oi,ft,nt,Pt,It,si,Mt,Et,qu,Ve,Fo=J(()=>{"use strict";oi=4,ft=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>=oi)break;if(s-p<0&&c<oi){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"}}},nt=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:zu(s.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};Pt=class{config;constructor(e){this.config={protectedHeadExchanges:e.protectedHeadExchanges,protectedTailMessages:e.protectedTailMessages,summarize:e.summarize,estimateTokens:e.estimateTokens??No,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}=Vu(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=ri(p,{taskContext:this.config.taskContext}),f=await this.config.summarize(p,g),b={role:"system",content:`[Conversation summary \u2014 ${p.length} messages compressed]
12
+ ${m}`}))}if(c.length===0)return r;let l=[...r],p=-1;for(let u=0;u<l.length;u++)l[u].role==="system"&&(p=u);return l.splice(p+1,0,...c),l}function ir(r,e,t=rr){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 Ai,xt,dt,Nt,jt,Mi,Ft,Bt,Np,tt,ar=Q(()=>{"use strict";Ai=4,xt=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 p=o[l];if(p===i)continue;let u=this.estimateTokens(p);if(s-u<0&&c>=Ai)break;if(s-u<0&&c<Ai){a.unshift(p),c++;continue}s-=u,a.unshift(p),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"}}},dt=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:Lp(s.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};Nt=class{config;constructor(e){this.config={protectedHeadExchanges:e.protectedHeadExchanges,protectedTailMessages:e.protectedTailMessages,summarize:e.summarize,estimateTokens:e.estimateTokens??rr,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}=Up(e),i=e.reduce((R,b)=>R+this.config.estimateTokens(b),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 p=s.slice(0,a),u=s.slice(a,l),m=s.slice(l),g=Ii(u,{taskContext:this.config.taskContext}),f=await this.config.summarize(u,g),y={role:"system",content:`[Conversation summary \u2014 ${u.length} messages compressed]
13
13
 
14
- ${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=Ot(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}}}},si={modelContextWindow:128e3,targetUsageRatio:.75,minBudget:16e3,maxBudget:12e4};Mt=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}},Et=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}))}};qu=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"]),Ve=class{constructor(e=20,t=No){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||!qu.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 Bo(){return{stages:[]}}function Go(r,e,t){let n=t?.thresholdMessages??40;if(r.filter(a=>a.role!=="system").length<=n)return{messages:r,stagedCount:0};let s=ii(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=ii(r,e),{messages:s,stagedCount:i.length}}function Wo(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:ai(r,e),committed:t}}function ii(r,e){return e.stages.filter(n=>n.committed).length===0?r:ai(r,e)}function ai(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 li=J(()=>{"use strict"});function Yu(r){return!(!r.ok||r.existingSkillName||!r.multiStep||r.toolCallCount<3||r.distinctToolCount<2)}function Xu(r){return r.existingSkillName?r.feedback==="negative":!1}function wn(r,e){return Xu(r)?{type:"skill.improve",skillName:r.existingSkillName,reason:"negative user feedback on existing skill execution"}:Yu(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 ci=J(()=>{"use strict"});function di(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 Qu(r){return r==="enabled-eligible"||r==="installed-awaiting-approval"}function Zu(r){return new Map((r??[]).map(e=>[e.toolName,e]))}function ep(r){if(!r.eligibility?.length)return[...r.tools];let e=Zu(r.eligibility);return r.tools.filter(t=>{let n=di(t);if(!n)return!1;let o=e.get(n);return!o||Qu(o.status)})}function tp(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 Ho(r){let e=tp({toolChoice:r.toolChoice,thinkingEnabled:r.thinkingEnabled,compatibility:r.compatibility}),t=e.normalizedToolChoice,n=[...e.warnings],o=ep({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=>di(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 ui=J(()=>{"use strict"});function pi(r){return r==null?[]:typeof r=="string"?r.length>0?[{type:"text",text:r}]:[]:Array.isArray(r)?r:[{type:"text",text:String(r)}]}function rp(r,e){return{...r,content:[...pi(r.content),...pi(e.content)]}}function sp(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 ip(r){return new Set((r??np).map(e=>e.trim().toLowerCase()))}function ap(r,e){return r?ip(e).has(r.trim().toLowerCase()):!1}function zo(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=>sp(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]=rp(c,a);continue}i.push(a)}return i}function Vo(r,e){return ap(e?.stopReason,e?.forcedStopReasons)?r.map(t=>{if(t.role!=="assistant")return{...t};let n={...t};for(let o of op)delete n[o];return n}):[...r]}function qo(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 Ko(r,e){let t=zo(r),n=Vo(t,e);return qo(n,e)}var np,op,Jo=J(()=>{"use strict";np=["stop","aborted","timeout","cancelled","interrupted","error"],op=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"]});function lp(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 cp(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 dp(r){return{round:r.round??0,maxRounds:r.maxRounds,pendingToolCallIds:[...r.pendingToolCallIds??[]],completedToolCallIds:[...r.completedToolCallIds??[]],lastStopReason:r.lastStopReason,replayMessages:[...r.replayMessages??[]]}}function Yo(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 vn(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 xn(r){let e=[],t=zo(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=Vo(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=qo(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:dp({maxRounds:r.maxRounds,round:r.round,lastStopReason:r.lastStopReason,replayMessages:o,pendingToolCallIds:lp(o),completedToolCallIds:cp(o)}),recoveryActions:e}}var mi=J(()=>{"use strict";Jo()});function Xo(r){return r?up.has(r):!0}function Qo(r){return r===429||r===529}function Sn(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 Zo(){let r=process.env.QLOGICAGENT_PERSISTENT_RETRY;return r==="1"||r==="true"}var up,nw,Dt,gi=J(()=>{"use strict";up=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);nw={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};Dt=class extends Error{constructor(t,n){super(`Model fallback triggered: ${t} -> ${n}`);this.originalModel=t;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel}});function er(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 tr=J(()=>{"use strict"});function _n(r){return bp.find(e=>e.name===r)}var pp,mp,gp,fp,hp,yp,bp,nr=J(()=>{"use strict";pp={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},mp={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},gp={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},fp={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolAccessMode:"full",canFork:!0},hp={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},yp={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},bp=[pp,mp,gp,fp,hp,yp]});var fi=J(()=>{"use strict"});function or(r){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:r.maxOutputTokens,consecutiveTruncations:0,aborted:r.abortSignal?.aborted??!1}}function rr(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 sr(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 ir(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 ar(r,e){return r.aborted?!0:e.abortSignal?.aborted?(r.aborted=!0,!0):!1}var hi=J(()=>{"use strict"});function lr(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function ht(r,e=kp){return!(r.attemptedThisTurn||r.consecutiveFailures>=e.maxConsecutiveFailures)}var kp,yi=J(()=>{"use strict";kp={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50}});var $t=J(()=>{"use strict";qs();ni();Fo();Fo();li();ci();ui();Jo();mi();gi();tr();nr();fi();hi();yi()});function cr(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 dr=J(()=>{"use strict"});var bi,ki,Ti,wi,vi,xi,Si,_i,Ri,Ci,Nt,ur,Ai,Pi,Ii,pr,Rn=J(()=>{"use strict";bi=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),ki=3,Ti=128e3,wi=13e3,vi=16384,xi=65536,Si=3,_i=65536,Ri=3e4,Ci=3,Nt=10,ur=500,Ai=3,Pi=5e4,Ii=2e5,pr=2e3});import{mkdir as wp,writeFile as vp}from"fs/promises";import{join as Mi}from"path";import{tmpdir as xp}from"os";function Oi(){return{seenIds:new Set,replacements:new Map}}function Li(r){return Mi(xp(),"qlogicagent-sessions",r,Sp)}async function Rp(r){try{await wp(Li(r),{recursive:!0})}catch{}}function Cp(r,e){let t=e.replace(/[^a-zA-Z0-9_-]/g,"_");return Mi(Li(r),`${t}.txt`)}function Ap(r,e){if(r.length<=e)return{preview:r,hasMore:!1};let n=r.slice(0,e).lastIndexOf(`
15
- `),o=n>e*.5?n:e;return{preview:r.slice(0,o),hasMore:!0}}function Di(r){return r.includes(Ei)}async function $i(r,e,t){await Rp(t);let n=Cp(t,e);try{await vp(n,r,{encoding:"utf-8",flag:"wx"})}catch(i){if(i.code!=="EEXIST")return null}let{preview:o,hasMore:s}=Ap(r,pr);return{filepath:n,originalSize:r.length,preview:o,hasMore:s}}function Ni(r){let e=`${Ei}
14
+ ${f}`},k=[...o,...p,y,...m],w=Date.now()-n,C=k.reduce((R,b)=>R+this.config.estimateTokens(b),0);return{messages:k,droppedCount:u.length,strategy:"head-tail-protected",metrics:{tokensBefore:i,tokensAfter:C,compressionRatio:i>0?C/i:1,latencyMs:w,usedLlm:!0,cacheInvalidated:!0}}}},jt=class{config;constructor(e){this.config=e}compress(e,t){let n=En(e),o=this.config.inner.compress(e,t),s=En(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=En(e),o=Wt(this.config.inner)?await this.config.inner.compressAsync(e,t):this.config.inner.compress(e,t),s=En(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}}}},Mi={modelContextWindow:128e3,targetUsageRatio:.75,minBudget:16e3,maxBudget:12e4};Ft=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}},Bt=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}))}};Np=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"]),tt=class{constructor(e=20,t=rr){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||!Np.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 lr(){return{stages:[]}}function cr(r,e,t){let n=t?.thresholdMessages??40;if(r.filter(a=>a.role!=="system").length<=n)return{messages:r,stagedCount:0};let s=Pi(r,e),i=Fp(s,e,n);if(i.length===0)return{messages:s,stagedCount:0};for(let a of i)e.stages.push(a);return s=Pi(r,e),{messages:s,stagedCount:i.length}}function dr(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:Ei(r,e),committed:t}}function Pi(r,e){return e.stages.filter(n=>n.committed).length===0?r:Ei(r,e)}function Ei(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 Fp(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 p=`${i}-${i+a}`;s.has(p)||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 Oi=Q(()=>{"use strict"});function Bp(r){return!(!r.ok||r.existingSkillName||!r.multiStep||r.toolCallCount<3||r.distinctToolCount<2)}function Wp(r){return r.existingSkillName?r.feedback==="negative":!1}function Dn(r,e){return Wp(r)?{type:"skill.improve",skillName:r.existingSkillName,reason:"negative user feedback on existing skill execution"}:Bp(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 Di=Q(()=>{"use strict"});function $i(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 Gp(r){return r==="enabled-eligible"||r==="installed-awaiting-approval"}function Hp(r){return new Map((r??[]).map(e=>[e.toolName,e]))}function zp(r){if(!r.eligibility?.length)return[...r.tools];let e=Hp(r.eligibility);return r.tools.filter(t=>{let n=$i(t);if(!n)return!1;let o=e.get(n);return!o||Gp(o.status)})}function Vp(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 ur(r){let e=Vp({toolChoice:r.toolChoice,thinkingEnabled:r.thinkingEnabled,compatibility:r.compatibility}),t=e.normalizedToolChoice,n=[...e.warnings],o=zp({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=>$i(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=Q(()=>{"use strict"});function Ui(r){return r==null?[]:typeof r=="string"?r.length>0?[{type:"text",text:r}]:[]:Array.isArray(r)?r:[{type:"text",text:String(r)}]}function Jp(r,e){return{...r,content:[...Ui(r.content),...Ui(e.content)]}}function Yp(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 Xp(r){return new Set((r??qp).map(e=>e.trim().toLowerCase()))}function Qp(r,e){return r?Xp(e).has(r.trim().toLowerCase()):!1}function pr(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=>Yp(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]=Jp(c,a);continue}i.push(a)}return i}function mr(r,e){return Qp(e?.stopReason,e?.forcedStopReasons)?r.map(t=>{if(t.role!=="assistant")return{...t};let n={...t};for(let o of Kp)delete n[o];return n}):[...r]}function gr(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 fr(r,e){let t=pr(r),n=mr(t,e);return gr(n,e)}var qp,Kp,hr=Q(()=>{"use strict";qp=["stop","aborted","timeout","cancelled","interrupted","error"],Kp=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"]});function Zp(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 em(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 tm(r){return{round:r.round??0,maxRounds:r.maxRounds,pendingToolCallIds:[...r.pendingToolCallIds??[]],completedToolCallIds:[...r.completedToolCallIds??[]],lastStopReason:r.lastStopReason,replayMessages:[...r.replayMessages??[]]}}function yr(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 $n(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 Ln(r){let e=[],t=pr(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=mr(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=gr(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:tm({maxRounds:r.maxRounds,round:r.round,lastStopReason:r.lastStopReason,replayMessages:o,pendingToolCallIds:Zp(o),completedToolCallIds:em(o)}),recoveryActions:e}}var Ni=Q(()=>{"use strict";hr()});function br(r){return r?nm.has(r):!0}function kr(r){return r===429||r===529}function Un(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 Tr(){let r=process.env.QLOGICAGENT_PERSISTENT_RETRY;return r==="1"||r==="true"}var nm,Nv,Ht,ji=Q(()=>{"use strict";nm=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);Nv={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};Ht=class extends Error{constructor(t,n){super(`Model fallback triggered: ${t} -> ${n}`);this.originalModel=t;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel}});function wr(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 vr=Q(()=>{"use strict"});function Nn(r){return cm.find(e=>e.name===r)}var om,rm,sm,im,am,lm,cm,xr=Q(()=>{"use strict";om={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},rm={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},sm={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},im={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolAccessMode:"full",canFork:!0},am={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},lm={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},cm=[om,rm,sm,im,am,lm]});var Fi=Q(()=>{"use strict"});function Sr(r){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:r.maxOutputTokens,consecutiveTruncations:0,aborted:r.abortSignal?.aborted??!1}}function Rr(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 _r(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 Cr(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 Ar(r,e){return r.aborted?!0:e.abortSignal?.aborted?(r.aborted=!0,!0):!1}var Bi=Q(()=>{"use strict"});function Ir(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function St(r,e=dm){return!(r.attemptedThisTurn||r.consecutiveFailures>=e.maxConsecutiveFailures)}var dm,Wi=Q(()=>{"use strict";dm={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50}});var zt=Q(()=>{"use strict";bi();Ci();ar();ar();Oi();Di();Li();hr();Ni();ji();vr();xr();Fi();Bi();Wi()});function Mr(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 Pr=Q(()=>{"use strict"});var Gi,Hi,zi,Vi,qi,Ki,Ji,Yi,Xi,Qi,Vt,Er,Zi,ea,ta,Or,jn=Q(()=>{"use strict";Gi=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),Hi=3,zi=128e3,Vi=13e3,qi=16384,Ki=65536,Ji=3,Yi=65536,Xi=3e4,Qi=3,Vt=10,Er=500,Zi=3,ea=5e4,ta=2e5,Or=2e3});import{mkdir as pm,writeFile as mm}from"fs/promises";import{join as na}from"path";import{tmpdir as gm}from"os";function ra(){return{seenIds:new Set,replacements:new Map}}function sa(r){return na(gm(),"qlogicagent-sessions",r,fm)}async function ym(r){try{await pm(sa(r),{recursive:!0})}catch{}}function bm(r,e){let t=e.replace(/[^a-zA-Z0-9_-]/g,"_");return na(sa(r),`${t}.txt`)}function km(r,e){if(r.length<=e)return{preview:r,hasMore:!1};let n=r.slice(0,e).lastIndexOf(`
15
+ `),o=n>e*.5?n:e;return{preview:r.slice(0,o),hasMore:!0}}function ia(r){return r.includes(oa)}async function aa(r,e,t){await ym(t);let n=bm(t,e);try{await mm(n,r,{encoding:"utf-8",flag:"wx"})}catch(i){if(i.code!=="EEXIST")return null}let{preview:o,hasMore:s}=km(r,Or);return{filepath:n,originalSize:r.length,preview:o,hasMore:s}}function la(r){let e=`${oa}
16
16
  `;return e+=`Output too large (${r.originalSize} chars). Full output saved to: ${r.filepath}
17
17
 
18
- `,e+=`Preview (first ${pr} bytes):
18
+ `,e+=`Preview (first ${Or} bytes):
19
19
  `,e+=r.preview,e+=r.hasMore?`
20
20
  ...
21
21
  `:`
22
- `,e+=_p,e}async function Ui(r,e,t,n=Pi){if(r.length<=n||Di(r))return r;let o=await $i(r,e,t);return o?Ni(o):r.slice(0,n)+`
23
- ...[truncated ${r.length-n} chars]`}function Pp(r){let e=[],t=[];for(let n of r)n.role==="tool"&&typeof n.content=="string"&&n.tool_call_id?Di(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 Ip(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 ji(r,e,t,n=Ii){let o=Pp(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}=Ip(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?Mp(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 $i(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=Ni(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 Sp,Ei,_p,mr=J(()=>{"use strict";Rn();Sp="tool-results",Ei="<persisted-output>",_p="</persisted-output>"});function Lp(r){try{return JSON.parse(r)}catch{return}}var Ep,Op,Cn,Fi=J(()=>{"use strict";$t();mr();Ep=new Set(["read_file","file_read","FileRead","grep","Grep","glob","Glob","search","list_dir","find_files","web_fetch","web_search","WebFetch","WebSearch"]),Op=new Set(["bash","execute_command","Bash","shell"]),Cn=class{tools=[];hasErrored=!1;erroredToolDescription="";discarded=!1;siblingAbortController;progressResolve;config;concurrencySafe;constructor(e){this.config=e,this.concurrencySafe=e.concurrencySafeTools??Ep,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:At(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:Lp(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:At(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 Ui(b,e.id,a));let w=At(e.id,{ok:f,payload:b,error:m.error,toolReferences:m.toolReferences});f||(u=!0,Op.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 Dp}from"node:fs/promises";function ot(r){let e=typeof r.content=="string"?r.content:r.content!=null?JSON.stringify(r.content):"";return Math.ceil(e.length/4)}function rt(r){let e=0;for(let t of r)e+=ot(t);return e}function Wi(r){if(!r)return 128e3;if(r in gr)return gr[r];let e=r.toLowerCase();for(let[t,n]of Object.entries(gr))if(e.startsWith(t.toLowerCase()))return n;return 128e3}function Np(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"),fr(t);try{let i="",a=e?.model??$p;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"),fr(t))}catch(i){return r.warn({err:i.message},"[context-compression] summarize call error \u2014 using fallback"),fr(t)}}}function fr(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):
22
+ `,e+=hm,e}async function ca(r,e,t,n=ea){if(r.length<=n||ia(r))return r;let o=await aa(r,e,t);return o?la(o):r.slice(0,n)+`
23
+ ...[truncated ${r.length-n} chars]`}function Tm(r){let e=[],t=[];for(let n of r)n.role==="tool"&&typeof n.content=="string"&&n.tool_call_id?ia(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 wm(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 vm(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 da(r,e,t,n=ta){let o=Tm(r);if(o.length===0)return{messages:r,newlyReplacedCount:0};let s=new Map,i=[];for(let l of o){let{mustReapply:p,frozen:u,fresh:m}=wm(l,e);for(let w of p)s.set(w.toolCallId,w.replacement);if(m.length===0){for(let w of l)e.seenIds.add(w.toolCallId);continue}let g=u.reduce((w,C)=>w+C.size,0),f=m.reduce((w,C)=>w+C.size,0),y=g+f>n?vm(m,g,n):[],k=new Set(y.map(w=>w.toolCallId));for(let w of l)k.has(w.toolCallId)||e.seenIds.add(w.toolCallId);y.length>0&&i.push(...y)}if(s.size===0&&i.length===0)return{messages:r,newlyReplacedCount:0};let a=await Promise.all(i.map(async l=>{let p=await aa(l.content,l.toolCallId,t);return{candidate:l,result:p}})),c=0;for(let{candidate:l,result:p}of a){if(e.seenIds.add(l.toolCallId),!p)continue;let u=la(p);s.set(l.toolCallId,u),e.replacements.set(l.toolCallId,u),c++}return s.size===0?{messages:r,newlyReplacedCount:0}:{messages:r.map(l=>{if(l.role!=="tool"||!l.tool_call_id)return l;let p=s.get(l.tool_call_id);return p===void 0?l:{...l,content:p}}),newlyReplacedCount:c}}var fm,oa,hm,Dr=Q(()=>{"use strict";jn();fm="tool-results",oa="<persisted-output>",hm="</persisted-output>"});function Rm(r){try{return JSON.parse(r)}catch{return}}var xm,Sm,Fn,ua=Q(()=>{"use strict";zt();Dr();xm=new Set(["read_file","file_read","FileRead","grep","Grep","glob","Glob","search","list_dir","find_files","web_fetch","web_search","WebFetch","WebSearch"]),Sm=new Set(["bash","execute_command","Bash","shell"]),Fn=class{tools=[];hasErrored=!1;erroredToolDescription="";discarded=!1;siblingAbortController;progressResolve;config;concurrencySafe;constructor(e){this.config=e,this.concurrencySafe=e.concurrencySafeTools??xm,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:Ut(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,p=!1,u=e.toolCall.function.arguments;if(i)try{let w=await i.invoke("tool.before_invoke",{sessionId:a,turnId:c,callId:e.id,toolName:l,arguments:Rm(u)});if(w.action==="abort"){let C=w.reason??"blocked by policy";d.info(`tool ${l} blocked: ${C}`),e.results.push({callId:e.id,toolName:l,ok:!1,error:C,blocked:!0,blockReason:C,message:Ut(e.id,{ok:!1,error:C})}),e.status="completed";return}w.action==="continue"&&w.context?.arguments&&(u=JSON.stringify(w.context.arguments))}catch{}let m=await s.invoke(c,l,u,this.siblingAbortController.signal),g=this.getAbortReason();if(g&&!p){e.results.push(this.createSyntheticError(e,g)),e.status="completed";return}let f=!m.error,y=m.result;f&&y&&y.length>5e4&&(y=await ca(y,e.id,a));let k=Ut(e.id,{ok:f,payload:y,error:m.error,toolReferences:m.toolReferences});f||(p=!0,Sm.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:k}),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 _m}from"node:fs/promises";function ut(r){let e=typeof r.content=="string"?r.content:r.content!=null?JSON.stringify(r.content):"";return Math.ceil(e.length/4)}function pt(r){let e=0;for(let t of r)e+=ut(t);return e}function ga(r){if(!r)return 128e3;if(r in $r)return $r[r];let e=r.toLowerCase();for(let[t,n]of Object.entries($r))if(e.startsWith(t.toLowerCase()))return n;return 128e3}function Am(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"),Lr(t);try{let i="",a=e?.model??Cm;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"),Lr(t))}catch(i){return r.warn({err:i.message},"[context-compression] summarize call error \u2014 using fallback"),Lr(t)}}}function Lr(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):
24
24
  ${t.join(`
25
- `)}`}function Up(){return Do(new nt(hr),new Ve(20,ot),new ft(ot))}function Gi(r,e){let t=$o(new nt(hr),new Ve(20,ot),new Pt({protectedHeadExchanges:1,protectedTailMessages:8,summarize:r,estimateTokens:ot}),new ft(ot));return new It({inner:t,estimateTokens:ot,onCacheInvalidated:e?.onCacheInvalidated})}function zi(r,e){let t=e?.budget??Tn({modelContextWindow:Wi(e?.model)}),o=(e?.pipeline??Up()).compress(r,t);if(o.droppedCount>0){let s=rt(r),i=rt(o.messages);Hi.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:Lt(s,t)})}return o.droppedCount>0&&yr?.(o.droppedCount,rt(o.messages)),o}async function jp(r,e,t){let n=t??Tn({modelContextWindow:Wi(e.model)}),o=rt(r),s=Lt(o,n),i;switch(s){case"none":i={messages:r,droppedCount:0,strategy:"none"};break;case"trim-only":i=new nt(hr).compress(r,n);break;case"sliding-window":{i=await Gi(e.summarize).compressAsync(r,n);break}case"llm-summarize":{let a=e.pipeline??Gi(e.summarize);i=Ot(a)?await a.compressAsync(r,n):a.compress(r,n);break}}return i.droppedCount>0&&(i={...i,messages:await Uo(i.messages,r,{maxFiles:5,maxTokenBudget:5e4,readFile:async a=>{try{return await Dp(a,"utf-8")}catch{return null}}})}),Fp(r,i,n),i}function Fp(r,e,t){if(e.droppedCount>0||e.metrics?.usedLlm){let n=e.metrics?.tokensBefore||rt(r),o=e.metrics?.tokensAfter||rt(e.messages);Hi.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:Lt(n,t)})}if(e.droppedCount>0){let n=e.metrics?.tokensAfter||rt(e.messages);yr?.(e.droppedCount,n)}}function Bp(r,e){let t=Np(r,e),n={id:"builtin-compressor",label:"4-Layer Compression Funnel (built-in)",async compressAsync(o,s,i){return jp(o,{budget:s,model:i?.model,sessionId:i?.sessionId,summarize:t},s)}};Bi.register(n),Bi.activate(n.id),r.info(`[context-compression] registered context engine: ${n.id}`)}function Vi(r,e,t){Bp(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"}}}),yr=(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 gr,hr,$p,Hi,Bi,yr,br=J(()=>{"use strict";$t();gr={"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};hr=8e3,$p="deepseek-v4-flash",Hi=new Mt(200),Bi=new Et;yr=null});function qi(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 Ki=J(()=>{"use strict"});var Ji={};Vs(Ji,{resolveToolEligibility:()=>Vp});function Wp(r,e){if(Gp.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 Hp(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||Wp(t,e.dangerousPatterns)?(o.push("dangerous_tool"),{level:3,reasons:o}):{level:2,reasons:o}}function zp(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 Vp(r,e={}){let t=new Map,n=[],o=[],s=[];for(let i of r){let a=i.function.name,{level:c,reasons:d}=Hp(i,e),l=zp(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 Gp,Yi=J(()=>{"use strict";Gp=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:write_file|delete_file|move_file|create_directory)$/i,/^(?:git_push|git_reset|git_force)$/i]});function Yp(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 Xp(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 Qp(r){return typeof r=="number"&&Number.isFinite(r)&&r>=1?Math.min(Math.round(r),100):bi}function Xi(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 Zp(r){return r==="length"||r==="max_tokens"}function Qi(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 em(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 tm(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 nm(r){return r.filter(e=>e.role!=="assistant"?!0:!(typeof e.content=="string"&&e.content.trim()===""))}async function*Zi(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(()=>(Yi(),Ji)),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*om(o,c,i,d,l,p,e,n);return}let _=Qp(r.maxRounds),R={contextWindowTokens:r.contextWindowTokens??Ti,responseBufferTokens:wi,maxOutputTokens:r.maxOutputTokens??vi,abortSignal:p,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},y=new Set,M=0,O=T,$,v={messages:[...i],maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:1,transition:void 0,guardState:or(R),reactiveCompactState:lr(),toolLoopState:xn({maxRounds:_,replayMessages:[...i]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{prompt:0,completion:0},collapseStore:Bo(),currentModel:c,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:void 0,lastResponseId:void 0,snipRemovedIds:new Set,contentReplacementState:Oi(),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||Ut(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:$e}=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(ar(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=rr(B,R);if(h.level==="blocking"){h.reason==="prompt_too_long"&&ht(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 ji(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=jo(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 I=new Ve().compress(k,0);I.droppedCount>0&&(k=I.messages,n.info(`microcompact: cleared ${I.droppedCount} old tool results`))}if(k=Go(k,$e).messages,B.promptTokens>0){let S=zi(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=nm(k);let x=Ho({tools:O,toolChoice:r.toolChoice??"auto"}),C=xn({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,Qe=[],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,cr(G,S);break;case"reasoning_delta":Qe.push(S.text);break;case"reasoning_block_complete":S.signature&&X.push({thinking:Qe.join(""),signature:S.signature}),Qe.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 I of r.postSamplingHooks)try{I({messages:[...k],model:S,sessionId:s})}catch{}}}catch(S){if(S instanceof Dt&&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 I=S instanceof Error?S.message:String(S),D=typeof S?.status=="number"?S.status:void 0;if(!D&&I&&(I.includes("ECONNRESET")||I.includes("EPIPE"))){let Q=(v.consecutiveApiRetries??0)+1;if(Q>Nt){n.info(`stale connection retry limit reached (${Nt}), aborting`),yield{type:"error",turnId:o,error:I,code:"RETRIES_EXHAUSTED",usage:v.totalUsage};return}n.info(`stale connection (${I.includes("ECONNRESET")?"ECONNRESET":"EPIPE"}): retrying`),yield{type:"recovery",turnId:o,action:"stale_connection_retry",detail:I.slice(0,80)},v={...v,consecutiveApiRetries:Q,transition:void 0};continue}let H=tm({status:D,message:I});if(H!==null){n.info(`max_tokens overflow: adjusting to ${H}`),B.currentMaxOutputTokens=H,v={...v,maxOutputTokensOverride:H,transition:void 0};continue}if(Qo(D)){if(v.consecutive529Errors++,v.consecutive529Errors>=Ci&&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(Zo()){let Q=Sn(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,Ri);await new Promise(Io=>setTimeout(Io,de)),q-=de}v={...v,transition:void 0};continue}if(Xo(f)){let q=em({status:D,message:I})??Sn(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:I}}if(E&&u?.invoke("turn.after_inference",{...m,model:v.currentModel,response:{error:E.message}}).catch(()=>{}),E)if(Xi(E))se=!0,n.info(`withheld prompt_too_long error (status=${E.status})`);else if(Qi(E))se=!0,n.info(`withheld media_size error (status=${E.status})`);else{let S=sr({status:E.status??500,message:E.message},B,R);if(S.action==="reactive_compact"&&ht(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>Nt){n.info(`API retry limit reached (${Nt}), aborting`);let H=gt(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 I=gt(E.status,E.message);u?.invoke("stop.failure",{sessionId:s,reason:I,error:E.message}).catch(()=>{}),yield{type:"error",turnId:o,error:E.message,code:I,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 Re=[...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(Re.length===0&&!L){if(se&&E&&Xi(E)){if(v.transition?.reason!=="collapse_drain_retry"){let D=Wo(k,$e);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(ht(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&&Qi(E)){if(ht(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(Zp(ce)){B.consecutiveTruncations+=1;let D=r.modelMaxOutputTokens??xi,H=ir(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:_i,transition:{reason:"max_output_tokens_escalate"}};continue}if(oe<Si){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=vn(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>=Ai&&Q<ur&&v.lastBudgetDeltaTokens<ur;if(q&&n.info(`token budget early stop: diminishing returns at ${Math.round(H)}% (delta=${Q})`),!q&&H<90){let de=v.budgetContinuationCount+1,Io={role:"user",content:qi(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 pu={role:"assistant",content:v.finalText,...X.length>0&&{thinkingBlocks:[...X]}};v={...v,messages:[...j,pu,Io],budgetContinuationCount:de,lastBudgetDeltaTokens:Q,lastBudgetGlobalTokens:D,transition:{reason:"token_budget_continuation"}};continue}}if(M>0){let D={ok:!0,toolCallCount:M,distinctToolCount:y.size,multiStep:M>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},H=wn(D,{tools:[...y]});H&&(yield{type:"skill_instruction",turnId:o,instruction:H})}let I=v.finalText||Ut(j,n);yield{type:"end",turnId:o,content:I,usage:v.totalUsage,model:v.currentModel};return}for(let S of Re){let I=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))&&(I=JSON.stringify(Q))}catch{}yield{type:"tool_call",turnId:o,callId:S.id,name:S.function.name,arguments:I}}let du=X.length===0&&Qe.length>0?Qe.join(""):void 0;j.push(Eo(Re,v.finalText||void 0,X.length>0?X:void 0,du)),be=Yo(be,{replayMessages:j,pendingToolCallIds:Re.map(S=>S.id),completedToolCallIds:be.completedToolCallIds,lastStopReason:"tool_calls"});let Hs=[];try{let S=new Cn({toolInvoker:t,hooks:u,sessionId:s,turnId:o,log:n,signal:p,maxConcurrentTools:r?.maxConcurrentTools});for(let I of Re)S.addTool(I);for await(let I of S.getRemainingResults()){I.blocked&&(yield{type:"tool_blocked",turnId:o,callId:I.callId,name:I.toolName,reason:I.blockReason??"blocked"}),j.push(I.message),Hs.push(I.callId),y.add(I.toolName),M++;let D=typeof I.message?.content=="string"?I.message.content:"",H=I.ok&&D?D.slice(0,2e3):void 0;if(yield{type:"tool_result",turnId:o,callId:I.callId,name:I.toolName,ok:I.ok,error:I.error,outputPreview:H},I.ok){let Q=Re.find(q=>q.id===I.callId);if(Q){if(I.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(I.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-${I.callId}`,artifactType:Yp(de),title:de.split(/[\\/]/).pop()||de,filePath:de,language:Xp(de)})}catch{}}}}}catch(S){let I=S instanceof Error?S.message:String(S);yield{type:"error",turnId:o,error:I,code:"TOOL_EXECUTION_ERROR",usage:v.totalUsage};return}if(be=vn(be,{replayMessages:j,completedToolCallIds:[...be.completedToolCallIds,...Hs],lastStopReason:"tool_calls"}),r.generateToolUseSummary&&Re.length>0){let S=Re.map(I=>({name:I.function.name,arguments:I.function.arguments}));$=r.generateToolUseSummary(S).catch(()=>null)}let zs=j.slice(-Re.length),uu=zs.length>0&&zs.every(S=>{let I=S?.content;return typeof I!="string"?!1:I.startsWith("Error: ")}),Ct=v.consecutiveFailedRounds;if(uu){if(Ct+=1,Ct>=ki){let S=v.finalText||Ut(j,n);n.info(`early exit: ${Ct} consecutive failed rounds, returning ${v.finalText?"partial":"fallback"} response`),yield{type:"end",turnId:o,content:S,usage:v.totalUsage,model:v.currentModel};return}}else Ct=0;let Po=V+1;if(g>0&&Po>g){if(n.info(`max turns reached (${g}), completing`),u){let I=await u.invoke("stop",{sessionId:s,reason:"max_turns"});if(I.action==="abort"){let D=I.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||Ut(j,n);yield{type:"end",turnId:o,content:S,usage:v.totalUsage,model:v.currentModel};return}if(Po>_){if(n.info(`tool loop budget exhausted (${_} rounds), returning`),M>0){let I={ok:!0,toolCallCount:M,distinctToolCount:y.size,multiStep:M>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},D=wn(I,{tools:[...y]});D&&(yield{type:"skill_instruction",turnId:o,instruction:D})}let S=v.finalText||Ut(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:Po,transition:{reason:"next_turn"},guardState:B,reactiveCompactState:ye,toolLoopState:be,consecutiveFailedRounds:Ct,finalText:v.finalText,totalUsage:v.totalUsage,collapseStore:$e,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 Ut(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
+ `)}`}function Im(){return nr(new dt(Ur),new tt(20,ut),new xt(ut))}function ma(r,e){let t=or(new dt(Ur),new tt(20,ut),new Nt({protectedHeadExchanges:1,protectedTailMessages:8,summarize:r,estimateTokens:ut}),new xt(ut));return new jt({inner:t,estimateTokens:ut,onCacheInvalidated:e?.onCacheInvalidated})}function ha(r,e){let t=e?.budget??On({modelContextWindow:ga(e?.model)}),o=(e?.pipeline??Im()).compress(r,t);if(o.droppedCount>0){let s=pt(r),i=pt(o.messages);fa.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:Gt(s,t)})}return o.droppedCount>0&&Nr?.(o.droppedCount,pt(o.messages)),o}async function Mm(r,e,t){let n=t??On({modelContextWindow:ga(e.model)}),o=pt(r),s=Gt(o,n),i;switch(s){case"none":i={messages:r,droppedCount:0,strategy:"none"};break;case"trim-only":i=new dt(Ur).compress(r,n);break;case"sliding-window":{i=await ma(e.summarize).compressAsync(r,n);break}case"llm-summarize":{let a=e.pipeline??ma(e.summarize);i=Wt(a)?await a.compressAsync(r,n):a.compress(r,n);break}}return i.droppedCount>0&&(i={...i,messages:await sr(i.messages,r,{maxFiles:5,maxTokenBudget:5e4,readFile:async a=>{try{return await _m(a,"utf-8")}catch{return null}}})}),Pm(r,i,n),i}function Pm(r,e,t){if(e.droppedCount>0||e.metrics?.usedLlm){let n=e.metrics?.tokensBefore||pt(r),o=e.metrics?.tokensAfter||pt(e.messages);fa.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:Gt(n,t)})}if(e.droppedCount>0){let n=e.metrics?.tokensAfter||pt(e.messages);Nr?.(e.droppedCount,n)}}function Em(r,e){let t=Am(r,e),n={id:"builtin-compressor",label:"4-Layer Compression Funnel (built-in)",async compressAsync(o,s,i){return Mm(o,{budget:s,model:i?.model,sessionId:i?.sessionId,summarize:t},s)}};pa.register(n),pa.activate(n.id),r.info(`[context-compression] registered context engine: ${n.id}`)}function ya(r,e,t){Em(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"}}}),Nr=(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 $r,Ur,Cm,fa,pa,Nr,jr=Q(()=>{"use strict";zt();$r={"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};Ur=8e3,Cm="deepseek-v4-flash",fa=new Ft(200),pa=new Bt;Nr=null});function ba(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 ka=Q(()=>{"use strict"});var Ta={};yi(Ta,{resolveToolEligibility:()=>Um});function Dm(r,e){if(Om.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 $m(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||Dm(t,e.dangerousPatterns)?(o.push("dangerous_tool"),{level:3,reasons:o}):{level:2,reasons:o}}function Lm(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 Um(r,e={}){let t=new Map,n=[],o=[],s=[];for(let i of r){let a=i.function.name,{level:c,reasons:d}=$m(i,e),l=Lm(c),p={toolName:a,status:l,permissionLevel:c,approvalRequired:c===4,reasonCodes:d};t.set(a,p),c===5?o.push(p):(n.push(i),c===4&&s.push(p))}return{eligibleTools:n,blockedTools:o,approvalRequiredTools:s,eligibilityByName:t}}var Om,wa=Q(()=>{"use strict";Om=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:write_file|delete_file|move_file|create_directory)$/i,/^(?:git_push|git_reset|git_force)$/i]});function Bm(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 Wm(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 Gm(r){return typeof r=="number"&&Number.isFinite(r)&&r>=1?Math.min(Math.round(r),100):Gi}function va(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 Hm(r){return r==="length"||r==="max_tokens"}function xa(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 zm(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 Vm(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 qm(r){return r.filter(e=>e.role!=="assistant"?!0:!(typeof e.content=="string"&&e.content.trim()===""))}async function*Sa(r,e,t,n){let{turnId:o,sessionId:s,messages:i,tools:a,model:c,apiKey:d,temperature:l=0,hooks:p,signal:u}=r,m={sessionId:s,turnId:o},g=r.maxTurns??0,f=r.querySource,{resolveToolEligibility:y}=await Promise.resolve().then(()=>(wa(),Ta)),k=y(a,r.toolEligibilityContext),w=k.eligibleTools;for(let D of k.blockedTools)yield{type:"tool_blocked",turnId:o,callId:"",name:D.toolName,reason:"blocked-by-policy"};if(!w.length){yield*Km(o,c,i,d,l,u,e,n);return}let C=Gm(r.maxRounds),R={contextWindowTokens:r.contextWindowTokens??zi,responseBufferTokens:Vi,maxOutputTokens:r.maxOutputTokens??qi,abortSignal:u,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},b=new Set,E=0,P=w,U,v={messages:[...i],maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:1,transition:void 0,guardState:Sr(R),reactiveCompactState:Ir(),toolLoopState:Ln({maxRounds:C,replayMessages:[...i]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{prompt:0,completion:0},collapseStore:lr(),currentModel:c,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:void 0,lastResponseId:void 0,snipRemovedIds:new Set,contentReplacementState:ra(),budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0},ie=Math.max(g*5,200),Y=0;for(;;){if(Y++,Y>ie){n.info(`hard iteration cap reached (${ie}), forcing completion`);let _=v.finalText||qt(v.messages,n);yield{type:"end",turnId:o,content:_,usage:v.totalUsage,model:v.currentModel};return}let{messages:D,maxOutputTokensRecoveryCount:pe,hasAttemptedReactiveCompact:Re,maxOutputTokensOverride:ae,turnCount:H,guardState:X,reactiveCompactState:te,collapseStore:Ge}=v,{toolLoopState:we}=v;if(U){try{let _=await U;_&&(yield{type:"tool_use_summary",turnId:o,summary:_})}catch{}U=void 0}if(r.refreshTools&&H>1){let _=r.refreshTools();_!==P&&(P=_,n.debug(`tools refreshed: ${_.length} tools`))}if(Ar(X,R)){n.info(`turn aborted by guard at turn ${H}`),yield{type:"error",turnId:o,error:"Turn aborted",code:"ABORTED",usage:v.totalUsage};return}let He=Rr(X,R);if(He.level==="blocking"){He.reason==="prompt_too_long"&&St(te)&&(te.attemptedThisTurn=!0,X.hasAttemptedReactiveCompact=!0,n.info(`token budget blocking (${He.reason}), reactive compact needed`),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"token budget pre-check"}),n.info(`token budget blocking (${He.reason}), ending tool loop`);break}He.level==="warning"&&n.info(`token budget warning: ${He.usagePercent}% used, ${He.remainingTokens} remaining`);let h;{let _=await da(D,v.contentReplacementState,s);h=_.messages,_.newlyReplacedCount>0&&(n.info(`tool-result-budget: persisted ${_.newlyReplacedCount} oversized tool results`),yield{type:"recovery",turnId:o,action:"tool_result_budget",detail:`${_.newlyReplacedCount} persisted`})}{let _=ir(h,v.snipRemovedIds);h=_.messages,_.removedCount>0&&(n.info(`snip: removed ${_.removedCount} messages, freed ~${_.tokensFreed} tokens`),yield{type:"recovery",turnId:o,action:"snip",detail:`${_.removedCount} messages`})}{let M=new tt().compress(h,0);M.droppedCount>0&&(h=M.messages,n.info(`microcompact: cleared ${M.droppedCount} old tool results`))}if(h=cr(h,Ge).messages,X.promptTokens>0){let _=ha(h,{budget:R.contextWindowTokens*.75,model:v.currentModel});_.droppedCount>0&&(h=_.messages,n.info(`autocompact: ${_.strategy}, dropped ${_.droppedCount}`),yield{type:"recovery",turnId:o,action:"autocompact",detail:`${_.strategy}: ${_.droppedCount} dropped`},v.hasAttemptedReactiveCompact=!1,p?.invoke("context.after_compact",{...m,removedCount:_.droppedCount}).catch(()=>{}))}h=qm(h);let T=ur({tools:P,toolChoice:r.toolChoice??"auto"}),x=Ln({maxRounds:C,replayMessages:h,lastStopReason:we.lastStopReason,options:{stopReason:we.lastStopReason}}),A=T.extraSystemPrompt?[{role:"system",content:T.extraSystemPrompt},...x.state.replayMessages]:x.state.replayMessages;we=x.state,x.recoveryActions.length>0&&n.debug(`tool loop recovery: ${x.recoveryActions.map(_=>_.detail??_.kind).join("; ")}`),n.debug(`turn ${H}, messages: ${A.length}`),p?.invoke("turn.before_inference",{...m,model:v.currentModel}).catch(()=>{});let S=!1,O=[],N=new Map,G="stop",F,j=null,z=!1,se=[],ve=[];try{for await(let _ of e.stream({model:v.currentModel,messages:A,tools:T.tools,toolChoice:T.normalizedToolChoice??"auto",temperature:l,maxTokens:(ae??X.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,u))switch(_.type){case"delta":O.push(_.text),S||(yield{type:"delta",turnId:o,text:_.text});break;case"tool_call_delta":S=!0,Mr(N,_);break;case"reasoning_delta":se.push(_.text);break;case"reasoning_block_complete":_.signature&&ve.push({thinking:se.join(""),signature:_.signature}),se.length=0;break;case"usage":F={prompt:_.promptTokens,completion:_.completionTokens,reasoning:_.reasoningTokens,cacheRead:_.cacheReadTokens,cacheCreation:_.cacheCreationTokens};break;case"response_id":v.lastResponseId=_.id;break;case"annotations":yield{type:"annotations",turnId:o,annotations:_.annotations};break;case"builtin_tool_status":yield{type:"heartbeat",turnId:o,message:`${_.toolType}: ${_.event}`};break;case"done":G=_.finishReason;break}if(S||p?.invoke("turn.after_inference",{...m,model:v.currentModel}).catch(()=>{}),r.postSamplingHooks&&r.postSamplingHooks.length>0){let _=v.currentModel;for(let M of r.postSamplingHooks)try{M({messages:[...h],model:_,sessionId:s})}catch{}}}catch(_){if(_ instanceof Ht&&r.fallbackModel){n.info(`model fallback triggered: ${_.originalModel} \u2192 ${_.fallbackModel}`),yield{type:"recovery",turnId:o,action:"model_fallback",detail:`${_.originalModel} \u2192 ${_.fallbackModel}`},v={...v,currentModel:_.fallbackModel,consecutive529Errors:0,consecutiveApiRetries:0,transition:void 0};continue}let M=_ instanceof Error?_.message:String(_),L=typeof _?.status=="number"?_.status:void 0;if(!L&&M&&(M.includes("ECONNRESET")||M.includes("EPIPE"))){let ne=(v.consecutiveApiRetries??0)+1;if(ne>Vt){n.info(`stale connection retry limit reached (${Vt}), 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:ne,transition:void 0};continue}let V=Vm({status:L,message:M});if(V!==null){n.info(`max_tokens overflow: adjusting to ${V}`),X.currentMaxOutputTokens=V,v={...v,maxOutputTokensOverride:V,transition:void 0};continue}if(kr(L)){if(v.consecutive529Errors++,v.consecutive529Errors>=Qi&&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(Tr()){let ne=Un(v.consecutive529Errors);n.info(`persistent retry: waiting ${ne}ms (attempt ${v.consecutive529Errors})`);let J=ne;for(;J>0;){if(u?.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(J/1e3)}s (${L})`};let ge=Math.min(J,Xi);await new Promise(Xo=>setTimeout(Xo,ge)),J-=ge}v={...v,transition:void 0};continue}if(br(f)){let J=zm({status:L,message:M})??Un(v.consecutive529Errors);n.info(`transient ${L}: retry in ${J}ms`),yield{type:"recovery",turnId:o,action:"retry",detail:`${L} retry in ${J}ms`},await new Promise(ge=>setTimeout(ge,J)),v={...v,transition:void 0};continue}n.info(`background source ${f}: not retrying ${L}`)}j={status:L,message:M}}if(j&&p?.invoke("turn.after_inference",{...m,model:v.currentModel,response:{error:j.message}}).catch(()=>{}),j)if(va(j))z=!0,n.info(`withheld prompt_too_long error (status=${j.status})`);else if(xa(j))z=!0,n.info(`withheld media_size error (status=${j.status})`);else{let _=_r({status:j.status??500,message:j.message},X,R);if(_.action==="reactive_compact"&&St(te)&&(te.attemptedThisTurn=!0,X.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:o,action:"reactive_compact",detail:`API ${j.status??500}: ${j.message}`}),_.action==="retry"){let L=(v.consecutiveApiRetries??0)+1;if(L>Vt){n.info(`API retry limit reached (${Vt}), aborting`);let V=vt(j.status,j.message);yield{type:"error",turnId:o,error:j.message,code:V,usage:v.totalUsage};return}yield{type:"recovery",turnId:o,action:"retry",detail:_.reason},v={...v,consecutiveApiRetries:L,transition:void 0};continue}let M=vt(j.status,j.message);p?.invoke("stop.failure",{sessionId:s,reason:M,error:j.message}).catch(()=>{}),yield{type:"error",turnId:o,error:j.message,code:M,usage:v.totalUsage};return}F&&(v.totalUsage.prompt+=F.prompt,v.totalUsage.completion+=F.completion,F.reasoning&&(v.totalUsage.reasoning=(v.totalUsage.reasoning??0)+F.reasoning),F.cacheRead&&(v.totalUsage.cacheRead=(v.totalUsage.cacheRead??0)+F.cacheRead),F.cacheCreation&&(v.totalUsage.cacheCreation=(v.totalUsage.cacheCreation??0)+F.cacheCreation)),F?.prompt&&(X.promptTokens=F.prompt);let me=O.join("");me&&(v.finalText=me);let Me=[...N.values()].map(_=>({id:_.id||`tc_${o}_${H}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:_.name,arguments:_.arguments}}));if(Me.length===0&&!S){if(z&&j&&va(j)){if(v.transition?.reason!=="collapse_drain_retry"){let L=dr(h,Ge);if(L.committed>0){n.info(`collapse drain: committed ${L.committed} stages`),yield{type:"recovery",turnId:o,action:"collapse_drain",detail:`${L.committed} stages committed`},v={...v,messages:L.messages,transition:{reason:"collapse_drain_retry",committed:L.committed}};continue}}if(St(te)){te.attemptedThisTurn=!0,X.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"),p?.invoke("stop.failure",{sessionId:s,reason:"prompt_too_long",error:j.message}).catch(()=>{}),yield{type:"error",turnId:o,error:j.message,code:"PROMPT_TOO_LONG",usage:v.totalUsage};return}if(z&&j&&xa(j)){if(St(te)){te.attemptedThisTurn=!0,X.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"),p?.invoke("stop.failure",{sessionId:s,reason:"media_error",error:j.message}).catch(()=>{}),yield{type:"error",turnId:o,error:j.message,code:"IMAGE_ERROR",usage:v.totalUsage};return}if(Hm(G)){X.consecutiveTruncations+=1;let L=r.modelMaxOutputTokens??Ki,V=Cr(X,R,L);if(V.shouldEscalate&&ae===void 0){X.currentMaxOutputTokens=V.newMax,n.info(`max_output_tokens escalate: ${V.newMax} tokens`),yield{type:"recovery",turnId:o,action:"output_escalation",detail:`${V.newMax} tokens`},v={...v,maxOutputTokensOverride:Yi,transition:{reason:"max_output_tokens_escalate"}};continue}if(pe<Ji){let ne={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 #${pe+1}`),yield{type:"recovery",turnId:o,action:"max_output_tokens_recovery",detail:`attempt ${pe+1}`},v={...v,messages:[...h,ne],maxOutputTokensRecoveryCount:pe+1,maxOutputTokensOverride:void 0,transition:{reason:"max_output_tokens_recovery",attempt:pe+1}};continue}n.info("max_output_tokens recovery exhausted, completing with partial content")}else X.consecutiveTruncations=0;if(we=$n(we,{replayMessages:D,lastStopReason:"completed"}),p){let L=await p.invoke("stop",{sessionId:s,reason:"completed"});if(L.action==="prevent"){n.info(`stop hook prevented continuation: ${L.reason??"no reason"}`),yield{type:"end",turnId:o,content:v.finalText,usage:v.totalUsage,model:v.currentModel};return}if(L.action==="abort"){let V=L.reason??"Stop hook requested continuation";n.info(`stop hook blocking: ${V}`);let ne={role:"user",content:V},J={role:"assistant",content:v.finalText,...ve.length>0&&{thinkingBlocks:[...ve]}};v={...v,messages:[...D,J,ne],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(r.tokenBudget&&r.tokenBudget>0&&v.budgetContinuationCount<5){let L=v.totalUsage.prompt+v.totalUsage.completion+(v.totalUsage.reasoning??0),V=L/r.tokenBudget*100,ne=L-v.lastBudgetGlobalTokens,J=v.budgetContinuationCount>=Zi&&ne<Er&&v.lastBudgetDeltaTokens<Er;if(J&&n.info(`token budget early stop: diminishing returns at ${Math.round(V)}% (delta=${ne})`),!J&&V<90){let ge=v.budgetContinuationCount+1,Xo={role:"user",content:ba(V,L,r.tokenBudget)};n.info(`token budget continuation #${ge}: ${Math.round(V)}% used`),yield{type:"recovery",turnId:o,action:"budget_continuation",detail:`${Math.round(V)}% used (#${ge})`};let np={role:"assistant",content:v.finalText,...ve.length>0&&{thinkingBlocks:[...ve]}};v={...v,messages:[...D,np,Xo],budgetContinuationCount:ge,lastBudgetDeltaTokens:ne,lastBudgetGlobalTokens:L,transition:{reason:"token_budget_continuation"}};continue}}if(E>0){let L={ok:!0,toolCallCount:E,distinctToolCount:b.size,multiStep:E>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},V=Dn(L,{tools:[...b]});V&&(yield{type:"skill_instruction",turnId:o,instruction:V})}let M=v.finalText||qt(D,n);yield{type:"end",turnId:o,content:M,usage:v.totalUsage,model:v.currentModel};return}for(let _ of Me){let M=_.function.arguments,L=P.find(V=>V.function.name===_.function.name);if(L?.backfillObservableInput)try{let V=JSON.parse(_.function.arguments),ne={...V};L.backfillObservableInput(ne),Object.keys(ne).some(ge=>!(ge in V))&&(M=JSON.stringify(ne))}catch{}yield{type:"tool_call",turnId:o,callId:_.id,name:_.function.name,arguments:M}}let Mn=ve.length===0&&se.length>0?se.join(""):void 0;D.push(Zo(Me,v.finalText||void 0,ve.length>0?ve:void 0,Mn)),we=yr(we,{replayMessages:D,pendingToolCallIds:Me.map(_=>_.id),completedToolCallIds:we.completedToolCallIds,lastStopReason:"tool_calls"});let Pn=[];try{let _=new Fn({toolInvoker:t,hooks:p,sessionId:s,turnId:o,log:n,signal:u,maxConcurrentTools:r?.maxConcurrentTools});for(let M of Me)_.addTool(M);for await(let M of _.getRemainingResults()){M.blocked&&(yield{type:"tool_blocked",turnId:o,callId:M.callId,name:M.toolName,reason:M.blockReason??"blocked"}),D.push(M.message),Pn.push(M.callId),b.add(M.toolName),E++;let L=typeof M.message?.content=="string"?M.message.content:"",V=M.ok&&L?L.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:V},M.ok){let ne=Me.find(J=>J.id===M.callId);if(ne){if(M.toolName==="plan_mode")try{let J=JSON.parse(ne.function.arguments);J.action==="exit"&&typeof J.plan=="string"&&J.plan.length>0&&(yield{type:"plan_update",turnId:o,slug:"approved-plan",content:J.plan})}catch{}if(Fm.has(M.toolName))try{let J=JSON.parse(ne.function.arguments),ge=typeof J.file_path=="string"?J.file_path:typeof J.filePath=="string"?J.filePath:typeof J.path=="string"?J.path:void 0;ge&&(yield{type:"artifact",turnId:o,artifactId:`artifact-${M.callId}`,artifactType:Bm(ge),title:ge.split(/[\\/]/).pop()||ge,filePath:ge,language:Wm(ge)})}catch{}}}}}catch(_){let M=_ instanceof Error?_.message:String(_);yield{type:"error",turnId:o,error:M,code:"TOOL_EXECUTION_ERROR",usage:v.totalUsage};return}if(we=$n(we,{replayMessages:D,completedToolCallIds:[...we.completedToolCallIds,...Pn],lastStopReason:"tool_calls"}),r.generateToolUseSummary&&Me.length>0){let _=Me.map(M=>({name:M.function.name,arguments:M.function.arguments}));U=r.generateToolUseSummary(_).catch(()=>null)}let $t=D.slice(-Me.length),tp=$t.length>0&&$t.every(_=>{let M=_?.content;return typeof M!="string"?!1:M.startsWith("Error: ")}),Lt=v.consecutiveFailedRounds;if(tp){if(Lt+=1,Lt>=Hi){let _=v.finalText||qt(D,n);n.info(`early exit: ${Lt} consecutive failed rounds, returning ${v.finalText?"partial":"fallback"} response`),yield{type:"end",turnId:o,content:_,usage:v.totalUsage,model:v.currentModel};return}}else Lt=0;let Yo=H+1;if(g>0&&Yo>g){if(n.info(`max turns reached (${g}), completing`),p){let M=await p.invoke("stop",{sessionId:s,reason:"max_turns"});if(M.action==="abort"){let L=M.reason??"Stop hook requested continuation after max_turns",V={role:"assistant",content:v.finalText,...ve.length>0&&{thinkingBlocks:[...ve]}};v={...v,messages:[...D,V,{role:"user",content:L}],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}let _=v.finalText||qt(D,n);yield{type:"end",turnId:o,content:_,usage:v.totalUsage,model:v.currentModel};return}if(Yo>C){if(n.info(`tool loop budget exhausted (${C} rounds), returning`),E>0){let M={ok:!0,toolCallCount:E,distinctToolCount:b.size,multiStep:E>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},L=Dn(M,{tools:[...b]});L&&(yield{type:"skill_instruction",turnId:o,instruction:L})}let _=v.finalText||qt(D,n);yield{type:"end",turnId:o,content:_,usage:v.totalUsage,model:v.currentModel};return}v={messages:D,maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:Yo,transition:{reason:"next_turn"},guardState:X,reactiveCompactState:te,toolLoopState:we,consecutiveFailedRounds:Lt,finalText:v.finalText,totalUsage:v.totalUsage,collapseStore:Ge,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 qt(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(`
26
26
 
27
- `)):""}async function*om(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,ea=J(()=>{"use strict";dr();$t();Fi();br();Ki();mr();Rn();Jp=new Set(["write","edit","patch","apply_patch"])});var na={};Vs(na,{Agent:()=>jt});var jt,kr=J(()=>{"use strict";$t();ea();Rn();jt=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=Ko(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
+ `)):""}async function*Km(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 Fm,Ra=Q(()=>{"use strict";Pr();zt();ua();jr();ka();Dr();jn();Fm=new Set(["write","edit","patch","apply_patch"])});function _a(r){if(!r||r.length<5)return{scenario:"general",preferred:[],deprioritized:[],confidence:0};let e=[];for(let[o,s]of Object.entries(Jm)){if(o==="general")continue;let i=s.filter(a=>a.test(r)).length;if(i>0){let a=Math.min(1,i/2);e.push({scenario:o,score:a})}}if(e.length===0)return{scenario:"general",preferred:[],deprioritized:[],confidence:0};e.sort((o,s)=>s.score-o.score);let t=e[0];if(t.score<.5)return{scenario:"general",preferred:[],deprioritized:[],confidence:t.score};let n=Ym[t.scenario];return{scenario:t.scenario,preferred:n.preferred,deprioritized:n.deprioritized,confidence:t.score}}function Fr(r,e,t){return!e||t.scenario==="general"?r:t.preferred.includes(e)?Math.min(1,r*1.2):t.deprioritized.includes(e)?r*.7:r}function Ca(r){let e=r.replace(/\.md$/,"").toLowerCase();for(let[t,n]of Object.entries(Xm))if(e.startsWith(t+"-")||e.startsWith(t+"_")||e===t)return n;return null}var Jm,Ym,Xm,Br=Q(()=>{"use strict";Jm={coding:[/(?:bug|error|fix|debug|报错|修复|编译|compile|build|lint)/i,/(?:implement|refactor|重构|实现|代码|code|function|method|class)/i,/(?:test|测试|vitest|jest|断言|assert)/i,/(?:type(?:script)?|接口|interface|generic|泛型)/i,/(?:import|export|module|依赖|package|npm|pnpm)/i,/(?:git|commit|branch|merge|rebase|PR|MR)/i],config:[/(?:deploy|部署|运维|docker|container|kubernetes|k8s)/i,/(?:port|端口|config|配置|env|环境变量|.env)/i,/(?:server|service|daemon|进程|systemd|nginx|redis)/i,/(?:版本|version|upgrade|migrate|迁移)/i,/(?:domain|域名|ssl|cert|证书|DNS)/i],conversation:[/(?:你好|hi|hello|hey|请问|问一下)/i,/(?:我(?:喜欢|偏好|习惯|想)|prefer|I (?:like|want|need))/i,/(?:帮我|help me|能不能|可以吗|would you)/i,/(?:style|风格|format|格式|命名|naming)/i],learning:[/(?:best practice|最佳实践|pattern|模式|惯例|convention)/i,/(?:怎么做|how to|how do|what's the|推荐|recommend)/i,/(?:为什么|why|原因|reason|explain|解释)/i,/(?:lesson|经验|教训|gotcha|pitfall|坑)/i],decision:[/(?:should|应该|选择|choose|decision|决定|trade-?off|权衡)/i,/(?:vs|versus|对比|compare|区别|difference)/i,/(?:architecture|架构|方案|approach|strategy)/i,/(?:pros|cons|优缺点|利弊|好处|坏处)/i],general:[]},Ym={coding:{preferred:["lesson","pattern","fact"],deprioritized:["preference"]},config:{preferred:["fact","decision","lesson"],deprioritized:["preference","skill-learning"]},conversation:{preferred:["preference","fact"],deprioritized:["pattern","skill-learning"]},learning:{preferred:["lesson","pattern","skill-learning"],deprioritized:["preference"]},decision:{preferred:["decision","fact","lesson"],deprioritized:["skill-learning","preference"]},general:{preferred:[],deprioritized:[]}};Xm={lesson:"lesson",debug:"lesson",gotcha:"lesson",fix:"lesson",preference:"preference",style:"preference",pattern:"pattern",convention:"pattern",practice:"pattern",fact:"fact",config:"fact",architecture:"fact",env:"fact",deploy:"fact",decision:"decision",choice:"decision",skill:"skill-learning",workflow:"skill-learning"}});var Ia={};yi(Ia,{Agent:()=>Kt});var Kt,Wr=Q(()=>{"use strict";zt();Ra();jn();Br();Kt=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=fr(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=_a(g),y=await this.hooks.invoke("memory.before_recall",{sessionId:e.sessionId,turnId:n,query:g,preferredCategories:f.preferred.length>0?f.preferred:void 0,deprioritizedCategories:f.deprioritized.length>0?f.deprioritized:void 0}),k=y?.context?.recalledMemories;if(k&&k.length>0){let w=k.map(C=>`- ${C.text}`).join(`
28
28
  `);l.splice(i?1:0,0,{role:"system",content:`[Recalled from long-term memory]
29
- ${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 Zi(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=gt(f,g);this.log.error(`turn ${n} error [${b}, retryable=${Lo(b)}]: ${g}`),this.hooks?.invoke("turn.failed",{...c,code:b,error:g}).catch(()=>{}),yield{type:"error",turnId:n,error:g,code:b}}}}}});import{randomUUID as le}from"node:crypto";import{createInterface as gu}from"node:readline";var mt=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
+ ${w}`})}this.hooks.invoke("memory.after_recall",{sessionId:e.sessionId,turnId:n,blockCount:y?.context?.recalledMemories?.length??0}).catch(()=>{})}catch{}}let p=a?.model??"",u=Math.min(a?.maxRounds??this.maxRounds,100);try{let m=a?.summaryModel?async y=>{try{let k=y.map(R=>`${R.name}(${R.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:k}],tools:[],maxTokens:60},a.apiKey??this.apiKey),C="";for await(let R of w)R.type==="delta"&&(C+=R.text);return C.trim()||null}catch{return null}}:void 0,g={turnId:n,sessionId:e.sessionId,messages:l,tools:s,model:p,apiKey:a?.apiKey??this.apiKey,temperature:a?.temperature,maxRounds:u,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 y of Sa(g,this.transport,this.toolInvoker,this.log))f=y,yield y;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,y=vt(f,g);this.log.error(`turn ${n} error [${y}, retryable=${tr(y)}]: ${g}`),this.hooks?.invoke("turn.failed",{...c,code:y,error:g}).catch(()=>{}),yield{type:"error",turnId:n,error:g,code:y}}}}}});import{randomUUID as ue}from"node:crypto";import{createInterface as sp}from"node:readline";var wt=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)}
30
30
  `)}start(){process.stdin.on("data",t=>{process.stderr.write(`[transport] raw stdin data (${t.length} bytes): ${t.toString().slice(0,300)}
31
- `)});let e=gu({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
+ `)});let e=sp({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)}
32
32
  `);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}
33
- `)}};kr();dr();var Ce=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(`
34
- `))!==-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 im,mkdirSync as am}from"node:fs";import{join as ya}from"node:path";import{randomUUID as lm}from"node:crypto";import{homedir as sm}from"node:os";import{join as ee}from"node:path";var ke=".qlogicagent";function W(){return process.env.QLOGICAGENT_HOME||ee(sm(),ke)}function Tr(){return ee(W(),"sessions")}function oa(r){return ee(Tr(),r)}function ra(){return ee(W(),"plugins")}function wr(){return ee(W(),"skills")}function yt(){return ee(W(),"settings.json")}function Ae(){return ee(W(),"cache")}function sa(){return ee(W(),"debug-logs")}function ia(r){let e=ee(W(),"checkpoints");return r?ee(e,r):e}function aa(){return ee(W(),"plugin-cache")}function la(){return ee(W(),"mcp.json")}function ca(){return ee(W(),"marketplace.json")}function da(){return ee(W(),"workflows")}function ua(){return ee(W(),"rules")}function qe(r){return ee(r??process.cwd(),ke)}function pa(r){return ee(qe(r),"workflows")}function ma(r){return ee(qe(r),"INSTRUCTIONS.md")}function ga(r){return ee(qe(r),"rules")}function fa(r){return ee(qe(r),"sessions")}function ha(r){return ee(r,ke,"hooks")}var cm=18e4,Ft=class{supportedTypes=["image","tts"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??cm}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=ya(Ae(),"tts");am(l,{recursive:!0});let u=`openai-tts-${lm()}.mp3`,p=ya(l,u);return im(p,d),{mediaUrls:[`file://${p}`],model:e.model||"tts-1",durationMs:Date.now()-o,billingUnit:"per_character",billingQuantity:s.length}}};var st=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 ka,mkdirSync as Ta}from"node:fs";import{join as Pn}from"node:path";import{randomUUID as wa}from"node:crypto";import{writeFileSync as dm,mkdirSync as um}from"node:fs";import{join as ba}from"node:path";import{randomUUID as pm}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 vr(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=mm(l,48e3,2,16),p=ba(Ae(),"gemini-music-realtime");um(p,{recursive:!0});let m=`lyria-rt-${pm()}.wav`,g=ba(p,m);return dm(g,u),t.onProgress?.(100,"completed"),{filePath:`file://${g}`,durationMs:Date.now()-o}}finally{s.close()}}function mm(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 gm=18e4,fm=1e4,xr=6e5,Bt=class{supportedTypes=["image","video","music","music_realtime","tts","embedding"];apiBase;timeoutMs;constructor(e){this.apiBase=e.baseUrl.replace(/\/openai\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??gm}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 vr(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()+xr;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-xr),u=Math.min(95,Math.round(l/xr*100));o?.(u,"running",s),await new Promise(p=>setTimeout(p,fm))}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(Ae(),"gemini-images");Ta(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-${wa()}.${i}`,c=Pn(n,a);ka(c,Buffer.from(s.inlineData.data,"base64")),t.push(`file://${c}`)}return t}extractInlineAudio(e,t){let n=[],o=Pn(Ae(),t);Ta(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"?hm(c,24e3,1,16):c,l=`gemini-${wa()}.${a==="pcm"?"wav":a}`,u=Pn(o,l);ka(u,d),n.push(`file://${u}`)}return n}};function hm(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 In=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 ym(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 ym(r){return new Promise(e=>setTimeout(e,r))}import{writeFileSync as bm,mkdirSync as km}from"node:fs";import{join as va}from"node:path";import{randomUUID as Tm}from"node:crypto";var wm=18e4,vm=3e3,Mn=6e5,xm=new Set(["glm-image"]),Gt=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??wm}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 xm.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=va(Ae(),"tts");km(l,{recursive:!0});let u=e.audioFormat??"wav",p=`zhipu-tts-${Tm()}.${u}`,m=va(l,p);return bm(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()+Mn,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-Mn);o?.(Math.min(95,Math.round(d/Mn*100)),c.task_status??"running",e),await new Promise(l=>setTimeout(l,vm))}throw new Error(`Zhipu async task timed out after ${Mn/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 Wt=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=Rm(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?Sm(n):void 0,a=s.find(c=>c.mediaType!==t?!1:!i||!c.mediaCapabilities?!0:_m(c.mediaCapabilities,i));if(a)return{providerId:e,providerDef:o,modelInfo:a,mediaType:t}}};function Sm(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 _m(r,e){return!("operations"in r)||!r.operations?!0:r.operations.includes(e)}function Rm(r){let e=r.baseUrl;switch(r.id){case"volcengine":return new Ce({baseUrl:e});case"openai":return new Ft({baseUrl:e});case"minimax":return new st({baseUrl:e});case"google":return new Bt({baseUrl:e});case"qwen":return new In({baseUrl:e});case"zhipu":return new Gt({baseUrl:e.replace(/\/api\/anthropic\/?$/,"/api/paas/v4")});case"zhipu-openai":case"zhipu-coding":return new Gt({baseUrl:e.replace(/\/api\/coding\/paas\/v4\/?$/,"/api/paas/v4")});default:return}}var Sr=[{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 Cm,mkdirSync as Am,readFileSync as Pm,writeFileSync as Im}from"node:fs";import{join as Mm}from"node:path";var Em="https://models.dev/api.json",Om=3e4,Lm=1440*60*1e3,Dm=300*1e3,$m={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"},Ht=class{cache=null;cacheDir;cacheFile;ttlMs;fetching=!1;lastFetchAttempt=0;constructor(e){this.cacheDir=e?.cacheDir??Ae(),this.cacheFile=Mm(this.cacheDir,"model_catalog.json"),this.ttlMs=e?.ttlMs??Lm}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(!Cm(this.cacheFile))return;let e=Pm(this.cacheFile,"utf8"),t=JSON.parse(e);if(!t.fetchedAt||!t.data)return;this.cache={fetchedAt:t.fetchedAt,providers:xa(t.data)}}catch{}}saveToDisk(e){try{Am(this.cacheDir,{recursive:!0});let t=JSON.stringify({fetchedAt:Date.now(),data:e},null,0);Im(this.cacheFile,t,"utf8")}catch{}}backgroundFetch(){this.fetching||Date.now()-this.lastFetchAttempt<Dm||(this.fetching=!0,this.fetchRemote().finally(()=>{this.fetching=!1}))}async fetchRemote(){this.lastFetchAttempt=Date.now();try{let e=await fetch(Em,{signal:AbortSignal.timeout(Om),headers:{Accept:"application/json"}});if(!e.ok)return!1;let t=await e.json(),n=xa(t);return n.size===0?!1:(this.cache={fetchedAt:Date.now(),providers:n},this.saveToDisk(t),!0)}catch{return!1}}};function xa(r){let e=new Map;if(!r||typeof r!="object")return e;for(let[t,n]of Object.entries(r)){let o=$m[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=Nm(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 Nm(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 Um={claude:"anthropic",gemini:"google",doubao:"volcengine"},zt=class{builtins=new Map;catalog;overrides=new Map;constructor(e){for(let t of Sr)this.builtins.set(t.id,t);this.catalog=e?.catalog??new Ht}applyOverride(e,t){this.overrides.set(e,{...this.overrides.get(e),...t})}getProvider(e){let t=Um[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 _r=new Set([429,529,502,503,504]),Me=9e4;function Ee(r){let e=Math.min(1e3*Math.pow(2,r-1),3e4),t=Math.random()*.25*e;return e+t}function Ne(r){return r!=null&&_r.has(r)}function Oe(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 Ue(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 bt=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:Fm(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 Oe(Ee(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(!Ne(Ue(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(`
35
- `))!==-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:jm(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(`
36
- `))!==-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 jm(r){switch(r){case"sensitive":return"content_filter";case"model_context_window_exceeded":return"length";case"network_error":return"error";default:return r}}function Fm(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 Oe(Ee(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(!Ne(Ue(c))&&!u||d===3)throw c}}}buildRequestBody(e){let t={model:e.model,input:Bm(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(`
37
- `))!==-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 Bm(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 Gm=18e4,Wm=3e5,Hm=64e3,zm="[Tool execution failed; output not available during conversation recovery]",Vm="interleaved-thinking-2025-05-14",qm="context-1m-2025-08-07",Km="token-efficient-tools-2026-03-28",Jm="prompt-caching-scope-2026-01-05",Ym="pdfs-2024-09-25";function Xm(r){let e=r.toLowerCase();return e.includes("opus-4-6")||e.includes("opus-4-7")||e.includes("sonnet-4-6")}function Qm(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(qm),n.push(Ym),e&&!o.includes("haiku")&&n.push(Vm),t&&n.push(Km),n.push(Jm);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??Gm,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=ng(e.messages),{system:i,messages:a}=og(s,this.quirks,e.model),c=tg(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(rg);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(Xm(e.model))u.thinking={type:"adaptive"};else{let f=eg(e.reasoning.effort,e.maxTokens);u.thinking={type:"enabled",budget_tokens:Math.min(l-1,f)}}let p=Qm(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 Oe(Ee(f),n);try{yield*this.streamWithWatchdog(o,m,u,n);return}catch(b){g=b instanceof Error?b:new Error(String(b));let w=sg(g.message),T=w!==null&&_r.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=ig({...n,stream:!1}),i=AbortSignal.timeout(Wm),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:_a(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(`
38
- `))!==-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&&(Sa(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&&(Sa(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:_a(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 Sa(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 _a(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 Rr={high:16e3,medium:8e3,low:4e3};function eg(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 Rr.high}return Rr[r]??Rr.high}function tg(r,e){if(r)return e?[{type:"text",text:r,cache_control:{type:"ephemeral"}}]:r}function ng(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 og(r,e={},t){let n,o=[];for(let s of r){if(s.role==="system"){n=n?`${n}
39
-
40
- ${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===zm,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 rg(r){return{name:r.function.name,description:r.function.description,input_schema:r.function.parameters??{type:"object",properties:{}}}}function sg(r){let e=/Anthropic API error (\d{3})/.exec(r);return e?parseInt(e[1],10):null}function ig(r){let e=typeof r.max_tokens=="number"?r.max_tokens:8192,t=Math.min(e,Hm),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 Oe(Ee(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(!Ne(Ue(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:ag(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(`
41
- `))!==-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 ag(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 lg=[{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 cg(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 Oe(Ee(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(!Ne(Ue(a))&&!l)throw a;if(c===3){if((l||Ne(Ue(a)))&&!e.streamRequired)try{yield*this.nonStreamingFallback(e,t,n);return}catch{throw a}throw a}}}}buildRequestBody(e){let{systemInstruction:t,contents:n}=dg(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=lg,e.cachedContent&&(o.cachedContent=e.cachedContent),o}buildTools(e){let t=[];if(e.tools&&e.tools.length>0){let n=e.tools.map(ug);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=cg(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(`
42
- `))!==-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:`
33
+ `)}};Wr();Pr();var Oe=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(`
34
+ `))!==-1;){let p=s.slice(0,l).trim();if(s=s.slice(l+1),!p||p.startsWith(":")||!p.startsWith("data:"))continue;let u=p.slice(5).trim();if(u==="[DONE]")break;try{let g=JSON.parse(u).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 k=0;k<e.referenceImages.length;k++){let w=e.imageRoles?.[k]??"reference_image";l.push({type:"image_url",image_url:{url:e.referenceImages[k]},role:w})}if(e.referenceVideos?.length)for(let k of e.referenceVideos)l.push({type:"video_url",video_url:{url:k},role:"reference_video"});if(e.referenceAudios?.length)for(let k of e.referenceAudios)l.push({type:"audio_url",audio_url:{url:k},role:"reference_audio"});break}case"extend":{if(e.sourceVideos?.length)for(let k of e.sourceVideos)l.push({type:"video_url",video_url:{url:k},role:"reference_video"});e.prompt&&l.push({type:"text",text:e.prompt});break}case"merge":for(let k of e.sourceVideos??[])l.push({type:"video_url",video_url:{url:k}});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 k of e.sourceVideos??[])l.push({type:"video_url",video_url:{url:k},role:"reference_video"});if(e.referenceImages?.length)for(let k of e.referenceImages)l.push({type:"image_url",image_url:{url:k},role:"reference_image"});e.prompt&&l.push({type:"text",text:e.prompt});break;default:{let k=(e.referenceVideos?.length??0)>0,w=(e.referenceAudios?.length??0)>0,C=(e.imageRoles?.length??0)>0;if(k||w||C){if(e.prompt&&l.push({type:"text",text:e.prompt}),e.referenceImages?.length)for(let R=0;R<e.referenceImages.length;R++){let b=e.imageRoles?.[R]??"reference_image";l.push({type:"image_url",image_url:{url:e.referenceImages[R]},role:b})}if(k)for(let R of e.referenceVideos)l.push({type:"video_url",video_url:{url:R},role:"reference_video"});if(w)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 p={model:e.model,content:l};e.duration&&(p.duration=e.duration),e.aspectRatio&&(p.ratio=e.aspectRatio),e.resolution&&(p.resolution=e.resolution),e.seed!==void 0&&(p.seed=e.seed),e.fps&&(p.fps=e.fps),e.generateAudio!==void 0&&(p.generate_audio=e.generateAudio),e.watermark!==void 0&&(p.watermark=e.watermark),e.enhancePrompt!==void 0&&(p.enhance_prompt=e.enhancePrompt),e.cameraFixed!==void 0&&(p.camera_fixed=e.cameraFixed),e.returnLastFrame!==void 0&&(p.return_last_frame=e.returnLastFrame),e.serviceTier&&(p.service_tier=e.serviceTier),e.executionExpiresAfterSeconds!==void 0&&(p.execution_expires_after=e.executionExpiresAfterSeconds),e.draft!==void 0&&(p.draft=e.draft),e.safetyIdentifier&&(p.safety_identifier=e.safetyIdentifier),e.callbackUrl&&(p.callback_url=e.callbackUrl),e.videoTools?.length&&(p.tools=e.videoTools.map(k=>({type:k})));let u=await this.submitTask(s,p,t,n),m=await this.pollTask(`${this.baseUrl}/v3/contents/generations/tasks/${u}`,t,n,e.onProgress,u),g=[],f=m.content;typeof f?.video_url=="string"&&g.push(f.video_url);let y=typeof f?.last_frame_url=="string"?f.last_frame_url:void 0;return{mediaUrls:g,model:e.model,durationMs:Date.now()-o,lastFrameUrl:y,taskId:u}}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),p=[],u=l.content;if(typeof u?.video_url=="string"&&p.push(u.video_url),p.length===0&&u)for(let[,g]of Object.entries(u))typeof g=="string"&&/^https?:\/\//.test(g)&&p.push(g);let m=l.output;if(m?.model_urls){let g=m.model_urls;for(let f of Object.values(g))f&&!p.includes(f)&&p.push(f)}if(p.length===0){let g=Object.keys(l),f=u?Object.keys(u):[],y=m?Object.keys(m):[];console.error(`[volcengine-3d] No media URLs found. Response keys: [${g}], content keys: [${f}], output keys: [${y}]`);let k=l.data;if(k?.content){let w=k.content;for(let[,C]of Object.entries(w))typeof C=="string"&&/^https?:\/\//.test(C)&&p.push(C)}}return{mediaUrls:p,model:e.model,durationMs:Date.now()-o,metadata:p.length===0?{debugResponseKeys:Object.keys(l),debugContentKeys:u?Object.keys(u):null,debugContentSample:u?JSON.stringify(u).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 p=Date.now()-(i-6e5),u=Math.min(95,Math.round(p/6e5*100));o?.(u,l??"running",s),await new Promise(m=>setTimeout(m,3e3))}throw new Error("Volcengine task timed out after polling")}};import{writeFileSync as ng,mkdirSync as og}from"node:fs";import{join as Va}from"node:path";import{randomUUID as rg}from"node:crypto";import{homedir as Zm}from"node:os";import{join as ee}from"node:path";import{existsSync as Ma,readdirSync as eg,readFileSync as tg}from"node:fs";var ye=".qlogicagent";function Z(){return process.env.QLOGICAGENT_HOME||ee(Zm(),ye)}function Bn(){return ee(Z(),"sessions")}function Pa(r){return ee(Bn(),r)}function Ea(){return ee(Z(),"plugins")}function Rt(){return ee(Z(),"skills")}function _t(){return ee(Z(),"settings.json")}function De(){return ee(Z(),"cache")}function Oa(){return ee(Z(),"debug-logs")}function Da(r){let e=ee(Z(),"checkpoints");return r?ee(e,r):e}function $a(){return ee(Z(),"plugin-cache")}function La(){return ee(Z(),"mcp.json")}function Ua(){return ee(Z(),"marketplace.json")}function Na(){return ee(Z(),"workflows")}function ja(){return ee(Z(),"rules")}function ze(r){return ee(r??process.cwd(),ye)}function Fa(r){return ee(ze(r),"workflows")}function Wn(r){return ee(ze(r),"skills")}function Ba(r){return ee(ze(r),"INSTRUCTIONS.md")}function Wa(r){return ee(ze(r),"rules")}function Ga(r){return ee(ze(r),"sessions")}function Ha(r){return ee(r,ye,"hooks")}function za(r){let e=Bn();if(!Ma(e))return[];let t=new Set;try{let n=eg(e,{withFileTypes:!0});for(let o of n){if(!o.isDirectory())continue;let s=ee(e,o.name,"state.json");try{let i=tg(s,"utf8"),c=JSON.parse(i).metadata?.cwd;c&&c!==r&&Ma(ee(c,ye,"skills"))&&t.add(c)}catch{}}}catch{}return[...t]}var sg=18e4,Jt=class{supportedTypes=["image","tts"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??sg}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=Va(De(),"tts");og(l,{recursive:!0});let p=`openai-tts-${rg()}.mp3`,u=Va(l,p);return ng(u,d),{mediaUrls:[`file://${u}`],model:e.model||"tts-1",durationMs:Date.now()-o,billingUnit:"per_character",billingQuantity:s.length}}};var mt=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 p=`${this.baseUrl}/v1/music_generation/${l}`;return{mediaUrls:(await this.pollTask(p,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 p=await a.text().catch(()=>"");throw new Error(`MiniMax music poll error ${a.status}: ${p}`)}let c=await a.json(),d=c.status;if(d==="Success"||d==="Finished"){o?.(100,"completed",s);let p=[];return c.audio_file&&p.push(c.audio_file),{audioUrls:p}}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(p=>setTimeout(p,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 p=e.imageRoles.includes("first_frame"),u=e.imageRoles.includes("last_frame");if(p&&u){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(p){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 p=await a.text().catch(()=>"");throw new Error(`MiniMax video submit error ${a.status}: ${p}`)}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",p=Date.now()-(s-6e5),u=Math.min(95,Math.round(p/6e5*100));o?.(u,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 Ka,mkdirSync as Ja}from"node:fs";import{join as Hn}from"node:path";import{randomUUID as Ya}from"node:crypto";import{writeFileSync as ig,mkdirSync as ag}from"node:fs";import{join as qa}from"node:path";import{randomUUID as lg}from"node:crypto";var Gn=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 Gr(r,e,t){let n=t.durationSeconds??30,o=Date.now(),s=new Gn(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,y=n*1e3,k=Math.min(95,Math.round(10+f/y*85));t.onProgress?.(k,"streaming"),await new Promise(w=>setTimeout(w,d))}s.connected&&await s.stop(),t.onProgress?.(98,"assembling");let l=Buffer.concat(i),p=cg(l,48e3,2,16),u=qa(De(),"gemini-music-realtime");ag(u,{recursive:!0});let m=`lyria-rt-${lg()}.wav`,g=qa(u,m);return ig(g,p),t.onProgress?.(100,"completed"),{filePath:`file://${g}`,durationMs:Date.now()-o}}finally{s.close()}}function cg(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 dg=18e4,ug=1e4,Hr=6e5,Yt=class{supportedTypes=["image","video","music","music_realtime","tts","embedding"];apiBase;timeoutMs;constructor(e){this.apiBase=e.baseUrl.replace(/\/openai\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??dg}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 y=>({image:{inlineData:await this.resolveImageData(y)},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 p=l;e.onProgress?.(5,"submitted",p);let g=(await this.pollOperation(l,t,n,e.onProgress,p)).response?.generateVideoResponse?.generatedSamples??[],f=[];for(let y of g)y.video?.uri&&f.push(y.video.uri);return{mediaUrls:f,model:e.model,durationMs:Date.now()-o,taskId:p}}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 Gr(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()+Hr;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 u=await c.text().catch(()=>"");throw new Error(`Gemini operation poll error ${c.status}: ${u}`)}let d=await c.json();if(d.done===!0)return o?.(100,"completed",s),d;if(d.error){let u=d.error;throw new Error(`Gemini video generation failed: ${u.message??JSON.stringify(u)}`)}let l=Date.now()-(i-Hr),p=Math.min(95,Math.round(l/Hr*100));o?.(p,"running",s),await new Promise(u=>setTimeout(u,ug))}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=Hn(De(),"gemini-images");Ja(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-${Ya()}.${i}`,c=Hn(n,a);Ka(c,Buffer.from(s.inlineData.data,"base64")),t.push(`file://${c}`)}return t}extractInlineAudio(e,t){let n=[],o=Hn(De(),t);Ja(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"?pg(c,24e3,1,16):c,l=`gemini-${Ya()}.${a==="pcm"?"wav":a}`,p=Hn(o,l);Ka(p,d),n.push(`file://${p}`)}return n}};function pg(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 zn=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 p=await l.json();if(p.code)throw new Error(`DashScope TTS submit rejected: ${p.code} \u2014 ${p.message??""}`);let u=p.output?.task_id;if(!u)throw new Error("DashScope TTS submit: no task_id in response");if(p.output?.task_status==="SUCCEEDED"){let g=this.extractMediaUrl(p);return{mediaUrls:g?[g]:[],model:e.model,durationMs:Date.now()-o}}return{mediaUrls:await this.pollTask(u,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 mg(2e3);let c=await fetch(a,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let u=await c.text().catch(()=>"");throw new Error(`DashScope TTS poll error ${c.status}: ${u}`)}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 u=this.extractMediaUrl(d);return u?[u]:[]}if(l==="FAILED")throw new Error(`DashScope task failed: ${d.message??"unknown error"}`);let p=Date.now()-(i-s);o?.(Math.min(95,Math.round(p/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 y=e.imageRoles.map((k,w)=>k==="reference_image"?w:-1).filter(k=>k>=0);y.length>0&&(i.ref_image_url=e.referenceImages[y[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 p=await l.json();if(p.code)throw new Error(`DashScope video submit rejected: ${p.code} \u2014 ${p.message??""}`);let u=p.output?.task_id;if(!u)throw new Error("DashScope video submit: no task_id in response");return{mediaUrls:await this.pollTask(u,t,n,e.onProgress,6e5),model:s,durationMs:Date.now()-o,taskId:u}}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 mg(r){return new Promise(e=>setTimeout(e,r))}import{writeFileSync as gg,mkdirSync as fg}from"node:fs";import{join as Xa}from"node:path";import{randomUUID as hg}from"node:crypto";var yg=18e4,bg=3e3,Vn=6e5,kg=new Set(["glm-image"]),Xt=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??yg}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 kg.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(u=>u.url).filter(u=>!!u),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(u=>u.url).filter(u=>!!u),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=Xa(De(),"tts");fg(l,{recursive:!0});let p=e.audioFormat??"wav",u=`zhipu-tts-${hg()}.${p}`,m=Xa(l,u);return gg(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 p=await d.text().catch(()=>"");throw new Error(`Zhipu STT API error ${d.status}: ${p}`)}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 u=await d.text().catch(()=>"");throw new Error(`Zhipu Voice Clone API error ${d.status}: ${u}`)}let l=await d.json();return{mediaUrls:(l.data??[]).map(u=>u.url).filter(u=>!!u),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(p=>({pageNum:p.page_num,content:p.content,layouts:p.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()+Vn,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-Vn);o?.(Math.min(95,Math.round(d/Vn*100)),c.task_status??"running",e),await new Promise(l=>setTimeout(l,bg))}throw new Error(`Zhipu async task timed out after ${Vn/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 Qt=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=vg(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?Tg(n):void 0,a=s.find(c=>c.mediaType!==t?!1:!i||!c.mediaCapabilities?!0:wg(c.mediaCapabilities,i));if(a)return{providerId:e,providerDef:o,modelInfo:a,mediaType:t}}};function Tg(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 wg(r,e){return!("operations"in r)||!r.operations?!0:r.operations.includes(e)}function vg(r){let e=r.baseUrl;switch(r.id){case"volcengine":return new Oe({baseUrl:e});case"openai":return new Jt({baseUrl:e});case"minimax":return new mt({baseUrl:e});case"google":return new Yt({baseUrl:e});case"qwen":return new zn({baseUrl:e});case"zhipu":return new Xt({baseUrl:e.replace(/\/api\/anthropic\/?$/,"/api/paas/v4")});case"zhipu-openai":case"zhipu-coding":return new Xt({baseUrl:e.replace(/\/api\/coding\/paas\/v4\/?$/,"/api/paas/v4")});default:return}}var zr=[{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 xg,mkdirSync as Sg,readFileSync as Rg,writeFileSync as _g}from"node:fs";import{join as Cg}from"node:path";var Ag="https://models.dev/api.json",Ig=3e4,Mg=1440*60*1e3,Pg=300*1e3,Eg={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??De(),this.cacheFile=Cg(this.cacheDir,"model_catalog.json"),this.ttlMs=e?.ttlMs??Mg}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(!xg(this.cacheFile))return;let e=Rg(this.cacheFile,"utf8"),t=JSON.parse(e);if(!t.fetchedAt||!t.data)return;this.cache={fetchedAt:t.fetchedAt,providers:Qa(t.data)}}catch{}}saveToDisk(e){try{Sg(this.cacheDir,{recursive:!0});let t=JSON.stringify({fetchedAt:Date.now(),data:e},null,0);_g(this.cacheFile,t,"utf8")}catch{}}backgroundFetch(){this.fetching||Date.now()-this.lastFetchAttempt<Pg||(this.fetching=!0,this.fetchRemote().finally(()=>{this.fetching=!1}))}async fetchRemote(){this.lastFetchAttempt=Date.now();try{let e=await fetch(Ag,{signal:AbortSignal.timeout(Ig),headers:{Accept:"application/json"}});if(!e.ok)return!1;let t=await e.json(),n=Qa(t);return n.size===0?!1:(this.cache={fetchedAt:Date.now(),providers:n},this.saveToDisk(t),!0)}catch{return!1}}};function Qa(r){let e=new Map;if(!r||typeof r!="object")return e;for(let[t,n]of Object.entries(r)){let o=Eg[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,p=l.cost??{},u=l.limit??{},m=l.modalities??{},g=Array.isArray(m.input)?m.input:[],f=Array.isArray(m.output)?m.output:[],y=Og(f,g,c);a.models.set(c,{id:c,name:typeof l.name=="string"?l.name:c,contextWindow:typeof u.context=="number"?u.context:2e5,maxOutput:typeof u.output=="number"?u.output:8192,toolCall:l.tool_call===!0,reasoning:l.reasoning===!0,vision:l.attachment===!0||g.includes("image"),costInput:typeof p.input=="number"?p.input:void 0,costOutput:typeof p.output=="number"?p.output:void 0,costCacheRead:typeof p.cache_read=="number"?p.cache_read:void 0,costCacheWrite:typeof p.cache_write=="number"?p.cache_write:void 0,mediaType:y})}}return e}function Og(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 Dg={claude:"anthropic",gemini:"google",doubao:"volcengine"},en=class{builtins=new Map;catalog;overrides=new Map;constructor(e){for(let t of zr)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=Dg[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 $g=/^https?:\/\/(127\.0\.0\.1|localhost|0\.0\.0\.0|\[::1\])(:\d+)?/i;function $(r){return $g.test(r)}async function le(r,e){if(r.startsWith("data:")||!$(r))return r;let t=await fetch(r);if(!t.ok)throw new Error(`Failed to fetch local media ${r}: ${t.status}`);let n=Buffer.from(await t.arrayBuffer());return`data:${t.headers.get("content-type")||e||Lg(r)};base64,${n.toString("base64")}`}function Lg(r){let e=r.split("?")[0].split("#")[0],t=e.slice(e.lastIndexOf(".")).toLowerCase();return{".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml",".bmp":"image/bmp",".avif":"image/avif",".heic":"image/heic",".mp4":"video/mp4",".webm":"video/webm",".mov":"video/quicktime",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".aac":"audio/aac",".flac":"audio/flac",".m4a":"audio/mp4",".opus":"audio/opus",".pdf":"application/pdf"}[t]||"application/octet-stream"}var Vr=new Set([429,529,502,503,504]),Ne=9e4;function je(r){let e=Math.min(1e3*Math.pow(2,r-1),3e4),t=Math.random()*.25*e;return e+t}function Ve(r){return r!=null&&Vr.has(r)}function Fe(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 qe(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 qn(r){return r.toLowerCase().startsWith("gpt-5")}function Kn(r){return r.toLowerCase().includes("5.4-nano")}function tn(r){return/^o[1-4](-|$)/.test(r.toLowerCase())}var Ct=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:jg(await Ng(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,p=e.model.startsWith("kimi-k2.6"),u=qn(e.model);if(e.temperature!==void 0&&(this.omitZeroTemperature&&e.temperature===0||(u||!tn(e.model)&&!l&&!p)&&(a.temperature=e.temperature)),e.topP!==void 0&&(u||!tn(e.model)&&!l&&!p)&&(a.top_p=e.topP),e.maxTokens!==void 0&&(u||tn(e.model)||e.model.startsWith("kimi-k2")?a.max_completion_tokens=e.maxTokens:a.max_tokens=e.maxTokens),e.reasoning)if(u){let f=e.reasoning.effort==="minimal"?"none":e.reasoning.effort;Kn(e.model)&&(f==="high"||f==="xhigh")&&(f="medium"),a.reasoning={effort:f}}else if(tn(e.model))a.reasoning_effort=e.reasoning.effort;else if(this.quirks.useEffortInsteadOfBudget){a.thinking={type:"enabled"};let f=this.quirks.maxReasoningEffort??"high",y=e.reasoning.effort??"high";a.reasoning_effort=y==="low"||y==="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&&u&&(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 Fe(je(f),n);try{yield*this.fetchAndStream(i,m,a,n);return}catch(y){g=y instanceof Error?y:new Error(String(y));let k=g.message.includes("Stream idle timeout");if(!Ve(qe(g))&&!k||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()},Ne)};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(`
35
+ `))!==-1;){let p=n.slice(0,l).trim();if(n=n.slice(l+1),!p||p.startsWith(":")||!p.startsWith("data: "))continue;let u=p.slice(6);if(u==="[DONE]")return;let m;try{m=JSON.parse(u)}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:Ug(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 p=new TextDecoder,u="",m=l.body.getReader();try{for(;;){let{done:g,value:f}=await m.read();if(g)break;u+=p.decode(f,{stream:!0});let y;for(;(y=u.indexOf(`
36
+ `))!==-1;){let k=u.slice(0,y).trim();if(u=u.slice(y+1),!k||k.startsWith(":")||!k.startsWith("data: "))continue;let w=k.slice(6);if(w==="[DONE]")return;let C;try{C=JSON.parse(w)}catch{continue}for(let R of C.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 p=await d.text().catch(()=>"");throw new Error(`File upload error ${d.status}: ${p}`)}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 Ug(r){switch(r){case"sensitive":return"content_filter";case"model_context_window_exceeded":return"length";case"network_error":return"error";default:return r}}async function Ng(r){return r.some(t=>t.audioUrls?.some($)||t.imageUrls?.some($))?Promise.all(r.map(async t=>{if(t.role!=="user")return t;let n={};return t.audioUrls?.some($)&&(n.audioUrls=await Promise.all(t.audioUrls.map(o=>$(o)?le(o):Promise.resolve(o)))),t.imageUrls?.some($)&&(n.imageUrls=await Promise.all(t.imageUrls.map(o=>$(o)?le(o):Promise.resolve(o)))),Object.keys(n).length>0?{...t,...n}:t})):r}function jg(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){let l=d,p=t.audioFormat??"mp3";if(d.startsWith("data:")){let u=/^data:audio\/([^;]+);base64,(.+)$/.exec(d);u&&(p=u[1]==="mpeg"?"mp3":u[1],l=u[2])}c.push({type:"input_audio",input_audio:{data:l,format:p}})}if(i)for(let d of t.fileIds)if(d.id.startsWith("http://")||d.id.startsWith("https://")){let l=d.mimeType?`[Attached: ${d.id} (${d.mimeType})]`:`[Attached: ${d.id}]`;c.push({type:"text",text:l})}else 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 Jn=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=await 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 Fe(je(d),n);try{yield*this.fetchAndStream(s,a,i,n);return}catch(l){c=l instanceof Error?l:new Error(String(l));let p=c.message.includes("Stream idle timeout");if(!Ve(qe(c))&&!p||d===3)throw c}}}async buildRequestBody(e){let t={model:e.model,input:Bg(await Fg(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;Kn(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&&qn(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()},Ne)};try{d();let l=e.getReader();try{for(;;){let{done:p,value:u}=await l.read();if(p)break;if(i.signal.aborted)throw new Error("Stream idle timeout");d(),n+=t.decode(u,{stream:!0});let m;for(;(m=n.indexOf(`
37
+ `))!==-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 y;try{y=JSON.parse(f)}catch{continue}yield*this.processEvent(o,y,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}}}};async function Fg(r){return r.some(t=>t.audioUrls?.some($)||t.imageUrls?.some($))?Promise.all(r.map(async t=>{if(t.role!=="user")return t;let n={};return t.audioUrls?.some($)&&(n.audioUrls=await Promise.all(t.audioUrls.map(o=>$(o)?le(o):Promise.resolve(o)))),t.imageUrls?.some($)&&(n.imageUrls=await Promise.all(t.imageUrls.map(o=>$(o)?le(o):Promise.resolve(o)))),Object.keys(n).length>0?{...t,...n}:t})):r}function Bg(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(o)for(let d of t.videoUrls)c.push({type:"input_video",video_url:d});if(s)for(let d of t.audioUrls){let l=d,p=t.audioFormat??"mp3";if(d.startsWith("data:")){let u=/^data:audio\/([^;]+);base64,(.+)$/.exec(d);u&&(p=u[1]==="mpeg"?"mp3":u[1],l=u[2])}c.push({type:"input_audio",data:l,format:p})}if(i)for(let d of t.fileIds)if(d.id.startsWith("http://")||d.id.startsWith("https://")){let l=d.mimeType?`[Attached: ${d.id} (${d.mimeType})]`:`[Attached: ${d.id}]`;c.push({type:"input_text",text:l})}else 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 Wg=18e4,Gg=3e5,Hg=64e3,zg="[Tool execution failed; output not available during conversation recovery]",Vg="interleaved-thinking-2025-05-14",qg="context-1m-2025-08-07",Kg="token-efficient-tools-2026-03-28",Jg="prompt-caching-scope-2026-01-05",Yg="pdfs-2024-09-25";function Xg(r){let e=r.toLowerCase();return e.includes("opus-4-6")||e.includes("opus-4-7")||e.includes("sonnet-4-6")}function Qg(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(qg),n.push(Yg),e&&!o.includes("haiku")&&n.push(Vg),t&&n.push(Kg),n.push(Jg);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 nn=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??Wg,this.streamIdleTimeoutMs=e.streamIdleTimeoutMs??Ne,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=nf(e.messages),i=await of(s),{system:a,messages:c}=rf(i,this.quirks,e.model),d=tf(a,this.enablePromptCaching),l=!!e.reasoning,p=e.maxTokens??8192,u={model:e.model,messages:c,max_tokens:l?Math.max(p,4096):p,stream:!0};if(d&&(u.system=d),e.tools&&e.tools.length>0){let y=e.tools.map(sf);this.enablePromptCaching&&y.length>0&&(y[y.length-1].cache_control={type:"ephemeral"}),u.tools=y,e.toolChoice&&(u.tool_choice=e.toolChoice==="auto"?{type:"auto"}:e.toolChoice==="required"?{type:"any"}:{type:"none"})}if(!l&&e.temperature!==void 0&&(this.omitZeroTemperature&&e.temperature===0||(u.temperature=e.temperature)),!l&&e.topP!==void 0&&(u.top_p=e.topP),l)if(this.quirks.useEffortInsteadOfBudget){u.thinking={type:"enabled"};let y=this.quirks.maxReasoningEffort??"high",k=e.reasoning?.effort??"high",w=k==="low"||k==="medium"?"high":y;if(u.output_config={effort:w},a){let C=2166136261;for(let R=0;R<a.length;R++)C^=a.charCodeAt(R),C=Math.imul(C,16777619);u.metadata={user_id:`qa-${(C>>>0).toString(36)}`}}}else if(Xg(e.model))u.thinking={type:"adaptive"};else{let y=ef(e.reasoning.effort,e.maxTokens);u.thinking={type:"enabled",budget_tokens:Math.min(p-1,y)}}let m=Qg(e.model,l,(e.tools?.length??0)>0),g={"Content-Type":"application/json","x-api-key":t,"anthropic-version":this.apiVersion};m.length>0&&(g["anthropic-beta"]=m.join(","));let f=null;for(let y=0;y<=this.maxRetries;y++){if(n?.aborted)throw new Error("Request aborted");y>0&&f&&await Fe(je(y),n);try{yield*this.streamWithWatchdog(o,g,u,n);return}catch(k){f=k instanceof Error?k:new Error(String(k));let w=af(f.message),C=w!==null&&Vr.has(w),R=f.message.includes("Stream idle timeout");if(f.message.includes("model_context_window_exceeded")||f.message.includes("context_length_exceeded")||!C&&!R)throw f;if(y===this.maxRetries){if((R||C)&&!e.streamRequired)try{yield*this.nonStreamingFallback(o,g,u,n);return}catch{throw f}throw f}}}if(f)throw f}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 u=await a.text().catch(()=>""),m=new Error(`Anthropic API error ${a.status}: ${u.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)},p=()=>{c!==null&&(clearTimeout(c),c=null)};l();try{yield*this.parseSSEStream(a.body,l,()=>d)}finally{p()}if(d)throw new Error("Stream idle timeout - no chunks received")}async*nonStreamingFallback(e,t,n,o){let s=lf({...n,stream:!1}),i=AbortSignal.timeout(Gg),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(()=>""),p=new Error(`Anthropic API error ${c.status}: ${l.slice(0,500)}`);throw p.status=c.status,p}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:el(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(`
38
+ `))!==-1;){let p=s.slice(0,l).trim();if(s=s.slice(l+1),!p){i="";continue}if(p.startsWith("event:")){i=p.slice(6).trimStart();continue}if(!p.startsWith("data:"))continue;let u=p.slice(5).trimStart(),m;try{m=JSON.parse(u)}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&&(Za(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&&(Za(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:el(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 Za(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 el(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 Zg(r){return!/haiku/i.test(r)}var qr={high:16e3,medium:8e3,low:4e3};function ef(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 qr.high}return qr[r]??qr.high}function tf(r,e){if(r)return e?[{type:"text",text:r,cache_control:{type:"ephemeral"}}]:r}function nf(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 p=s.find(u=>u.id===l);e.push({role:"tool",tool_call_id:l,name:p?.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}async function of(r){return r.some(t=>t.imageUrls?.some($)||t.fileIds?.some(n=>$(n.id)))?Promise.all(r.map(async t=>{if(t.role!=="user")return t;let n={};return t.imageUrls?.some($)&&(n.imageUrls=await Promise.all(t.imageUrls.map(o=>$(o)?le(o):Promise.resolve(o)))),t.fileIds?.some(o=>$(o.id))&&(n.fileIds=await Promise.all(t.fileIds.map(async o=>{if(!$(o.id))return o;let s=await le(o.id,o.mimeType);return{...o,id:s}}))),Object.keys(n).length>0?{...t,...n}:t})):r}function rf(r,e={},t){let n,o=[];for(let s of r){if(s.role==="system"){n=n?`${n}
39
+
40
+ ${s.content??""}`:s.content??"";continue}if(s.role==="user"){let i=s.imageUrls&&s.imageUrls.length>0&&!e.filterImageBlocks,a=s.fileIds&&s.fileIds.length>0;if(i||a){let c=[];if(s.content&&c.push({type:"text",text:s.content}),i)for(let d of s.imageUrls)if(d.startsWith("data:")){let l=/^data:([^;]+);base64,(.+)$/.exec(d);if(l){let p=l[1];p==="application/pdf"?c.push({type:"document",source:{type:"base64",media_type:p,data:l[2]}}):c.push({type:"image",source:{type:"base64",media_type:p,data:l[2]}})}}else d.endsWith(".pdf")||d.includes(".pdf?")?c.push({type:"document",source:{type:"url",url:d}}):c.push({type:"image",source:{type:"url",url:d}});if(a)for(let d of s.fileIds){let l=d.mimeType||"";if(l==="application/pdf"||d.id.endsWith(".pdf"))if(d.id.startsWith("data:")){let p=/^data:[^;]+;base64,(.+)$/.exec(d.id);p&&c.push({type:"document",source:{type:"base64",media_type:"application/pdf",data:p[1]}})}else c.push({type:"document",source:{type:"url",url:d.id}});else{let p=l?`[Attached: ${d.id} (${l})]`:`[Attached: ${d.id}]`;c.push({type:"text",text:p})}}o.push({role:"user",content:c})}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===zg,c=s.toolReferences,l=c&&c.length>0&&!a&&(!t||Zg(t))?c.map(m=>({type:"tool_reference",tool_name:m})):i,p={type:"tool_result",tool_use_id:s.tool_call_id??"",content:l,...a&&{is_error:!0}},u=o[o.length-1];u&&u.role==="user"&&Array.isArray(u.content)?u.content.push(p):o.push({role:"user",content:[p]})}}return{system:n,messages:o}}function sf(r){return{name:r.function.name,description:r.function.description,input_schema:r.function.parameters??{type:"object",properties:{}}}}function af(r){let e=/Anthropic API error (\d{3})/.exec(r);return e?parseInt(e[1],10):null}function lf(r){let e=typeof r.max_tokens=="number"?r.max_tokens:8192,t=Math.min(e,Hg),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 Yn=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=await 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 Fe(je(d),n);try{yield*this.fetchAndStream(s,a,i,n);return}catch(l){c=l instanceof Error?l:new Error(String(l));let p=c.message.includes("Stream idle timeout");if(!Ve(qe(c))&&!p||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}async buildRequestBody(e){let t=this.resolveConstraints(e),n=await cf(t.messages),o={model:t.model,input:df(n),stream:!0};if(t.previousResponseId&&(o.previous_response_id=t.previousResponseId),t.store!==void 0&&(o.store=t.store),t.storeExpireAt!==void 0&&(o.expire_at=t.storeExpireAt),t.instructions&&(o.instructions=t.instructions),t.structuredOutput)if(t.structuredOutput.mode==="json_object")o.text={format:{type:"json_object"}};else{let i={type:"json_schema",name:t.structuredOutput.name,schema:t.structuredOutput.schema};t.structuredOutput.strict!==void 0&&(i.strict=t.structuredOutput.strict),o.text={format:i}}if(t.caching){let i={type:t.caching.type};t.caching.prefix!==void 0&&(i.prefix=t.caching.prefix),o.caching=i,t.caching.prefix&&(o.stream=!1)}if(t.contextManagement){let i=t.contextManagement.edits.map(a=>{let c={type:a.type};return a.type==="clear_thinking"&&a.keep!==void 0?c.keep=a.keep:a.type==="clear_tool_uses"&&(a.trigger&&(c.trigger=a.trigger),a.keep&&(c.keep=a.keep),a.excludeTools&&(c.exclude_tools=a.excludeTools),a.clearToolInput!==void 0&&(c.clear_tool_input=a.clearToolInput)),c});o.context_management={edits:i}}let s=[];if(t.tools&&t.tools.length>0)for(let i of t.tools)s.push({type:"function",name:i.function.name,description:i.function.description,parameters:i.function.parameters});if(t.builtinTools&&!t.disableBuiltinTools&&t.builtinTools.length>0)for(let i of t.builtinTools){let c={type:i.type.replace(/^builtin_/,"")};i.config&&Object.assign(c,i.config),s.push(c)}if(s.length>0&&(o.tools=s),t.maxToolCalls!==void 0&&(o.max_tool_calls=t.maxToolCalls),t.toolChoice!==void 0&&(typeof t.toolChoice=="string"?o.tool_choice=t.toolChoice:o.tool_choice={type:t.toolChoice.type,name:t.toolChoice.name}),t.temperature!==void 0&&(o.temperature=t.temperature),t.topP!==void 0&&(o.top_p=t.topP),t.maxTokens!==void 0&&(o.max_output_tokens=t.maxTokens),t.reasoning){let i=t.reasoning.effort??"high";i==="minimal"?o.thinking={type:"disabled"}:(o.thinking={type:"enabled"},o.reasoning={effort:i}),t.reasoning.includeEncryptedReasoning&&(o.include=["reasoning.encrypted_content"])}return t.prefixMessage&&o.input.push({role:"assistant",content:t.prefixMessage,partial:!0}),o}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()},Ne)};try{d();let l=e.getReader();try{for(;;){let{done:p,value:u}=await l.read();if(p)break;if(i.signal.aborted)throw new Error("Stream idle timeout");d(),n+=t.decode(u,{stream:!0});let m;for(;(m=n.indexOf(`
41
+ `))!==-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 y;try{y=JSON.parse(f)}catch{continue}yield*this.processEvent(o,y,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}}}};async function cf(r){return r.some(t=>t.imageUrls?.some($)||t.videoUrls?.some($)||t.audioUrls?.some($))?Promise.all(r.map(async t=>{if(t.role!=="user")return t;let n={};return t.imageUrls?.some($)&&(n.imageUrls=await Promise.all(t.imageUrls.map(o=>$(o)?le(o):Promise.resolve(o)))),t.videoUrls?.some($)&&(n.videoUrls=await Promise.all(t.videoUrls.map(o=>$(o)?le(o):Promise.resolve(o)))),t.audioUrls?.some($)&&(n.audioUrls=await Promise.all(t.audioUrls.map(o=>$(o)?le(o):Promise.resolve(o)))),Object.keys(n).length>0?{...t,...n}:t})):r}function df(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)if(d.id.startsWith("http://")||d.id.startsWith("https://")){let l=d.mimeType?`[Attached: ${d.id} (${d.mimeType})]`:`[Attached: ${d.id}]`;c.push({type:"input_text",text:l})}else 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}Qo();var uf=[{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 pf(r){switch(r){case"minimal":return"MINIMAL";case"low":return"LOW";case"medium":return"MEDIUM";case"high":return"HIGH";default:return"HIGH"}}var on=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=await 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 Fe(je(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(!Ve(qe(a))&&!l)throw a;if(c===3){if((l||Ve(qe(a)))&&!e.streamRequired)try{yield*this.nonStreamingFallback(e,t,n);return}catch{throw a}throw a}}}}async buildRequestBody(e){let t=await mf(e.messages),{systemInstruction:n,contents:o}=gf(t),s={contents:o};n&&(s.system_instruction=n);let i=this.buildTools(e);i.length>0&&(s.tools=i),e.tools&&e.tools.length>0&&e.toolChoice&&(s.toolConfig=this.buildToolConfig(e.toolChoice));let a=this.buildGenerationConfig(e);return Object.keys(a).length>0&&(s.generationConfig=a),s.safetySettings=uf,e.cachedContent&&(s.cachedContent=e.cachedContent),s}buildTools(e){let t=[];if(e.tools&&e.tools.length>0){let n=e.tools.map(ff);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=pf(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()},Ne)};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(`
42
+ `))!==-1;){let p=n.slice(0,l).trim();if(n=n.slice(l+1),!p||p.startsWith(":")||!p.startsWith("data: "))continue;let u=p.slice(6);if(u==="[DONE]")return;let m;try{m=JSON.parse(u)}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:`
43
43
  \`\`\`output
44
44
  ${s.codeExecutionResult.output??""}
45
45
  \`\`\`
@@ -47,8 +47,27 @@ ${s.codeExecutionResult.output??""}
47
47
  \`\`\`${s.executableCode.language??"python"}
48
48
  ${s.executableCode.code}
49
49
  \`\`\`
50
- `};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:pg(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 dg(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 ug(r){let e={name:r.function.name,description:r.function.description};return r.function.parameters&&(e.parameters=Ie(r.function.parameters)),e}function pg(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 Ar(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:mg(t,n),apiKey:r.apiKey,resolvedModel:r.model,providerDef:t}}function mg(r,e){let t;switch(r.transport){case"openai-chat":t=new bt({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 bt({baseUrl:n,quirks:r.quirks});return new Cr(t,o)}return t}var Cr=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 gg}from"node:path";import{mkdirSync as fg,appendFileSync as hg}from"node:fs";var Ra=sa();function Pr(){return process.env.QLOGICAGENT_DEBUG==="1"}function Ir(r,e){let t=gg(Ra,`${e}.jsonl`),n=!1;function o(){n||(fg(Ra,{recursive:!0}),n=!0)}function s(i){try{o(),hg(t,JSON.stringify(i)+`
51
- `,"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 Mr(r){return typeof r.deleteVideoTask=="function"&&typeof r.listVideoTasks=="function"}function Ca(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 $n={MAX_SESSION_BYTES:61440,LIMIT_PER_RECALL:10,MAX_SURFACED_ENTRIES:100};function kt(){return{surfacedPaths:new Set,sessionBytes:0}}function Aa(r,e,t){let n=[],o=t??kt(),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>=$n.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:$n.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>$n.MAX_SESSION_BYTES)return!1;if(o.surfacedPaths.add(g),o.sessionBytes+=f,o.surfacedPaths.size>$n.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 yg}from"qlogicagent-adapter-claw";var Pa="qmemory";function Ia(r){let e=new yg({baseUrl:r.baseUrl,apiKey:r.apiKey,timeout:r.timeoutMs??5e3});function t(n){return r.userIdPrefix?`${r.userIdPrefix}:${n}`:n}return{providerId:Pa,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:Pa,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 $a,writeFile as Or,stat as Wa,unlink as xg,mkdir as Sg}from"node:fs/promises";import{join as Nn,resolve as Na,isAbsolute as Ua,normalize as ja}from"node:path";import{randomUUID as _g}from"node:crypto";function Ma(){return{toolUseCount:0,latestInputTokens:0,cumulativeOutputTokens:0,recentActivities:[]}}function bg(r){return r.latestInputTokens+r.cumulativeOutputTokens}var kg=new Set(["grep","glob","search","Grep","Glob","list_dir","find_files"]),Ea=new Set(["read_file","file_read","cat","head","tail","FileRead"]);function Tg(r){return{isSearch:kg.has(r)||void 0,isRead:Ea.has(r)||void 0}}function wg(r,e){let t=e.file_path??e.path??e.filePath;if(typeof t=="string")return`${Ea.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 Oa(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 La(r,e,t,n){r.toolUseCount++;let o=Tg(e),s={toolName:e,input:t,activityDescription:n?.(e,t)??wg(e,t),isSearch:o.isSearch,isRead:o.isRead};for(r.recentActivities.push(s);r.recentActivities.length>5;)r.recentActivities.shift()}function Er(r){return{toolUseCount:r.toolUseCount,tokenCount:bg(r),lastActivity:r.recentActivities.length>0?r.recentActivities[r.recentActivities.length-1]:void 0,recentActivities:[...r.recentActivities]}}import{randomUUID as Da}from"node:crypto";function vg(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=Ma(),{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:M}=r,O=vg(T),$=`fork-${f}-${Da().slice(0,8)}`,v=`fork-session-${Da().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 $e=c(me,ye);return $e.allowed?l.invoke(re,me,V,B):(m.info(`[fork:${f}] tool ${me} denied: ${$e.reason}`),{result:"",error:$e.reason})}}:l,F=!0,j;try{let{Agent:re}=await Promise.resolve().then(()=>(kr(),na)),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:M}},O.signal)){if(t.push(V),_?.(V),V.type==="end"&&V.usage&&(Oa(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{}La(o,V.name,B),R?.(Er(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:Er(o),durationMs:oe,ok:F,error:j}}var Ha={minHours:24,minSessions:5,scanIntervalMs:6e5},Un=".consolidate-lock",Rg=3600*1e3,Fa="CLAUDE.md",Cg=100,Ag=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"]),Pg=new Set(["log","show","diff","status","branch","tag","remote","rev-parse","rev-list","ls-files","ls-tree","describe","blame","shortlog","name-rev","cat-file"]),Ig=/[|>&]|>>|>\s|rm\s|mv\s|cp\s|chmod\s|chown\s|mkdir\s|touch\s/;function Mg(r){let e=r.trim();if(!e||Ig.test(e))return!1;let t=e.split(/\s+/),n=t[0]?.replace(/^(\/usr\/bin\/|\/bin\/|\/usr\/local\/bin\/)/,"")??"";if(!Ag.has(n))return!1;if(n==="git"){let o=t[1];if(!o||!Pg.has(o))return!1}return!0}function Eg(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 Mg(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"&&za(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 za(r,e){let t=Ua(r)?r:Na(r),n=Ua(e)?e:Na(e),o=ja(t),s=ja(n);return o.startsWith(s)}function Va(r,e,t,n){let o=n?.hasQMemory?`
50
+ `};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:hf(t.finishReason)})}}async*nonStreamingFallback(e,t,n){let o=`${this.baseUrl}/models/${encodeURIComponent(e.model)}:generateContent`,s=await 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)}};async function mf(r){return r.some(t=>t.imageUrls?.some($)||t.videoUrls?.some($)||t.audioUrls?.some($)||t.fileIds?.some(n=>$(n.id)))?Promise.all(r.map(async t=>{if(t.role!=="user")return t;let n={};return t.imageUrls?.some($)&&(n.imageUrls=await Promise.all(t.imageUrls.map(o=>$(o)?le(o):Promise.resolve(o)))),t.videoUrls?.some($)&&(n.videoUrls=await Promise.all(t.videoUrls.map(o=>$(o)?le(o):Promise.resolve(o)))),t.audioUrls?.some($)&&(n.audioUrls=await Promise.all(t.audioUrls.map(o=>$(o)?le(o):Promise.resolve(o)))),t.fileIds?.some(o=>$(o.id))&&(n.fileIds=await Promise.all(t.fileIds.map(async o=>{if(!$(o.id))return o;let s=await le(o.id,o.mimeType);return{...o,id:s}}))),Object.keys(n).length>0?{...t,...n}:t})):r}function gf(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}});if(s.fileIds&&s.fileIds.length>0)for(let a of s.fileIds)if(a.id.startsWith("data:")){let c=a.id.match(/^data:([^;]+);base64,(.+)$/);c&&i.push({inlineData:{mimeType:c[1],data:c[2]}})}else a.id.startsWith("http://")||a.id.startsWith("https://")?i.push({fileData:{mimeType:a.mimeType??"application/octet-stream",fileUri:a.id}}):i.push({fileData:{mimeType:a.mimeType??"application/octet-stream",fileUri:a.id}});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 ff(r){let e={name:r.function.name,description:r.function.description};return r.function.parameters&&(e.parameters=Ue(r.function.parameters)),e}function hf(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 Jr(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:yf(t,n),apiKey:r.apiKey,resolvedModel:r.model,providerDef:t}}function yf(r,e){let t;switch(r.transport){case"openai-chat":t=new Ct({baseUrl:e,extraHeaders:r.extraHeaders,supportsStreamOptions:r.supportsStreamOptions,omitZeroTemperature:r.omitZeroTemperature,quirks:r.quirks});break;case"openai-responses":t=new Jn({baseUrl:e,extraHeaders:r.extraHeaders,quirks:r.quirks});break;case"anthropic-messages":t=new nn({baseUrl:e,omitZeroTemperature:r.omitZeroTemperature,quirks:r.quirks});break;case"volcengine-responses":t=new Yn({baseUrl:e,extraHeaders:r.extraHeaders,quirks:r.quirks});break;case"gemini-generatecontent":t=new on({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 Ct({baseUrl:n,quirks:r.quirks});return new Kr(t,o)}return t}var Kr=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 rn=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 p=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(!p.ok){let m=await p.text().catch(()=>"");throw new Error(`Gemini file upload error ${p.status}: ${m.slice(0,500)}`)}return(await p.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 bf}from"node:path";import{mkdirSync as kf,appendFileSync as Tf}from"node:fs";var tl=Oa();function Yr(){return process.env.QLOGICAGENT_DEBUG==="1"}function Xr(r,e){let t=bf(tl,`${e}.jsonl`),n=!1;function o(){n||(kf(tl,{recursive:!0}),n=!0)}function s(i){try{o(),Tf(t,JSON.stringify(i)+`
51
+ `,"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,p=0,u=0,m="",g;try{for await(let f of r.stream(i,a,c))f.type==="usage"?(l=f.promptTokens,p=f.completionTokens,u=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:p,reasoningTokens:u,finishReason:m,...g?{error:g}:{}})}}}}function Qr(r){return typeof r.deleteVideoTask=="function"&&typeof r.listVideoTasks=="function"}function nl(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}}}}import{readFile as ol,readdir as wf,stat as vf}from"node:fs/promises";import{existsSync as rl}from"node:fs";import{join as xf}from"node:path";var Pe={MAX_SCAN_FILES:100,MAX_SELECTED:5,MAX_FILE_BYTES:4096,MAX_TOTAL_BYTES:20*1024,MIN_SCORE:.2,HEADER_LINES:10,RECENCY_DAYS:7,RECENCY_BOOST:.15};async function sl(r,e,t=new Set){if(!r.trim()||!rl(e))return[];let n=r.trim().split(/\s+/);if(n.length<2&&n[0].length<4)return[];let o=await Sf(e);if(o.length===0)return[];let s=o.filter(c=>!t.has(c.filePath));if(s.length===0)return[];let a=Rf(r,s).filter(c=>c.score>=Pe.MIN_SCORE).slice(0,Pe.MAX_SELECTED);return a.length===0?[]:_f(a)}async function Sf(r){if(!rl(r))return[];let e;try{e=await wf(r)}catch{return[]}let t=e.filter(o=>o.endsWith(".md")&&o!=="INDEX.md");return(await Promise.allSettled(t.map(async o=>{let s=xf(r,o),i=await vf(s),c=(await ol(s,"utf-8")).split(`
52
+ `),d=null;for(let p=0;p<Math.min(c.length,Pe.HEADER_LINES);p++){let u=c[p].trim();if(!(!u||u.startsWith("#")||u.startsWith("---"))){d=u.slice(0,150);break}}let l=Cf(o);return{filename:o,filePath:s,mtimeMs:i.mtimeMs,sizeBytes:i.size,description:d,category:l}}))).filter(o=>o.status==="fulfilled").map(o=>o.value).sort((o,s)=>s.mtimeMs-o.mtimeMs).slice(0,Pe.MAX_SCAN_FILES)}function Rf(r,e){let t=Zr(r);if(t.length===0)return[];let n=Date.now(),o=Pe.RECENCY_DAYS*24*60*60*1e3;return e.map(i=>{let a=0,c=Zr(i.filename.replace(/\.md$/,"").replace(/[-_]/g," ")),d=t.filter(l=>c.some(p=>p.includes(l)||l.includes(p))).length;if(a+=Math.min(.5,d/t.length*.5),i.description){let l=Zr(i.description),p=t.filter(u=>l.some(m=>m.includes(u)||u.includes(m))).length;a+=Math.min(.3,p/t.length*.3)}return i.category&&Af(r).includes(i.category)&&(a+=.1),n-i.mtimeMs<o&&(a+=Pe.RECENCY_BOOST),{header:i,score:a}}).sort((i,a)=>a.score-i.score)}async function _f(r){let e=[],t=0;for(let{header:n,score:o}of r){if(t>=Pe.MAX_TOTAL_BYTES)break;try{let s=await ol(n.filePath,"utf-8"),i=!1;s.length>Pe.MAX_FILE_BYTES&&(s=s.slice(0,Pe.MAX_FILE_BYTES)+`
53
+
54
+ > [Truncated at ${Pe.MAX_FILE_BYTES} bytes. Use memory tool read_file for full content: ${n.filename}]`,i=!0);let a=Buffer.byteLength(s,"utf-8");if(t+a>Pe.MAX_TOTAL_BYTES){let c=Pe.MAX_TOTAL_BYTES-t;s=s.slice(0,c)+`
55
+
56
+ > [Truncated to fit session budget. Use memory tool read_file for full content: ${n.filename}]`,i=!0}t+=Buffer.byteLength(s,"utf-8"),e.push({filename:n.filename,filePath:n.filePath,mtimeMs:n.mtimeMs,score:o,content:s,truncated:i})}catch{}}return e}function Zr(r){return r.toLowerCase().replace(/[^\w\u4e00-\u9fff]+/g," ").split(/\s+/).filter(e=>e.length>1)}function Cf(r){let e=r.replace(/\.md$/,""),t=["lesson","project","pattern","preference","fact","decision","task","reference"];for(let n of t)if(e.startsWith(n+"-")||e.startsWith(n+"_"))return n;return null}function Af(r){let e=[],t=r.toLowerCase();return/(?:bug|error|fix|debug|issue|问题|报错|修复)/.test(t)&&e.push("lesson"),/(?:architecture|设计|架构|决定|decision)/.test(t)&&e.push("decision"),/(?:pattern|convention|惯例|标准|practice)/.test(t)&&e.push("pattern"),/(?:prefer|style|偏好|风格|习惯)/.test(t)&&e.push("preference"),/(?:deploy|port|config|version|部署|配置|环境)/.test(t)&&e.push("fact"),/(?:project|repo|codebase|项目|仓库)/.test(t)&&e.push("project"),/(?:task|todo|plan|任务|计划)/.test(t)&&e.push("task"),/(?:api|doc|guide|reference|文档|手册)/.test(t)&&e.push("reference"),e}function il(r){if(r.length===0)return"";let e=Date.now();return r.map(n=>{let o=Math.floor((e-n.mtimeMs)/864e5);return`## Memory (saved ${o===0?"today":o===1?"yesterday":`${o} days ago`}): ${n.filename}
57
+
58
+ ${n.content}`}).join(`
59
+
60
+ ---
61
+
62
+ `)}Br();var At={MAX_SESSION_BYTES:60*1024,LIMIT_PER_RECALL:10,MAX_SURFACED_ENTRIES:100};function gt(){return{surfacedPaths:new Set,sessionBytes:0}}function al(r,e,t){let n=[],o=t??gt(),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>=At.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:At.LIMIT_PER_RECALL}),l=d.filter(u=>{let m=u,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>At.MAX_SESSION_BYTES)return!1;if(o.surfacedPaths.add(g),o.sessionBytes+=f,o.surfacedPaths.size>At.MAX_SURFACED_ENTRIES){let y=o.surfacedPaths.values().next().value;y!==void 0&&o.surfacedPaths.delete(y)}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 p=l.map(u=>{let m=u;return{text:m.text??m.content??"",score:m.score,category:m.metadata?.category??null}}).filter(u=>u.text);if(c.preferredCategories?.length||c.deprioritizedCategories?.length){let u={scenario:"general",preferred:c.preferredCategories??[],deprioritized:c.deprioritizedCategories??[],confidence:1};p=p.map(m=>({...m,score:Fr(m.score??.5,m.category,u)})).sort((m,g)=>(g.score??0)-(m.score??0))}return{action:"continue",context:{...c,recalledMemories:p}}}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=[]}}function ll(r,e,t){let n=t??gt();return r.register({point:"memory.before_recall",priority:40,label:"memdir-cross-file-recall",handler:async(s,i)=>{let a=e.getMemdir();if(!a||!i.query)return{action:"continue",context:i};if(n.sessionBytes>=At.MAX_SESSION_BYTES)return e.log.debug("memdir-recall: session byte budget exhausted, skipping"),{action:"continue",context:i};try{let c=a.getRootPath(),d=await sl(i.query,c,n.surfacedPaths);if(d.length===0)return{action:"continue",context:i};if(i.preferredCategories?.length||i.deprioritizedCategories?.length){let g={scenario:"general",preferred:i.preferredCategories??[],deprioritized:i.deprioritizedCategories??[],confidence:1};d=d.map(f=>({...f,score:Fr(f.score,Ca(f.filename),g)})).sort((f,y)=>y.score-f.score)}let l=d.filter(g=>{let f=Buffer.byteLength(g.content,"utf-8");return n.sessionBytes+f>At.MAX_SESSION_BYTES?!1:(n.surfacedPaths.add(g.filePath),n.sessionBytes+=f,!0)});if(l.length===0)return{action:"continue",context:i};e.log.debug(`memdir-recall: found ${d.length} \u2192 accepted ${l.length} files (${n.sessionBytes} bytes used)`);let p=il(l),u=i.recalledMemories??[];return{action:"continue",context:{...i,recalledMemories:[...[{text:p,score:.9}],...u]}}}catch(c){e.log.warn(`memdir-recall: cross-file recall failed: ${c instanceof Error?c.message:String(c)}`)}return{action:"continue",context:i}}})}import*as Zn from"node:fs";import*as sn from"node:path";var Qn={MAX_RECALLED_SKILLS:3,MAX_SKILL_CONTENT_CHARS:800,CACHE_TTL_MS:300*1e3};function If(r){let e=[/之前.{0,8}(?:做过|写过|实现过|处理过|用过|搞过|弄过)/,/以前.{0,8}(?:做过|写过|实现过|处理过|用过)/,/(?:上次|上回|之前|以前).{0,12}(?:不是|是不是|已经).{0,8}(?:做|写|实现|处理)/,/(?:参考|参照|照着|按照).{0,6}(?:项目|工程|仓库)/,/(?:那个|那边|另一个).{0,6}(?:项目|工程).{0,6}(?:里|中|的)/,/(?:跟|和|像).{0,6}(?:项目|工程).{0,6}(?:一样|类似|差不多)/,/(?:复用|重用|搬过来|拿过来|移过来|copy过来)/],t=[/(?:before|previously|earlier|last time).{0,20}(?:did|done|made|built|implemented|wrote)/i,/(?:didn't|did) you.{0,15}(?:already|before|earlier)/i,/(?:same|similar).{0,10}(?:as|to|like).{0,10}(?:project|repo)/i,/(?:reuse|re-use|copy from|bring over|port from).{0,15}(?:project|repo)/i,/(?:remember|recall).{0,10}(?:doing|making|building|writing)/i,/(?:other|another|different)\s+project/i];if(![...e,...t].some(i=>i.test(r)))return null;let s=Mf(r);return s.length>0?s:null}function Mf(r){let t=r.replace(/之前|以前|上次|上回|不是|是不是|已经|做过|写过|实现过|处理过|用过|搞过|弄过/g," ").replace(/参考|参照|照着|按照|项目|工程|仓库|那个|那边|另一个|里|中|的|跟|和|像|一样|类似|差不多/g," ").replace(/复用|重用|搬过来|拿过来|移过来/g," ").replace(/\b(the|a|an|is|was|were|did|didn't|do|you|i|we|it|this|that|before|previously|earlier|last|time|already|same|similar|as|to|like|from|project|repo|remember|recall|doing|making|building|writing|other|another|different)\b/gi," ").trim().split(/[\s,;.!?,。!?、;:""''()\[\]{}]+/).filter(n=>n.length>=2).map(n=>n.toLowerCase());return[...new Set(t)].slice(0,8)}var Xn=null,es=0;function Pf(r){let e=Date.now();if(Xn&&e-es<Qn.CACHE_TTL_MS)return Xn;let t=[],n=za(r);for(let o of n){let s=sn.join(o,".qlogicagent","skills");try{let i=Zn.readdirSync(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory())continue;let c=sn.join(s,a.name,"SKILL.md");try{let d=Zn.readFileSync(c,"utf8"),l=d.split(`
63
+ `).slice(0,5).join(" ").toLowerCase();t.push({name:a.name,projectDir:o,projectName:sn.basename(o),content:d,searchText:`${a.name.toLowerCase()} ${l}`})}catch{}}}catch{}}return Xn=t,es=e,t}function Ef(r,e){if(r.length===0)return[];let t=Pf(e);return t.length===0?[]:t.map(o=>{let s=0;for(let i of r)o.searchText.includes(i)&&(s+=2),o.name.includes(i)&&(s+=3);return{skill:o,score:s}}).filter(o=>o.score>0).sort((o,s)=>s.score-o.score).slice(0,Qn.MAX_RECALLED_SKILLS).map(o=>o.skill)}function cl(r,e){return r.register({point:"memory.before_recall",priority:60,label:"cross-project-skill-recall",handler:(n,o)=>{let s=o.query;if(!s)return{action:"continue",context:o};let i=If(s);if(!i)return{action:"continue",context:o};e.log.debug(`skill-recall: retrospective trigger detected, keywords: [${i.join(", ")}]`);let a=Ef(i,e.currentCwd);if(a.length===0)return e.log.debug("skill-recall: no cross-project skill matches found"),{action:"continue",context:o};e.log.debug(`skill-recall: found ${a.length} cross-project skill(s): ${a.map(l=>`${l.name}@${l.projectName}`).join(", ")}`);let c=o.recalledMemories??[],d=a.map(l=>{let p=l.content.length>Qn.MAX_SKILL_CONTENT_CHARS?l.content.slice(0,Qn.MAX_SKILL_CONTENT_CHARS)+`
64
+ ...(truncated)`:l.content;return{text:[`[Cross-project skill available] Skill "${l.name}" learned in project "${l.projectName}" (${l.projectDir}):`,p,`\u2192 To use this skill in current project: use skill tool with action "create" name "${l.name}" and copy the content above`,`\u2192 After creating locally, promote to global: skill tool with action "promote" name "${l.name}"`,"\u2192 Or just follow the instructions above directly without saving"].join(`
65
+ `),score:.85}});return{action:"continue",context:{...o,recalledMemories:[...c,...d]}}}})}function an(){Xn=null,es=0}import{ClawQMemoryAdapter as Of}from"qlogicagent-adapter-claw";var dl="qmemory";function ul(r){let e=new Of({baseUrl:r.baseUrl,apiKey:r.apiKey,timeout:r.timeoutMs??5e3});function t(n){return r.userIdPrefix?`${r.userIdPrefix}:${n}`:n}return{providerId:dl,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:dl,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}:{}})},async triggerDecay(n,o){let s=await e.dispatch("memory.decay",{user_id:t(n),temporal_expiry:o?.temporalExpiry??!0,staleness_decay:o?.stalenessDecay??!0,noise_archival:o?.noiseArchival??!0});return{decayed:s.decayed??0,archived:s.archived??0}}}}import{readFile as kl,writeFile as ns,stat as _l,unlink as Kf,mkdir as Jf}from"node:fs/promises";import{join as eo,resolve as Tl,isAbsolute as wl,normalize as vl}from"node:path";import{randomUUID as Yf}from"node:crypto";function pl(){return{toolUseCount:0,latestInputTokens:0,cumulativeOutputTokens:0,recentActivities:[]}}function Df(r){return r.latestInputTokens+r.cumulativeOutputTokens}var $f=new Set(["grep","glob","search","Grep","Glob","list_dir","find_files"]),ml=new Set(["read_file","file_read","cat","head","tail","FileRead"]);function Lf(r){return{isSearch:$f.has(r)||void 0,isRead:ml.has(r)||void 0}}function Uf(r,e){let t=e.file_path??e.path??e.filePath;if(typeof t=="string")return`${ml.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 gl(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 fl(r,e,t,n){r.toolUseCount++;let o=Lf(e),s={toolName:e,input:t,activityDescription:n?.(e,t)??Uf(e,t),isSearch:o.isSearch,isRead:o.isRead};for(r.recentActivities.push(s);r.recentActivities.length>5;)r.recentActivities.shift()}function ts(r){return{toolUseCount:r.toolUseCount,tokenCount:Df(r),lastActivity:r.recentActivities.length>0?r.recentActivities[r.recentActivities.length-1]:void 0,recentActivities:[...r.recentActivities]}}import{randomUUID as hl}from"node:crypto";function Nf(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 ln(r){let e=Date.now(),t=[],n={prompt:0,completion:0},o=pl(),{promptMessages:s,systemPrompt:i,tools:a,canUseTool:c,transport:d,toolInvoker:l,apiKey:p,model:u,log:m,hooks:g,forkLabel:f,maxTurns:y,temperature:k,parentSignal:w,onEvent:C,onProgress:R,budgetTokens:b,parentDepth:E}=r,P=Nf(w),U=`fork-${f}-${hl().slice(0,8)}`,v=`fork-session-${hl().slice(0,8)}`;m.info(`[fork:${f}] starting \u2014 ${s.length} initial messages, model=${u}`);let ie=c?{invoke:async(Re,ae,H,X)=>{let te={};try{te=JSON.parse(H)}catch{}let Ge=c(ae,te);return Ge.allowed?l.invoke(Re,ae,H,X):(m.info(`[fork:${f}] tool ${ae} denied: ${Ge.reason}`),{result:"",error:Ge.reason})}}:l,Y=!0,D;try{let{Agent:Re}=await Promise.resolve().then(()=>(Wr(),Ia)),ae=new Re({llmTransport:d,apiKey:p,toolInvoker:ie,log:m,hooks:g,maxRounds:y});for await(let H of ae.run({turnId:U,sessionId:v,messages:s,tools:a,systemPrompt:i,config:{model:u,apiKey:p,temperature:k,maxOutputTokens:r.maxOutputTokens,parentDepth:E}},P.signal)){if(t.push(H),C?.(H),H.type==="end"&&H.usage&&(gl(o,{input_tokens:H.usage.prompt,output_tokens:H.usage.completion}),n.prompt+=H.usage.prompt,n.completion+=H.usage.completion,H.usage.cacheRead&&(n.cacheRead=(n.cacheRead??0)+H.usage.cacheRead),H.usage.cacheCreation&&(n.cacheCreation=(n.cacheCreation??0)+H.usage.cacheCreation),b&&b>0)){let X=n.prompt+n.completion+(n.reasoning??0);X>=b&&(m.info(`[fork:${f}] budget exceeded (${X} / ${b} tokens), aborting`),P.abort("budget_exceeded"))}if(H.type==="tool_call"){let X={};try{X=JSON.parse(H.arguments??"{}")}catch{}fl(o,H.name,X),R?.(ts(o))}H.type==="error"&&(Y=!1,D=H.error)}}catch(Re){Y=!1,D=Re instanceof Error?Re.message:String(Re),m.warn(`[fork:${f}] error: ${D}`)}finally{P.signal.aborted||P.abort("fork_complete")}let pe=Date.now()-e;return m.info(`[fork:${f}] finished in ${pe}ms \u2014 ${t.length} events, usage: prompt=${n.prompt} completion=${n.completion}, ok=${Y}`),{events:t,totalUsage:n,progress:ts(o),durationMs:pe,ok:Y,error:D}}import{readFile as jf,readdir as Ff}from"node:fs/promises";import{existsSync as Bf}from"node:fs";import{join as Wf}from"node:path";var Gf={lesson:"lesson",debug:"lesson",gotcha:"lesson",fix:"lesson",preference:"preference",style:"preference",pattern:"pattern",convention:"pattern",practice:"pattern",fact:"fact",config:"fact",architecture:"fact",env:"fact",deploy:"fact",decision:"decision",choice:"decision",tradeoff:"decision",skill:"skill-learning",workflow:"skill-learning"},Hf={lesson:[/(?:原来|root cause|turns out|the issue was|问题出在|踩坑|gotcha|pitfall)/i,/(?:以后|下次|remember to|don't forget|务必|切记)/i],preference:[/(?:我(?:喜欢|偏好|习惯)|I (?:prefer|like|always))/i,/(?:请(?:用|使用)|please use|always use)/i],pattern:[/(?:每次|always|whenever|pattern|惯例|convention|best practice)/i],fact:[/(?:架构|architecture|port|version|部署|deployed|环境|配置|config)/i],decision:[/(?:决定|decided|选择|chosen|采用|因为|because|rationale|trade-?off)/i],"skill-learning":[/(?:skill|workflow|tool|command|命令|工具)/i]};function zf(r){let e=r.replace(/\.md$/,"").toLowerCase();for(let[t,n]of Object.entries(Gf))if(e.startsWith(t+"-")||e.startsWith(t+"_")||e===t)return n;return null}function Vf(r){let e=r.slice(0,500),t=null,n=0;for(let[o,s]of Object.entries(Hf)){let i=s.filter(a=>a.test(e)).length;i>n&&(n=i,t=o)}return t}async function yl(r){let e={},t=0,n=0;if(!Bf(r))return{categories:e,totalFiles:0,uncategorizedCount:0};let o;try{o=await Ff(r)}catch{return{categories:e,totalFiles:0,uncategorizedCount:0}}let s=o.filter(i=>i.endsWith(".md")&&i!=="INDEX.md");for(let i of s){let a=Wf(r,i);try{let c=await jf(a,"utf-8");t++;let d=zf(i)??Vf(c)??"uncategorized";d==="uncategorized"&&n++;let l=c.split(`
66
+ `),p="";for(let m of l){let g=m.trim();if(!(!g||g.startsWith("#")||g.startsWith("---"))){p=g.slice(0,120);break}}let u=l.filter(m=>/^\s*[-*+]\s|^\s*\d+[.)]\s/.test(m)).length;e[d]||(e[d]=[]),e[d].push({filename:i,category:d,description:p,sizeBytes:Buffer.byteLength(c,"utf-8"),entryCount:u})}catch{}}return{categories:e,totalFiles:t,uncategorizedCount:n}}var qf={fact:"SUPERSEDE: If a newer fact contradicts an older one (e.g. port changed, version updated), update the existing entry in-place. Do not keep both \u2014 stale facts cause confusion. Convert relative dates to absolute. Mark the update date.",lesson:"ACCUMULATE: Lessons learned are valuable even when old. Append new insights to existing lesson files. Only remove a lesson if it's provably wrong (not just outdated). Group related lessons under the same topic file.",preference:"OVERWRITE: User preferences evolve. If a newer statement contradicts an older preference, the newer one wins. Remove the old entry and write the current preference. Keep preferences concise (one line each).",pattern:"MERGE: If multiple entries describe the same pattern, merge them into one authoritative entry with examples. Remove redundant duplicates. A pattern that's been superseded by a better practice should be removed.",decision:"UPDATE: Decisions have context and rationale. When a decision changes, don't delete the old one \u2014 add an 'Updated (date):' section explaining what changed and why. This preserves the decision history.","skill-learning":"CONSOLIDATE: Group related skill entries by tool/workflow. Remove entries for skills that are now obvious or well-documented elsewhere. Keep the most actionable version of each skill note.",uncategorized:"CLASSIFY: Try to infer a category from the content. If it matches lesson/preference/pattern/fact/decision, rename the file with the appropriate prefix. If truly uncategorizable, leave as-is but ensure it has a clear description."};function bl(r){if(r.totalFiles===0)return"\n## Category Context\n\nNo existing memory files found. Create new files using the naming convention: `<category>-<topic>.md` (e.g. `lesson-docker.md`, `fact-ports.md`, `decision-framework.md`).\n";let e=[];e.push(`
67
+ ## Category Context (${r.totalFiles} files)
68
+ `),e.push(`Use category-specific merge rules when updating files:
69
+ `);for(let[t,n]of Object.entries(r.categories)){if(n.length===0)continue;let o=qf[t]??"",s=n.reduce((i,a)=>i+a.entryCount,0);e.push(`### ${t} (${n.length} files, ~${s} entries)`),e.push(`**Merge rule**: ${o}`),e.push("Files:");for(let i of n.slice(0,10)){let a=i.description?` \u2014 ${i.description}`:"";e.push(`- \`${i.filename}\` (${i.entryCount} entries, ${Math.ceil(i.sizeBytes/1024)}KB)${a}`)}n.length>10&&e.push(`- ... and ${n.length-10} more files`),e.push("")}return e.push("### File naming convention"),e.push("New files MUST use category prefix: `<category>-<topic>.md`"),e.push("Valid prefixes: lesson-, preference-, pattern-, fact-, decision-, skill-"),e.push(""),e.join(`
70
+ `)}var Cl={minHours:24,minSessions:5,scanIntervalMs:6e5},to=".consolidate-lock",Xf=3600*1e3,xl="CLAUDE.md",Qf=100,Zf=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"]),eh=new Set(["log","show","diff","status","branch","tag","remote","rev-parse","rev-list","ls-files","ls-tree","describe","blame","shortlog","name-rev","cat-file"]),th=/[|>&]|>>|>\s|rm\s|mv\s|cp\s|chmod\s|chown\s|mkdir\s|touch\s/;function nh(r){let e=r.trim();if(!e||th.test(e))return!1;let t=e.split(/\s+/),n=t[0]?.replace(/^(\/usr\/bin\/|\/bin\/|\/usr\/local\/bin\/)/,"")??"";if(!Zf.has(n))return!1;if(n==="git"){let o=t[1];if(!o||!eh.has(o))return!1}return!0}function oh(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 nh(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"&&Al(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 Al(r,e){let t=wl(r)?r:Tl(r),n=wl(e)?e:Tl(e),o=vl(t),s=vl(n);return o.startsWith(s)}function Il(r,e,t,n){let o=n?.hasQMemory?`
52
71
 
53
72
  ## Phase 2.5 \u2014 Long-term memory triage (QMemory)
54
73
 
@@ -83,7 +102,7 @@ Session transcripts: \`${e}\` (large JSONL files \u2014 grep narrowly, don't rea
83
102
  ## Phase 1 \u2014 Orient
84
103
 
85
104
  - \`ls\` the memory directory to see what already exists
86
- - Read \`${Fa}\` to understand the current index
105
+ - Read \`${xl}\` to understand the current index
87
106
  - Skim existing topic files so you improve them rather than creating duplicates
88
107
  - If \`logs/\` or \`sessions/\` subdirectories exist, review recent entries there
89
108
 
@@ -97,7 +116,7 @@ Look for new information worth persisting. Sources in rough priority order:
97
116
  \`grep -rn "<narrow term>" ${e}/ --include="*.jsonl" | tail -50\`
98
117
 
99
118
  Don't exhaustively read transcripts. Look only for things you already suspect matter.
100
- ${o}
119
+ ${o}${n?.categoryContext??""}
101
120
  ## Phase 3 \u2014 Consolidate
102
121
 
103
122
  For each thing worth remembering, write or update a memory file at the top level of the memory directory.
@@ -109,7 +128,7 @@ Focus on:
109
128
 
110
129
  ## Phase 4 \u2014 Prune and index
111
130
 
112
- Update \`${Fa}\` so it stays under ${Cg} 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.
131
+ Update \`${xl}\` so it stays under ${Qf} 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.
113
132
 
114
133
  - Remove pointers to memories that are now stale, wrong, or superseded
115
134
  - 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
@@ -124,162 +143,162 @@ Sessions since last consolidation (${t.length}):
124
143
  ${t.map(s=>`- ${s}`).join(`
125
144
  `)}
126
145
 
127
- Return a brief summary of what you consolidated, updated, or pruned. If nothing changed (memories are already tight), say so.`}var Ba=0;async function Og(r,e={}){let t={...Ha,...e},n;try{n=await qa(r.memoryRoot)}catch{n=0}let o=(Date.now()-n)/36e5;if(!t.force&&o<t.minHours)return null;let s=Date.now()-Ba;if(!t.force&&s<t.scanIntervalMs)return null;Ba=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 qa(r){let e=Nn(r,Un);return(await Wa(e)).mtimeMs}function Lg(r){try{return process.kill(r,0),!0}catch{return!1}}async function Dg(r){let e=Nn(r,Un),t,n;try{let[s,i]=await Promise.all([Wa(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<Rg&&n!==void 0&&Lg(n))return null;await Sg(r,{recursive:!0}),await Or(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 Ga(r,e){let t=Nn(r,Un);try{if(e===0){await xg(t);return}await Or(t,"");let{utimes:n}=await import("node:fs/promises"),o=e/1e3;await n(t,o,o)}catch{}}async function $g(r){let e=Nn(r,Un);await Or(e,String(process.pid))}function Ng(r){return{taskId:`dream-${_g().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 Ug(r,e={}){let t={...Ha,...e},n=await Og(r,t);if(!n)return null;let o;if(t.force)try{o=await qa(r.memoryRoot)}catch{o=0}else if(o=await Dg(r.memoryRoot),o===null)return null;let s=Va(r.memoryRoot,r.transcriptDir,n.sessionIds),i=Ng({sessionId:r.currentSessionId,sessionsReviewing:n.sessionIds.length,priorLockMtime:o});return{prompt:s,taskState:i,sessionIds:n.sessionIds}}async function Ka(r){let e=Date.now(),t=await Ug(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?Va(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)=>Eg(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&&za(f,r.context.memoryRoot)&&p.push(f)}catch{}return u.ok?(await $g(r.context.memoryRoot),r.log.info(`[dream] consolidation complete \u2014 ${p.length} files touched, ${u.durationMs}ms`)):(await Ga(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 Ga(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 Tt=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 xe from"node:fs";import*as je from"node:path";var Ja="transcript.jsonl",Xt="state.json",jg=50,Fg=50,Bg=30;function Ya(r){return r?fa(r):Tr()}function jn(r,e){let t=r.replace(/[^a-zA-Z0-9_-]/g,"_");return je.join(Ya(e),t)}async function Lr(r,e,t){let n=jn(r,t);await xe.promises.mkdir(n,{recursive:!0});let o=JSON.stringify({role:e.role,content:e.content,ts:Date.now()})+`
128
- `;await xe.promises.appendFile(je.join(n,Ja),o,"utf8")}async function Xa(r,e,t,n){let o=jn(r,n);await xe.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=je.join(o,Xt+".tmp");await xe.promises.writeFile(i,JSON.stringify(s,null,2),"utf8"),await xe.promises.rename(i,je.join(o,Xt))}async function Qa(r,e){let t=jn(r,e),n=je.join(t,Ja),o=je.join(t,Xt),s=[];try{s=(await xe.promises.readFile(n,"utf8")).split(`
129
- `).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 xe.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 Za(r=jg,e){let t=Ya(e),n;try{n=await xe.promises.readdir(t)}catch{return[]}let o=[];for(let s of n){let i=je.join(t,s,Xt);try{let a=await xe.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 Gg(r){return r.turnCount<Fg?!1:r.taskSummaryGeneratedAt?r.turnCount-(r.taskSummaryGeneratedAt??0)>=Bg:!0}async function el(r,e,t,n,o){if(!Gg(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(`
130
- `),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=jn(r,o),l=je.join(d,Xt);try{let u=await xe.promises.readFile(l,"utf8"),p=JSON.parse(u);p.metadata.taskSummary=c,p.metadata.taskSummaryGeneratedAt=e.turnCount;let m=l+".tmp";await xe.promises.writeFile(m,JSON.stringify(p,null,2),"utf8"),await xe.promises.rename(m,l)}catch{}return c}catch{return null}}br();import{randomUUID as gS}from"node:crypto";var Wg=3e4;var Bn=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),!Fn(n.lifecycle)&&Fn(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&&Fn(t.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=Wg){let t=Date.now();for(let[n,o]of this.tasks)Fn(o.lifecycle)&&o.endedAt&&t-o.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function Fn(r){return r==="completed"||r==="failed"||r==="cancelled"||r==="timeout"}import{watch as Hg}from"node:fs";import{stat as zg}from"node:fs/promises";import{join as tl,relative as Vg,resolve as qg}from"node:path";var Kg=[`${ke}/settings.json`,"INSTRUCTIONS.md",`${ke}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${ke}/rules`],Jg=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${ke}/rules`],Dr=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 Kg){let t=tl(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=Hg(e,{persistent:!1,recursive:t.includes("/")?!1:void 0},(o,s)=>{let i=s?tl(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 zg(e)}catch{o="deleted"}let s=Vg(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(()=>{}),Jg.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let t=qg(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 nl(r){let e=new Dr(r);return await e.start(),e}import{readFile as Yg,readdir as Xg,stat as Qg}from"node:fs/promises";import{dirname as Gn,extname as Zg,isAbsolute as ef,join as at,parse as rl,resolve as ol}from"node:path";import{homedir as tf}from"node:os";var nf=5;var of="INSTRUCTIONS.md",rf="INSTRUCTIONS.local.md",sf="INSTRUCTIONS.md",af=[".instructions.md"],lf=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 cf(r){try{return await Yg(r,"utf-8")}catch{return null}}function df(r){return r.includes("<!--")?r.replace(/^[ \t]*<!--[\s\S]*?-->[ \t]*$/gm,""):r}function uf(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 pf(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=at(tf(),a.slice(2));else if(ef(a))d=a;else if(a.startsWith("./"))d=ol(Gn(e),a);else if(/^[a-zA-Z0-9._-]/.test(a)&&!a.startsWith("@"))d=ol(Gn(e),a);else continue;t.add(d)}return[...t]}async function it(r,e,t,n=0,o){let s=r.toLowerCase();if(t.has(s)||n>=nf)return[];let i=Zg(r).toLowerCase();if(i&&!lf.has(i))return[];t.add(s);let a=await cf(r);if(!a?.trim())return[];let{content:c,globs:d}=uf(a),l=df(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=pf(c,r);for(let g of m){let f=await it(g,e,t,n+1,r);u.push(...f)}return u}async function $r(r,e,t,n,o=new Set){if(o.has(r))return[];o.add(r);let s=[];try{let i=await Xg(r,{withFileTypes:!0});for(let a of i){let c=at(r,a.name);if(a.isDirectory())s.push(...await $r(c,e,t,n,o));else if(a.isFile()&&a.name.endsWith(".md")){let d=await it(c,e,t);s.push(...d.filter(l=>n?!!l.globs:!l.globs))}}}catch{}return s}async function mf(r){let e=r,t=rl(e).root;for(;e!==t;){try{let n=at(e,".git"),o=await Qg(n);if(o.isDirectory()||o.isFile())return e}catch{}e=Gn(e)}return null}async function gf(r,e){let t=[],n=new Set,o=W(),s=at(o,sf);t.push(...await it(s,"User",n));let i=ua();t.push(...await $r(i,"User",n,!1));let c=await mf(r)??rl(r).root,d=[],l=r;for(;d.push(l),!(l===c&&l!==r);){let u=Gn(l);if(u===l)break;l=u}for(let u of d.reverse()){t.push(...await it(at(u,of),"Project",n));for(let p of af)t.push(...await it(at(u,p),"Project",n));t.push(...await it(ma(u),"Project",n)),t.push(...await $r(ga(u),"Project",n,!1)),t.push(...await it(at(u,rf),"Local",n))}return e&&t.length>0&&e.invoke("instructions.loaded",{sessionId:"",source:r,fileCount:t.length}).catch(()=>{}),t}function sl(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}:
146
+ Return a brief summary of what you consolidated, updated, or pruned. If nothing changed (memories are already tight), say so.`}var Sl=0;async function rh(r,e={}){let t={...Cl,...e},n;try{n=await Ml(r.memoryRoot)}catch{n=0}let o=(Date.now()-n)/36e5;if(!t.force&&o<t.minHours)return null;let s=Date.now()-Sl;if(!t.force&&s<t.scanIntervalMs)return null;Sl=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 Ml(r){let e=eo(r,to);return(await _l(e)).mtimeMs}function sh(r){try{return process.kill(r,0),!0}catch{return!1}}async function ih(r){let e=eo(r,to),t,n;try{let[s,i]=await Promise.all([_l(e),kl(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<Xf&&n!==void 0&&sh(n))return null;await Jf(r,{recursive:!0}),await ns(e,String(process.pid));let o;try{o=await kl(e,"utf8")}catch{return null}return parseInt(o.trim(),10)!==process.pid?null:t??0}async function Rl(r,e){let t=eo(r,to);try{if(e===0){await Kf(t);return}await ns(t,"");let{utimes:n}=await import("node:fs/promises"),o=e/1e3;await n(t,o,o)}catch{}}async function ah(r){let e=eo(r,to);await ns(e,String(process.pid))}function lh(r){return{taskId:`dream-${Yf().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 ch(r,e={}){let t={...Cl,...e},n=await rh(r,t);if(!n)return null;let o;if(t.force)try{o=await Ml(r.memoryRoot)}catch{o=0}else if(o=await ih(r.memoryRoot),o===null)return null;let s=Il(r.memoryRoot,r.transcriptDir,n.sessionIds),i=lh({sessionId:r.currentSessionId,sessionsReviewing:n.sessionIds.length,priorLockMtime:o});return{prompt:s,taskState:i,sessionIds:n.sessionIds}}async function Pl(r){let e=Date.now(),t=await ch(r.context,r.triggerConfig);if(!t)return{ok:!0,sessionsReviewed:0,filesTouched:[],turns:[],durationMs:Date.now()-e};let{taskState:n,sessionIds:o}=t,s="";try{let u=await yl(r.context.memoryRoot);u.totalFiles>0&&(s=bl(u))}catch{}let i=!!(r.qmemoryAdapter&&r.qmemoryUserId),a=Il(r.context.memoryRoot,r.context.transcriptDir,o,{hasQMemory:i,categoryContext:s||void 0});r.log.info(`[dream] starting consolidation \u2014 ${o.length} sessions, memoryRoot=${r.context.memoryRoot}`+(i?", qmemory=enabled":"")),r.hooks?.invoke("subagent.started",{sessionId:r.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream"}).catch(()=>{});let c=(u,m)=>oh(r.context.memoryRoot,{toolName:u,input:m}),d=i?[{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"]}}}]:[],l=i?{invoke:async(u,m,g,f)=>{let y=r.qmemoryAdapter,k=r.qmemoryUserId;if(m==="qmemory_search"){let{query:w,limit:C}=JSON.parse(g),R=await y.search(w,k,{limit:C??10});return{result:JSON.stringify(R)}}if(m==="qmemory_store"){if(!y.addText)return{result:"",error:"addText not supported"};let{text:w,source:C}=JSON.parse(g),R=await y.addText(w,k,{sessionId:r.context.currentSessionId,source:C??"dream-consolidation"});return{result:JSON.stringify(R)}}if(m==="qmemory_feedback"){let{memoryIds:w,signal:C}=JSON.parse(g);return y.feedback&&await y.feedback(w,C,r.context.currentSessionId),{result:"Feedback recorded successfully."}}return r.toolInvoker.invoke(u,m,g,f)}}:r.toolInvoker,p=[...r.tools,...d];try{let u=await ln({promptMessages:[{role:"user",content:"Begin memory consolidation."}],systemPrompt:a,tools:p,canUseTool:c,transport:r.transport,toolInvoker:l,apiKey:r.apiKey,model:r.model,log:r.log,hooks:r.hooks,forkLabel:"dream-consolidation",parentSignal:r.parentSignal,skipTranscript:!0}),m=[];for(let g of u.events)if(g.type==="tool_call")try{let f=JSON.parse(g.arguments),y=f.file_path??f.path??f.filePath;y&&Al(y,r.context.memoryRoot)&&m.push(y)}catch{}return u.ok?(await ah(r.context.memoryRoot),r.log.info(`[dream] consolidation complete \u2014 ${m.length} files touched, ${u.durationMs}ms`)):(await Rl(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(m)],turns:[],durationMs:Date.now()-e,error:u.error}}catch(u){await Rl(r.context.memoryRoot,n.priorLockMtime).catch(()=>{});let m=u instanceof Error?u.message:String(u);return r.log.warn(`[dream] consolidation error: ${m}`),r.hooks?.invoke("subagent.stopped",{sessionId:r.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream",reason:"error",error:m}).catch(()=>{}),{ok:!1,sessionsReviewed:0,filesTouched:[],turns:[],durationMs:Date.now()-e,error:m}}}import*as no from"node:fs/promises";import*as os from"node:path";var El={minIntervalHours:24,temporalExpiry:!0,stalenessDecay:!0,noiseArchival:!0},Ol=".last-decay";async function dh(r,e={}){let t=(e.minIntervalHours??El.minIntervalHours)*36e5,n=os.join(r,Ol);try{let o=await no.readFile(n,"utf-8"),s=parseInt(o.trim(),10);return isNaN(s)?!0:Date.now()-s>=t}catch{return!0}}async function uh(r){let e=os.join(r,Ol);await no.writeFile(e,String(Date.now()),"utf-8")}async function Dl(r){let e=Date.now(),t={...El,...r.config};if(!await dh(r.memoryRoot,t))return r.log?.debug?.("[decay] Skipped \u2014 cooldown not elapsed"),{ran:!1,decayed:0,archived:0,durationMs:Date.now()-e};r.log?.info("[decay] Starting importance decay cycle");try{let o=await r.adapter.triggerDecay(r.userId,{temporalExpiry:t.temporalExpiry,stalenessDecay:t.stalenessDecay,noiseArchival:t.noiseArchival});await uh(r.memoryRoot);let s=Date.now()-e;return r.log?.info(`[decay] Completed \u2014 decayed=${o.decayed}, archived=${o.archived}, ${s}ms`),{ran:!0,decayed:o.decayed,archived:o.archived,durationMs:s}}catch(o){let s=Date.now()-e;return r.log?.info(`[decay] Failed \u2014 ${o instanceof Error?o.message:String(o)}`),{ran:!1,decayed:0,archived:0,durationMs:s}}}var It=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 Ce from"node:fs";import*as Ke from"node:path";var $l="transcript.jsonl",cn="state.json",ph=50,mh=50,gh=30;function Ll(r){return r?Ga(r):Bn()}function oo(r,e){let t=r.replace(/[^a-zA-Z0-9_-]/g,"_");return Ke.join(Ll(e),t)}async function rs(r,e,t,n){let o=oo(r,t);await Ce.promises.mkdir(o,{recursive:!0});let s={role:e.role,content:e.content,ts:Date.now()};n&&(s.turnId=n);let i=JSON.stringify(s)+`
147
+ `;await Ce.promises.appendFile(Ke.join(o,$l),i,"utf8")}async function Ul(r,e,t,n){let o=oo(r,n);await Ce.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=Ke.join(o,cn+".tmp");await Ce.promises.writeFile(i,JSON.stringify(s,null,2),"utf8"),await Ce.promises.rename(i,Ke.join(o,cn))}async function Nl(r,e){let t=oo(r,e),n=Ke.join(t,$l),o=Ke.join(t,cn),s=[];try{s=(await Ce.promises.readFile(n,"utf8")).split(`
148
+ `).filter(Boolean).map(l=>{let p=JSON.parse(l);return{role:p.role,content:p.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 Ce.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 jl(r=ph,e){let t=Ll(e),n;try{n=await Ce.promises.readdir(t)}catch{return[]}let o=[];for(let s of n){let i=Ke.join(t,s,cn);try{let a=await Ce.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 fh(r){return r.turnCount<mh?!1:r.taskSummaryGeneratedAt?r.turnCount-(r.taskSummaryGeneratedAt??0)>=gh:!0}async function Fl(r,e,t,n,o){if(!fh(e))return null;try{let i=t.slice(-20).map(p=>`[${p.role}]: ${typeof p.content=="string"?p.content.slice(0,500):JSON.stringify(p.content).slice(0,500)}`).join(`
149
+ `),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 p of a)p.type==="delta"&&(c+=p.text);if(c=c.trim(),!c)return null;let d=oo(r,o),l=Ke.join(d,cn);try{let p=await Ce.promises.readFile(l,"utf8"),u=JSON.parse(p);u.metadata.taskSummary=c,u.metadata.taskSummaryGeneratedAt=e.turnCount;let m=l+".tmp";await Ce.promises.writeFile(m,JSON.stringify(u,null,2),"utf8"),await Ce.promises.rename(m,l)}catch{}return c}catch{return null}}jr();import{randomUUID as T_}from"node:crypto";var hh=3e4;var so=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),!ro(n.lifecycle)&&ro(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&&ro(t.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=hh){let t=Date.now();for(let[n,o]of this.tasks)ro(o.lifecycle)&&o.endedAt&&t-o.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function ro(r){return r==="completed"||r==="failed"||r==="cancelled"||r==="timeout"}import{watch as yh}from"node:fs";import{stat as bh}from"node:fs/promises";import{join as Bl,relative as kh,resolve as Th}from"node:path";var wh=[`${ye}/settings.json`,"INSTRUCTIONS.md",`${ye}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${ye}/rules`],vh=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${ye}/rules`],ss=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 wh){let t=Bl(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=yh(e,{persistent:!1,recursive:t.includes("/")?!1:void 0},(o,s)=>{let i=s?Bl(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 bh(e)}catch{o="deleted"}let s=kh(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(()=>{}),vh.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let t=Th(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 Wl(r){let e=new ss(r);return await e.start(),e}import{readFile as xh,readdir as Sh,stat as Rh}from"node:fs/promises";import{dirname as io,extname as _h,isAbsolute as Ch,join as ht,parse as Hl,resolve as Gl}from"node:path";import{homedir as Ah}from"node:os";var Ih=5;var Mh="INSTRUCTIONS.md",Ph="INSTRUCTIONS.local.md",Eh="INSTRUCTIONS.md",Oh=[".instructions.md"],Dh=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 $h(r){try{return await xh(r,"utf-8")}catch{return null}}function Lh(r){return r.includes("<!--")?r.replace(/^[ \t]*<!--[\s\S]*?-->[ \t]*$/gm,""):r}function Uh(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 Nh(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=ht(Ah(),a.slice(2));else if(Ch(a))d=a;else if(a.startsWith("./"))d=Gl(io(e),a);else if(/^[a-zA-Z0-9._-]/.test(a)&&!a.startsWith("@"))d=Gl(io(e),a);else continue;t.add(d)}return[...t]}async function ft(r,e,t,n=0,o){let s=r.toLowerCase();if(t.has(s)||n>=Ih)return[];let i=_h(r).toLowerCase();if(i&&!Dh.has(i))return[];t.add(s);let a=await $h(r);if(!a?.trim())return[];let{content:c,globs:d}=Uh(a),l=Lh(c);if(!l.trim())return[];let p=[],u={path:r,type:e,content:l.trim()};o&&(u.parent=o),d&&(u.globs=d),p.push(u);let m=Nh(c,r);for(let g of m){let f=await ft(g,e,t,n+1,r);p.push(...f)}return p}async function is(r,e,t,n,o=new Set){if(o.has(r))return[];o.add(r);let s=[];try{let i=await Sh(r,{withFileTypes:!0});for(let a of i){let c=ht(r,a.name);if(a.isDirectory())s.push(...await is(c,e,t,n,o));else if(a.isFile()&&a.name.endsWith(".md")){let d=await ft(c,e,t);s.push(...d.filter(l=>n?!!l.globs:!l.globs))}}}catch{}return s}async function jh(r){let e=r,t=Hl(e).root;for(;e!==t;){try{let n=ht(e,".git"),o=await Rh(n);if(o.isDirectory()||o.isFile())return e}catch{}e=io(e)}return null}async function Fh(r,e){let t=[],n=new Set,o=Z(),s=ht(o,Eh);t.push(...await ft(s,"User",n));let i=ja();t.push(...await is(i,"User",n,!1));let c=await jh(r)??Hl(r).root,d=[],l=r;for(;d.push(l),!(l===c&&l!==r);){let p=io(l);if(p===l)break;l=p}for(let p of d.reverse()){t.push(...await ft(ht(p,Mh),"Project",n));for(let u of Oh)t.push(...await ft(ht(p,u),"Project",n));t.push(...await ft(Ba(p),"Project",n)),t.push(...await is(Wa(p),"Project",n,!1)),t.push(...await ft(ht(p,Ph),"Local",n))}return e&&t.length>0&&e.invoke("instructions.loaded",{sessionId:"",source:r,fileCount:t.length}).catch(()=>{}),t}function zl(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}:
131
150
 
132
151
  ${n.content.trim()}`)}return t.length>0?`${e}
133
152
 
134
153
  ${t.join(`
135
154
 
136
- `)}`:""}var Qt=null,Nr=null;async function il(r,e){return Qt&&Nr===r||(Qt=await gf(r,e),Nr=r),Qt}function al(){Qt=null,Nr=null}function Ur(r,e){return{name:r,compute:e,cacheBreak:!1}}function Hn(r,e,t){return{name:r,compute:e,cacheBreak:!0}}var Wn=new Map;async function ff(r){return(await Promise.all(r.map(async t=>{if(!t.cacheBreak&&Wn.has(t.name))return Wn.get(t.name)??null;let n=await t.compute();return Wn.set(t.name,n),n}))).filter(t=>t!=null)}function ll(){Wn.clear()}async function cl(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 ff(r.sections);e.push(...t)}return r.appendSystemPrompt&&e.push(r.appendSystemPrompt),e.filter(Boolean).join(`
155
+ `)}`:""}var dn=null,as=null;async function Vl(r,e){return dn&&as===r||(dn=await Fh(r,e),as=r),dn}function ql(){dn=null,as=null}function ls(r,e){return{name:r,compute:e,cacheBreak:!1}}function lo(r,e,t){return{name:r,compute:e,cacheBreak:!0}}var ao=new Map;async function Bh(r){return(await Promise.all(r.map(async t=>{if(!t.cacheBreak&&ao.has(t.name))return ao.get(t.name)??null;let n=await t.compute();return ao.set(t.name,n),n}))).filter(t=>t!=null)}function Kl(){ao.clear()}async function Jl(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 Bh(r.sections);e.push(...t)}return r.appendSystemPrompt&&e.push(r.appendSystemPrompt),e.filter(Boolean).join(`
137
156
 
138
- `)}import{release as hf,homedir as yf}from"node:os";import{resolve as bf}from"node:path";function kf(){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 Tf(){let r=process.platform,e=hf();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 dl(r){return Ur("environment_context",()=>{let e=kf(),t=Tf(),n=r??process.cwd(),o=process.version,s=yf(),i=["# Environment","",`- Platform: ${t}`,`- Shell: ${e}`,`- Working directory: ${bf(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(`
139
- `)})}function zn(){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 wf(){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 vf(){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 xf(){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 ul(r="general"){return Hn("task_guidance",()=>{let e;switch(r){case"coding":e=[...wf(),"",...zn()];break;case"office":e=[...vf(),"",...zn()];break;case"creative":e=[...xf(),"",...zn()];break;default:e=["# Doing Tasks","","You are a versatile assistant that handles software engineering, office, and creative tasks.","",...zn(),"","## 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(`
140
- `)})}function pl(){return Ur("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(`
141
- `))}import{existsSync as ml,mkdirSync as Sf,readFileSync as Zt,writeFileSync as gl}from"node:fs";import{join as en}from"node:path";var Vn=new Set(["coding","office","creative","general"]),fl="settings.yaml";function _f(r){try{let e=en(r,ke,fl),n=Zt(e,"utf-8").match(/^taskDomain\s*:\s*(\w+)/m);if(n){let o=n[1].toLowerCase();if(Vn.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(Vn.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(Vn.has(s))return s}}}catch{}}var Rf=3;function Cf(r,e){let t=Mf(r);return e?t===e||t==="general"?e:(Fr(r)[t]??0)>=Rf?t:e:t}var Af=/\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,Pf=/\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,If=/\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 Mf(r){if(!r||r.trim().length===0)return"general";let e=Fr(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 Fr(r){return{coding:jr(r,Af),office:jr(r,Pf),creative:jr(r,If),general:0}}function jr(r,e){let t=new RegExp(e.source,"gi"),n=r.match(t);return n?n.length:0}function hl(r){let e=_f(r.cwd);if(e)return{domain:e,source:"project-file"};if(r.hostOverride&&Vn.has(r.hostOverride))return{domain:r.hostOverride,source:"host-override"};let t=Cf(r.userText,r.sessionDomain);return r.sessionDomain&&t===r.sessionDomain?{domain:t,source:"session-sticky"}:{domain:t,source:"auto-detect"}}var Ef=3;function yl(r,e){if(e==="general")return!1;try{let t=en(r,ke),n=en(t,fl);if(ml(n)){let s=Zt(n,"utf-8");if(/^taskDomain\s*:/m.test(s))return!1}Sf(t,{recursive:!0});let o=`# Auto-detected task domain for this workspace.
157
+ `)}import{release as Wh,homedir as Gh}from"node:os";import{resolve as Hh}from"node:path";function zh(){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 Vh(){let r=process.platform,e=Wh();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 Yl(r){return ls("environment_context",()=>{let e=zh(),t=Vh(),n=r??process.cwd(),o=process.version,s=Gh(),i=["# Environment","",`- Platform: ${t}`,`- Shell: ${e}`,`- Working directory: ${Hh(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(`
158
+ `)})}function co(){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 qh(){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 Kh(){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 Jh(){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 Xl(r="general"){return lo("task_guidance",()=>{let e;switch(r){case"coding":e=[...qh(),"",...co()];break;case"office":e=[...Kh(),"",...co()];break;case"creative":e=[...Jh(),"",...co()];break;default:e=["# Doing Tasks","","You are a versatile assistant that handles software engineering, office, and creative tasks.","",...co(),"","## 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(`
159
+ `)})}function Ql(){return ls("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 the `skill` tool (unified meta-tool) for all skill operations:","- action 'invoke' \u2014 run a skill by name","- action 'list' \u2014 discover available skills (shows scope: project/global)","- action 'create' \u2014 save a new skill to current project","- action 'promote' \u2014 copy a project skill to global (user-level)","When recalled memories show '[Cross-project skill available]', proactively offer to use or save the skill.","","## 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(`
160
+ `))}import{existsSync as Zl,mkdirSync as Yh,readFileSync as un,writeFileSync as ec}from"node:fs";import{join as pn}from"node:path";var uo=new Set(["coding","office","creative","general"]),tc="settings.yaml";function Xh(r){try{let e=pn(r,ye,tc),n=un(e,"utf-8").match(/^taskDomain\s*:\s*(\w+)/m);if(n){let o=n[1].toLowerCase();if(uo.has(o))return o}}catch{}try{let e=pn(r,ye,"INSTRUCTIONS.md"),n=un(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(uo.has(s))return s}}}catch{}try{let e=pn(r,"INSTRUCTIONS.md"),n=un(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(uo.has(s))return s}}}catch{}}var Qh=3;function Zh(r,e){let t=oy(r);return e?t===e||t==="general"?e:(ds(r)[t]??0)>=Qh?t:e:t}var ey=/\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,ty=/\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,ny=/\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 oy(r){if(!r||r.trim().length===0)return"general";let e=ds(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 ds(r){return{coding:cs(r,ey),office:cs(r,ty),creative:cs(r,ny),general:0}}function cs(r,e){let t=new RegExp(e.source,"gi"),n=r.match(t);return n?n.length:0}function nc(r){let e=Xh(r.cwd);if(e)return{domain:e,source:"project-file"};if(r.hostOverride&&uo.has(r.hostOverride))return{domain:r.hostOverride,source:"host-override"};let t=Zh(r.userText,r.sessionDomain);return r.sessionDomain&&t===r.sessionDomain?{domain:t,source:"session-sticky"}:{domain:t,source:"auto-detect"}}var ry=3;function oc(r,e){if(e==="general")return!1;try{let t=pn(r,ye),n=pn(t,tc);if(Zl(n)){let s=un(n,"utf-8");if(/^taskDomain\s*:/m.test(s))return!1}Yh(t,{recursive:!0});let o=`# Auto-detected task domain for this workspace.
142
161
  # Values: coding | office | creative | general
143
- `;if(ml(n)){let s=Zt(n,"utf-8");gl(n,s.trimEnd()+`
162
+ `;if(Zl(n)){let s=un(n,"utf-8");ec(n,s.trimEnd()+`
144
163
 
145
164
  `+o+`taskDomain: ${e}
146
- `,"utf-8")}else gl(n,o+`taskDomain: ${e}
147
- `,"utf-8");return!0}catch{return!1}}function bl(r,e){return e==="general"?!1:(Fr(r)[e]??0)>=Ef}import*as N from"node:fs";import*as z from"node:path";import{execFile as Xy}from"node:child_process";var Br=new Set(["gateway","agents_list","session_status","sessions_send","sessions_list","sessions_history","sessions_spawn","cron","config","workflow"]),kl=new Set([...Br,"agent"]);function Gr(r,e){let t=e?Br:kl;return r.filter(n=>n.function.name.startsWith("mcp__")?!0:!t.has(n.function.name))}var Fe=new Map,Wr=new Set;function Tl(r){Fe.clear(),Wr.clear();for(let e of r)Fe.set(e.name,e)}function fe(r){Fe.set(r.name,r)}function Hr(r){for(let e of r)Fe.set(e.name,e)}function qn(r){return Fe.delete(r)}function Se(r){return Fe.get(r)}function Ke(){return Array.from(Fe.keys())}function wl(r){let e=Fe.get(r);return!e||e.isEnabled?.()===!1?!1:(Wr.add(r),!0)}function Be(r=!1){let e=[];for(let t of Fe.values())t.isEnabled?.()!==!1&&(!r&&t.shouldDefer&&!Wr.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 Of="think",Lf={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(`
148
- `)}},required:["thought"]};function vl(){return{name:Of,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(`
149
- `),parameters:Lf,execute:async(r,e)=>({content:[{type:"text",text:"Thought recorded. Now proceed with the best action based on your reasoning."}],details:{type:"think"}})}}function wt(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 Df="todo",$f=["create","update","delete","list"],Nf={type:"object",properties:{action:{type:"string",enum:[...$f],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 xl(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=wt(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:Df,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:Nf,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 sh,resolve as ih}from"node:path";var Sl=new Set(["find","grep","rg","ag","ack","locate","which","whereis"]),_l=new Set(["cat","head","tail","less","more","wc","stat","file","strings","jq","awk","cut","sort","uniq","tr"]),Rl=new Set(["ls","tree","du"]);var Cl=new Set(["mv","cp","rm","mkdir","rmdir","chmod","chown","chgrp","touch","ln","cd","export","unset","wait"]);function Uf(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 Al(r){return/(?:^|[;&|])\s*(?:cd|pushd|popd)\b/.test(r)}function zr(r){let e=Uf(r),t=e!==null&&Sl.has(e),n=e!==null&&_l.has(e),o=e!==null&&Rl.has(e),s=e!==null&&Cl.has(e),i=/(?:[^2]>|^>|\|>)/.test(r),a=Al(r),c=(t||n||o)&&!i&&!a;return{firstCommand:e,isSearch:t,isRead:n,isList:o,isSilent:s,isConcurrencySafe:c,isReadOnly:c}}function Vr(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 Xf}from"node:child_process";import{constants as Xn,readFileSync as Qf,unlinkSync as Zf}from"node:fs";import{mkdir as eh,open as th,realpath as El}from"node:fs/promises";import{isAbsolute as nh,resolve as oh}from"node:path";function Kn(){if(process.platform!=="win32")return!1;let r=process.env.QLOGICAGENT_USE_POWERSHELL;return r==="1"||r==="true"}function qr(){return Kn()?"powershell":"bash"}function Kr(){return Math.floor(Math.random()*65536).toString(16).padStart(4,"0")}import{mkdir as jf,readFile as Ff,writeFile as Bf,unlink as Gf}from"node:fs/promises";import{join as Pl}from"node:path";import{tmpdir as Wf}from"node:os";var Hf=8*1024*1024,zf=5*1024*1024*1024;var Jr;function tn(){if(!Jr){let r=Math.random().toString(36).slice(2,10);Jr=Pl(Wf(),"qla-tasks",r)}return Jr}function Il(r){return Pl(tn(),`${r}.output`)}function Ge(r="local_bash"){return`${r}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var Je=class{taskId;path;stdoutToFile;#e="";#n="";#r=0;#s=0;#t;#i;#o=0;#a=!1;constructor(e,t,n=!1,o=Hf){this.taskId=e,this.path=Il(e),this.stdoutToFile=n,this.#t=o,this.#i=t}writeStdout(e){this.#e+=e,this.#s+=e.length,this.#r+=Vf(e),this.#d()}writeStderr(e){this.#n+=e}async getStdout(){if(this.stdoutToFile)try{let e=await Ff(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&&jf(tn(),{recursive:!0}).then(()=>Bf(this.path,this.#e).catch(()=>{}))}async deleteOutputFile(){try{await Gf(this.path)}catch{}}clear(){this.#a||(this.#a=!0,this.#e="",this.#n="",this.#i=null,this.deleteOutputFile())}};function Vf(r){let e=0;for(let t=0;t<r.length;t++)r.charCodeAt(t)===10&&e++;return e}var Yr=137,Ml=143,qf=5e3,Xr=5*1024*1024*1024,Jn=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)}},Qr=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=Xr){this.#t=e,this.#l=t,this.#g=n,this.#b=s,this.#d=i,this.taskOutput=o,this.#s=e.stderr?new Jn(e.stderr,o,!0):null,this.#r=e.stdout?new Jn(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(Ml)}#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(Yr))},()=>{}))},qf),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===Yr,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 ${Xr} bytes. ${n.stderr}`:e===Ml&&(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??Yr)}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 Zr(r,e,t,n,o=!1,s=Xr){return new Qr(r,e,t,n,o,s)}function Yn(r,e){let t=new Je(Ge("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 es(r){let e=new Je(Ge("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 Kf=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"]),Jf=["_SECRET","_TOKEN","_PASSWORD","_CREDENTIAL","_API_KEY","SECRET_","TOKEN_","PASSWORD_","CREDENTIAL_","_AUTH_","PRIVATE_KEY"];function ts(){let r={...process.env};for(let e of Object.keys(r))Yf(e)&&delete r[e];return r}function Yf(r){if(Kf.has(r))return!0;let e=r.toUpperCase();for(let t of Jf)if(e.includes(t))return!0;return!1}var rh=1800*1e3,Qn=process.cwd(),Ol=process.cwd();function Zn(){return Qn}function ns(r,e){Qn=nh(r)?r:oh(e||Qn,r)}function Ll(){return Ol}function eo(r){Qn=r,Ol=r}var os=null;function nn(r){os={provider:r}}function Dl(){if(!os)throw new Error("Shell provider not configured. Call setShellProvider() at startup.");return os.provider}async function to(r,e,t,n){let{timeout:o,onProgress:s,preventCwdChanges:i,shouldAutoBackground:a,onStdout:c,cwd:d}=n??{},l=o||rh,u=t??qr(),p=Dl(),m=Kr(),{commandString:g,cwdFilePath:f}=await p.buildExecCommand(r,{id:m,useSandbox:!1}),b=g,w=d??Zn();try{await El(w)}catch{let v=Ll();try{await El(v),ns(v),w=v}catch{return es(`Working directory "${w}" no longer exists.`)}}if(e.aborted)return Yn();let T=p.shellPath,_=p.getSpawnArgs(b),R=await p.getEnvironmentOverrides(r),y=!!c,M=Ge("local_bash"),O=new Je(M,s??null,!y);await eh(tn(),{recursive:!0});let $;if(!y){let v=Xn.O_NOFOLLOW??0;$=await th(O.path,process.platform==="win32"?"w":Xn.O_WRONLY|Xn.O_CREAT|Xn.O_APPEND|v)}try{let v=Xf(T,_,{env:{...ts(),GIT_EDITOR:"true",QLOGICAGENT:"1",...R},cwd:w,stdio:y?["pipe","pipe","pipe"]:["pipe",$?.fd,$?.fd],detached:p.detached,windowsHide:!0}),pe=Zr(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=Qf(f,{encoding:"utf8"}).trim();j&&j.normalize("NFC")!==w&&ns(j,w)}catch{}try{Zf(f)}catch{}}}),pe}catch(v){if($!==void 0)try{await $.close()}catch{}return O.clear(),Yn(void 0,{code:126,stderr:v instanceof Error?v.message:String(v)})}}var ah="exec",lh={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"]},ch=12e4,dh=6e5,no=3e4;function rs(r,e){if(r.length<=e)return r;let t=Math.floor(e/2)-50;return`${r.slice(0,t)}
165
+ `,"utf-8")}else ec(n,o+`taskDomain: ${e}
166
+ `,"utf-8");return!0}catch{return!1}}function rc(r,e){return e==="general"?!1:(ds(r)[e]??0)>=ry}import*as B from"node:fs";import*as q from"node:path";import{execFile as xk}from"node:child_process";var us=new Set(["gateway","agents_list","session_status","sessions_send","sessions_list","sessions_history","sessions_spawn","cron","config","workflow"]),sc=new Set([...us,"agent"]);function ps(r,e){let t=e?us:sc;return r.filter(n=>n.function.name.startsWith("mcp__")?!0:!t.has(n.function.name))}var Je=new Map,ms=new Set;function ic(r){Je.clear(),ms.clear();for(let e of r)Je.set(e.name,e)}function be(r){Je.set(r.name,r)}function gs(r){for(let e of r)Je.set(e.name,e)}function po(r){return Je.delete(r)}function Ae(r){return Je.get(r)}function nt(){return Array.from(Je.keys())}function ac(r){let e=Je.get(r);return!e||e.isEnabled?.()===!1?!1:(ms.add(r),!0)}function Ye(r=!1){let e=[];for(let t of Je.values())t.isEnabled?.()!==!1&&(!r&&t.shouldDefer&&!ms.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 sy="think",iy={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(`
167
+ `)}},required:["thought"]};function lc(){return{name:sy,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(`
168
+ `),parameters:iy,execute:async(r,e)=>({content:[{type:"text",text:"Thought recorded. Now proceed with the best action based on your reasoning."}],details:{type:"think"}})}}function Mt(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 ay="todo",ly=["create","update","delete","list"],cy={type:"object",properties:{action:{type:"string",enum:[...ly],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 cc(r){let e=[],t=0,n=r??{};function o(){let u=e.reduce((m,g)=>Math.max(m,g.id),0);return t=Math.max(t,u)+1,t}function s(u){return{content:[{type:"text",text:JSON.stringify({error:u,todoList:e})}],details:{type:"todo",error:u}}}function i(u){let m=Mt(e),g=new Set(e.filter(k=>k.status==="completed").map(k=>k.id)),f=e.map(k=>{let w=k.blockedBy?.filter(C=>!g.has(C));return{...k,...w?.length?{blockedBy:w}:{blockedBy:void 0}}}),y={...m,todoList:f,...u};return{content:[{type:"text",text:JSON.stringify(y)}],details:{type:"todo",...m,agentId:n.agentId}}}function a(u,m,g){let f=e.find(y=>y.id===u);if(f){if(m?.length){f.blocks=[...new Set([...f.blocks??[],...m])];for(let y of m){let k=e.find(w=>w.id===y);k&&(k.blockedBy=[...new Set([...k.blockedBy??[],u])])}}if(g?.length){f.blockedBy=[...new Set([...f.blockedBy??[],...g])];for(let y of g){let k=e.find(w=>w.id===y);k&&(k.blocks=[...new Set([...k.blocks??[],u])])}}}}function c(u){for(let m of e)m.blocks&&(m.blocks=m.blocks.filter(g=>g!==u)),m.blockedBy&&(m.blockedBy=m.blockedBy.filter(g=>g!==u))}function d(u){if(!u.title)return s("title is required for create action.");let m={id:o(),title:u.title,status:"not-started",...u.description!=null&&{description:u.description},...u.owner!=null&&{owner:u.owner}};return e.push(m),a(m.id,void 0,u.addBlockedBy),i({created:{id:m.id,title:m.title}})}function l(u){if(u.id==null)return s("id is required for update action.");let m=e.find(g=>g.id===u.id);if(!m)return s(`Task #${u.id} not found.`);if(u.status==="in-progress"){let g=e.find(f=>f.status==="in-progress"&&f.id!==u.id);if(g)return s(`Cannot set #${u.id} to in-progress: #${g.id} already is.`)}return u.title!=null&&(m.title=u.title),u.description!=null&&(m.description=u.description),u.owner!=null&&(m.owner=u.owner),u.status!=null&&(m.status=u.status),a(m.id,u.addBlocks,u.addBlockedBy),i({updated:{id:m.id,title:m.title}})}function p(u){if(u.id==null)return s("id is required for delete action.");let m=e.findIndex(g=>g.id===u.id);return m===-1?s(`Task #${u.id} not found.`):(t=Math.max(t,u.id),e.splice(m,1),c(u.id),i({deleted:u.id}))}return{name:ay,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:cy,searchHint:"manage session task checklist progress tracking dependencies",maxResultSizeChars:1e5,execute:async(u,m)=>{let g=m.action;switch(g){case"create":return d(m);case"update":return l(m);case"delete":return p(m);case"list":return i();default:return s(`Unknown action: ${g}. Valid: create, update, delete, list.`)}}}}import{isAbsolute as Py,resolve as Ey}from"node:path";var dc=new Set(["find","grep","rg","ag","ack","locate","which","whereis"]),uc=new Set(["cat","head","tail","less","more","wc","stat","file","strings","jq","awk","cut","sort","uniq","tr"]),pc=new Set(["ls","tree","du"]);var mc=new Set(["mv","cp","rm","mkdir","rmdir","chmod","chown","chgrp","touch","ln","cd","export","unset","wait"]);function dy(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 gc(r){return/(?:^|[;&|])\s*(?:cd|pushd|popd)\b/.test(r)}function fs(r){let e=dy(r),t=e!==null&&dc.has(e),n=e!==null&&uc.has(e),o=e!==null&&pc.has(e),s=e!==null&&mc.has(e),i=/(?:[^2]>|^>|\|>)/.test(r),a=gc(r),c=(t||n||o)&&!i&&!a;return{firstCommand:e,isSearch:t,isRead:n,isList:o,isSilent:s,isConcurrencySafe:c,isReadOnly:c}}function hs(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 xy}from"node:child_process";import{constants as ho,readFileSync as Sy,unlinkSync as Ry}from"node:fs";import{mkdir as _y,open as Cy,realpath as bc}from"node:fs/promises";import{isAbsolute as Ay,resolve as Iy}from"node:path";function mo(){if(process.platform!=="win32")return!1;let r=process.env.QLOGICAGENT_USE_POWERSHELL;return r==="1"||r==="true"}function ys(){return mo()?"powershell":"bash"}function bs(){return Math.floor(Math.random()*65536).toString(16).padStart(4,"0")}import{mkdir as uy,readFile as py,writeFile as my,unlink as gy}from"node:fs/promises";import{join as fc}from"node:path";import{tmpdir as fy}from"node:os";var hy=8*1024*1024,yy=5*1024*1024*1024;var ks;function mn(){if(!ks){let r=Math.random().toString(36).slice(2,10);ks=fc(fy(),"qla-tasks",r)}return ks}function hc(r){return fc(mn(),`${r}.output`)}function Xe(r="local_bash"){return`${r}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var ot=class{taskId;path;stdoutToFile;#e="";#n="";#r=0;#s=0;#t;#i;#o=0;#a=!1;constructor(e,t,n=!1,o=hy){this.taskId=e,this.path=hc(e),this.stdoutToFile=n,this.#t=o,this.#i=t}writeStdout(e){this.#e+=e,this.#s+=e.length,this.#r+=by(e),this.#d()}writeStderr(e){this.#n+=e}async getStdout(){if(this.stdoutToFile)try{let e=await py(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&&uy(mn(),{recursive:!0}).then(()=>my(this.path,this.#e).catch(()=>{}))}async deleteOutputFile(){try{await gy(this.path)}catch{}}clear(){this.#a||(this.#a=!0,this.#e="",this.#n="",this.#i=null,this.deleteOutputFile())}};function by(r){let e=0;for(let t=0;t<r.length;t++)r.charCodeAt(t)===10&&e++;return e}var Ts=137,yc=143,ky=5e3,ws=5*1024*1024*1024,go=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)}},vs=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=ws){this.#t=e,this.#l=t,this.#g=n,this.#b=s,this.#d=i,this.taskOutput=o,this.#s=e.stderr?new go(e.stderr,o,!0):null,this.#r=e.stdout?new go(e.stdout,o,!1):null,s&&(this.onTimeout=a=>{this.#u=a}),this.result=this.#R()}get status(){return this.#e}static#T(e){e.#b&&e.#u?e.#u(e.background.bind(e)):e.#y(yc)}#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(Ts))},()=>{}))},ky),this.#o.unref?.()}#R(){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.#_.bind(this))})}async#_(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===Ts,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 ${ws} bytes. ${n.stderr}`:e===yc&&(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??Ts)}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 xs(r,e,t,n,o=!1,s=ws){return new vs(r,e,t,n,o,s)}function fo(r,e){let t=new ot(Xe("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 Ss(r){let e=new ot(Xe("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 Ty=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"]),wy=["_SECRET","_TOKEN","_PASSWORD","_CREDENTIAL","_API_KEY","SECRET_","TOKEN_","PASSWORD_","CREDENTIAL_","_AUTH_","PRIVATE_KEY"];function Rs(){let r={...process.env};for(let e of Object.keys(r))vy(e)&&delete r[e];return r}function vy(r){if(Ty.has(r))return!0;let e=r.toUpperCase();for(let t of wy)if(e.includes(t))return!0;return!1}var My=1800*1e3,yo=process.cwd(),kc=process.cwd();function bo(){return yo}function _s(r,e){yo=Ay(r)?r:Iy(e||yo,r)}function Tc(){return kc}function ko(r){yo=r,kc=r}var Cs=null;function gn(r){Cs={provider:r}}function wc(){if(!Cs)throw new Error("Shell provider not configured. Call setShellProvider() at startup.");return Cs.provider}async function To(r,e,t,n){let{timeout:o,onProgress:s,preventCwdChanges:i,shouldAutoBackground:a,onStdout:c,cwd:d}=n??{},l=o||My,p=t??ys(),u=wc(),m=bs(),{commandString:g,cwdFilePath:f}=await u.buildExecCommand(r,{id:m,useSandbox:!1}),y=g,k=d??bo();try{await bc(k)}catch{let v=Tc();try{await bc(v),_s(v),k=v}catch{return Ss(`Working directory "${k}" no longer exists.`)}}if(e.aborted)return fo();let w=u.shellPath,C=u.getSpawnArgs(y),R=await u.getEnvironmentOverrides(r),b=!!c,E=Xe("local_bash"),P=new ot(E,s??null,!b);await _y(mn(),{recursive:!0});let U;if(!b){let v=ho.O_NOFOLLOW??0;U=await Cy(P.path,process.platform==="win32"?"w":ho.O_WRONLY|ho.O_CREAT|ho.O_APPEND|v)}try{let v=xy(w,C,{env:{...Rs(),GIT_EDITOR:"true",QLOGICAGENT:"1",...R},cwd:k,stdio:b?["pipe","pipe","pipe"]:["pipe",U?.fd,U?.fd],detached:u.detached,windowsHide:!0}),ie=xs(v,e,l,P,a);if(U!==void 0)try{await U.close()}catch{}return v.stdout&&c&&v.stdout.on("data",Y=>{c(typeof Y=="string"?Y:Y.toString())}),f&&ie.result.then(Y=>{if(Y&&!i&&!Y.backgroundTaskId){try{let D=Sy(f,{encoding:"utf8"}).trim();D&&D.normalize("NFC")!==k&&_s(D,k)}catch{}try{Ry(f)}catch{}}}),ie}catch(v){if(U!==void 0)try{await U.close()}catch{}return P.clear(),fo(void 0,{code:126,stderr:v instanceof Error?v.message:String(v)})}}var Oy="exec",Dy={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"]},$y=12e4,Ly=6e5,wo=3e4;function As(r,e){if(r.length<=e)return r;let t=Math.floor(e/2)-50;return`${r.slice(0,t)}
150
169
 
151
170
  ... [truncated ${r.length-e} chars] ...
152
171
 
153
- ${r.slice(-t)}`}function uh(r){return r==null||r<=0?ch:Math.min(r,dh)}async function*ph(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 to(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=Ge("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 $l(r={}){return{name:ah,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:lh,maxResultSizeChars:no,execute:async(e,t)=>{let n=zr(t.command);if(!t.background){let p=Vr(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=uh(t.timeout),i=t.workdir?sh(t.workdir)?t.workdir:ih(Zn(),t.workdir):void 0;if(t.background){let p=await to(t.command,o.signal,void 0,{shouldAutoBackground:!1,cwd:i}),m=Ge("bg");if(p.background(m))return{content:[{type:"text",text:`Background task started (id: ${m}).
154
- Use getOutput to check on it later.`}],details:{type:"exec_background",backgroundTaskId:m,description:t.description,classification:n}}}let a=ph({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(rs(d.stdout,no)),l.push(`[full output: ${d.outputFilePath} (${d.outputFileSize} bytes)]`)):d.stdout&&l.push(rs(d.stdout,no)),d.stderr&&l.push(`[stderr]
155
- ${rs(d.stderr,Math.floor(no/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(`
156
- `)}],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 mh}from"node:os";import{join as gh,posix as ss}from"node:path";function fh(r){return r.replace(/(\d?)>nul\b/gi,(e,t)=>`${t||""}>/dev/null`)}function hh(r){return!(/(?:^|[;&|])\s*<\s/.test(r)||/<<[-]?\s*['"]?[A-Za-z_]/.test(r))}function yh(r,e){return`$'${r.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,"\\n")}'${e?" < /dev/null":""}`}function Nl(r){return process.platform!=="win32"?r:r.replace(/^([A-Za-z]):/,(e,t)=>`/${t.toLowerCase()}`).replace(/\\/g,"/")}function oo(r,e){let t=e?.snapshotFilePath;return{type:"bash",shellPath:r,detached:!0,async buildExecCommand(n,o){let s=process.platform==="win32",i=mh(),a=s?Nl(i):i,c=o.useSandbox&&o.sandboxTmpDir?ss.join(o.sandboxTmpDir,`cwd-${o.id}`):ss.join(a,`qla-${o.id}-cwd`),d=o.useSandbox&&o.sandboxTmpDir?ss.join(o.sandboxTmpDir,`cwd-${o.id}`):gh(i,`qla-${o.id}-cwd`),l=fh(n),u=hh(l),p=yh(l,u),m=[];if(t){let f=s?Nl(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 bh}from"node:os";import{join as kh,posix as Th}from"node:path";function Ul(r){return Buffer.from(r,"utf16le").toString("base64")}function wh(r){return["-NoProfile","-NonInteractive","-Command",r]}function is(r){return{type:"powershell",shellPath:r,detached:!1,async buildExecCommand(e,t){let n=t.useSandbox&&t.sandboxTmpDir?Th.join(t.sandboxTmpDir,`qla-pwd-ps-${t.id}`):kh(bh(),`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(`
157
- ; `),i=e+s;return{commandString:t.useSandbox?[`'${r.replace(/'/g,"'\\''")}'`,"-NoProfile","-NonInteractive","-EncodedCommand",Ul(i)].join(" "):i,cwdFilePath:n}},getSpawnArgs(e){return wh(e)},async getEnvironmentOverrides(e){return{QLOGICAGENT:"1"}}}}var vh=[{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"}],xh=[{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 as(r){for(let{pattern:e,warning:t}of vh)if(e.test(r))return t;return null}function ls(r){for(let{pattern:e,warning:t}of xh)if(e.test(r))return t;return null}var Sh="read",_h={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 jl(r){return{name:Sh,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:_h,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(`
158
- `),c=Math.max(0,(o.offset??1)-1),d=Math.min(o.limit??2e3,2e3),l=a.slice(c,c+d),u=l.join(`
159
- `);u.length>5e4&&(u=u.slice(0,5e4)+`
160
- ... (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 Rh="write",Ch={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"]},Fl=5e5;function Bl(r){return{name:Rh,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:Ch,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>Fl)return{content:[{type:"text",text:`Content too large (${t.content.length} chars, max ${Fl}). 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(`
161
- `).length;return{content:[{type:"text",text:`Wrote ${o} lines to ${n}`}],details:{type:"write",path:n,lineCount:o}}}}}var Ah="edit",Ph={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 Gl(r){return{name:Ah,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:Ph,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(`
162
- `).length;return{content:[{type:"text",text:`Edited ${n} (line ${d})`}],details:{type:"edit",path:n,success:!0,firstChangedLine:d}}}}}var Ih="search",Mh={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"]},Wl=100,Hl=250,cs=1e5;function zl(r){return{name:Ih,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:Mh,execute:async(e,t)=>{let n=t.path?r.resolvePath?r.resolvePath(t.path):t.path:"",o=t.mode;return o==="filename"?Eh(r,t,n):o==="content"?Oh(r,t,n):Lh(r,t,n)}}}async function Eh(r,e,t){let n=e.headLimit??Wl,{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(`
163
- `);return l&&(u+=`
164
-
165
- (Results truncated. ${d.length} shown. Use a more specific pattern or increase headLimit.)`),u=ds(u,cs),{content:[{type:"text",text:u}],details:{mode:"filename",totalMatches:d.length,truncated:l}}}async function Oh(r,e,t){let n=e.headLimit??Hl,{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(`
172
+ ${r.slice(-t)}`}function Uy(r){return r==null||r<=0?$y:Math.min(r,Ly)}async function*Ny(r){let{command:e,abortController:t,timeout:n,shouldAutoBackground:o,cwd:s}=r,i="",a=0,c=0,d=Date.now(),l=null;function p(){return new Promise(g=>{l=()=>g(null)})}let u=await To(e,t.signal,void 0,{timeout:n,onProgress(g,f,y,k,w){i=f,a=y,c=k,l&&(l(),l=null)},shouldAutoBackground:o,cwd:s});for(u.onTimeout&&o&&u.onTimeout(g=>{let f=Xe("bg");g(f)});u.status==="running"&&await Promise.race([p(),u.result])===null;)yield{type:"exec_progress",output:i.slice(-4096),fullOutput:i,elapsedTimeSeconds:(Date.now()-d)/1e3,totalLines:a,totalBytes:c};let m=await u.result;return u.cleanup(),m}function vc(r={}){return{name:Oy,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:Dy,maxResultSizeChars:wo,execute:async(e,t)=>{let n=fs(t.command);if(!t.background){let u=hs(t.command);if(u)return{content:[{type:"text",text:`Command blocked: ${u}`}],details:{type:"exec",error:"blocked_sleep_pattern",classification:n}}}if(r.validateCommand){let u=await r.validateCommand(t.command);if(u)return{content:[{type:"text",text:`Command blocked: ${u}`}],details:{type:"exec",error:"blocked_by_guard",reason:u,classification:n}}}let o=new AbortController,s=Uy(t.timeout),i=t.workdir?Py(t.workdir)?t.workdir:Ey(bo(),t.workdir):void 0;if(t.background){let u=await To(t.command,o.signal,void 0,{shouldAutoBackground:!1,cwd:i}),m=Xe("bg");if(u.background(m))return{content:[{type:"text",text:`Background task started (id: ${m}).
173
+ Use getOutput to check on it later.`}],details:{type:"exec_background",backgroundTaskId:m,description:t.description,classification:n}}}let a=Ny({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(As(d.stdout,wo)),l.push(`[full output: ${d.outputFilePath} (${d.outputFileSize} bytes)]`)):d.stdout&&l.push(As(d.stdout,wo)),d.stderr&&l.push(`[stderr]
174
+ ${As(d.stderr,Math.floor(wo/4))}`),d.interrupted&&l.push(`[interrupted \u2014 exit code ${d.code}]`);let p;return d.code!==0&&r.interpretExitCode&&(p=r.interpretExitCode(d.code,d.stderr),p&&l.push(`[exit ${d.code}: ${p}]`)),l.length===0&&l.push(n.isSilent&&d.code===0?"Done":`(exit code ${d.code}, no output)`),{content:[{type:"text",text:l.join(`
175
+ `)}],details:{type:"exec",exitCode:d.code,interrupted:d.interrupted,description:t.description,returnCodeInterpretation:p,noOutputExpected:n.isSilent,outputFilePath:d.outputFilePath,classification:n}}}}}import{tmpdir as jy}from"node:os";import{join as Fy,posix as Is}from"node:path";function By(r){return r.replace(/(\d?)>nul\b/gi,(e,t)=>`${t||""}>/dev/null`)}function Wy(r){return!(/(?:^|[;&|])\s*<\s/.test(r)||/<<[-]?\s*['"]?[A-Za-z_]/.test(r))}function Gy(r,e){return`$'${r.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,"\\n")}'${e?" < /dev/null":""}`}function xc(r){return process.platform!=="win32"?r:r.replace(/^([A-Za-z]):/,(e,t)=>`/${t.toLowerCase()}`).replace(/\\/g,"/")}function vo(r,e){let t=e?.snapshotFilePath;return{type:"bash",shellPath:r,detached:!0,async buildExecCommand(n,o){let s=process.platform==="win32",i=jy(),a=s?xc(i):i,c=o.useSandbox&&o.sandboxTmpDir?Is.join(o.sandboxTmpDir,`cwd-${o.id}`):Is.join(a,`qla-${o.id}-cwd`),d=o.useSandbox&&o.sandboxTmpDir?Is.join(o.sandboxTmpDir,`cwd-${o.id}`):Fy(i,`qla-${o.id}-cwd`),l=By(n),p=Wy(l),u=Gy(l,p),m=[];if(t){let f=s?xc(t):t;m.push(`source '${f}' 2>/dev/null || true`)}return e?.sessionEnvScript&&m.push(e.sessionEnvScript),m.push(`eval ${u}`),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 Hy}from"node:os";import{join as zy,posix as Vy}from"node:path";function Sc(r){return Buffer.from(r,"utf16le").toString("base64")}function qy(r){return["-NoProfile","-NonInteractive","-Command",r]}function Ms(r){return{type:"powershell",shellPath:r,detached:!1,async buildExecCommand(e,t){let n=t.useSandbox&&t.sandboxTmpDir?Vy.join(t.sandboxTmpDir,`qla-pwd-ps-${t.id}`):zy(Hy(),`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(`
176
+ ; `),i=e+s;return{commandString:t.useSandbox?[`'${r.replace(/'/g,"'\\''")}'`,"-NoProfile","-NonInteractive","-EncodedCommand",Sc(i)].join(" "):i,cwdFilePath:n}},getSpawnArgs(e){return qy(e)},async getEnvironmentOverrides(e){return{QLOGICAGENT:"1"}}}}var Ky=[{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"}],Jy=[{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 Ps(r){for(let{pattern:e,warning:t}of Ky)if(e.test(r))return t;return null}function Es(r){for(let{pattern:e,warning:t}of Jy)if(e.test(r))return t;return null}var Yy="read",Xy={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 Rc(r){return{name:Yy,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:Xy,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(`
177
+ `),c=Math.max(0,(o.offset??1)-1),d=Math.min(o.limit??2e3,2e3),l=a.slice(c,c+d),p=l.join(`
178
+ `);p.length>5e4&&(p=p.slice(0,5e4)+`
179
+ ... (truncated)`);let u=a.length,m=c+l.length,g=m<u;return{content:[{type:"text",text:p}],details:{type:"read",path:s,totalLines:u,startLine:c+1,endLine:m,hasMore:g}}}}}var Qy="write",Zy={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"]},_c=5e5;function Cc(r){return{name:Qy,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:Zy,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>_c)return{content:[{type:"text",text:`Content too large (${t.content.length} chars, max ${_c}). 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(`
180
+ `).length;return{content:[{type:"text",text:`Wrote ${o} lines to ${n}`}],details:{type:"write",path:n,lineCount:o}}}}}var eb="edit",tb={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 Ac(r){return{name:eb,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:tb,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(`
181
+ `).length;return{content:[{type:"text",text:`Edited ${n} (line ${d})`}],details:{type:"edit",path:n,success:!0,firstChangedLine:d}}}}}var nb="search",ob={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"]},Ic=100,Mc=250,Os=1e5;function Pc(r){return{name:nb,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:ob,execute:async(e,t)=>{let n=t.path?r.resolvePath?r.resolvePath(t.path):t.path:"",o=t.mode;return o==="filename"?rb(r,t,n):o==="content"?sb(r,t,n):ib(r,t,n)}}}async function rb(r,e,t){let n=e.headLimit??Ic,{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 p=d.join(`
182
+ `);return l&&(p+=`
183
+
184
+ (Results truncated. ${d.length} shown. Use a more specific pattern or increase headLimit.)`),p=Ds(p,Os),{content:[{type:"text",text:p}],details:{mode:"filename",totalMatches:d.length,truncated:l}}}async function sb(r,e,t){let n=e.headLimit??Mc,{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(`
166
185
  `);return s&&(a+=`
167
186
 
168
- (Results truncated at ${o.length} matches. Use offset/headLimit for pagination.)`),a=ds(a,cs),{content:[{type:"text",text:a}],details:{mode:"content",totalMatches:o.length,truncated:s}}}async function Lh(r,e,t){let[n,o]=await Promise.all([e.fileGlob?r.glob(e.fileGlob,{cwd:t,limit:Wl}):Promise.resolve({files:[],truncated:!1}),r.grep(e.pattern,{cwd:t,fileGlob:e.fileGlob,caseInsensitive:e.caseInsensitive,contextLines:e.contextLines,headLimit:e.headLimit??Hl,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}):
187
+ (Results truncated at ${o.length} matches. Use offset/headLimit for pagination.)`),a=Ds(a,Os),{content:[{type:"text",text:a}],details:{mode:"content",totalMatches:o.length,truncated:s}}}async function ib(r,e,t){let[n,o]=await Promise.all([e.fileGlob?r.glob(e.fileGlob,{cwd:t,limit:Ic}):Promise.resolve({files:[],truncated:!1}),r.grep(e.pattern,{cwd:t,fileGlob:e.fileGlob,caseInsensitive:e.caseInsensitive,contextLines:e.contextLines,headLimit:e.headLimit??Mc,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}):
169
188
  ${i.join(`
170
- `)}`),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}):
189
+ `)}`),o.matches.length>0){let l=[];for(let p of o.matches)l.push(`${p.path}:${p.line}: ${p.text}`);a.push(`## Content matches (${o.matches.length}):
171
190
  ${l.join(`
172
191
  `)}`)}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(`
173
192
 
174
193
  `);return c&&(d+=`
175
194
 
176
- (Some results truncated. Use more specific patterns.)`),d=ds(d,cs),{content:[{type:"text",text:d}],details:{mode:"both",totalMatches:i.length+o.matches.length,truncated:c}}}function ds(r,e){if(r.length<=e)return r;let t=Math.floor(e/2)-50;return`${r.slice(0,t)}
195
+ (Some results truncated. Use more specific patterns.)`),d=Ds(d,Os),{content:[{type:"text",text:d}],details:{mode:"both",totalMatches:i.length+o.matches.length,truncated:c}}}function Ds(r,e){if(r.length<=e)return r;let t=Math.floor(e/2)-50;return`${r.slice(0,t)}
177
196
 
178
197
  ... [truncated ${r.length-e} chars] ...
179
198
 
180
- ${r.slice(-t)}`}var Dh="apply_patch",$h={type:"object",properties:{input:{type:"string",description:"Patch content using the *** Begin Patch / *** End Patch format."}},required:["input"]};function Nh(r){let e=r.split(`
181
- `),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 Uh(r,e){let n=[...r.split(`
199
+ ${r.slice(-t)}`}var ab="apply_patch",lb={type:"object",properties:{input:{type:"string",description:"Patch content using the *** Begin Patch / *** End Patch format."}},required:["input"]};function cb(r){let e=r.split(`
200
+ `),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 db(r,e){let n=[...r.split(`
182
201
  `)];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(`
183
- `)}function Vl(r){return{name:Dh,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:$h,execute:async(e,t)=>{let n=Nh(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(`
184
- `);await r.writeFile(c,d),o.added.push(a.path);break}case"update":{let d=await r.readFile(c),l=Uh(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(`
185
- `)||"No changes applied."}],details:{type:"apply_patch",summary:o,errors:s}}}}}var jh="patch",Fh={type:"object",properties:{input:{type:"string",description:`Patch content. Supports two formats:
202
+ `)}function Ec(r){return{name:ab,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:lb,execute:async(e,t)=>{let n=cb(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(`
203
+ `);await r.writeFile(c,d),o.added.push(a.path);break}case"update":{let d=await r.readFile(c),l=db(d,a.hunks);if(a.moveTo){let p=r.resolvePath(a.moveTo);await r.writeFile(p,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(`
204
+ `)||"No changes applied."}],details:{type:"apply_patch",summary:o,errors:s}}}}}var ub="patch",pb={type:"object",properties:{input:{type:"string",description:`Patch content. Supports two formats:
186
205
  1) V4A unified diff (*** Begin Patch / *** End Patch markers)
187
206
  2) Simple find-replace: first line is file path, then <<<< SEARCH / ==== / >>>> REPLACE blocks.
188
- 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 Bh(r){return r.replace(/\\n/g,`
189
- `).replace(/\\t/g," ").replace(/\\'/g,"'").replace(/\\"/g,'"')}function ql(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 Kl(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 ec(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(`
207
+ 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 mb(r){return r.replace(/\\n/g,`
208
+ `).replace(/\\t/g," ").replace(/\\'/g,"'").replace(/\\"/g,'"')}function Oc(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 Dc(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 Fc(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(`
190
209
  `).map(f=>f.trim()),i=r.split(`
191
- `),a=Jl(i,s,(f,b)=>f.trim()===b);if(a)return[{...Yl(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=Xl(r,d,o,c.length);if(f)return[{...f,strategy:"whitespace_normalized"}]}let l=Jl(i,s,(f,b)=>f.trimStart()===b.trimStart());if(l)return[{...Yl(r,i,l),strategy:"indentation_flexible"}];let u=Bh(e);if(u!==e&&(o=r.indexOf(u),o!==-1))return[{start:o,end:o+u.length,strategy:"escape_normalized"}];let p=e.split(`
192
- `);if(p.length>=3){let f=p.slice(1,-1).join(`
193
- `),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(`
194
- `).length+1,R=r.indexOf(f,_);if(R!==-1){let y=R+f.length,M=r.indexOf(`
195
- `,y);if((M===-1?r.slice(y):r.slice(y,M)).trim()===w||M!==-1&&r.slice(y+1,r.indexOf(`
196
- `,y+1)===-1?void 0:r.indexOf(`
197
- `,y+1)).trim()===w){let $=i.slice(0,T).join(`
198
- `).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(`
199
- `).length;return[{start:$,end:F,strategy:"trimmed_boundary"}]}}}}}let m=ql(e),g=ql(r);if((m!==e||g!==r)&&(o=g.indexOf(m),o!==-1)){let f=Xl(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),M=y.filter($=>R.some(v=>Kl(v,$)>=.7)).length;if((y.length>0?M/y.length:1)>=.5&&_<=p.length+2){let $=i.slice(0,w).join(`
200
- `).length+(w>0?1:0),v=i.slice(0,T+1).join(`
201
- `).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)=>Kl(_,b[R])).filter(_=>_>=.8).length/p.length>=.5){let _=i.slice(0,f).join(`
202
- `).length+(f>0?1:0),R=i.slice(0,f+p.length).join(`
203
- `).length;return[{start:_,end:R,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 Yl(r,e,t){let n=e.slice(0,t.startIdx).join(`
210
+ `),a=$c(i,s,(f,y)=>f.trim()===y);if(a)return[{...Lc(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=Uc(r,d,o,c.length);if(f)return[{...f,strategy:"whitespace_normalized"}]}let l=$c(i,s,(f,y)=>f.trimStart()===y.trimStart());if(l)return[{...Lc(r,i,l),strategy:"indentation_flexible"}];let p=mb(e);if(p!==e&&(o=r.indexOf(p),o!==-1))return[{start:o,end:o+p.length,strategy:"escape_normalized"}];let u=e.split(`
211
+ `);if(u.length>=3){let f=u.slice(1,-1).join(`
212
+ `),y=u[0].trim(),k=u[u.length-1].trim();for(let w=0;w<i.length;w++)if(i[w].trim()===y){let C=i.slice(0,w+1).join(`
213
+ `).length+1,R=r.indexOf(f,C);if(R!==-1){let b=R+f.length,E=r.indexOf(`
214
+ `,b);if((E===-1?r.slice(b):r.slice(b,E)).trim()===k||E!==-1&&r.slice(b+1,r.indexOf(`
215
+ `,b+1)===-1?void 0:r.indexOf(`
216
+ `,b+1)).trim()===k){let U=i.slice(0,w).join(`
217
+ `).length+(w>0?1:0),v=w,ie=u.length;if(w+ie<=i.length){v=w+ie;let Y=i.slice(0,v).join(`
218
+ `).length;return[{start:U,end:Y,strategy:"trimmed_boundary"}]}}}}}let m=Oc(e),g=Oc(r);if((m!==e||g!==r)&&(o=g.indexOf(m),o!==-1)){let f=Uc(r,g,o,m.length);if(f)return[{...f,strategy:"unicode_normalized"}]}if(u.length>=3){let f=u[0],y=u[u.length-1];for(let k=0;k<i.length;k++)if(i[k]===f){for(let w=k+u.length-1;w<Math.min(k+u.length+2,i.length);w++)if(i[w]===y){let C=w-k+1,R=i.slice(k+1,w),b=u.slice(1,-1),E=b.filter(U=>R.some(v=>Dc(v,U)>=.7)).length;if((b.length>0?E/b.length:1)>=.5&&C<=u.length+2){let U=i.slice(0,k).join(`
219
+ `).length+(k>0?1:0),v=i.slice(0,w+1).join(`
220
+ `).length;return[{start:U,end:v,strategy:"block_anchor"}]}}}}if(u.length>=2)for(let f=0;f<=i.length-u.length;f++){let y=i.slice(f,f+u.length);if(u.map((C,R)=>Dc(C,y[R])).filter(C=>C>=.8).length/u.length>=.5){let C=i.slice(0,f).join(`
221
+ `).length+(f>0?1:0),R=i.slice(0,f+u.length).join(`
222
+ `).length;return[{start:C,end:R,strategy:"context_aware"}]}}return[]}function $c(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 Lc(r,e,t){let n=e.slice(0,t.startIdx).join(`
204
223
  `).length+(t.startIdx>0?1:0),o=e.slice(0,t.endIdx).join(`
205
- `).length;return{start:n,end:o}}function Xl(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 Ql(r){let e=r.split(`
206
- `),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 Gh(r){let e=[],t=r.split(/^(<<<< SEARCH)$/m);if(t.length<2)return[];let n=t[0].trim().split(`
224
+ `).length;return{start:n,end:o}}function Uc(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 Nc(r){let e=r.split(`
225
+ `),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 gb(r){let e=[],t=r.split(/^(<<<< SEARCH)$/m);if(t.length<2)return[];let n=t[0].trim().split(`
207
226
  `).pop()?.trim();if(!n)return[];for(let o=1;o<t.length;o+=2){let s=t[o+1]||"",i=s.indexOf(`
208
227
  ====
209
228
  `);if(i===-1)continue;let a=s.slice(0,i).replace(/^\n/,""),c=s.slice(i+6),d=c.indexOf(`
210
- >>>> REPLACE`),l=d===-1?c:c.slice(0,d);e.push({path:n,search:a,replace:l})}return e}function Zl(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(`
229
+ >>>> REPLACE`),l=d===-1?c:c.slice(0,d);e.push({path:n,search:a,replace:l})}return e}function jc(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(`
211
230
  `);if(!c)return{content:r+`
212
231
  `+s.join(`
213
- `),strategy:"exact"};let d=ec(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(`
214
- `),p=d[0];return{content:r.slice(0,p.start)+u+r.slice(p.end),strategy:p.strategy}}function us(r){return{name:jh,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:Fh,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=Ql(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(`
215
- `);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=Zl(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=Zl(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(`
232
+ `),strategy:"exact"};let d=Fc(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 p=l.join(`
233
+ `),u=d[0];return{content:r.slice(0,u.start)+p+r.slice(u.end),strategy:u.strategy}}function $s(r){return{name:ub,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:pb,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=Nc(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 p=r.resolvePath(l.path);try{switch(l.type){case"add":{let u=l.hunks.flatMap(m=>m.lines.filter(g=>g.prefix==="+").map(g=>g.content)).join(`
234
+ `);await r.writeFile(p,u),o.filesAdded.push(l.path),o.strategies[l.path]="exact";break}case"delete":{await r.deleteFile(p),o.filesDeleted.push(l.path);break}case"move":{let u=await r.readFile(p);if(l.newPath){let m=r.resolvePath(l.newPath),g=u;for(let f of l.hunks){let y=jc(g,f,n);y&&(g=y.content,o.strategies[l.path]=y.strategy)}await r.writeFile(m,g),await r.deleteFile(p),o.filesModified.push(`${l.path} \u2192 ${l.newPath}`)}break}case"update":{let u=await r.readFile(p),m="exact",g=!0;for(let f of l.hunks){let y=jc(u,f,n);if(y)u=y.content,m=y.strategy;else{g=!1;let k=f.lines.filter(w=>w.prefix===" "||w.prefix==="-").map(w=>w.content).slice(0,5).join(`
216
235
  `);o.errors.push(`${l.path}: hunk not matched. Search begins with:
217
- ${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=Gh(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=ec(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 Ql(`*** Begin Patch
236
+ ${k}`)}}(g||u!==await r.readFile(p))&&(await r.writeFile(p,u),o.filesModified.push(l.path),o.strategies[l.path]=m);break}}}catch(u){o.errors.push(`${l.type} ${l.path}: ${u instanceof Error?u.message:String(u)}`)}}}else if(i){let d=gb(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 p=r.resolvePath(l.path);try{let u=await r.readFile(p),m=Fc(u,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,y)=>y.start-f.start);for(let f of g)u=u.slice(0,f.start)+l.replace+u.slice(f.end);await r.writeFile(p,u),o.filesModified.push(l.path),o.strategies[l.path]=m[0].strategy}catch(u){o.errors.push(`${l.path}: ${u instanceof Error?u.message:String(u)}`)}}}else return Nc(`*** Begin Patch
218
237
  `+t.input+`
219
- *** End Patch`).length>0?us(r).execute(e,{input:`*** Begin Patch
238
+ *** End Patch`).length>0?$s(r).execute(e,{input:`*** Begin Patch
220
239
  `+t.input+`
221
240
  *** 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(`
222
241
  Errors:
223
242
  ${o.errors.join(`
224
243
  `)}`);let c=o.errors.length===0;return{content:[{type:"text",text:a.join(`
225
- `)||"No changes applied."}],details:{type:"patch",...o,success:c}}}}}var Wh="web_fetch",Hh={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"]},zh=5e4;function tc(r){return{name:Wh,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:Hh,execute:async(e,t)=>{let n=await r.fetchUrl({url:t.url,extractMode:t.extractMode,maxChars:t.maxChars??zh,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}
244
+ `)||"No changes applied."}],details:{type:"patch",...o,success:c}}}}}var fb="web_fetch",hb={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"]},yb=5e4;function Bc(r){return{name:fb,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:hb,execute:async(e,t)=>{let n=await r.fetchUrl({url:t.url,extractMode:t.extractMode,maxChars:t.maxChars??yb,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}
226
245
 
227
246
  ${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}
228
247
  `),o.push(n.content),n.relevantExcerpts?.length){o.push(`
229
248
  ---
230
249
  ## Relevant Excerpts
231
250
  `);for(let s of n.relevantExcerpts)o.push(`- ${s}`)}return{content:[{type:"text",text:o.join(`
232
- `)}],details:{type:"web_fetch",url:t.url,extractMode:t.extractMode??"markdown",hasExtraction:!!n.extraction,extraction:n.extraction}}}}}var Vh="web_search",qh={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"]},Kh=10;function nc(r){return{name:Vh,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:qh,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:Kh});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(`
233
- `)}],details:{type:"web_search",query:n.query,resultCount:n.results.length}}}}}var Jh="instructions",Yh={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 oc(r){return{name:Jh,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:Yh,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(`
251
+ `)}],details:{type:"web_fetch",url:t.url,extractMode:t.extractMode??"markdown",hasExtraction:!!n.extraction,extraction:n.extraction}}}}}var bb="web_search",kb={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"]},Tb=10;function Wc(r){return{name:bb,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:kb,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:Tb});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(`
252
+ `)}],details:{type:"web_search",query:n.query,resultCount:n.results.length}}}}}var wb="instructions",vb={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 Gc(r){return{name:wb,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:vb,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(`
234
253
  `);return{content:[{type:"text",text:`Found ${n.length} instruction file(s):
235
- ${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 Xh="worktree",Qh={type:"object",properties:{action:{type:"string",enum:["enter","exit","list"],description:`enter: Create and switch to an isolated git worktree branch.
254
+ ${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 xb="worktree",Sb={type:"object",properties:{action:{type:"string",enum:["enter","exit","list"],description:`enter: Create and switch to an isolated git worktree branch.
236
255
  exit: Leave worktree (keep or remove it).
237
- 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 rc(r){return{name:Xh,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:Qh,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(`
256
+ 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"]},Rb=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]?$/;function Hc(r){return{name:xb,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:Sb,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&&!Rb.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(`
238
257
  `)}],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."}
239
258
  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(`
240
- `)}],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 ey}from"node:child_process";import{promisify as ty}from"node:util";import{join as lt,resolve as sc,basename as ps}from"node:path";import{mkdir as uc,rm as pc,symlink as ny,readdir as aR,stat as oy}from"node:fs/promises";var rn=ty(ey),ry=/^[a-zA-Z0-9._-]+$/,ic=64;function mc(r){if(r.length>ic)throw new Error(`Invalid worktree name: must be ${ic} 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(!ry.test(e))throw new Error(`Invalid worktree name "${r}": segment must contain only letters, digits, dots, underscores, and dashes`)}}function ms(r){return r.replaceAll("/","+")}function gc(r){return`worktree-${ms(r)}`}var _e=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 ac(r){let{stdout:e,code:t}=await ue(["status","--porcelain"],r);return t!==0?-1:e.trim().split(`
241
- `).filter(Boolean).length}async function lc(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 fc(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=lt(r,o),i=lt(e,o);try{await ny(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 sy(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 iy(){try{return await rn("tmux",["-V"],{timeout:5e3}),!0}catch{return!1}}function ay(r,e){return`${ps(r)}_${e}`.replace(/[/.]/g,"_")}async function ly(r,e){if(!await iy())return null;try{return await rn("tmux",["new-session","-d","-s",e,"-c",r],{timeout:1e4}),e}catch{return null}}async function cc(r){try{return await rn("tmux",["kill-session","-t",r],{timeout:5e3}),!0}catch{return!1}}async function dc(r,e,t,n){let o=ha(e),s=lt(o,r);try{if(!(await oy(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 hc(r,e,t){mc(e);let n=ms(e),o=gc(e),s=lt(r,".worktrees"),i=lt(s,n);await uc(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 fc(r,i,["node_modules"],t),t?.info(`[worktree] agent worktree created: ${e} at ${i}`),{worktreePath:i,branch:o})}async function yc(r,e,t,n){let{code:o}=await ue(["worktree","remove","--force",e],r);return o!==0&&(await pc(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 bc(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 dc("worktree-create",i,{WORKTREE_NAME:o??""},e);if(a){let O=process.cwd();return process.chdir(a),_e={originalCwd:O,worktreePath:a,worktreeName:o??ps(a),worktreeBranch:"",hookBased:!0,creationDurationMs:Date.now()-s},{success:!0,worktree:{name:_e.worktreeName,path:a,branch:"",isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let c=o??`agent-${Date.now().toString(36)}`;mc(c);let d=ms(c),l=gc(c),u=lt(i,".worktrees"),p=lt(u,d);await uc(u,{recursive:!0});let{stdout:m}=await ue(["worktree","list","--porcelain"],i),g=m.split(`
242
- `).find(O=>O.startsWith("worktree ")&&O.includes(d));if(g){let O=g.replace("worktree ","").trim(),$=process.cwd();return process.chdir(O),_e={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 sy(p,i,n),_=!0),await fc(i,p,t,e);let R=process.cwd();process.chdir(p);let y=ay(i,l),M=await ly(p,y);return _e={originalCwd:R,worktreePath:p,worktreeName:c,worktreeBranch:l,tmuxSessionName:M??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(!_e)return{success:!1,error:"Not in a worktree"};try{let i=_e,a=await on(i.originalCwd);if(!a)return{success:!1,error:"Original git root not found"};if(o==="remove"){let c=await ac(i.worktreePath),d=await lc(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),_e=null,i.tmuxSessionName&&await cc(i.tmuxSessionName),await dc("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 pc(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 cc(i.tmuxSessionName),_e=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(`
259
+ `)}],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 _b}from"node:child_process";import{promisify as Cb}from"node:util";import{join as yt,resolve as zc,basename as Ls}from"node:path";import{mkdir as Xc,rm as Qc,symlink as Ab,readdir as mA,stat as Ib}from"node:fs/promises";var hn=Cb(_b),Mb=/^[a-zA-Z0-9._-]+$/,Vc=64;function Zc(r){if(r.length>Vc)throw new Error(`Invalid worktree name: must be ${Vc} 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(!Mb.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 ed(r){return`worktree-${Us(r)}`}var Ie=null;async function fe(r,e){try{let{stdout:t,stderr:n}=await hn("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 fn(r){let{stdout:e,code:t}=await fe(["rev-parse","--show-toplevel"],r);return t===0?e.trim():null}async function qc(r){let{stdout:e,code:t}=await fe(["status","--porcelain"],r);return t!==0?-1:e.trim().split(`
260
+ `).filter(Boolean).length}async function Kc(r,e){let{stdout:t,code:n}=await fe(["rev-list",`origin/${e}..${e}`,"--count"],r);return n!==0?0:parseInt(t.trim(),10)||0}async function td(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=yt(r,o),i=yt(e,o);try{await Ab(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 Pb(r,e,t){let{code:n,stderr:o}=await fe(["sparse-checkout","set","--cone","--",...t],r);if(n!==0)throw await fe(["worktree","remove","--force",r],e),new Error(`Failed to configure sparse-checkout: ${o}`);let{code:s,stderr:i}=await fe(["checkout","HEAD"],r);if(s!==0)throw await fe(["worktree","remove","--force",r],e),new Error(`Failed to checkout sparse worktree: ${i}`);return!0}async function Eb(){try{return await hn("tmux",["-V"],{timeout:5e3}),!0}catch{return!1}}function Ob(r,e){return`${Ls(r)}_${e}`.replace(/[/.]/g,"_")}async function Db(r,e){if(!await Eb())return null;try{return await hn("tmux",["new-session","-d","-s",e,"-c",r],{timeout:1e4}),e}catch{return null}}async function Jc(r){try{return await hn("tmux",["kill-session","-t",r],{timeout:5e3}),!0}catch{return!1}}async function Yc(r,e,t,n){let o=Ha(e),s=yt(o,r);try{if(!(await Ib(s)).isFile())return null}catch{return null}try{let{stdout:i,stderr:a}=await hn(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 nd(r,e,t){Zc(e);let n=Us(e),o=ed(e),s=yt(r,".worktrees"),i=yt(s,n);await Xc(s,{recursive:!0});let{code:a,stderr:c}=await fe(["worktree","add","-B",o,i,"HEAD"],r);return a!==0?(t?.warn(`[worktree] agent worktree creation failed: ${c}`),null):(await td(r,i,["node_modules"],t),t?.info(`[worktree] agent worktree created: ${e} at ${i}`),{worktreePath:i,branch:o})}async function od(r,e,t,n){let{code:o}=await fe(["worktree","remove","--force",e],r);return o!==0&&(await Qc(e,{recursive:!0,force:!0}).catch(()=>{}),await fe(["worktree","prune"],r)),await fe(["branch","-D",t],r),n?.info(`[worktree] agent worktree removed: ${e}`),!0}function rd(r){let{log:e,symlinkDirs:t=["node_modules"],sparsePaths:n}=r;return{async enterWorktree(o){try{let s=Date.now(),i=await fn();if(!i)return{success:!1,error:"Not in a git repository"};let a=await Yc("worktree-create",i,{WORKTREE_NAME:o??""},e);if(a){let P=process.cwd();return process.chdir(a),Ie={originalCwd:P,worktreePath:a,worktreeName:o??Ls(a),worktreeBranch:"",hookBased:!0,creationDurationMs:Date.now()-s},{success:!0,worktree:{name:Ie.worktreeName,path:a,branch:"",isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let c=o??`agent-${Date.now().toString(36)}`;Zc(c);let d=Us(c),l=ed(c),p=yt(i,".worktrees"),u=yt(p,d);await Xc(p,{recursive:!0});let{stdout:m}=await fe(["worktree","list","--porcelain"],i),g=m.split(`
261
+ `).find(P=>P.startsWith("worktree ")&&P.includes(d));if(g){let P=g.replace("worktree ","").trim(),U=process.cwd();return process.chdir(P),Ie={originalCwd:U,worktreePath:P,worktreeName:c,worktreeBranch:l},e.info(`[worktree] resumed existing worktree: ${c} at ${P}`),{success:!0,worktree:{name:c,path:P,branch:l,isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let f=n&&n.length>0,y=["worktree","add"];f&&y.push("--no-checkout"),y.push("-B",l,u,"HEAD");let{code:k,stderr:w}=await fe(y,i);if(k!==0)return{success:!1,error:`git worktree add failed: ${w.trim()}`};let C=!1;f&&n&&(await Pb(u,i,n),C=!0),await td(i,u,t,e);let R=process.cwd();process.chdir(u);let b=Ob(i,l),E=await Db(u,b);return Ie={originalCwd:R,worktreePath:u,worktreeName:c,worktreeBranch:l,tmuxSessionName:E??void 0,creationDurationMs:Date.now()-s,usedSparsePaths:C},e.info(`[worktree] entered: ${c} at ${u}`),{success:!0,worktree:{name:c,path:u,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(!Ie)return{success:!1,error:"Not in a worktree"};try{let i=Ie,a=await fn(i.originalCwd);if(!a)return{success:!1,error:"Original git root not found"};if(o==="remove"){let c=await qc(i.worktreePath),d=await Kc(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),Ie=null,i.tmuxSessionName&&await Jc(i.tmuxSessionName),await Yc("worktree-remove",a,{WORKTREE_PATH:i.worktreePath},e);let l=["worktree","remove"];s&&l.push("--force"),l.push(i.worktreePath);let{code:p,stderr:u}=await fe(l,a);p!==0&&(e.warn(`[worktree] git worktree remove failed: ${u.trim()}, cleaning up manually`),await Qc(i.worktreePath,{recursive:!0,force:!0}).catch(()=>{}),await fe(["worktree","prune"],a)),await fe(["branch","-D",i.worktreeBranch],a),e.info(`[worktree] removed: ${i.worktreeName}`)}else process.chdir(i.originalCwd),i.tmuxSessionName&&await Jc(i.tmuxSessionName),Ie=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 fe(["worktree","list","--porcelain"]);if(s!==0)return{success:!0,worktrees:[]};let i=[],a=process.cwd(),c=o.split(`
243
262
 
244
263
  `).filter(Boolean);for(let d of c){let l=d.split(`
245
- `),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=sc(u)===sc(a),g=await ac(u),f=await lc(u,p);i.push({name:p.startsWith("worktree-")?p.slice(9):ps(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 _e!==null},currentWorktree(){return _e?{name:_e.worktreeName,path:_e.worktreePath,branch:_e.worktreeBranch,isCurrent:!0,hasChanges:!1,unpushedCommits:0}:null}}}import{readFile as cy,writeFile as dy}from"node:fs/promises";import*as kc from"node:path";var uy={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 Tc(r){let e=r.split(`
264
+ `),p="",u="";for(let y of l)y.startsWith("worktree ")&&(p=y.slice(9).trim()),y.startsWith("branch ")&&(u=y.slice(7).trim().replace("refs/heads/",""));if(!p)continue;let m=zc(p)===zc(a),g=await qc(p),f=await Kc(p,u);i.push({name:u.startsWith("worktree-")?u.slice(9):Ls(p),path:p,branch:u,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 Ie!==null},currentWorktree(){return Ie?{name:Ie.worktreeName,path:Ie.worktreePath,branch:Ie.worktreeBranch,isCurrent:!0,hasChanges:!1,unpushedCommits:0}:null}}}import{readFile as $b,writeFile as Lb}from"node:fs/promises";import*as sd from"node:path";var Ub={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 id(r){let e=r.split(`
246
265
  `);return e.map((t,n)=>n<e.length-1?t+`
247
- `:t)}function wc(r){return r.join("")}function py(r,e){let t=wc(r.source).trim(),n=t.length>80?t.slice(0,80)+"...":t;return`Cell ${e+1} [${r.cell_type}]: ${n}`}function my(r,e){let t={cell_type:r,source:Tc(e),metadata:{}};return r==="code"&&(t.execution_count=null,t.outputs=[]),t}function vc(){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:uy,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=kc.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 cy(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=wc(m.source);m.source=Tc(e.new_source),m.cell_type==="code"&&(m.execution_count=null,m.outputs=[]),l=`Replaced cell ${n} [${m.cell_type}].
266
+ `:t)}function ad(r){return r.join("")}function Nb(r,e){let t=ad(r.source).trim(),n=t.length>80?t.slice(0,80)+"...":t;return`Cell ${e+1} [${r.cell_type}]: ${n}`}function jb(r,e){let t={cell_type:r,source:id(e),metadata:{}};return r==="code"&&(t.execution_count=null,t.outputs=[]),t}function ld(){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:Ub,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=sd.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 $b(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=ad(m.source);m.source=id(e.new_source),m.cell_type==="code"&&(m.execution_count=null,m.outputs=[]),l=`Replaced cell ${n} [${m.cell_type}].
248
267
  Old: ${g.slice(0,120)}${g.length>120?"...":""}
249
- 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=my(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)+`
250
- `;await dy(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)=>py(m,g)).join(`
251
- `),p=a.cells.length>10?`
268
+ 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=jb(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)+`
269
+ `;await Lb(t,m,"utf-8")}catch(m){return{content:[{type:"text",text:`Error writing notebook: ${m.message}`}],details:{error:"write_failed"}}}let p=a.cells.slice(0,10).map((m,g)=>Nb(m,g)).join(`
270
+ `),u=a.cells.length>10?`
252
271
  ... and ${a.cells.length-10} more cells`:"";return{content:[{type:"text",text:`${l}
253
272
 
254
273
  Current cells:
255
- ${u}${p}`}],details:{type:"notebook_edit",edit_mode:o,cell_number:n,total_cells:a.cells.length}}}}}import{readFile as gy,readdir as fy}from"node:fs/promises";import*as Sc from"node:path";import{existsSync as hy}from"node:fs";var yy={type:"object",properties:{action:{type:"string",enum:["list","run","describe"],description:`list: Show available workflows.
274
+ ${p}${u}`}],details:{type:"notebook_edit",edit_mode:o,cell_number:n,total_cells:a.cells.length}}}}}import{readFile as Fb,readdir as Bb}from"node:fs/promises";import*as dd from"node:path";import{existsSync as Wb}from"node:fs";var Gb={type:"object",properties:{action:{type:"string",enum:["list","run","describe"],description:`list: Show available workflows.
256
275
  run: Execute a workflow by name.
257
- 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 gs(r){let e=new Map,t=pa(r);await xc(t,e);let n=da();return await xc(n,e),e}async function xc(r,e){if(hy(r))try{let t=await fy(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,Sc.join(r,n.name))}}catch{}}async function fs(r){let e=await gy(r,"utf-8");return JSON.parse(e)}function by(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 ky(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 _c(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:yy,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 gs(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 fs(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(`
258
- `)}],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 gs(o)).get(t.workflow);if(!i)return{content:[{type:"text",text:`Error: Workflow "${t.workflow}" not found.`}],details:{error:"not_found"}};let a=await fs(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(`
259
- `)}],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 gs(o)).get(t.workflow);if(!i)return{content:[{type:"text",text:`Error: Workflow "${t.workflow}" not found.`}],details:{error:"not_found"}};let a=await fs(i),c={...a.variables,...t.variables},d;try{d=by(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=ky(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(`
260
- `)}],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 Ty="sleep",wy={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 Rc(r){return{name:Ty,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(`
261
- `),parameters:wy,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(`
262
- `)}],details:{...c,requestedSeconds:o}}}finally{n?.removeEventListener("abort",a)}}}}var vy="tool_search",xy={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"]},Sy=5;function Ac(r){return{name:vy,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:xy,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??Sy;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 Cc(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(`
263
- `)}],details:{type:"tool_search",activated:a,notFound:c,mode:"select"}}}let s=await r.searchTools(n,{maxResults:o});return Cc(s)}}}function Cc(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(`
264
- `)}],details:{type:"tool_search",query:r.query,matchCount:r.matches.length,totalDeferred:r.totalDeferred,matches:r.matches.map(t=>t.name)}}}var hs="image_generate",_y={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 Pc(r){return{name:hs,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:_y,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 Ry={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 Ic(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:Ry,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 ys="video_generate",Cy={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 Mc(r){return{name:ys,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:Cy,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 bs="music_generate",Ay={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 Ec(r){return{name:bs,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:Ay,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 Py="video_edit",Iy={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 Oc(r){return{name:Py,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:Iy,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 My="video_merge",Ey={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 Lc(r){return{name:My,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:Ey,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 Oy="video_upscale",Ly={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 Dc(r){return{name:Oy,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:Ly,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 Dy="three_d_generate",$y={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 $c(r){return{name:Dy,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:$y,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 Ny={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 Nc(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:Ny,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 Uy="voice_clone",jy={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 Uc(r){return{name:Uy,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:jy,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 Fy="media_cancel",By={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 jc(r){return{name:Fy,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:By,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 Gy="file_upload",Wy={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 Fc(r){return{name:Gy,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:Wy,execute:async(e,t)=>{let n=await r.uploadFile({filePath:t.file_path,purpose:t.purpose}),o=[`Uploaded "${n.filename}" (${ks(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(`
265
- `)}],details:{type:"file_upload",fileId:n.fileId,url:n.url,filename:n.filename,bytes:n.bytes,provider:n.provider}}}}}var Hy="file_query",zy={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 Bc(r){return{name:Hy,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:zy,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: ${ks(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(`
276
+ 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 Ns(r){let e=new Map,t=Fa(r);await cd(t,e);let n=Na();return await cd(n,e),e}async function cd(r,e){if(Wb(r))try{let t=await Bb(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,dd.join(r,n.name))}}catch{}}async function js(r){let e=await Fb(r,"utf-8");return JSON.parse(e)}function Hb(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 zb(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 ud(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:Gb,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 Ns(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 js(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(`
277
+ `)}],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 Ns(o)).get(t.workflow);if(!i)return{content:[{type:"text",text:`Error: Workflow "${t.workflow}" not found.`}],details:{error:"not_found"}};let a=await js(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(`
278
+ `)}],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 Ns(o)).get(t.workflow);if(!i)return{content:[{type:"text",text:`Error: Workflow "${t.workflow}" not found.`}],details:{error:"not_found"}};let a=await js(i),c={...a.variables,...t.variables},d;try{d=Hb(a.steps)}catch(m){return{content:[{type:"text",text:`Error: ${m.message}`}],details:{error:"dag_error"}}}let l=new Map,p=[`Running workflow: ${a.name}`,""],u=!0;for(let m of d){if(n?.aborted){p.push(`\u26A1 Aborted at step: ${m.id}`),u=!1;break}let g=(m.dependsOn??[]).some(k=>!l.get(k)?.success),f=m.condition??"on_success";if(f==="on_success"&&g){p.push(`\u23ED Skipped ${m.id} (dependency failed)`),l.set(m.id,{stepId:m.id,success:!1,output:"",error:"dependency_failed"}),u=!1;continue}if(f==="on_failure"&&!g){p.push(`\u23ED Skipped ${m.id} (no failure to handle)`),l.set(m.id,{stepId:m.id,success:!0,output:""});continue}p.push(`\u25B6 ${m.id}: ${m.label??m.tool}`);let y=zb(m.args,c,l);try{let k=await r.invokeTool(m.tool,y,n),w=!k.error;if(l.set(m.id,{stepId:m.id,success:w,output:k.result,error:k.error}),w){let C=k.result.length>200?k.result.slice(0,200)+"...":k.result;p.push(` \u2705 ${C}`)}else p.push(` \u274C ${k.error}`),u=!1}catch(k){let w=k.message;l.set(m.id,{stepId:m.id,success:!1,output:"",error:w}),p.push(` \u274C ${w}`),u=!1}}return p.push("",u?"Workflow completed successfully.":"Workflow completed with errors."),{content:[{type:"text",text:p.join(`
279
+ `)}],details:{type:"workflow",action:"run",workflow:a.name,success:u,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 Vb="sleep",qb={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 pd(r){return{name:Vb,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(`
280
+ `),parameters:qb,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(`
281
+ `)}],details:{...c,requestedSeconds:o}}}finally{n?.removeEventListener("abort",a)}}}}var Kb="tool_search",Jb={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"]},Yb=5;function gd(r){return{name:Kb,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:Jb,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??Yb;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 md(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(`
282
+ `)}],details:{type:"tool_search",activated:a,notFound:c,mode:"select"}}}let s=await r.searchTools(n,{maxResults:o});return md(s)}}}function md(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(`
283
+ `)}],details:{type:"tool_search",query:r.query,matchCount:r.matches.length,totalDeferred:r.totalDeferred,matches:r.matches.map(t=>t.name)}}}var Fs="image_generate",Xb={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 fd(r){return{name:Fs,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:Xb,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 Qb={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 hd(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:Qb,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 Bs="video_generate",Zb={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 yd(r){return{name:Bs,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:Zb,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 Ws="music_generate",ek={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 bd(r){return{name:Ws,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:ek,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 tk="video_edit",nk={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 kd(r){return{name:tk,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:nk,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 ok="video_merge",rk={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 Td(r){return{name:ok,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:rk,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 sk="video_upscale",ik={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 wd(r){return{name:sk,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:ik,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 ak="three_d_generate",lk={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 vd(r){return{name:ak,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:lk,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 ck={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 xd(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:ck,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 dk="voice_clone",uk={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 Sd(r){return{name:dk,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:uk,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 pk="media_cancel",mk={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 Rd(r){return{name:pk,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:mk,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 gk="file_upload",fk={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 _d(r){return{name:gk,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:fk,execute:async(e,t)=>{let n=await r.uploadFile({filePath:t.file_path,purpose:t.purpose}),o=[`Uploaded "${n.filename}" (${Gs(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(`
284
+ `)}],details:{type:"file_upload",fileId:n.fileId,url:n.url,filename:n.filename,bytes:n.bytes,provider:n.provider}}}}}var hk="file_query",yk={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 Cd(r){return{name:hk,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:yk,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: ${Gs(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(`
266
285
  `)}],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):
267
- `];for(let i of o)s.push(`- ${i.filename} | ID: ${i.id} | ${ks(i.bytes)} | ${i.status}${i.url?` | ${i.url}`:""}`);return{content:[{type:"text",text:s.join(`
268
- `)}],details:{type:"file_query",count:o.length}}}}}var Vy="file_delete",qy={type:"object",properties:{file_id:{type:"string",description:"ID of the uploaded file to delete."}},required:["file_id"]};function Gc(r){return{name:Vy,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:qy,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 ks(r){return r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`}var Ky="ask_user",Jy={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 Wc(r){return{name:Ky,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:Jy,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(`
269
- `)}],details:{type:"ask_user",answers:o,questionCount:t.questions.length}}}}}function Hc(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={},qc,vs,Ye={},Kc;function Jc(r){Kc=r}var Yc=null;function Xc(r){Yc=r}function Qc(r,e,t,n,o){te=r,ge=e??{},qc=t,vs=o,Ye=n??{},Qy()}function xs(r){let e=Ye[r];if(!(!e||!te))return te.resolveModelById(e.provider,e.model,r)}function Qy(){Zy(),eb(),tb(),nb()}function Zy(){let r=Se(ys);if(!r)return;let e=Ye.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 eb(){let r=Se(hs);if(!r)return;let e=xs("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 tb(){let r=Se("tts");if(!r)return;let e=xs("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 nb(){let r=Se(bs);if(!r)return;let e=xs("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 Le(r){if(!te)throw new Error(`No media provider configured for ${r.mediaType}`);let e=Ye[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};vs&&!o.onProgress&&(o.onProgress=(c,d,l)=>{vs(l??"pending",r.mediaType,c,d,t)});let s=await zc(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 zc(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}:
286
+ `];for(let i of o)s.push(`- ${i.filename} | ID: ${i.id} | ${Gs(i.bytes)} | ${i.status}${i.url?` | ${i.url}`:""}`);return{content:[{type:"text",text:s.join(`
287
+ `)}],details:{type:"file_query",count:o.length}}}}}var bk="file_delete",kk={type:"object",properties:{file_id:{type:"string",description:"ID of the uploaded file to delete."}},required:["file_id"]};function Ad(r){return{name:bk,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:kk,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 Gs(r){return r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`}var Tk="ask_user",wk={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 Id(r){return{name:Tk,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:wk,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(`
288
+ `)}],details:{type:"ask_user",answers:o,questionCount:t.questions.length}}}}}function Md(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 oe,he={},Od,Vs,rt={},Dd;function $d(r){Dd=r}var Ld=null;function Ud(r){Ld=r}function Nd(r,e,t,n,o){oe=r,he=e??{},Od=t,Vs=o,rt=n??{},Sk()}function qs(r){let e=rt[r];if(!(!e||!oe))return oe.resolveModelById(e.provider,e.model,r)}function Sk(){Rk(),_k(),Ck(),Ak()}function Rk(){let r=Ae(Bs);if(!r)return;let e=rt.video;if(!e||!oe)return;let t=oe.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 _k(){let r=Ae(Fs);if(!r)return;let e=qs("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 Ck(){let r=Ae("tts");if(!r)return;let e=qs("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 Ak(){let r=Ae(Ws);if(!r)return;let e=qs("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 Be(r){if(!oe)throw new Error(`No media provider configured for ${r.mediaType}`);let e=rt[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};Vs&&!o.onProgress&&(o.onProgress=(c,d,l)=>{Vs(l??"pending",r.mediaType,c,d,t)});let s=await Pd(t,n||r.model,o);if(s.ok)return s.result;let i=oe.listMediaModels(r.mediaType),a=[`${t}: ${s.error}`];for(let c of i){if(c.providerId===t||!he[c.providerId])continue;let l=await Pd(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}:
270
289
  `+a.map(c=>` - ${c}`).join(`
271
- `))}async function zc(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 qc?.(a,c,d),{ok:!0,result:i}}catch(s){return{ok:!1,error:s instanceof Error?s.message:String(s)}}}function De(r){if(!te)return!1;let e=Ye[r];if(!e)return!1;let t=te.getTransport(e.provider),n=ge[e.provider];return!!(t&&n)}function Ts(r,e){if(!De(r))return!1;let t=Ye[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 ro(){if(!te)return;for(let[,e]of Object.entries(Ye)){if(!e)continue;let t=te.getTransport(e.provider),n=ge[e.provider];if(t instanceof Ce&&n)return{id:e.provider,type:"volcengine"}}if(ge.google)return{id:"google",type:"gemini"}}var ws;function so(){return ws||(ws=new Jt({baseUrl:"https://generativelanguage.googleapis.com/v1beta"})),ws}var ct=process.cwd();function he(r){return z.isAbsolute(r)?z.normalize(r):z.resolve(ct,r)}var ob=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg",".ico"]),Zc=new Set([".exe",".dll",".so",".dylib",".zip",".tar",".gz",".7z",".rar",".wasm",".class"]),rb={".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 sb(){return{resolvePath:he,async readFile(r){let e=he(r),t=z.extname(e).toLowerCase();if(Zc.has(t))return{type:"binary",mimeType:"application/octet-stream"};if(ob.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 ib(){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 ab(){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 lb(){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 cb(){return{resolvePath:he,async glob(r,e){let t=e.cwd||ct,n=e.limit||1e3,o=[],s=!1,i=r.replace(/\\/g,"/").split("/"),a=i.some(l=>l==="**"),c=i[i.length-1]??"*",d=ed(c);try{await Ss(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||ct;try{return await ub(r,t,e)}catch{return await pb(r,t,e)}}}}function ed(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 db=new Set([".git",".svn",".hg","node_modules","__pycache__",".next","dist",".tox",".venv"]);async function Ss(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(db.has(i.name))continue;await Ss(z.join(r,i.name),e,t,n+1,a)}else if(i.isFile()&&!await e(a))return}}function ub(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("."),Xy("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(`
272
- `))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 pb(r,e,t){let n=new RegExp(r,t.caseInsensitive?"i":""),o=t.headLimit??250,s=t.offset??0,i=t.fileGlob?ed(t.fileGlob):null,a=[],c=!1;return await Ss(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(Zc.has(l))return!0;try{let p=(await N.promises.readFile(z.join(e,d),"utf8")).split(`
273
- `);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 Vc=!1;function mb(){if(!Vc)if(Vc=!0,Kn()){let r=process.env.QLOGICAGENT_POWERSHELL_PATH??"powershell.exe";nn(is(r))}else if(process.platform==="win32"){let r=gb();nn(oo(r))}else{let r=process.env.SHELL?.endsWith("bash")?process.env.SHELL:"/bin/bash";nn(oo(r))}}function gb(){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 fb(){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=hb(s)),{content:s,title:yb(s)}}finally{clearTimeout(t)}}}}function hb(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 yb(r){return r.match(/<title[^>]*>([^<]+)<\/title>/i)?.[1]?.trim()}function bb(){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)=>Hc(Kc,r)(e,t)}}function kb(){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 Tb(r){r?.workdir&&(ct=r.workdir),mb(),eo(ct);let e=[];e.push(vl()),e.push(xl()),e.push(Wc({askUser:async l=>Yc?.(l)??null})),e.push($l({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=sb(),n=ib(),o=ab(),s=lb();e.push(jl(t)),e.push(Bl(n)),e.push(Gl(o)),e.push(us(s)),e.push(Vl(s)),e.push(zl(cb())),e.push(tc(fb())),e.push(nc(bb()));let i=kb();e.push(oc(i));let a=r?.log??{info:()=>{},warn:()=>{}};e.push(rc(bc({log:a}))),e.push(vc());let c={invokeTool:async(l,u,p)=>{let m=Se(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(`
274
- `),error:g.details?.error}}catch(g){return{result:"",error:g.message}}},getCwd:()=>ct};e.push(_c(c)),e.push(Rc({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(Ac({searchTools:async(l,u)=>{let p=u?.maxResults??5,m=Ke(),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 M=Se(y),O=T(y),$=(M?.description??"").toLowerCase(),v=(M?.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:M?.description??"",searchHint:M?.searchHint,score:pe}}).filter(y=>y!==null&&y.score>0).sort((y,M)=>M.score-y.score).slice(0,p),query:l,totalDeferred:m.length}},activateTool:async l=>wl(l)})),e.push({...Pc({generateImage:async l=>{let u=await Le({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:()=>De("image")}),e.push({...Ic({textToSpeech:async l=>{let u=await Le({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:()=>De("tts")}),e.push({...Mc({generateVideo:async l=>{let u=await Le({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:()=>De("video")}),e.push({...Ec({generateMusic:async l=>{let u=await Le({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=Ye.music;if(!u||!te)return"";let p=te.getTransport(u.provider);if(!(p instanceof st))return"";let m=ge[u.provider];return m?p.generateLyrics(l,m):""}}),isEnabled:()=>De("music")}),e.push({...Oc({editVideo:async l=>{let u=await Le({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:()=>Ts("video","edit")}),e.push({...Lc({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 Le({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:()=>Ts("video","merge")}),e.push({...Dc({upscaleVideo:async l=>{let u=["upscale"];l.sharpness&&u.push(`sharpness: ${l.sharpness}`);let p=await Le({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:()=>Ts("video","upscale")}),e.push({...$c({generate3D:async l=>{let u=await Le({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:()=>De("3d")}),e.push({...Nc({speechToText:async l=>{let u=await Le({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:()=>De("stt")}),e.push({...Uc({cloneVoice:async l=>{let u=await Le({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:()=>De("voice_clone")}),e.push({...jc({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:()=>De("video")||De("3d")});let d=ro();return e.push({...Fc({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=so(),y=ge.google,M=z.extname(u).toLowerCase(),O=rb[M]??"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 Ce))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:()=>!!ro()}),e.push({...Bc({queryFile:async l=>{if(!d)throw new Error("No file API provider available.");if(d.type==="gemini"){let g=so(),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 Ce))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=so(),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 Ce))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:()=>!!ro()}),e.push({...Gc({deleteFile:async l=>{if(!d)throw new Error("No file API provider available.");if(d.type==="gemini"){let m=so(),g=ge.google;await m.deleteFile(l.fileId,g);return}let u=te.getTransport(d.id),p=ge[d.id];if(!(u instanceof Ce))throw new Error("File delete only supported via Volcengine or Google provider.");await u.deleteFile(l.fileId,p)}}),shouldDefer:!0,isEnabled:()=>!!ro()}),Tl(e),r?.log?.info(`[tool-bootstrap] Registered ${e.length} local tools (${e.filter(l=>l.isEnabled?.()!==!1).length} enabled): ${Ke().join(", ")}`),e}var td=Tb;function io(r){ct=r,eo(r)}import{spawn as wb}from"node:child_process";import{createInterface as vb}from"node:readline";var ao=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=wb(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=vb({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=xb(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(`
275
- `)||"(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+`
276
- `)}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 xb(r){return r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}import{randomUUID as Sb}from"node:crypto";var lo=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=Sb(),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(`
277
- `);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__${_b(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(`
278
- `)||"(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 _b(r){return r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}var co=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 lo(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 ao(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();Hr(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 Ke())s.startsWith(n)&&qn(s);let o=t.toPortableTools();Hr(o),this.log.info(`[mcp] re-injected ${o.length} tools from ${e}`)}};function _s(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 Rb={type:"object",properties:{server:{type:"string",description:"MCP server name to list resources from. Omit to list from all connected servers."}}};function nd(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:Rb,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(`
279
- `).trim()}],details:{type:"list_mcp_resources",count:o.length}}}}}var Cb={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 od(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:Cb,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} ---
290
+ `))}async function Pd(r,e,t){let n=oe.getTransport(r);if(!n)return{ok:!1,error:"transport not available"};let o=he[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 Od?.(a,c,d),{ok:!0,result:i}}catch(s){return{ok:!1,error:s instanceof Error?s.message:String(s)}}}function We(r){if(!oe)return!1;let e=rt[r];if(!e)return!1;let t=oe.getTransport(e.provider),n=he[e.provider];return!!(t&&n)}function Hs(r,e){if(!We(r))return!1;let t=rt[r],n=oe.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 xo(){if(!oe)return;for(let[,e]of Object.entries(rt)){if(!e)continue;let t=oe.getTransport(e.provider),n=he[e.provider];if(t instanceof Oe&&n)return{id:e.provider,type:"volcengine"}}if(he.google)return{id:"google",type:"gemini"}}var zs;function So(){return zs||(zs=new rn({baseUrl:"https://generativelanguage.googleapis.com/v1beta"})),zs}var bt=process.cwd();function ke(r){return q.isAbsolute(r)?q.normalize(r):q.resolve(bt,r)}var Ik=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg",".ico"]),jd=new Set([".exe",".dll",".so",".dylib",".zip",".tar",".gz",".7z",".rar",".wasm",".class"]),Mk={".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 Pk(){return{resolvePath:ke,async readFile(r){let e=ke(r),t=q.extname(e).toLowerCase();if(jd.has(t))return{type:"binary",mimeType:"application/octet-stream"};if(Ik.has(t)){let o=await B.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 B.promises.readFile(e,"utf8")}},validatePath(r){let e=ke(r);return e.startsWith("/dev/")||e.startsWith("/proc/")||e.startsWith("/sys/")?`Blocked: reading device/system path ${e}`:null}}}function Ek(){return{resolvePath:ke,async writeFile(r,e){let t=ke(r);await B.promises.mkdir(q.dirname(t),{recursive:!0}),await B.promises.writeFile(t,e,"utf8")}}}function Ok(){return{resolvePath:ke,async readFile(r){let e=ke(r);return B.promises.readFile(e,"utf8")},async writeFile(r,e){let t=ke(r);await B.promises.mkdir(q.dirname(t),{recursive:!0}),await B.promises.writeFile(t,e,"utf8")}}}function Dk(){return{resolvePath:ke,async readFile(r){let e=ke(r);return B.promises.readFile(e,"utf8")},async writeFile(r,e){let t=ke(r);await B.promises.mkdir(q.dirname(t),{recursive:!0}),await B.promises.writeFile(t,e,"utf8")},async deleteFile(r){let e=ke(r);await B.promises.unlink(e)},async fileExists(r){let e=ke(r);try{return await B.promises.access(e),!0}catch{return!1}}}}function $k(){return{resolvePath:ke,async glob(r,e){let t=e.cwd||bt,n=e.limit||1e3,o=[],s=!1,i=r.replace(/\\/g,"/").split("/"),a=i.some(l=>l==="**"),c=i[i.length-1]??"*",d=Fd(c);try{await Ks(t,async l=>{if(o.length>=n)return s=!0,!1;let p=q.basename(l);return d.test(p)&&o.push(l),!0},a?1/0:1)}catch{}return{files:o,truncated:s}},async grep(r,e){let t=e.cwd||bt;try{return await Uk(r,t,e)}catch{return await Nk(r,t,e)}}}}function Fd(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 Lk=new Set([".git",".svn",".hg","node_modules","__pycache__",".next","dist",".tox",".venv"]);async function Ks(r,e,t,n=0,o=""){if(n>t)return;let s;try{s=await B.promises.readdir(r,{withFileTypes:!0})}catch{return}for(let i of s){let a=o?`${o}/${i.name}`:i.name;if(i.isDirectory()){if(Lk.has(i.name))continue;await Ks(q.join(r,i.name),e,t,n+1,a)}else if(i.isFile()&&!await e(a))return}}function Uk(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("."),xk("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 u of a.split(`
291
+ `))if(u.trim())try{let m=JSON.parse(u);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,p=c.slice(l,l+d);n({matches:p,truncated:c.length>l+d})})})}async function Nk(r,e,t){let n=new RegExp(r,t.caseInsensitive?"i":""),o=t.headLimit??250,s=t.offset??0,i=t.fileGlob?Fd(t.fileGlob):null,a=[],c=!1;return await Ks(e,async d=>{if(a.length>=s+o+1)return c=!0,!1;if(i&&!i.test(q.basename(d)))return!0;let l=q.extname(d).toLowerCase();if(jd.has(l))return!0;try{let u=(await B.promises.readFile(q.join(e,d),"utf8")).split(`
292
+ `);for(let m=0;m<u.length;m++)if(n.test(u[m])&&(a.push({path:d,line:m+1,text:u[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 Ed=!1;function jk(){if(!Ed)if(Ed=!0,mo()){let r=process.env.QLOGICAGENT_POWERSHELL_PATH??"powershell.exe";gn(Ms(r))}else if(process.platform==="win32"){let r=Fk();gn(vo(r))}else{let r=process.env.SHELL?.endsWith("bash")?process.env.SHELL:"/bin/bash";gn(vo(r))}}function Fk(){let r=process.env.QLOGICAGENT_BASH_PATH;if(r&&B.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?q.join(process.env.ProgramFiles,"Git","bin","bash.exe"):null;t&&!e.includes(t)&&e.unshift(t);for(let n of e)if(B.existsSync(n))return n;return"bash"}function Bk(){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=Wk(s)),{content:s,title:Gk(s)}}finally{clearTimeout(t)}}}}function Wk(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 Gk(r){return r.match(/<title[^>]*>([^<]+)<\/title>/i)?.[1]?.trim()}function Hk(){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(p=>({title:p.title??"",url:p.url??"",snippet:p.content??""}));if(t?.allowedDomains?.length){let p=new Set(t.allowedDomains.map(u=>u.toLowerCase()));return{query:e,results:l.filter(u=>{try{return p.has(new URL(u.url).hostname.toLowerCase())}catch{return!1}})}}if(t?.blockedDomains?.length){let p=new Set(t.blockedDomains.map(u=>u.toLowerCase()));return{query:e,results:l.filter(u=>{try{return!p.has(new URL(u.url).hostname.toLowerCase())}catch{return!0}})}}return{query:e,results:l,totalResults:d.number_of_results}}finally{clearTimeout(a)}};return{search:(e,t)=>Md(Dd,r)(e,t)}}function zk(){let r=q.join(process.env.HOME??process.env.USERPROFILE??".",".qlogicagent");function e(o){return q.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=q.resolve(i,s);if(!a.startsWith(i+q.sep)&&a!==i)throw new Error("Path traversal not allowed");return a}function n(o,s){if(!B.existsSync(o))return[];let i=[];for(let a of B.readdirSync(o,{withFileTypes:!0})){let c=q.join(o,a.name);if(a.isDirectory())i.push(...n(c,s));else if(a.isFile()&&a.name.endsWith(".md")){let d=B.statSync(c);i.push({filename:q.relative(s,c).replace(/\\/g,"/"),path:c,size:d.size,updatedAt:d.mtime.toISOString(),content:B.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(!B.existsSync(i))return null;let a=B.statSync(i),c=B.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);B.mkdirSync(q.dirname(a),{recursive:!0}),B.writeFileSync(a,i,"utf-8");let c=B.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 B.existsSync(i)?(B.unlinkSync(i),!0):!1}catch{return!1}}}}function Vk(r){r?.workdir&&(bt=r.workdir),jk(),ko(bt);let e=[];e.push(lc()),e.push(cc()),e.push(Id({askUser:async l=>Ld?.(l)??null})),e.push(vc({onProgress:r?.onExecProgress,interpretExitCode:(l,p)=>{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=Pk(),n=Ek(),o=Ok(),s=Dk();e.push(Rc(t)),e.push(Cc(n)),e.push(Ac(o)),e.push($s(s)),e.push(Ec(s)),e.push(Pc($k())),e.push(Bc(Bk())),e.push(Wc(Hk()));let i=zk();e.push(Gc(i));let a=r?.log??{info:()=>{},warn:()=>{}};e.push(Hc(rd({log:a}))),e.push(ld());let c={invokeTool:async(l,p,u)=>{let m=Ae(l);if(!m)return{result:"",error:`Unknown tool: ${l}`};try{let g=await m.execute(`wf_${Date.now()}`,p,u);return{result:g.content.map(y=>y.text??"").join(`
293
+ `),error:g.details?.error}}catch(g){return{result:"",error:g.message}}},getCwd:()=>bt};e.push(ud(c)),e.push(pd({sleep:(l,p)=>new Promise(u=>{let m=Date.now(),g=setTimeout(()=>{u({sleptSeconds:Math.round((Date.now()-m)/1e3),interrupted:!1})},l),f=()=>{clearTimeout(g),u({sleptSeconds:Math.round((Date.now()-m)/1e3),interrupted:!0,interruptReason:"aborted"})};p.addEventListener("abort",f,{once:!0}),p.aborted&&(clearTimeout(g),f())})})),e.push(gd({searchTools:async(l,p)=>{let u=p?.maxResults??5,m=nt(),g=l.toLowerCase().split(/\s+/).filter(Boolean),f=[],y=[];for(let b of g)b.startsWith("+")&&b.length>1?f.push(b.slice(1)):y.push(b);let k=[...f,...y],w=b=>b.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/_/g," ").toLowerCase().split(/\s+/).filter(Boolean);return{matches:m.map(b=>{let E=Ae(b),P=w(b),U=(E?.description??"").toLowerCase(),v=(E?.searchHint??"").toLowerCase();if(f.length>0){let Y=`${P.join(" ")} ${U} ${v}`;if(!f.every(pe=>Y.includes(pe)))return null}let ie=0;for(let Y of k){let D=0;P.some(pe=>pe===Y)?D=10:P.some(pe=>pe.includes(Y))?D=5:b.toLowerCase().includes(Y)&&(D=3),v&&new RegExp(`\\b${Y}`,"i").test(v)&&(D+=4),new RegExp(`\\b${Y}`,"i").test(U)&&(D+=2),ie+=D}return{name:b,description:E?.description??"",searchHint:E?.searchHint,score:ie}}).filter(b=>b!==null&&b.score>0).sort((b,E)=>E.score-b.score).slice(0,u),query:l,totalDeferred:m.length}},activateTool:async l=>ac(l)})),e.push({...fd({generateImage:async l=>{let p=await Be({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:p.mediaUrls,model:p.model,size:p.size,durationMs:p.durationMs}}}),isEnabled:()=>We("image")}),e.push({...hd({textToSpeech:async l=>{let p=await Be({mediaType:"tts",model:"",prompt:"",text:l.text,channel:l.channel,voice:l.voice,speed:l.speed});return{audioPath:"",provider:p.model,mediaUrls:p.mediaUrls}}}),isEnabled:()=>We("tts")}),e.push({...yd({generateVideo:async l=>{let p=await Be({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:p.mediaUrls,model:p.model,durationMs:p.durationMs,lastFrameUrl:p.lastFrameUrl,taskId:p.taskId}}}),isEnabled:()=>We("video")}),e.push({...bd({generateMusic:async l=>{let p=await Be({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:p.mediaUrls,model:p.model,durationMs:p.durationMs}},generateLyrics:async l=>{let p=rt.music;if(!p||!oe)return"";let u=oe.getTransport(p.provider);if(!(u instanceof mt))return"";let m=he[p.provider];return m?u.generateLyrics(l,m):""}}),isEnabled:()=>We("music")}),e.push({...kd({editVideo:async l=>{let p=await Be({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:p.mediaUrls,model:p.model,durationMs:p.durationMs}}}),shouldDefer:!0,isEnabled:()=>Hs("video","edit")}),e.push({...Td({mergeVideos:async l=>{let p=[`merge ${l.clips.length} clips`];l.transition&&p.push(`transition: ${l.transition}${l.transitionDuration?` (${l.transitionDuration}s)`:""}`),l.subtitles&&p.push(`burn-in subtitles: ${l.subtitles}`),l.bgm&&p.push(`background music: ${l.bgm}${l.bgmVolume!==void 0?` at volume ${l.bgmVolume}`:""}`);let u=await Be({mediaType:"video",model:"",prompt:p.join("; "),operation:"merge",sourceVideos:l.clips.map(m=>m.video),resolution:l.outputResolution,fps:l.outputFps});return{localPath:"",servePath:u.mediaUrls[0]??"",durationSec:(u.durationMs??0)/1e3,clipCount:l.clips.length,mediaUrls:u.mediaUrls}}}),shouldDefer:!0,isEnabled:()=>Hs("video","merge")}),e.push({...wd({upscaleVideo:async l=>{let p=["upscale"];l.sharpness&&p.push(`sharpness: ${l.sharpness}`);let u=await Be({mediaType:"video",model:"",prompt:p.join(", "),operation:"upscale",sourceVideos:[l.video],resolution:l.targetResolution??"1080p"});return{localPath:"",servePath:u.mediaUrls[0]??"",resolution:l.targetResolution??"1080p",durationSec:(u.durationMs??0)/1e3,mediaUrls:u.mediaUrls}}}),shouldDefer:!0,isEnabled:()=>Hs("video","upscale")}),e.push({...vd({generate3D:async l=>{let p=await Be({mediaType:"3d",model:"",prompt:l.prompt,imageUrl:l.imageUrl,outputFormat:l.outputFormat,seed:l.seed});return{mediaUrls:p.mediaUrls,model:p.model,durationMs:p.durationMs,metadata:p.metadata}}}),shouldDefer:!0,isEnabled:()=>We("3d")}),e.push({...xd({speechToText:async l=>{let p=await Be({mediaType:"stt",model:"",prompt:"",audioUrl:l.audioUrl,metadata:l.language?{language:l.language}:void 0});return{transcription:p.metadata?.transcription??"",model:p.model,durationMs:p.durationMs}}}),shouldDefer:!0,isEnabled:()=>We("stt")}),e.push({...Sd({cloneVoice:async l=>{let p=await Be({mediaType:"voice_clone",model:"",prompt:"",text:l.text,audioUrl:l.sampleAudioUrl,speed:l.speed});return{mediaUrls:p.mediaUrls,model:p.model,voiceId:p.metadata?.voiceId,durationMs:p.durationMs}}}),shouldDefer:!0,isEnabled:()=>We("voice_clone")}),e.push({...Rd({cancelTask:async l=>{let p=l.provider??"doubao";if(!oe)return{ok:!1,message:"Media client not configured."};let u=oe.getTransport(p);if(!u)return{ok:!1,message:`No transport for provider: ${p}`};let m=he[p];if(!m)return{ok:!1,message:`No API key for provider: ${p}`};try{return"deleteVideoTask"in u&&typeof u.deleteVideoTask=="function"?(await u.deleteVideoTask(l.taskId,m),{ok:!0,message:"Task cancelled."}):{ok:!1,message:`Provider ${p} does not support task cancellation.`}}catch(g){return{ok:!1,message:g instanceof Error?g.message:String(g)}}}}),shouldDefer:!0,isEnabled:()=>We("video")||We("3d")});let d=xo();return e.push({..._d({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 p=ke(l.filePath);if(!B.existsSync(p))throw new Error(`File not found: ${p}`);let u=B.statSync(p);if(u.size>100*1024*1024)throw new Error(`File too large (${(u.size/1024/1024).toFixed(1)} MB). Max: 100 MB.`);let m=await B.promises.readFile(p),g=q.basename(p);if(d.type==="gemini"){let R=So(),b=he.google,E=q.extname(p).toLowerCase(),P=Mk[E]??"application/octet-stream",U=await R.uploadFile(Buffer.from(m),b,{mimeType:P,displayName:g});if(U.state==="PROCESSING"){let v=await R.waitForProcessing(U.name,b);return{fileId:v.name,url:v.uri,filename:g,bytes:u.size,provider:"google"}}return{fileId:U.name,url:U.uri,filename:g,bytes:u.size,provider:"google"}}let f=new Blob([m]),y=oe.getTransport(d.id),k=he[d.id];if(!(y instanceof Oe))throw new Error(`File upload only supported via Volcengine or Google provider. Current: ${d.id}`);let w=await y.uploadFile(f,k,{purpose:l.purpose??"media_reference",filename:g}),C;try{let R=await y.getFile(w.id,k);typeof R.url=="string"&&R.url&&(C=R.url)}catch{}return{fileId:w.id,url:C,filename:g,bytes:u.size,provider:d.id}}}),shouldDefer:!0,isEnabled:()=>!!xo()}),e.push({...Cd({queryFile:async l=>{if(!d)throw new Error("No file API provider available.");if(d.type==="gemini"){let g=So(),f=he.google,y=await g.getFile(l.fileId,f);return{id:y.name,filename:y.displayName??"",bytes:Number(y.sizeBytes??0),status:y.state?.toLowerCase()??"unknown",createdAt:y.createTime,url:y.uri}}let p=oe.getTransport(d.id),u=he[d.id];if(!(p instanceof Oe))throw new Error("File query only supported via Volcengine or Google provider.");let m=await p.getFile(l.fileId,u);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=So(),y=he.google;return(await f.listFiles(y,{pageSize:l.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 p=oe.getTransport(d.id),u=he[d.id];if(!(p instanceof Oe))throw new Error("File list only supported via Volcengine or Google provider.");return((await p.listFiles(u,{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:()=>!!xo()}),e.push({...Ad({deleteFile:async l=>{if(!d)throw new Error("No file API provider available.");if(d.type==="gemini"){let m=So(),g=he.google;await m.deleteFile(l.fileId,g);return}let p=oe.getTransport(d.id),u=he[d.id];if(!(p instanceof Oe))throw new Error("File delete only supported via Volcengine or Google provider.");await p.deleteFile(l.fileId,u)}}),shouldDefer:!0,isEnabled:()=>!!xo()}),ic(e),r?.log?.info(`[tool-bootstrap] Registered ${e.length} local tools (${e.filter(l=>l.isEnabled?.()!==!1).length} enabled): ${nt().join(", ")}`),e}var Bd=Vk;function Ro(r){bt=r,ko(r)}import{spawn as qk}from"node:child_process";import{createInterface as Kk}from"node:readline";var _o=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=qk(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=Kk({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=Jk(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(`
294
+ `)||"(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:p=>{l(),p.error?i(new Error(`MCP error ${p.error.code}: ${p.error.message}`)):s(p.result)},reject:p=>{l(),i(p)}}),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+`
295
+ `)}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 Jk(r){return r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}import{randomUUID as Yk}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=Yk(),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}),p=l.headers.get("mcp-session-id");if(p&&(this.sessionId=p),!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(`
296
+ `);i=d.pop()??"";for(let l of d){if(!l.startsWith("data: "))continue;let p=l.slice(6).trim();if(p)try{let u=JSON.parse(p);if("method"in u&&u.method==="notifications/tools/list_changed"){this.onToolsChanged?.();continue}if(u.id===t){if(u.error)throw new Error(`MCP error ${u.error.code}: ${u.error.message}`);return u.result}}catch(u){if(u instanceof Error&&u.message.startsWith("MCP error"))throw u}}}}finally{o.releaseLock()}throw new Error("MCP SSE stream ended without response")}schemaToPortableTool(e){let t=this;return{name:`mcp__${Xk(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(`
297
+ `)||"(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 Xk(r){return r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}var Ao=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 _o(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();gs(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 nt())s.startsWith(n)&&po(s);let o=t.toPortableTools();gs(o),this.log.info(`[mcp] re-injected ${o.length} tools from ${e}`)}};function Js(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 Qk={type:"object",properties:{server:{type:"string",description:"MCP server name to list resources from. Omit to list from all connected servers."}}};function Wd(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:Qk,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}]`:"",p=d.description?` \u2014 ${d.description}`:"";i.push(` ${d.name}: ${d.uri}${l}${p}`)}i.push("")}return{content:[{type:"text",text:i.join(`
298
+ `).trim()}],details:{type:"list_mcp_resources",count:o.length}}}}}var Zk={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 Gd(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:Zk,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} ---
280
299
  ${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"}) ---
281
- [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 Xe from"node:fs";import*as uo from"node:path";import{pathToFileURL as Ab}from"node:url";var rd={preToolUse:"tool.before_invoke",postToolUse:"tool.after_invoke",onTurnStart:"turn.submitted",onTurnEnd:"turn.completed",onSessionEnd:"session.ended"};var po=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(!Xe.existsSync(e))continue;let t;try{t=Xe.readdirSync(e,{withFileTypes:!0})}catch{continue}for(let n of t){if(!n.isDirectory()||n.name.startsWith(".")||n.name.startsWith("_"))continue;let o=uo.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)qn(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=uo.join(t,f);if(Xe.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=uo.join(t,"config.json");if(Xe.existsSync(m))try{p=JSON.parse(Xe.readFileSync(m,"utf8"))}catch{}let g={pluginName:e,registerTool:f=>{fe(f),c.push(f),s++},registerHook:(f,b)=>{let w=rd[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(Ab(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 Rs(){return aa()}function sd(){return sn.join(Rs(),"installed_plugins.json")}function id(){let r=sd();if(!ie.existsSync(r))return{version:1,plugins:[]};try{return JSON.parse(ie.readFileSync(r,"utf-8"))}catch{return{version:1,plugins:[]}}}function Pb(r){let e=Rs();ie.existsSync(e)||ie.mkdirSync(e,{recursive:!0}),ie.writeFileSync(sd(),JSON.stringify(r,null,2),"utf-8")}function Ib(r,e){return!(e.blocklist?.includes(r)||e.allowlist&&!e.allowlist.includes(r))}async function Mb(r,e,t){let{execFile:n}=await import("node:child_process"),{promisify:o}=await import("node:util"),s=o(n),i=Rs(),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(`
282
- `).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 Eb(){return id().plugins.filter(e=>ie.existsSync(e.installPath)).map(e=>e.installPath)}async function Ob(r,e){let t=id(),n=[];for(let o of r.enabledPlugins){let s=o.specifier.split("/").pop()??o.specifier;if(!Ib(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 Mb(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 Pb(t),n}function Lb(){let r=ca();if(!ie.existsSync(r))return null;try{return JSON.parse(ie.readFileSync(r,"utf-8"))}catch{return null}}async function ad(r,e){let t=[...r],n=Eb();t.push(...n);let o=Lb();if(o&&o.enabledPlugins.length>0)try{let s=await Ob(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 mo=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 $b(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:Db(t.pattern)}))}};function Cs(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"&&Nb(n)?n:"default",s=e.default??e.defaultBehavior,i=typeof s=="string"&&Ub(s)?s:"allow";return{mode:o,rules:t,defaultBehavior:i}}function Db(r){let t=r.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*+/g,".*");return new RegExp(`^${t}$`,"i")}function $b(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 Nb(r){return r==="default"||r==="bypassPermissions"||r==="acceptEdits"||r==="dontAsk"||r==="plan"}function Ub(r){return r==="allow"||r==="deny"||r==="ask"}import{randomUUID as Vb}from"node:crypto";var jb=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"]),ld=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"]),Fb=[/\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],cd=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 dd(r,e,t){let n=r.trim();if(!n)return{decision:"allow",reason:"empty command"};let o=as(n)??ls(n)??void 0;for(let d of Fb)if(d.test(n))return{decision:"deny",reason:`matches dangerous pattern: ${d.source}`,destructiveWarning:o};for(let d of jb)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 ld.has(i)||ld.has(a)?{decision:"allow",reason:`known safe command: ${i}`,destructiveWarning:o}:e&&t&&e.startsWith(t)&&(cd.has(i)||cd.has(a))?{decision:"allow",reason:`safe in project: ${a}`,destructiveWarning:o}:{decision:"defer",reason:"unknown command \u2014 needs LLM classification",destructiveWarning:o}}function Bb(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 As(r,e){return`${r}::${Bb(e)}`}var Gb=500,go=class{cache=new Map;get(e,t){let n=As(e,t),o=this.cache.get(n);if(o)return o.hitCount++,o}set(e,t,n){if(this.cache.size>=Gb){let s=this.cache.keys().next().value;s!==void 0&&this.cache.delete(s)}let o=As(e,t);this.cache.set(o,{shouldBlock:n.shouldBlock,reason:n.reason,classifiedAt:Date.now(),hitCount:0})}has(e,t){return this.cache.has(As(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 Wb=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 Wb.has(r)}var ud=`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.
300
+ [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 st from"node:fs";import*as Io from"node:path";import{pathToFileURL as eT}from"node:url";var Hd={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(!st.existsSync(e))continue;let t;try{t=st.readdirSync(e,{withFileTypes:!0})}catch{continue}for(let n of t){if(!n.isDirectory()||n.name.startsWith(".")||n.name.startsWith("_"))continue;let o=Io.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)be(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)po(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 y=Io.join(t,f);if(st.existsSync(y)){o=y;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,p=6e4,u={},m=Io.join(t,"config.json");if(st.existsSync(m))try{u=JSON.parse(st.readFileSync(m,"utf8"))}catch{}let g={pluginName:e,registerTool:f=>{be(f),c.push(f),s++},registerHook:(f,y)=>{let k=Hd[f];if(!k){this.log.warn(`[plugins] ${e}: unknown hook phase "${f}"`);return}let w=this.config.hookRegistry.register({point:k,handler:y,label:`plugin:${e}:${f}`,priority:200});d.push(w),i++},registerSkill:f=>{this.pluginSkills.push(f),a++},getConfig:()=>u,setActivationCheck:(f,y)=>{l=f,y!==void 0&&(p=y)}};try{let y=await import(eT(o).href);if(typeof y.register!="function"){this.log.warn(`[plugins] ${e}: no register() export, skipping`);return}await y.register(g),l&&this.activations.set(e,{checkFn:l,ttlMs:p,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 ce from"node:fs";import*as yn from"node:path";function Ys(){return $a()}function zd(){return yn.join(Ys(),"installed_plugins.json")}function Vd(){let r=zd();if(!ce.existsSync(r))return{version:1,plugins:[]};try{return JSON.parse(ce.readFileSync(r,"utf-8"))}catch{return{version:1,plugins:[]}}}function tT(r){let e=Ys();ce.existsSync(e)||ce.mkdirSync(e,{recursive:!0}),ce.writeFileSync(zd(),JSON.stringify(r,null,2),"utf-8")}function nT(r,e){return!(e.blocklist?.includes(r)||e.allowlist&&!e.allowlist.includes(r))}async function oT(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:c}=await s("npm",["pack",a,"--pack-destination",i],{timeout:6e4,cwd:i}),d=c.trim().split(`
301
+ `).pop()?.trim();if(!d)return t.warn(`[marketplace] npm pack returned no output for ${a}`),null;let l=yn.join(i,d),u=d.match(/^(.+)-(\d+\.\d+\.\d+.*)\.tgz$/)?.[2]??"0.0.0",m=yn.join(i,`${r}@${u}`);ce.existsSync(m)||ce.mkdirSync(m,{recursive:!0}),await s("tar",["xzf",l,"-C",m,"--strip-components=1"],{timeout:3e4});try{ce.unlinkSync(l)}catch{}let g=yn.join(m,"package.json");if(ce.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}@${u} from npm`),{name:r,version:u,installPath:m}}catch(c){return t.warn(`[marketplace] failed to install ${a} from npm: ${c.message}`),null}}function rT(){return Vd().plugins.filter(e=>ce.existsSync(e.installPath)).map(e=>e.installPath)}async function sT(r,e){let t=Vd(),n=[];for(let o of r.enabledPlugins){let s=o.specifier.split("/").pop()??o.specifier;if(!nT(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&&ce.existsSync(i.installPath)&&(!o.version||i.version===o.version)){n.push(i.installPath);continue}let a=null;switch(o.type){case"npm":a=await oT(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 tT(t),n}function iT(){let r=Ua();if(!ce.existsSync(r))return null;try{return JSON.parse(ce.readFileSync(r,"utf-8"))}catch{return null}}async function qd(r,e){let t=[...r],n=rT();t.push(...n);let o=iT();if(o&&o.enabledPlugins.length>0)try{let s=await sT(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 Po=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 lT(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:aT(t.pattern)}))}};function Xs(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"&&cT(n)?n:"default",s=e.default??e.defaultBehavior,i=typeof s=="string"&&dT(s)?s:"allow";return{mode:o,rules:t,defaultBehavior:i}}function aT(r){let t=r.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*+/g,".*");return new RegExp(`^${t}$`,"i")}function lT(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 cT(r){return r==="default"||r==="bypassPermissions"||r==="acceptEdits"||r==="dontAsk"||r==="plan"}function dT(r){return r==="allow"||r==="deny"||r==="ask"}import{randomUUID as bT}from"node:crypto";var uT=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"]),Kd=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"]),pT=[/\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],Jd=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 Yd(r,e,t){let n=r.trim();if(!n)return{decision:"allow",reason:"empty command"};let o=Ps(n)??Es(n)??void 0;for(let d of pT)if(d.test(n))return{decision:"deny",reason:`matches dangerous pattern: ${d.source}`,destructiveWarning:o};for(let d of uT)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 Kd.has(i)||Kd.has(a)?{decision:"allow",reason:`known safe command: ${i}`,destructiveWarning:o}:e&&t&&e.startsWith(t)&&(Jd.has(i)||Jd.has(a))?{decision:"allow",reason:`safe in project: ${a}`,destructiveWarning:o}:{decision:"defer",reason:"unknown command \u2014 needs LLM classification",destructiveWarning:o}}function mT(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 Qs(r,e){return`${r}::${mT(e)}`}var gT=500,Eo=class{cache=new Map;get(e,t){let n=Qs(e,t),o=this.cache.get(n);if(o)return o.hitCount++,o}set(e,t,n){if(this.cache.size>=gT){let s=this.cache.keys().next().value;s!==void 0&&this.cache.delete(s)}let o=Qs(e,t);this.cache.set(o,{shouldBlock:n.shouldBlock,reason:n.reason,classifiedAt:Date.now(),hitCount:0})}has(e,t){return this.cache.has(Qs(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 fT=new Set(["read","search","instructions","think","todo","memory","skill","tool_search","plan_mode","lsp","brief","web_search","checkpoint"]);function bn(r){return fT.has(r)}var Xd=`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.
283
302
 
284
303
  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).
285
304
 
@@ -301,7 +320,7 @@ DANGEROUS operations (SHOULD be blocked):
301
320
  - Running commands with sudo/admin privileges
302
321
  - Downloading and executing unknown scripts
303
322
 
304
- Respond ONLY with XML. No other text.`;async function Ps(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=Hb(t),i=zb(r,e),a=`<transcript>
323
+ Respond ONLY with XML. No other text.`;async function Zs(r,e,t,n){let o=Date.now();if(bn(r))return{shouldBlock:!1,reason:"allowlisted safe tool",stage:"allowlist",durationMs:Date.now()-o};let s=hT(t),i=yT(r,e),a=`<transcript>
305
324
  ${s}
306
325
  </transcript>
307
326
 
@@ -309,7 +328,7 @@ ${s}
309
328
  ${i}
310
329
  </action>
311
330
 
312
- 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:ud,messages:[{role:"user",content:a}],maxTokens:64,temperature:0,stop:["</reason>"],cacheSystemPrompt:!0}),d=gd(c.text);if(pd(d)===!1)return{shouldBlock:!1,reason:"classifier: safe",stage:"fast",durationMs:Date.now()-o};let u=`<transcript>
331
+ 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:Xd,messages:[{role:"user",content:a}],maxTokens:64,temperature:0,stop:["</reason>"],cacheSystemPrompt:!0}),d=eu(c.text);if(Qd(d)===!1)return{shouldBlock:!1,reason:"classifier: safe",stage:"fast",durationMs:Date.now()-o};let p=`<transcript>
313
332
  ${s}
314
333
  </transcript>
315
334
 
@@ -317,55 +336,57 @@ ${s}
317
336
  ${i}
318
337
  </action>
319
338
 
320
- 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:ud,messages:[{role:"user",content:u}],maxTokens:4096,temperature:0,cacheSystemPrompt:!0}),m=gd(p.text),g=pd(m),f=md(m)??md(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 Hb(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(`
321
- `)}function zb(r,e){let t=JSON.stringify(e,null,0),n=t.length>2e3?t.slice(0,2e3)+"...":t;return`Tool: ${r}
322
- Arguments: ${n}`}function pd(r){let e=r.match(/<block>(yes|no)<\/block>/i);return e?e[1].toLowerCase()==="yes":null}function md(r){let e=r.match(/<reason>([\s\S]*?)(?:<\/reason>|$)/i);return e?e[1].trim():null}function gd(r){return r.replace(/<thinking>[\s\S]*?<\/thinking>/gi,"").trim()}var fd={maxConsecutive:3,maxTotal:20};function hd(){return{consecutiveDenials:0,totalDenials:0}}function Is(r){return{consecutiveDenials:r.consecutiveDenials+1,totalDenials:r.totalDenials+1}}function Ms(r){return r.consecutiveDenials===0?r:{...r,consecutiveDenials:0}}function yd(r){return r.consecutiveDenials>=fd.maxConsecutive||r.totalDenials>=fd.maxTotal}var qb=12e4,fo=class{ruleEngine;hookRegistry;onRequestApproval;onPermissionUpdate;onDenied;classifierLLMCall;getRecentMessages;permissionRole;pendingApprovals=new Map;unregisterHook=null;toolMetaCache=new Map;classifierCache=new go;denialTracking=hd();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=dd(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=yd(this.denialTracking);if(this.classifierLLMCall&&!d)try{let l=this.getRecentMessages?.()??[],u=await Ps(n,o??{},l,this.classifierLLMCall);if(o&&this.classifierCache.set(n,o,{shouldBlock:u.shouldBlock,reason:u.reason}),!u.shouldBlock)return this.denialTracking=Ms(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:"auto",reason:u.reason}}};this.denialTracking=Is(this.denialTracking)}catch{}}let a=Vb(),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 Ps(t,n??{},o,this.classifierLLMCall);return n&&this.classifierCache.set(t,n,{shouldBlock:s.shouldBlock,reason:s.reason}),s.shouldBlock?(this.denialTracking=Is(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=Ms(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"))},qb);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 Kb="skill",Jb={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(`
323
- `)},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 bd(r){return{name:Kb,label:"Skill",description:ek(r),parameters:Jb,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 Yb(r,t,n);case"list":return Xb(r,t);case"view":return Qb(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 Yb(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}
339
+ 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>.`,u=await n({system:Xd,messages:[{role:"user",content:p}],maxTokens:4096,temperature:0,cacheSystemPrompt:!0}),m=eu(u.text),g=Qd(m),f=Zd(m)??Zd(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 hT(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(`
340
+ `)}function yT(r,e){let t=JSON.stringify(e,null,0),n=t.length>2e3?t.slice(0,2e3)+"...":t;return`Tool: ${r}
341
+ Arguments: ${n}`}function Qd(r){let e=r.match(/<block>(yes|no)<\/block>/i);return e?e[1].toLowerCase()==="yes":null}function Zd(r){let e=r.match(/<reason>([\s\S]*?)(?:<\/reason>|$)/i);return e?e[1].trim():null}function eu(r){return r.replace(/<thinking>[\s\S]*?<\/thinking>/gi,"").trim()}var tu={maxConsecutive:3,maxTotal:20};function nu(){return{consecutiveDenials:0,totalDenials:0}}function ei(r){return{consecutiveDenials:r.consecutiveDenials+1,totalDenials:r.totalDenials+1}}function ti(r){return r.consecutiveDenials===0?r:{...r,consecutiveDenials:0}}function ou(r){return r.consecutiveDenials>=tu.maxConsecutive||r.totalDenials>=tu.maxTotal}var kT=12e4,Oo=class{ruleEngine;hookRegistry;onRequestApproval;onPermissionUpdate;onDenied;classifierLLMCall;getRecentMessages;permissionRole;pendingApprovals=new Map;unregisterHook=null;toolMetaCache=new Map;classifierCache=new Eo;denialTracking=nu();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=Yd(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||bn(n)?{action:"continue"}:this.handleWorkerAsk(t,n,o);if(this.ruleEngine.getMode()==="auto"){if(bn(n))return{action:"continue"};let d=ou(this.denialTracking);if(this.classifierLLMCall&&!d)try{let l=this.getRecentMessages?.()??[],p=await Zs(n,o??{},l,this.classifierLLMCall);if(o&&this.classifierCache.set(n,o,{shouldBlock:p.shouldBlock,reason:p.reason}),!p.shouldBlock)return this.denialTracking=ti(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:"auto",reason:p.reason}}};this.denialTracking=ei(this.denialTracking)}catch{}}let a=bT(),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(bn(t))return{action:"continue"};if(this.classifierLLMCall)try{let o=this.getRecentMessages?.()??[],s=await Zs(t,n??{},o,this.classifierLLMCall);return n&&this.classifierCache.set(t,n,{shouldBlock:s.shouldBlock,reason:s.reason}),s.shouldBlock?(this.denialTracking=ei(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=ti(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"))},kT);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 TT="skill",wT={type:"object",properties:{action:{type:"string",enum:["invoke","list","view","create","edit","patch","delete","promote","install"],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')","\u2022 'promote' \u2014 Promote a project-level skill to global/user-level (provide 'name')","\u2022 'install' \u2014 Download and install a skill from a URL (provide 'url', optional 'name')"].join(`
342
+ `)},name:{type:"string",description:"Skill name (required for invoke/view/create/edit/patch/delete/promote)."},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."},url:{type:"string",description:"URL to download a skill from (for 'install' action). Supports skill stores (skillhub.cn, skill.io, GitHub raw links, etc.) and any direct .md URL."}},required:["action"]};function ru(r){return{name:TT,label:"Skill",description:AT(r),parameters:wT,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 vT(r,t,n);case"list":return xT(r,t);case"view":return ST(r,t);case"create":case"edit":case"patch":case"delete":return RT(r,t);case"promote":return _T(r,t);case"install":return CT(r,t);default:return{content:[{type:"text",text:`Unknown action: ${o}. Use invoke, list, view, create, edit, patch, delete, promote, or install.`}]}}}}}async function vT(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}
324
343
 
325
344
  `,a=o?`
326
345
 
327
346
  ### User Context
328
347
  ${o}`:"";return{content:[{type:"text",text:`${i}Follow these instructions:
329
348
 
330
- ${s}${a}`}],details:{skillName:n,action:"invoke",mode:"inline"}}}async function Xb(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(`
331
- `)}],details:{action:"list",count:t.skills.length}}}async function Qb(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}
349
+ ${s}${a}`}],details:{skillName:n,action:"invoke",mode:"inline"}}}async function xT(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})`:"",a=o.scope?` {${o.scope}}`:"";n.push(`- **${o.name}**${i}${s}${a}: ${o.description}`)}return{content:[{type:"text",text:n.join(`
350
+ `)}],details:{action:"list",count:t.skills.length}}}async function ST(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}
332
351
  `,t.content];return t.referenceFiles&&t.referenceFiles.length>0&&n.push(`
333
352
  ### Reference Files
334
353
  ${t.referenceFiles.map(o=>`- ${o}`).join(`
335
354
  `)}`),{content:[{type:"text",text:n.join(`
336
- `)}],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 ek(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(`
355
+ `)}],details:{action:"view",name:t.name}}}async function RT(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,category:e.category,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}}}async function _T(r,e){if(!e.name)return{content:[{type:"text",text:"Error: 'name' is required for promote."}]};if(!r.promoteSkill)return{content:[{type:"text",text:"Promote is not available in this configuration. Skills may already be at user-level."}]};let t=await r.promoteSkill(e.name);return{content:[{type:"text",text:t.message}],details:{action:"promote",success:t.success,name:e.name}}}async function CT(r,e){if(!e.url)return{content:[{type:"text",text:"Error: 'url' is required for install. Provide a direct link to a .md skill file."}]};if(!r.installSkill)return{content:[{type:"text",text:"Install from URL is not available in this configuration."}]};let t=await r.installSkill(e.url,e.name);return{content:[{type:"text",text:t.message}],details:{action:"install",success:t.success,url:e.url,name:e.name}}}function AT(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. Use 'promote' (with name) to copy a project skill to global (user-level) so it's available across all projects. Use 'install' (with url) to download a skill from a URL and save it globally.
356
+
357
+ CROSS-PROJECT RECALL: When you see '[Cross-project skill available]' in recalled memories, it means a relevant skill exists in another project. You should proactively inform the user and offer to use it (invoke) or promote it to global. Do not wait for explicit instructions \u2014 the user may not know the skill exists. Typical user signals: '\u4E4B\u524D\u505A\u8FC7', '\u53C2\u8003XX\u9879\u76EE', 'didn't you do this before', 'same as the other project'.`;if(e.length===0)return t;let n=e.slice(0,50).map(o=>`- ${o.name}: ${o.description??"(no description)"}`).join(`
337
358
  `);return`${t}
338
359
 
339
360
  Available skills:
340
- ${n}`}var tk="agent",kd=["general","explore","plan","code","research","verify"],nk={type:"object",properties:{agent:{type:"string",enum:["general","explore","plan","code","research","verify"],description:`Sub-agent type to fork:
361
+ ${n}`}var IT="agent",su=["general","explore","plan","code","research","verify"],MT={type:"object",properties:{agent:{type:"string",enum:["general","explore","plan","code","research","verify"],description:`Sub-agent type to fork:
341
362
  - general: Full tool access, any task
342
363
  - explore: Read-only codebase exploration (search, read, analyze)
343
364
  - plan: Planning mode (explore + produce plan, no writes)
344
365
  - code: Coding agent with full tool access
345
366
  - research: Web research and information gathering
346
- - 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},Td=4;function wd(r){return{name:tk,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:nk,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(!kd.includes(t.agent))return{content:[{type:"text",text:`Error: unknown agent "${t.agent}". Available: ${kd.join(", ")}`}],details:{type:"agent",error:"invalid_agent_type"}};let n=r.currentForkDepth??0;if(n>=Td)return{content:[{type:"text",text:`Error: maximum fork depth (${Td}) 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.
367
+ - 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},iu=4;function au(r){return{name:IT,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:MT,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(!su.includes(t.agent))return{content:[{type:"text",text:`Error: unknown agent "${t.agent}". Available: ${su.join(", ")}`}],details:{type:"agent",error:"invalid_agent_type"}};let n=r.currentForkDepth??0;if(n>=iu)return{content:[{type:"text",text:`Error: maximum fork depth (${iu}) 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.
347
368
  Agent ID: ${o.agentId}
348
369
  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?`
349
370
 
350
- [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 ok="config",rk={type:"object",properties:{action:{type:"string",enum:["get","set","list","reset"],description:`Action:
371
+ [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 PT="config",ET={type:"object",properties:{action:{type:"string",enum:["get","set","list","reset"],description:`Action:
351
372
  - get: Read a config setting
352
373
  - set: Write a config setting
353
374
  - list: List all available settings
354
- - 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 vd(r){return{name:ok,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:rk,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(`
355
- `)}],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(`
356
- `)}],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 sk="cron",ik={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:
375
+ - 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"]},kn=["permissions.securityPolicy","api.key","api.secret","auth.token","system.adminMode"];function lu(r){return{name:PT,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:ET,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(`
376
+ `)}],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(kn.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(`
377
+ `)}],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(kn.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 OT="cron",DT={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:
357
378
  - Cron: '0 9 * * *' (every day at 9am)
358
379
  - Shorthand: '5m' (every 5 min), '1h' (hourly), '1d' (daily)
359
- 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"]},xd=50;function Sd(r){return{name:sk,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:ik,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>=xd)return{content:[{type:"text",text:`Error: maximum ${xd} 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:Es(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(`
360
- `)}],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:Es(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.
361
- ${Es(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 Es(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(`
362
- `)}var ak="monitor",lk={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 _d(r){return{name:ak,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(`
363
- `),parameters:lk,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:
380
+ 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"]},cu=50;function du(r){return{name:OT,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:DT,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>=cu)return{content:[{type:"text",text:`Error: maximum ${cu} 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:ni(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(`
381
+ `)}],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:ni(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.
382
+ ${ni(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 ni(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(`
383
+ `)}var $T="monitor",LT={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 uu(r){return{name:$T,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(`
384
+ `),parameters:LT,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:
364
385
  ${i.map(c=>`\u2022 ${c.monitorId} [${c.source}] \u2192 ${c.target} (events: ${c.eventCount}, timeout: ${c.timeoutSeconds}s)`).join(`
365
- `)}`}],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 ck="team",dk={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 Rd(r){return{name:ck,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:dk,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(`
386
+ `)}`}],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 UT="team",NT={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 pu(r){return{name:UT,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:NT,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(`
366
387
  `)}],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(`
367
- `)}],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(`
368
- `)}],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 pk="mcp",mk={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:
388
+ `)}],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],p=a.isActive===!1?" (idle)":" (active)";if(l){let u=[];if(l.runningFor&&u.push(`running ${Math.round(l.runningFor/1e3)}s`),l.lastToolCall&&u.push(`tool: ${l.lastToolCall}`),l.idleFor!==void 0&&l.idleFor>5&&u.push(`idle ${l.idleFor}s`),l.mediaProgress){let m=l.mediaProgress;u.push(`${m.mediaType} ${m.percent}% [${m.status}] taskId=${m.taskId}${m.provider?` provider=${m.provider}`:""}`)}u.length&&(p=` (${u.join(", ")})`)}i.push(` - ${a.name} (${a.role})${c}${d}${p}`)}return{content:[{type:"text",text:i.join(`
389
+ `)}],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 FT="mcp",BT={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:
369
390
  - list_servers: List configured MCP servers, their status and capabilities
370
391
  - list_tools: List tools provided by a specific server
371
392
  - call_tool: Execute a tool on an MCP server
@@ -374,14 +395,14 @@ ${i.map(c=>`\u2022 ${c.monitorId} [${c.source}] \u2192 ${c.target} (events: ${c.
374
395
  - list_prompts: List prompts available from a server
375
396
  - get_prompt: Get a specific prompt with arguments
376
397
  - authenticate: Initiate OAuth authentication with a server
377
- - 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 Cd(r){return{name:pk,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).
398
+ - 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 mu(r){return{name:FT,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).
378
399
 
379
- 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:mk,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=gk(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(`
380
- `)}],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=fk(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(`
381
- `)}],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(`
382
- `)}],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?` (${hk(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(`
383
- `)}],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(`
384
- `)||"(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}".
400
+ 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:BT,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=WT(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(`
401
+ `)}],details:{type:"mcp",action:"list_servers",count:o.length}}}case"list_tools":{if(!t.server)return re("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=GT(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(`
402
+ `)}],details:{type:"mcp",action:"list_tools",server:t.server,count:o.length}}}case"call_tool":{if(!t.server)return re("server is required for call_tool.");if(!t.toolName)return re("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(`
403
+ `)}],details:{type:"mcp",action:"list_resources",count:o.length,server:t.server}}}case"read_resource":{if(!t.server)return re("server is required for read_resource.");if(!t.uri)return re("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?` (${HT(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 re("server is required for list_prompts.");if(!r.listPrompts)return re("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(`
404
+ `)}],details:{type:"mcp",action:"list_prompts",server:t.server,count:o.length}}}case"get_prompt":{if(!t.server)return re("server is required for get_prompt.");if(!t.promptName)return re("promptName is required for get_prompt.");if(!r.getPrompt)return re("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(`
405
+ `)||"(empty prompt)"}],details:{type:"mcp",action:"get_prompt",server:t.server,promptName:t.promptName}}}case"authenticate":{if(!t.server)return re("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}".
385
406
 
386
407
  Please open this URL in your browser:
387
408
  ${o.authUrl}
@@ -389,73 +410,82 @@ ${o.authUrl}
389
410
  ${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.
390
411
  Required scopes: ${o.requiredScopes?.join(", ")||"unknown"}
391
412
 
392
- `+(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 gk(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 fk(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 hk(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(`
393
- `)}],details:{type:"mcp",action:"manage_server",manageAction:r,server:e,success:t.success}}}var yk="checkpoint",bk={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"]},Ad=/^[0-9a-fA-F]{4,64}$/;function Pd(r){return{name:yk,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:bk,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}
413
+ `+(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 re("server is required for manage_server.");if(!t.manageAction)return re("manageAction is required for manage_server.");switch(t.manageAction){case"add":{if(!r.addServer)return re("Server addition not supported by the current MCP host.");if(!t.config)return re("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 re("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 re("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 re("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 re("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 re(`Unknown manageAction: ${t.manageAction}`)}}default:return re(`Unknown action: "${t.action}".`)}}}}function re(r){return{content:[{type:"text",text:`Error: ${r}`}],details:{type:"mcp",error:r}}}function WT(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 GT(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 HT(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(`
414
+ `)}],details:{type:"mcp",action:"manage_server",manageAction:r,server:e,success:t.success}}}var zT="checkpoint",VT={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"]},gu=/^[0-9a-fA-F]{4,64}$/;function fu(r){return{name:zT,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:VT,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}
394
415
  Message: ${n.checkpoint.message}
395
416
  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(`
396
- `)}],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(!Ad.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(!Ad.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 vt from"node:path";function Id(r,e){let t=ia(e);return{createCheckpoint:async n=>{try{Te.mkdirSync(t,{recursive:!0});let{execSync:o}=await import("node:child_process"),s=vt.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=vt.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(`
397
- `).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=vt.join(t,i),c=vt.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=vt.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 Ls}from"node:child_process";import{createInterface as yo}from"node:readline";import{resolve as Pk,join as un}from"node:path";import{createServer as Ik}from"node:net";import{createWriteStream as Mk,mkdirSync as Ek}from"node:fs";import{tmpdir as Ok}from"node:os";import{createInterface as kk}from"node:readline";var Tk=1,wk=1,Pe={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"},vk=1e4,dt=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=kk({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)}
398
- `)}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=Tk++,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)}
399
- `)}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:wk,clientInfo:{name:"qlogicagent",version:"1.0.0"},clientCapabilities:{fs:{readTextFile:!0,writeTextFile:!0},terminal:!0,auth:{terminal:!1}}},vk),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 Pe.AGENT_MESSAGE_CHUNK:{let a=o.content;return{method:"turn.delta",params:{text:a?.text??a?.content??"",sessionId:i,messageId:o.messageId}}}case Pe.AGENT_THOUGHT_CHUNK:return{method:"turn.thought_delta",params:{text:o.content?.text??"",sessionId:i}};case Pe.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 Pe.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 Pe.USAGE_UPDATE:return{method:"turn.usage_update",params:o??{}};case Pe.PLAN:return{method:"turn.plan",params:{steps:o.steps,sessionId:i}};case Pe.AVAILABLE_COMMANDS_UPDATE:case Pe.CURRENT_MODE_UPDATE:case Pe.CONFIG_OPTION_UPDATE:case Pe.SESSION_INFO_UPDATE:return{method:"turn.session_info",params:{type:s,...o,sessionId:i}};case Pe.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 Ed}from"node:child_process";import{platform as xk}from"node:os";var Os={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"}},Sk=["general","explore","plan","code","research","verify"];function _k(){return Sk.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 Rk=xk()==="win32";function Md(r){try{let e=Rk?`where ${r}`:`which ${r}`;return Ed(e,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim().split(/\r?\n/)[0]?.trim()||null}catch{return null}}function Ck(r){try{return Ed(`"${r}" --version`,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim().match(/(\d+\.\d+[\w.-]*)/)?.[1]??null}catch{return null}}var Ak=6e4,ho=class{cache=null;configStore=null;setConfigStore(e){this.configStore=e}scan(e=!1){if(!e&&this.cache&&Date.now()-this.cache.timestamp<Ak)return this.cache.agents;let t=[];t.push(..._k());for(let n of Object.values(Os))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=Md(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=Ck(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=Md(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=Os[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 Lk=1;function Dk(r,e){return{jsonrpc:"2.0",id:Lk++,method:r,params:e}}var $k=["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 Nk(r){let e={};for(let t of $k)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 Ds=2,Uk=3e3,xt=3,Od=5e3;function jk(r){return new Promise(e=>setTimeout(e,r))}var St=class r{processes=new Map;callbacks;cliBinaryPath;mcpBridgeScriptPath;constructor(e={}){this.callbacks=e;let t=Pk(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=Nk(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=Ls(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}),yo({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&&yo({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=Dk(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)}
400
- `)}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()}})+`
401
- `;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<=Ds;s++)try{if(s>0){this.processes.delete(e.memberId),t.state="starting",t.error=void 0,t.endedAt=void 0;let i=Uk*s;this.slog("info",e.memberId,"spawn",`retry ${s}/${Ds} after ${i}ms`),await jk(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 ${Ds+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=Ls(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 dt,l=new dn,{server:u,pipePath:p}=this.createMcpIpcServer(e.memberId);n.QLOGICAGENT_PARENT_RPC=p;let m;if(this.callbacks.sessionDir)try{Ek(this.callbacks.sessionDir,{recursive:!0}),m=Mk(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=dt.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&&yo({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}
402
- `)}),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<xt){let _=Od*2**T;this.slog("warn",e.memberId,"crash",`crashed (code=${g}), restarting ${T+1}/${xt} after ${_}ms`),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Process crashed (code=${g}, signal=${f}), restarting`,retriesLeft:xt-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(Ok(),`qlogicagent-mcp-${t}-${Date.now()}.sock`),o=Ik(s=>{let i="";s.on("data",a=>{i+=a.toString();let c;for(;(c=i.indexOf(`
417
+ `)}],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(!gu.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(!gu.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 xe from"node:fs";import*as Pt from"node:path";function hu(r,e){let t=Da(e);return{createCheckpoint:async n=>{try{xe.mkdirSync(t,{recursive:!0});let{execSync:o}=await import("node:child_process"),s=Pt.join(t,".git");xe.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"})),xe.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=Pt.join(t,".git");if(!xe.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(`
418
+ `).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=Pt.join(t,i),c=Pt.join(r,i);xe.existsSync(a)&&xe.cpSync(a,c,{recursive:!0})}}else{s(`git checkout ${n} -- .`,{cwd:t,stdio:"pipe"});let i=xe.readdirSync(r);for(let a of i){if(a===".git"||a==="node_modules")continue;let c=Pt.join(r,a);xe.rmSync(c,{recursive:!0,force:!0})}xe.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 ri}from"node:child_process";import{createInterface as $o}from"node:readline";import{resolve as ow,join as vn}from"node:path";import{createServer as rw}from"node:net";import{createWriteStream as sw,mkdirSync as iw}from"node:fs";import{tmpdir as aw}from"node:os";import{createInterface as qT}from"node:readline";var KT=1,JT=1,$e={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"},YT=1e4,kt=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=qT({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)}
419
+ `)}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=KT++,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)}
420
+ `)}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:JT,clientInfo:{name:"qlogicagent",version:"1.0.0"},clientCapabilities:{fs:{readTextFile:!0,writeTextFile:!0},terminal:!0,auth:{terminal:!1}}},YT),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 $e.AGENT_MESSAGE_CHUNK:{let a=o.content;return{method:"turn.delta",params:{text:a?.text??a?.content??"",sessionId:i,messageId:o.messageId}}}case $e.AGENT_THOUGHT_CHUNK:return{method:"turn.thought_delta",params:{text:o.content?.text??"",sessionId:i}};case $e.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 $e.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 $e.USAGE_UPDATE:return{method:"turn.usage_update",params:o??{}};case $e.PLAN:return{method:"turn.plan",params:{steps:o.steps,sessionId:i}};case $e.AVAILABLE_COMMANDS_UPDATE:case $e.CURRENT_MODE_UPDATE:case $e.CONFIG_OPTION_UPDATE:case $e.SESSION_INFO_UPDATE:return{method:"turn.session_info",params:{type:s,...o,sessionId:i}};case $e.USER_MESSAGE_CHUNK:return null;default:return{method:`turn.${s??"unknown"}`,params:{...o,sessionId:i}}}}return null}};var wn=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 bu}from"node:child_process";import{platform as XT}from"node:os";var oi={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"}},QT=["general","explore","plan","code","research","verify"];function ZT(){return QT.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 ew=XT()==="win32";function yu(r){try{let e=ew?`where ${r}`:`which ${r}`;return bu(e,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim().split(/\r?\n/)[0]?.trim()||null}catch{return null}}function tw(r){try{return bu(`"${r}" --version`,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim().match(/(\d+\.\d+[\w.-]*)/)?.[1]??null}catch{return null}}var nw=6e4,Do=class{cache=null;configStore=null;setConfigStore(e){this.configStore=e}scan(e=!1){if(!e&&this.cache&&Date.now()-this.cache.timestamp<nw)return this.cache.agents;let t=[];t.push(...ZT());for(let n of Object.values(oi))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=yu(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=tw(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=yu(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=oi[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 lw=1;function cw(r,e){return{jsonrpc:"2.0",id:lw++,method:r,params:e}}var dw=["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 uw(r){let e={};for(let t of dw)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 si=2,pw=3e3,Et=3,ku=5e3;function mw(r){return new Promise(e=>setTimeout(e,r))}var Ot=class r{processes=new Map;callbacks;cliBinaryPath;mcpBridgeScriptPath;constructor(e={}){this.callbacks=e;let t=ow(vn(import.meta.url.startsWith("file://")?new URL(import.meta.url).pathname.replace(/^\/([A-Z]:)/,"$1"):process.cwd(),"..",".."));this.cliBinaryPath=vn(t,"dist","cli.js"),this.mcpBridgeScriptPath=vn(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=uw(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=ri(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}),$o({input:i.stdout,crlfDelay:Number.POSITIVE_INFINITY}).on("line",d=>{let l=d.trim();if(l)try{let p=JSON.parse(l);if("id"in p&&typeof p.id=="number"){let u=a.get(p.id);if(u){clearTimeout(u.timer),a.delete(p.id);let m=p;m.error?u.reject(new Error(m.error.message)):u.resolve(m.result)}}if("method"in p&&!("id"in p)){let u=p;this.captureChildProgress(e.memberId,u.method,u.params),this.callbacks.onNotification?.(e.memberId,u.method,u.params)}}catch{this.slog("warn",e.memberId,"parse",`invalid JSON: ${l.slice(0,200)}`)}}),i.stderr&&$o({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[u,m]of a)clearTimeout(m.timer),m.reject(new Error(`Agent process exited (code=${d})`)),a.delete(u);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=cw(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)}
421
+ `)}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,p=this.sendRpc(e,"thread.turn",s,l),u=setInterval(async()=>{if(c>0&&Date.now()-d>c){clearInterval(u),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 p;clearInterval(u),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(u),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()}})+`
422
+ `;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<=si;s++)try{if(s>0){this.processes.delete(e.memberId),t.state="starting",t.error=void 0,t.endedAt=void 0;let i=pw*s;this.slog("info",e.memberId,"spawn",`retry ${s}/${si} after ${i}ms`),await mw(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 ${si+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=ri(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 kt,l=new wn,{server:p,pipePath:u}=this.createMcpIpcServer(e.memberId);n.QLOGICAGENT_PARENT_RPC=u;let m;if(this.callbacks.sessionDir)try{iw(this.callbacks.sessionDir,{recursive:!0}),m=sw(vn(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:p,ipcPath:u,stderrStream:m}),d.attach(a,(g,f)=>{g==="usage_update"&&l.onUsageUpdate(f);let y=kt.translateNotification(g,f);y?(this.captureChildProgress(e.memberId,y.method,y.params),this.callbacks.onNotification?.(e.memberId,y.method,y.params)):(this.captureChildProgress(e.memberId,g,f),this.callbacks.onNotification?.(e.memberId,g,f))}),a.stderr&&$o({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}
423
+ `)}),a.on("exit",(g,f)=>{d.detach();let y=t.state;if(y!=="killed"&&y!=="completed"&&g!==0){let w=this.processes.get(e.memberId)?.runtimeRestartCount??0;if(w<Et){let C=ku*2**w;this.slog("warn",e.memberId,"crash",`crashed (code=${g}), restarting ${w+1}/${Et} after ${C}ms`),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Process crashed (code=${g}, signal=${f}), restarting`,retriesLeft:Et-w-1}),setTimeout(()=>{this.attemptRuntimeRestart(e,n,w+1).catch(R=>{this.slog("warn",e.memberId,"restart",`failed: ${R instanceof Error?R.message:String(R)}`)})},C);return}}y!=="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},y=[...e.mcpServers??[]],k=this.processes.get(e.memberId);k?.ipcPath&&y.push({name:"qlogicagent-tools",command:process.execPath,args:[this.mcpBridgeScriptPath],env:{QLOGICAGENT_PARENT_RPC:k.ipcPath,QLOGICAGENT_SESSION_ID:e.memberId}}),y.length>0&&(f.mcpServers=y),e.systemPrompt&&(f.systemPrompt=e.systemPrompt);let w=await d.createSession(a,f);t.sessionId=w.sessionId,this.slog("info",e.memberId,"session",`session created (id=${w.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()}`:vn(aw(),`qlogicagent-mcp-${t}-${Date.now()}.sock`),o=rw(s=>{let i="";s.on("data",a=>{i+=a.toString();let c;for(;(c=i.indexOf(`
403
424
  `))!==-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"}})+`
404
425
  `;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})+`
405
426
  `;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)}})+`
406
427
  `;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}`}})+`
407
- `;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=Ls(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 dt,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=dt.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&&yo({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()} ${_}
408
- `)}),p.on("exit",(T,_)=>{g.detach();let R=d.state;if(R!=="killed"&&R!=="completed"&&T!==0){let M=this.processes.get(e.memberId)?.runtimeRestartCount??n;if(M<xt){let O=Od*2**M;this.slog("warn",e.memberId,"crash",`crashed again (code=${T}), restart ${M+1}/${xt}`),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Process crashed (code=${T}), restarting`,retriesLeft:xt-M-1}),setTimeout(()=>{this.attemptRuntimeRestart(e,t,M+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 Nd}from"node:path";import{chmod as Jk}from"node:fs/promises";import{readFile as Fk,writeFile as Bk,mkdir as Gk,rename as Wk,unlink as Hk}from"node:fs/promises";import{dirname as zk,join as Ld}from"node:path";import{randomUUID as Vk}from"node:crypto";async function qk(r,e){let t=zk(r);await Gk(t,{recursive:!0});let n=Ld(t,`.tmp-${Vk()}`);try{await Bk(n,e,"utf-8"),await Wk(n,r)}catch(o){throw await Hk(n).catch(()=>{}),o}}async function _t(r){try{let e=await Fk(r,"utf-8");return JSON.parse(e)}catch(e){if(e.code==="ENOENT")return;throw e}}async function pn(r,e){await qk(r,JSON.stringify(e,null,2)+`
409
- `)}var Kk="memory.json";function bo(){return Ld(W(),Kk)}async function Dd(){return _t(bo())}async function $s(r){let e={...r,savedAt:new Date().toISOString()};await pn(bo(),e)}var Ud="agent-configs.json";function $d(){return Nd(W(),Ud)}function Yk(r){return Nd(qe(r),Ud)}function Xk(){return{agents:{}}}var ko=class{data=Xk();cwd;constructor(e){this.cwd=e}async load(){let e=await _t($d()),t=this.cwd?await _t(Yk(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=$d();await pn(e,this.data);try{await Jk(e,384)}catch{}}};import{randomUUID as nT}from"node:crypto";import{execFile as Qk}from"node:child_process";import{promisify as Zk}from"node:util";import{join as jd}from"node:path";import{mkdir as eT,rm as tT}from"node:fs/promises";var Rt=Zk(Qk);async function mn(r){try{let{stdout:e}=await Rt("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8"});return e.trim()}catch{return null}}async function To(r,e,t){let n=jd(r,".worktrees");await eT(n,{recursive:!0});let o=jd(n,e),i=["worktree","add","-B",`solo/${e}`,o];return t?i.push(t):i.push("HEAD"),await Rt("git",i,{cwd:r,encoding:"utf8"}),o}async function Fd(r){try{await Rt("git",["add","-A"],{cwd:r});let{stdout:e}=await Rt("git",["diff","--cached","--stat"],{cwd:r,encoding:"utf8"});return e.trim()}catch{return""}}async function Bd(r,e){try{await Rt("git",["worktree","remove","--force",e],{cwd:r,encoding:"utf8"})}catch{try{await tT(e,{recursive:!0,force:!0})}catch{}}}async function Gd(r,e){let{stdout:t}=await Rt("git",["merge","--no-ff",e,"-m",`solo: merge ${e}`],{cwd:r,encoding:"utf8"});return t.trim()}var wo=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-${nT().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 To(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 Fd(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 Gd(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(`
410
- `),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 Bd(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 sT}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 Ns}from"node:path";import{mkdir as oT,readdir as rT}from"node:fs/promises";function Wd(r){return Ns(qe(r),"products")}function Hd(r,e){return Ns(Wd(e),r)}function zd(r,e){return Ns(Hd(r,e),"product-state.json")}async function Vd(r,e){let t=Hd(r.productId,e);await oT(t,{recursive:!0}),await pn(zd(r.productId,e),r)}async function Us(r,e){return _t(zd(r,e))}async function qd(r){let e=Wd(r),t;try{t=await rT(e)}catch{return[]}let n=[];for(let o of t){let s=await Us(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 Vd(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 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 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-${sT().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 Us(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 qd(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 To(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 Kd="memory";var iT=["add","replace","remove","search"],Jd={type:"object",properties:{action:{type:"string",enum:iT,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(`
411
- `)},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(`
412
- `)},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(`
413
- `)},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(`
414
- `)}},required:["action"]},Yd=["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(`
415
- `),Xd="Memory",aT=[/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 js(r){return!aT.some(e=>e.test(r))}async function Qd(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
416
- `+l.map(u=>`\u2022 ${u}`).join(`
417
- `))}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
418
- `+c.map((d,l)=>`${l+1}. [${d.blockId}] ${d.text}`).join(`
419
- `))}catch{}if((!s||s==="facts"||s==="projects")&&e.queryGraph)try{let c=e.queryGraph(o,e.userId);c.length>0&&i.push(`## Recalled Facts
420
- `+c.map(d=>`\u2022 ${d}`).join(`
421
- `))}catch{}if((!s||s==="profile"||s==="projects")&&e.getProfileSummary)try{let c=e.getProfileSummary(e.userId);c&&i.push(`## User Profile
422
- `+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
423
- `+d.join(`
424
- `))}}catch{}return i.length===0?{ok:!0,message:"No matching memories found.",action:t,results:[]}:{ok:!0,message:i.join(`
425
-
426
- `),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 lT,existsSync as cT}from"node:fs";var ut=`
427
- \xA7
428
- `,dT=2200,uT=1375,xo=class{memoryEntries=[];userEntries=[];frozenSnapshot={memory:"",user:""};snapshotFrozen=!1;saveTimer=null;memoryCharLimit;userCharLimit;persistToDisk;constructor(e){this.memoryCharLimit=e?.memoryCharLimit??dT,this.userCharLimit=e?.userCharLimit??uT,this.persistToDisk=e?.persistToDisk??!1}loadFromSerialized(e){this.memoryEntries=eu(Zd(e.memory??"")),this.userEntries=eu(Zd(e.user??""))}serialize(){return{memory:this.memoryEntries.join(ut),user:this.userEntries.join(ut)}}async loadFromDisk(){let e=await Dd();e&&this.loadFromSerialized(e)}loadFromDiskSync(){let e=bo();try{if(!cT(e))return;let t=lT(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,$s(this.serialize()).catch(()=>{})},500))}async flush(){this.saveTimer&&(clearTimeout(this.saveTimer),this.saveTimer=null),this.persistToDisk&&await $s(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(!js(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(ut).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(!js(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: "${Fs(o)}"`,"not_found");if(a.length>1&&new Set(a.map(p=>i[p])).size>1)return this.errorResult(e,`Multiple entries match: "${Fs(o)}" (${a.length} matches). Be more specific.`,"ambiguous_match");let c=a[0],d=[...i];if(d[c]=s,d.join(ut).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: "${Fs(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(ut).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(ut);return`${s}
429
- ${n} (your personal notes) [${o}]
430
- ${s}
431
- ${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 Zd(r){return r.trim()?r.split(ut).map(e=>e.trim()).filter(Boolean):[]}function eu(r){let e=new Set;return r.filter(t=>e.has(t)?!1:(e.add(t),!0))}function Fs(r,e=60){return r.length<=e?r:`${r.slice(0,e-1).trimEnd()}\u2026`}nr();tr();import{readFile as pT}from"node:fs/promises";import{watch as mT}from"node:fs";import{join as gT}from"node:path";var fT=ke,hT="settings.json";function yT(r){return gT(r,fT,hT)}async function bT(r){try{let e=await pT(r,"utf-8");return JSON.parse(e)}catch{return null}}function kT(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 tu(r){let e=yT(r.projectRoot),t=null,n=null,o=async()=>{let s=await bT(e);s&&kT(s,r.ruleEngine,r.hooks,r.log)};o().catch(()=>{});try{t=mT(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 Bs=new Set;function pt(r){return Bs.add(r),()=>{Bs.delete(r)}}async function nu(){await Promise.all(Array.from(Bs).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 Ro,isAgentRpcRequest as RT,isAcpJsonRpcRequest as CT,isAcpJsonRpcNotification as AT,isAcpJsonRpcResponse as PT,ACP_PROTOCOL_VERSION as IT}from"qlogicagent-runtime-contracts";import{randomUUID as TT}from"node:crypto";import{ACP_METHODS as We,ACP_EXTENDED_METHODS as He,isAcpJsonRpcRequest as wT,isAcpJsonRpcNotification as vT}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},So=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(wT(e)){let t=e;return process.stderr.write(`[acp-server] \u2192 recv id=${String(t.id)} method=${t.method}
432
- `),this.handleRequest(t),!0}return vT(e)?(this.handleNotification(e),!0):!1}emitSessionUpdate(e,t,n){if(t.startsWith("x_")&&!this.hostSupportsExtendedEvents)return;let o={jsonrpc:"2.0",method:We.SESSION_UPDATE,params:{sessionId:e,update:{sessionUpdate:t,...n}}};this.transport.send(o)}async requestPermission(e){let t=`perm-${TT().slice(0,8)}`,n={jsonrpc:"2.0",method:We.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 We.INITIALIZE:await this.onInitialize(o,s);break;case We.SESSION_NEW:await this.onSessionNew(o,s);break;case We.SESSION_PROMPT:await this.onSessionPrompt(o,s);break;case We.SESSION_END:await this.onSessionEnd(o,s);break;case We.SESSION_SET_CONFIG:await this.onSessionSetConfig(o,s);break;case We.SESSION_SET_MODEL:await this.handler.handleAcpSessionSetModel(s.sessionId??this.activeSessionId??"",s.modelId??s.model??""),this.sendResult(o,{});break;case We.SESSION_SET_MODE:await this.handler.handleAcpSessionSetMode(s.sessionId??this.activeSessionId??"",s.modeId??s.mode??""),this.sendResult(o,{});break;case He.ABORT:await this.onAbort(o,s);break;case He.DREAM:await this.onDream(o,s);break;case He.SOLO_START:{let i=await this.handler.handleAcpSoloStart(s);this.sendResult(o,i);break}case He.SOLO_STATUS:{let i=await this.handler.handleAcpSoloStatus(s);this.sendResult(o,i);break}case He.SOLO_SELECT:{let i=await this.handler.handleAcpSoloSelect(s);this.sendResult(o,i);break}case He.PRODUCT_CREATE:{let i=await this.handler.handleAcpProductCreate(s);this.sendResult(o,i);break}case He.PRODUCT_RESUME:{let i=await this.handler.handleAcpProductResume(s);this.sendResult(o,i);break}case He.PRODUCT_STATUS:{let i=await this.handler.handleAcpProductStatus(s);this.sendResult(o,i);break}case He.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
428
+ `;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,p=[...l.acpArgs];a&&(t.QLOGICAGENT_PARENT_RPC=a);let u=ri(l.cliPath,p,{cwd:e.cwd,env:t,stdio:["pipe","pipe","pipe"],detached:!1});d.pid=u.pid??-1;let m=new Map,g=new kt,f=new wn;this.processes.set(e.memberId,{handle:d,child:u,pendingRpc:m,acpAdapter:g,usageTracker:f,ipcServer:i,ipcPath:a,stderrStream:c,runtimeRestartCount:n}),g.attach(u,(w,C)=>{w==="usage_update"&&f.onUsageUpdate(C);let R=kt.translateNotification(w,C);R?(this.captureChildProgress(e.memberId,R.method,R.params),this.callbacks.onNotification?.(e.memberId,R.method,R.params)):(this.captureChildProgress(e.memberId,w,C),this.callbacks.onNotification?.(e.memberId,w,C))}),u.stderr&&$o({input:u.stderr,crlfDelay:Number.POSITIVE_INFINITY}).on("line",C=>{this.callbacks.log?.debug?.(`[${new Date().toISOString()}] [debug] [agent:${e.memberId}] [stderr] ${C}`),c?.write(`${new Date().toISOString()} ${C}
429
+ `)}),u.on("exit",(w,C)=>{g.detach();let R=d.state;if(R!=="killed"&&R!=="completed"&&w!==0){let E=this.processes.get(e.memberId)?.runtimeRestartCount??n;if(E<Et){let P=ku*2**E;this.slog("warn",e.memberId,"crash",`crashed again (code=${w}), restart ${E+1}/${Et}`),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Process crashed (code=${w}), restarting`,retriesLeft:Et-E-1}),setTimeout(()=>{this.attemptRuntimeRestart(e,t,E+1).catch(U=>{this.slog("warn",e.memberId,"restart",`failed: ${U instanceof Error?U.message:String(U)}`)})},P);return}}R!=="killed"&&(d.state=w===0?"completed":"failed"),d.endedAt=Date.now(),w!==0&&!d.error&&(d.error=`ACP process exited with code ${w} (signal: ${C})`),this.callbacks.onStateChange?.(e.memberId,d.state),this.callbacks.onExit?.(e.memberId,w,C)}),u.on("error",w=>{g.detach(),d.state="failed",d.error=w.message,d.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed")}),this.callbacks.onStateChange?.(e.memberId,"starting");let y=await g.initialize(u);d.state="ready",d.supportsResume=y.agentCapabilities.loadSession===!0,this.callbacks.onStateChange?.(e.memberId,"ready"),this.slog("info",e.memberId,"restart",`ACP restarted (attempt=${n}, protocol=${y.protocolVersion}, loadSession=${d.supportsResume}, pid=${d.pid})`);let k=[...e.mcpServers??[]];a&&k.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 w=await g.resumeSession(u,d.sessionId,{cwd:e.cwd,mcpServers:k.length>0?k:void 0});d.sessionId=w.sessionId,this.slog("info",e.memberId,"session",`session resumed (id=${d.sessionId})`)}else{let w={cwd:e.cwd};k.length>0&&(w.mcpServers=k),e.systemPrompt&&(w.systemPrompt=e.systemPrompt);let C=await g.createSession(u,w);d.sessionId=C.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,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(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 wu}from"node:path";import{chmod as vw}from"node:fs/promises";import{readFile as gw,writeFile as fw,mkdir as hw,rename as yw,unlink as bw}from"node:fs/promises";import{dirname as kw,join as Tw}from"node:path";import{randomUUID as ww}from"node:crypto";async function xn(r,e){let t=kw(r);await hw(t,{recursive:!0});let n=Tw(t,`.tmp-${ww()}`);try{await fw(n,e,"utf-8");let o;for(let s=0;s<3;s++)try{await yw(n,r);return}catch(i){if(o=i,i.code!=="EPERM")throw i;await new Promise(a=>setTimeout(a,50*(s+1)))}throw o}catch(o){throw await bw(n).catch(()=>{}),o}}async function Sn(r){try{let e=await gw(r,"utf-8");return JSON.parse(e)}catch(e){if(e.code==="ENOENT")return;throw e}}async function Lo(r,e){await xn(r,JSON.stringify(e,null,2)+`
430
+ `)}var vu="agent-configs.json";function Tu(){return wu(Z(),vu)}function xw(r){return wu(ze(r),vu)}function Sw(){return{agents:{}}}var Uo=class{data=Sw();cwd;constructor(e){this.cwd=e}async load(){let e=await Sn(Tu()),t=this.cwd?await Sn(xw(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=Tu();await Lo(e,this.data);try{await vw(e,384)}catch{}}};import{randomUUID as Iw}from"node:crypto";import{execFile as Rw}from"node:child_process";import{promisify as _w}from"node:util";import{join as xu}from"node:path";import{mkdir as Cw,rm as Aw}from"node:fs/promises";var Dt=_w(Rw);async function Rn(r){try{let{stdout:e}=await Dt("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8"});return e.trim()}catch{return null}}async function No(r,e,t){let n=xu(r,".worktrees");await Cw(n,{recursive:!0});let o=xu(n,e),i=["worktree","add","-B",`solo/${e}`,o];return t?i.push(t):i.push("HEAD"),await Dt("git",i,{cwd:r,encoding:"utf8"}),o}async function Su(r){try{await Dt("git",["add","-A"],{cwd:r});let{stdout:e}=await Dt("git",["diff","--cached","--stat"],{cwd:r,encoding:"utf8"});return e.trim()}catch{return""}}async function Ru(r,e){try{await Dt("git",["worktree","remove","--force",e],{cwd:r,encoding:"utf8"})}catch{try{await Aw(e,{recursive:!0,force:!0})}catch{}}}async function _u(r,e){let{stdout:t}=await Dt("git",["merge","--no-ff",e,"-m",`solo: merge ${e}`],{cwd:r,encoding:"utf8"});return t.trim()}var jo=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 Rn(o);if(!s)throw new Error("Solo Mode requires a git repository");let i=`solo-${Iw().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,p)=>{let u=`${i}-${l}-${p}`,m=`solo/${u}`,g=`${i}:${l}:${p}`,f;try{f=await No(s,u)}catch(k){this.callbacks.log?.warn(`[solo] worktree creation failed for ${l}: ${k instanceof Error?k.message:String(k)}`);let w={agentId:l,memberId:g,worktreePath:"",worktreeBranch:m,state:"failed",error:`Worktree creation failed: ${k instanceof Error?k.message:String(k)}`};a.agents.push(w);return}let y={agentId:l,memberId:g,worktreePath:f,worktreeBranch:m,state:"pending"};a.agents.push(y);try{y.state="running",this.callbacks.onProgress?.(i,l,"running");let k=this.acpDetector.buildExternalDescriptor(l);if(!k)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:k});let w=this.processManager.getHandle(g);if(!w||w.state!=="ready")throw new Error(`Agent ${l} spawn did not reach ready state`);let C=await this.processManager.sendTask(g,t);y.state="completed",y.resultText=typeof C=="string"?C:JSON.stringify(C),y.diff=await Su(f);let R=this.processManager.getUsageTracker(g);if(R?.hasData()){let b=R.getUsage();y.usage={inputTokens:b.inputTokens,outputTokens:b.outputTokens}}this.callbacks.onProgress?.(i,l,"completed"),this.callbacks.log?.info(`[solo] ${l} completed (diff: ${y.diff?"yes":"none"})`)}catch(k){y.state="failed",y.error=k instanceof Error?k.message:String(k),this.callbacks.onProgress?.(i,l,"failed",y.error),this.callbacks.log?.warn(`[solo] ${l} failed: ${y.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 _u(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(`
431
+ `),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 Ru(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 Ew}from"node:crypto";var _n=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 Cn=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 ii}from"node:path";import{mkdir as Mw,readdir as Pw}from"node:fs/promises";function Cu(r){return ii(ze(r),"products")}function Au(r,e){return ii(Cu(e),r)}function Iu(r,e){return ii(Au(r,e),"product-state.json")}async function Mu(r,e){let t=Au(r.productId,e);await Mw(t,{recursive:!0}),await Lo(Iu(r.productId,e),r)}async function ai(r,e){return Sn(Iu(r,e))}async function Pu(r){let e=Cu(r),t;try{t=await Pw(e)}catch{return[]}let n=[];for(let o of t){let s=await ai(o,r);s&&n.push(s)}return n}var An=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 Mu(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 c=`product-${Ew().slice(0,8)}`,d=new _n(s),l=new Cn(i),p=new An({onCheckpoint:(f,y)=>this.callbacks.onCheckpointed?.(f,y),getState:()=>{let f=this.sessions.get(c);return f?this.buildPersistedState(f):null},log:this.callbacks.log}),u=await Rn(n),m=o.map((f,y)=>({instanceId:`${c}:${f.name}:${y}`,name:f.name,agentId:f.agentId,state:"idle"})),g={productId:c,name:t,cwd:n,phase:"active",instances:m,dag:d,budget:l,checkpoint:p,createdAt:new Date().toISOString(),gitRoot:u};return this.sessions.set(c,g),p.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 ai(e,t);if(!n)throw new Error(`Product ${e} not found on disk`);let o=new _n(n.tasks);o.restore(n.tasks);let s=new Cn({maxTotalTokens:n.budget.maxTotalTokens,maxDuration:n.budget.maxDuration});s.restore(n.budget);let i=new An({onCheckpoint:(l,p)=>this.callbacks.onCheckpointed?.(l,p),getState:()=>{let l=this.sessions.get(e);return l?this.buildPersistedState(l):null},log:this.callbacks.log}),a=await Rn(n.cwd),c=n.instances.map((l,p)=>({instanceId:`${e}:${l.name}:${p}`,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 Pu(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 No(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 Eu="memory",Ou="Memory",Ow=["add","replace","remove","create_file","write_file","read_file","delete_file","list_files","search"],Du={type:"object",properties:{action:{type:"string",enum:Ow,description:["Operation to perform:","","INDEX.md operations (always-visible notes in system prompt):","\u2022 'add' \u2014 Append a note to INDEX.md","\u2022 'replace' \u2014 Replace text in INDEX.md (str_replace semantics)","\u2022 'remove' \u2014 Remove text from INDEX.md","","Topic file operations (on-demand, for longer content):","\u2022 'create_file' \u2014 Create a new .md topic file","\u2022 'write_file' \u2014 Overwrite an existing topic file","\u2022 'read_file' \u2014 Read a topic file","\u2022 'delete_file' \u2014 Delete a topic file","\u2022 'list_files' \u2014 List all memory topic files","","Search:","\u2022 'search' \u2014 Search long-term memory (QMemory) + local keyword match"].join(`
432
+ `)},content:{type:"string",description:["Content for add/replace/create_file/write_file.","For INDEX.md notes: write concise, factual statements.","For topic files: can be longer (up to 8KB), use markdown formatting."].join(`
433
+ `)},old_text:{type:"string",description:"For 'replace'/'remove': the exact text to find in INDEX.md."},new_text:{type:"string",description:"For 'replace': the replacement text."},file:{type:"string",description:"Filename for file operations (e.g. 'project-notes.md', 'lesson-esbuild.md'). Must be kebab-case .md."},query:{type:"string",description:"For 'search': natural language query to find relevant memories."}},required:["action"]},$u=["Manage persistent memory across sessions.","","Two storage tiers:","1. INDEX.md \u2014 always visible in system prompt (user preferences, key facts, file index)","2. Topic files \u2014 loaded on demand for longer notes (lessons, project context, task logs)","","Guidelines:","- Record important user preferences and facts to INDEX.md immediately","- Use topic files for detailed notes that don't need to be visible every turn","- Use 'search' to recall past conversations and long-term patterns from QMemory","- Keep INDEX.md concise (12KB limit) \u2014 move verbose content to topic files","- Name topic files descriptively: 'project-foo.md', 'lesson-deployment.md', 'task-2026-05-19.md'"].join(`
434
+ `);async function Lu(r,e){let{action:t}=r,{memdir:n}=e;if(t==="add"){let o=r.content?.trim();if(!o)return{ok:!1,message:"content is required for 'add'.",action:t};let s=await n.addToIndex(o);return{ok:s.ok,message:s.message,action:t}}if(t==="replace"){let o=r.old_text?.trim(),s=r.new_text?.trim()||r.content?.trim();if(!o)return{ok:!1,message:"old_text is required for 'replace'.",action:t};if(!s)return{ok:!1,message:"new_text (or content) is required for 'replace'.",action:t};let i=await n.replaceInIndex(o,s);return{ok:i.ok,message:i.message,action:t}}if(t==="remove"){let o=r.old_text?.trim();if(!o)return{ok:!1,message:"old_text is required for 'remove'.",action:t};let s=await n.removeFromIndex(o);return{ok:s.ok,message:s.message,action:t}}if(t==="create_file"){let o=r.file?.trim(),s=r.content?.trim();if(!o)return{ok:!1,message:"file is required for 'create_file'.",action:t};if(!s)return{ok:!1,message:"content is required for 'create_file'.",action:t};let i=await n.createFile(o,s);return{ok:i.ok,message:i.message,action:t}}if(t==="write_file"){let o=r.file?.trim(),s=r.content?.trim();if(!o)return{ok:!1,message:"file is required for 'write_file'.",action:t};if(!s)return{ok:!1,message:"content is required for 'write_file'.",action:t};let i=await n.writeFile(o,s);return{ok:i.ok,message:i.message,action:t}}if(t==="read_file"){let o=r.file?.trim();if(!o)return{ok:!1,message:"file is required for 'read_file'.",action:t};let s=await n.readFile(o);return s.ok?{ok:!0,message:s.content,action:t}:{ok:!1,message:s.message,action:t}}if(t==="delete_file"){let o=r.file?.trim();if(!o)return{ok:!1,message:"file is required for 'delete_file'.",action:t};let s=await n.deleteFile(o);return{ok:s.ok,message:s.message,action:t}}if(t==="list_files"){let o=await n.listFiles();if(o.length===0)return{ok:!0,message:"No topic files yet. Use 'create_file' to create one.",action:t};let s=o.map(i=>{let a=(i.size/1024).toFixed(1),c=i.modifiedAt.slice(0,10);return`\u2022 ${i.name} (${a}KB, ${c})${i.preview?" \u2014 "+i.preview:""}`}).join(`
435
+ `);return{ok:!0,message:`Memory files (${o.length}):
436
+ ${s}`,action:t}}if(t==="search"){let o=r.query?.trim();if(!o)return{ok:!1,message:"query is required for 'search'.",action:t};let s=[],i;try{let a=await n.searchLocal(o);a.length>0&&s.push(`## Local Memory
437
+ `+a.map(c=>`\u2022 [${c.file}] ${c.snippet}`).join(`
438
+ `))}catch{}if(e.provider)try{let a=await e.provider.search(o,e.userId,{limit:10});i=a,a.length>0&&s.push(`## Long-term Memory (QMemory)
439
+ `+a.map((c,d)=>`${d+1}. ${c.text}`).join(`
440
+ `))}catch{}return s.length===0?{ok:!0,message:"No matching memories found.",action:t,results:[]}:{ok:!0,message:s.join(`
441
+
442
+ `),action:t,results:i}}return{ok:!1,message:`Unknown action: "${t}".`,action:t}}import{readFile as li,readdir as Uu,unlink as Dw,stat as $w,mkdir as Lw}from"node:fs/promises";import{existsSync as Le,readFileSync as Nu,mkdirSync as ju}from"node:fs";import{join as Ee}from"node:path";var Te=12288,ci=200,Bo=8192,Uw="memory",it="INDEX.md";function di(){return Ee(Z(),Uw)}var Nw=[/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 Wo(r){return!Nw.some(e=>e.test(r))}var jw=/^[a-z0-9][a-z0-9\-_.]*\.md$/i;function Go(r){return!(!jw.test(r)||r===it||r.includes("..")||r.includes("/")||r.includes("\\"))}var Ho=class{root;indexCache=null;constructor(e){this.root=e??di()}getRootPath(){return this.root}ensureInitialized(){Le(this.root)||ju(this.root,{recursive:!0});let e=Ee(this.root,it);if(!Le(e)){let t=["# Memory Index","","<!-- Agent-managed memory. Lines here are always visible in system prompt. -->","<!-- Use memory tool to add notes, or create topic files for longer content. -->","","## User Profile","","## Notes",""].join(`
443
+ `);Fw(e,t)}}getIndexForPrompt(){let e=Ee(this.root,it);if(!Le(e))return"";let t;try{t=Nu(e,"utf-8")}catch{return""}this.indexCache=t;let n=t.split(`
444
+ `);return n.length>ci&&(t=n.slice(0,ci).join(`
445
+ `)+`
446
+
447
+ <!-- INDEX.md truncated: ${n.length} lines total, showing first ${ci} -->`),t.length>Te&&(t=t.slice(0,Te)+`
448
+
449
+ <!-- INDEX.md truncated at ${Te} chars -->`),t}getIndexRaw(){let e=Ee(this.root,it);if(!Le(e))return"";try{return Nu(e,"utf-8")}catch{return""}}getIndexUsage(){let e=this.getIndexRaw(),t=e.length,n=e.split(`
450
+ `).length;return{chars:t,lines:n,percent:Math.round(t/Te*100)}}async addToIndex(e){if(!e.trim())return{ok:!1,message:"Content cannot be empty."};if(!Wo(e))return{ok:!1,message:"Content rejected: potential injection detected."};let t=this.getIndexRaw(),n=t.endsWith(`
451
+ `)?t+e.trim()+`
452
+ `:t+`
453
+ `+e.trim()+`
454
+ `;if(n.length>Te)return{ok:!1,message:`INDEX.md would exceed limit (${this.getIndexUsage().chars}/${Te} chars). Create a topic file instead, or remove old entries.`};await this.writeIndex(n);let o=this.getIndexUsage();return{ok:!0,message:`Added to INDEX.md. [${o.chars}/${Te} chars, ${o.percent}%]`,indexUsage:`${o.chars}/${Te}`}}async replaceInIndex(e,t){if(!e.trim())return{ok:!1,message:"old_text cannot be empty."};if(!t.trim())return{ok:!1,message:"new_text cannot be empty. Use 'remove' to delete."};if(!Wo(t))return{ok:!1,message:"Content rejected: potential injection detected."};let n=this.getIndexRaw(),o=n.split(e).length-1;if(o===0)return{ok:!1,message:`No match found for: "${e.slice(0,80)}"`};if(o>1)return{ok:!1,message:`Multiple matches (${o}) for: "${e.slice(0,80)}". Be more specific.`};let s=n.replace(e,t);if(s.length>Te)return{ok:!1,message:`Replacement would exceed INDEX.md limit (${s.length}/${Te} chars).`};await this.writeIndex(s);let i=this.getIndexUsage();return{ok:!0,message:`Replaced in INDEX.md. [${i.chars}/${Te} chars]`,indexUsage:`${i.chars}/${Te}`}}async removeFromIndex(e){if(!e.trim())return{ok:!1,message:"old_text cannot be empty."};let t=this.getIndexRaw();if(!t.includes(e))return{ok:!1,message:`No match found for: "${e.slice(0,80)}"`};let n=t.replace(e,"");n=n.replace(/\n{3,}/g,`
455
+
456
+ `),await this.writeIndex(n);let o=this.getIndexUsage();return{ok:!0,message:`Removed from INDEX.md. [${o.chars}/${Te} chars]`,indexUsage:`${o.chars}/${Te}`}}async listFiles(){if(!Le(this.root))return[];let e=await Uu(this.root),t=[];for(let n of e){if(n===it||!n.endsWith(".md"))continue;let o=Ee(this.root,n);try{let s=await $w(o);if(!s.isFile())continue;let a=(await li(o,"utf-8")).split(`
457
+ `).find(c=>c.trim()&&!c.startsWith("#"))?.trim();t.push({name:n,size:s.size,modifiedAt:s.mtime.toISOString(),preview:a?.slice(0,100)})}catch{}}return t.sort((n,o)=>o.modifiedAt.localeCompare(n.modifiedAt))}async createFile(e,t){if(!Go(e))return{ok:!1,message:`Invalid filename: "${e}". Use kebab-case .md files (e.g. "project-notes.md").`};if(!Wo(t))return{ok:!1,message:"Content rejected: potential injection detected."};if(t.length>Bo)return{ok:!1,message:`Content too long (${t.length} chars, max ${Bo}).`};let n=Ee(this.root,e);if(Le(n))return{ok:!1,message:`File already exists: "${e}". Use write_file to update.`};await this.ensureDir(),await xn(n,t);let o=`- [${e}] \u2014 created ${new Date().toISOString().slice(0,10)}`;return await this.appendIndexEntry(o),{ok:!0,message:`Created "${e}" (${t.length} chars). Entry added to INDEX.md.`,file:e}}async writeFile(e,t){if(!Go(e))return{ok:!1,message:`Invalid filename: "${e}". Use kebab-case .md files.`};if(!Wo(t))return{ok:!1,message:"Content rejected: potential injection detected."};if(t.length>Bo)return{ok:!1,message:`Content too long (${t.length} chars, max ${Bo}).`};let n=Ee(this.root,e),o=!Le(n);if(await this.ensureDir(),await xn(n,t),o){let s=`- [${e}] \u2014 created ${new Date().toISOString().slice(0,10)}`;await this.appendIndexEntry(s)}return{ok:!0,message:`${o?"Created":"Updated"} "${e}" (${t.length} chars).`,file:e}}async readFile(e){if(!Go(e)&&e!==it)return{ok:!1,message:`Invalid filename: "${e}".`};let t=Ee(this.root,e);try{let n=await li(t,"utf-8");return{ok:!0,content:n,message:`Read "${e}" (${n.length} chars).`}}catch(n){return n.code==="ENOENT"?{ok:!1,message:`File not found: "${e}".`}:{ok:!1,message:`Error reading "${e}": ${n.message}`}}}async deleteFile(e){if(e===it)return{ok:!1,message:"Cannot delete INDEX.md. Use 'remove' to clear entries."};if(!Go(e))return{ok:!1,message:`Invalid filename: "${e}".`};let t=Ee(this.root,e);if(!Le(t))return{ok:!1,message:`File not found: "${e}".`};await Dw(t);let n=this.getIndexRaw(),o=new RegExp(`^.*\\[${Bw(e)}\\].*$\\n?`,"m");if(o.test(n)){let s=n.replace(o,"").replace(/\n{3,}/g,`
458
+
459
+ `);await this.writeIndex(s)}return{ok:!0,message:`Deleted "${e}" and removed INDEX.md entry.`,file:e}}async searchLocal(e){if(!Le(this.root))return[];let t=e.toLowerCase().split(/\s+/).filter(s=>s.length>1);if(t.length===0)return[];let n=await Uu(this.root),o=[];for(let s of n){if(!s.endsWith(".md"))continue;let i=Ee(this.root,s);try{let a=await li(i,"utf-8"),c=a.toLowerCase(),d=t.filter(m=>c.includes(m)).length;if(d===0)continue;let l=a.split(`
460
+ `),p="",u=0;for(let m of l){let g=m.toLowerCase(),f=t.filter(y=>g.includes(y)).length;f>u&&(u=f,p=m.trim())}o.push({file:s,snippet:p.slice(0,200),score:d/t.length})}catch{}}return o.sort((s,i)=>i.score-s.score).slice(0,10)}async writeIndex(e){await this.ensureDir(),await xn(Ee(this.root,it),e),this.indexCache=e}async ensureDir(){Le(this.root)||await Lw(this.root,{recursive:!0})}async appendIndexEntry(e){let t=this.getIndexRaw();if(t.includes(e))return;let n=t.endsWith(`
461
+ `)?t+e+`
462
+ `:t+`
463
+ `+e+`
464
+ `;n.length<=Te&&await this.writeIndex(n)}};function Fw(r,e){let t=Ee(r,"..");Le(t)||ju(t,{recursive:!0}),rp("node:fs").writeFileSync(r,e,"utf-8")}function Bw(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var Ww={lesson:[/(?:原来|原因是|根因|root cause|turns out|the issue was|问题出在|bug.?是)/i,/(?:以后|下次|remember to|don't forget|务必|切记|注意)/i,/(?:踩坑|gotcha|pitfall|caveat|陷阱)/i,/(?:修复方法|fix(?:ed)? by|solution|解决办法)/i],preference:[/(?:我(?:喜欢|偏好|习惯)|I (?:prefer|like|always|usually))/i,/(?:不要|don't|never|避免).{0,30}(?:方式|style|approach|format)/i,/(?:请(?:用|使用)|please use|always use)/i],pattern:[/(?:每次|always|whenever|pattern|惯例|convention)/i,/(?:标准做法|standard|best practice|最佳实践)/i,/(?:模板|template|boilerplate)/i],fact:[/(?:架构|architecture|is located at|位于|路径是|port is|版本是|version)/i,/(?:部署在|deployed|runs on|环境|environment)/i,/(?:配置|config|设置为|set to)/i],decision:[/(?:决定|decided|we'll go with|选择|chosen|采用)/i,/(?:因为|because|rationale|原因|trade-?off|权衡)/i,/(?:不用|instead of|rather than|弃用|deprecated)/i],"skill-learning":[]},Fu=[/^(ok|好的|好|明白|收到|understood|got it|sure|done|完成|已完成)[.!!。]*$/i,/^(yes|no|是|否|对|不对|嗯)[.!!。]*$/i,/(?:还有什么|anything else|need help|还需要)/i,/^(?:谢谢|thanks|thank you)[.!!。]*$/i],ui=30,pi=500;function Bu(r,e){if(!e||e.length<ui)return[];let t=e.trim();if(Fu.some(i=>i.test(t)))return[];let n=[],o=new Set,s=Gw(e);for(let i of s)if(!(i.length<ui)&&!Fu.some(a=>a.test(i)))for(let[a,c]of Object.entries(Ww)){if(a==="skill-learning"||!c.some(u=>u.test(i)))continue;let l=Hw(r,i);if(l.length>pi)continue;let p=l.slice(0,80).toLowerCase();if(!o.has(p)){o.add(p),n.push({text:l,category:a,importance:zw(i,a),tags:Vw(i)});break}}return n}function Wu(r,e=.4){return r.filter(t=>t.importance>=e)}async function Gu(r,e){let t=[];for(let n of r){let o=[];try{o=(await e(n.text)).filter(i=>i.score>.8&&i.blockId).map(i=>i.blockId)}catch{}t.push({candidate:n,supersedes:o})}return t}function Gw(r){let e=r.split(/\n{2,}/),t=[];for(let n of e)if(n.length<=pi)t.push(n.trim());else{let o=n.split(/(?<=[.!?。!?])\s+/),s="";for(let i of o)s.length+i.length>pi?(s&&t.push(s.trim()),s=i):s+=(s?" ":"")+i;s&&t.push(s.trim())}return t.filter(n=>n.length>=ui)}function Hw(r,e){let t=r.length>60?r.slice(0,60).trim()+"...":r;return e.toLowerCase().includes(t.slice(0,20).toLowerCase())?e:`[Context: ${t}] ${e}`}function zw(r,e){let t=.5;return t={lesson:.7,preference:.6,pattern:.6,fact:.5,decision:.8,"skill-learning":.7}[e],/(?:因为|because|原因|reason|所以|therefore)/i.test(r)&&(t+=.1),/(?:以后|next time|下次|记住|remember|注意)/i.test(r)&&(t+=.1),r.length<50&&(t-=.1),Math.max(0,Math.min(1,t))}function Vw(r){let e=[],t=[/\b(typescript|node\.?js|docker|git|pnpm|npm|vitest|eslint|vite)\b/i,/\b(react|vue|electron|express|postgres|redis|sqlite)\b/i,/\b(api|rpc|websocket|http|rest|graphql)\b/i];for(let n of t){let o=r.match(n);o&&e.push(o[1].toLowerCase())}return[...new Set(e)].slice(0,5)}var mi={MIN_IMPORTANCE:.4,MAX_PER_TURN:3,COOLDOWN_MS:5e3};function Hu(){return{lastWriteAt:0,sessionWrites:0,recentTexts:new Set}}async function zu(r,e,t,n){if(!r||!e||Date.now()-n.lastWriteAt<mi.COOLDOWN_MS)return;let s=Bu(r,e);if(s.length===0)return;let i=Wu(s,mi.MIN_IMPORTANCE);if(i.length===0)return;let a=i.filter(u=>{let m=u.text.slice(0,80).toLowerCase();return!n.recentTexts.has(m)});if(a.length===0)return;let c=a.slice(0,mi.MAX_PER_TURN),d=await Gu(c,u=>t.searchMemories(u,t.userId)),l=d.map(u=>({text:u.candidate.text,category:u.candidate.category,importance:u.candidate.importance,tags:u.candidate.tags,event_date:new Date().toISOString().slice(0,10)}));if(l.length===0)return;let p=await t.ingestExtracted(l,t.userId);n.lastWriteAt=Date.now(),n.sessionWrites+=p.memoriesAdded;for(let u of c)if(n.recentTexts.add(u.text.slice(0,80).toLowerCase()),n.recentTexts.size>200){let m=n.recentTexts.values().next().value;m!==void 0&&n.recentTexts.delete(m)}if(t.log.debug(`memory-write-gate: wrote ${p.memoriesAdded} memories (session total: ${n.sessionWrites})`),t.removeMemory)for(let u of d)for(let m of u.supersedes)t.removeMemory(m).catch(()=>{}),t.log.debug(`memory-write-gate: superseded ${m} (replaced by "${u.candidate.text.slice(0,40)}...")`)}xr();vr();import{readFile as qw}from"node:fs/promises";import{watch as Kw}from"node:fs";import{join as Jw}from"node:path";var Yw=ye,Xw="settings.json";function Qw(r){return Jw(r,Yw,Xw)}async function Zw(r){try{let e=await qw(r,"utf-8");return JSON.parse(e)}catch{return null}}function ev(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=Qw(r.projectRoot),t=null,n=null,o=async()=>{let s=await Zw(e);s&&ev(s,r.ruleEngine,r.hooks,r.log)};o().catch(()=>{});try{t=Kw(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 gi=new Set;function Tt(r){return gi.add(r),()=>{gi.delete(r)}}async function qu(){await Promise.all(Array.from(gi).map(r=>r()))}import*as W from"node:fs";import*as K from"node:path";import{AGENT_RPC_ERROR_CODES as I,AGENT_RPC_PROTOCOL_VERSION as qo,isAgentRpcRequest as av,isAcpJsonRpcRequest as lv,isAcpJsonRpcNotification as cv,isAcpJsonRpcResponse as dv,ACP_PROTOCOL_VERSION as uv}from"qlogicagent-runtime-contracts";import{randomUUID as tv}from"node:crypto";import{ACP_METHODS as Qe,ACP_EXTENDED_METHODS as Ze,isAcpJsonRpcRequest as nv,isAcpJsonRpcNotification as ov}from"qlogicagent-runtime-contracts";var In={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},zo=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(nv(e)){let t=e;return process.stderr.write(`[acp-server] \u2192 recv id=${String(t.id)} method=${t.method}
465
+ `),this.handleRequest(t),!0}return ov(e)?(this.handleNotification(e),!0):!1}emitSessionUpdate(e,t,n){if(t.startsWith("x_")&&!this.hostSupportsExtendedEvents)return;let o={jsonrpc:"2.0",method:Qe.SESSION_UPDATE,params:{sessionId:e,update:{sessionUpdate:t,...n}}};this.transport.send(o)}async requestPermission(e){let t=`perm-${tv().slice(0,8)}`,n={jsonrpc:"2.0",method:Qe.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 Qe.INITIALIZE:await this.onInitialize(o,s);break;case Qe.SESSION_NEW:await this.onSessionNew(o,s);break;case Qe.SESSION_PROMPT:await this.onSessionPrompt(o,s);break;case Qe.SESSION_END:await this.onSessionEnd(o,s);break;case Qe.SESSION_SET_CONFIG:await this.onSessionSetConfig(o,s);break;case Qe.SESSION_SET_MODEL:await this.handler.handleAcpSessionSetModel(s.sessionId??this.activeSessionId??"",s.modelId??s.model??""),this.sendResult(o,{});break;case Qe.SESSION_SET_MODE:await this.handler.handleAcpSessionSetMode(s.sessionId??this.activeSessionId??"",s.modeId??s.mode??""),this.sendResult(o,{});break;case Ze.ABORT:await this.onAbort(o,s);break;case Ze.DREAM:await this.onDream(o,s);break;case Ze.SOLO_START:{let i=await this.handler.handleAcpSoloStart(s);this.sendResult(o,i);break}case Ze.SOLO_STATUS:{let i=await this.handler.handleAcpSoloStatus(s);this.sendResult(o,i);break}case Ze.SOLO_SELECT:{let i=await this.handler.handleAcpSoloSelect(s);this.sendResult(o,i);break}case Ze.PRODUCT_CREATE:{let i=await this.handler.handleAcpProductCreate(s);this.sendResult(o,i);break}case Ze.PRODUCT_RESUME:{let i=await this.handler.handleAcpProductResume(s);this.sendResult(o,i);break}case Ze.PRODUCT_STATUS:{let i=await this.handler.handleAcpProductStatus(s);this.sendResult(o,i);break}case Ze.TEAM_DELEGATE:{let i=await this.handler.handleAcpTeamDelegate(s);this.sendResult(o,i);break}default:this.sendError(o,In.METHOD_NOT_FOUND,`Unknown method: ${t}`)}}catch(i){this.sendError(o,In.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,In.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,In.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,In.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
433
466
  `);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}
434
467
  `);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}
435
- `)}};import{ACP_SESSION_UPDATE_TYPES as ze,ACP_EXTENDED_SESSION_UPDATE_TYPES as ae}from"qlogicagent-runtime-contracts";function ou(r,e,t,n){let o=xT(t,n);o&&r.emitSessionUpdate(e,o.type,o.payload)}function xT(r,e){switch(r){case"turn.delta":return{type:ze.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:e.text}}};case"turn.reasoning_delta":return{type:ze.AGENT_THOUGHT_CHUNK,payload:{content:{type:"text",text:e.text}}};case"turn.tool_call":return{type:ze.TOOL_CALL,payload:{toolCallId:e.callId,status:"in_progress",title:e.name,kind:"execute",rawInput:ST(e.arguments)}};case"turn.tool_result":return{type:ze.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:ze.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:ze.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:ze.USAGE_UPDATE,payload:{used:n+o,size:t?.contextWindow??2e5}}}case"turn.end":return null;case"turn.error":return{type:ze.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:`[Error] ${e.error??"Unknown error"}`}}};case"turn.suggestions":return{type:ze.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??_T(),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 ST(r){if(r)try{return JSON.parse(r)}catch{return{raw:r}}}function _T(){return Math.random().toString(36).slice(2,10)}var ru=["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 _o=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 MT=new Set(["zhipu","zhipu-openai","zhipu-coding"]),ET="https://open.bigmodel.cn/api/paas/v4";function OT(r,e){if(!(!r||!e)&&MT.has(r))return new _o({baseUrl:ET,apiKey:e})}var Co=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 Bn;memoryPrefetchState=kt();qmemoryAdapter=null;qmemoryUserId="";memoryStore=null;fileWatcher=null;pendingAskUser=new Map;sessionTaskDomain;acpDetector=new ho;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 zt,this.mediaClient=new Wt({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 mt({verbose:e.verbose}),this.taskStore.onTaskChange((o,s)=>{s&&this.sendNotification("task.updated",{taskId:o,type:s.type,lifecycle:s.lifecycle,label:s.label})}),td({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(PT(e)||AT(e)){this.acpServer.dispatchMessage(e);return}if(CT(e)){let t=e.method;if(t==="initialize"||t.startsWith("session/")||t.startsWith("x/")||t.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!RT(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{nu().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=Ro.split(".")[0];if(i!==a){this.log(`[initialize] protocol mismatch: host=${n} agent=${Ro}`),e.id!==void 0&&this.sendResponse(e.id,void 0,{code:P.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${n}, agent=${Ro}`});return}this.log(`[initialize] host=${o} v${s}`),e.id!==void 0&&this.sendResponse(e.id,{protocolVersion:Ro,agent:{name:"qlogicagent",version:"0.1.0"},capabilities:{tools:Be().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:[...ru]}})}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"&&(io(t.cwd),this.currentProjectRoot=t.cwd),this.currentSessionId=n,this.sessionState=new Tt(n),this.sessionTaskDomain=void 0,this.memoryPrefetchState=kt(),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 Za(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 Qa(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"&&(io(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,Qc(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}:{}})}),Jc(OT(l,u))}Xc(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(()=>{}),ll()),this.currentSessionId=o,this.sessionState=new Tt(o),this.sessionTaskDomain=void 0,this.memoryPrefetchState=kt(),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??"",M=d.model??"";y&&M&&this.registry.getModelInfo(y,M)?.streamRequired&&(d.streamRequired=!0)}let l=this.resolveAgent(d);if(this.permissionChecker&&a?.permissions){let y=a.permissions,M=Cs(y);this.permissionChecker.ruleEngineRef.setMode(M.mode),M.rules.length>0&&this.permissionChecker.ruleEngineRef.replaceRules(M.rules),M.defaultBehavior&&this.permissionChecker.ruleEngineRef.setDefaultBehavior(M.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 il(p,this.currentHooks??void 0);y.length>0&&(u=sl(y))}catch{}let m=s.filter(y=>y.role==="user").map(y=>typeof y.content=="string"?y.content:"").join(" "),{domain:g,source:f}=hl({cwd:p,hostOverride:a?.taskDomain,sessionDomain:this.sessionTaskDomain,userText:m});this.sessionTaskDomain=g,f==="auto-detect"&&bl(m,g)&&yl(p,g);let b=this.memoryStore,w=await cl({basePrompt:a?.systemPrompt,instructionBlock:u,customSystemPrompt:a?.customSystemPrompt,appendSystemPrompt:a?.appendSystemPrompt,sections:[dl(p),ul(g),pl(),Hn("memory",()=>b&&b.getSystemPromptBlock("memory")||null,"memory entries may change between turns")]});for(let y of s)y.role==="user"&&Lr(o,y,this.currentProjectRoot).catch(()=>{});await this.mcpReady;let T=Be(),_=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 M=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:M}});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:M}}),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&&Lr(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:M}}),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:M}});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:M}});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:M}});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:M}});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){Xa(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&&el(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]
468
+ `)}};import{ACP_SESSION_UPDATE_TYPES as et,ACP_EXTENDED_SESSION_UPDATE_TYPES as de}from"qlogicagent-runtime-contracts";function Ku(r,e,t,n){let o=rv(t,n);o&&r.emitSessionUpdate(e,o.type,o.payload)}function rv(r,e){switch(r){case"turn.delta":return{type:et.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:e.text}}};case"turn.reasoning_delta":return{type:et.AGENT_THOUGHT_CHUNK,payload:{content:{type:"text",text:e.text}}};case"turn.tool_call":return{type:et.TOOL_CALL,payload:{toolCallId:e.callId,status:"in_progress",title:e.name,kind:"execute",rawInput:sv(e.arguments)}};case"turn.tool_result":return{type:et.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:et.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:et.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:et.USAGE_UPDATE,payload:{used:n+o,size:t?.contextWindow??2e5}}}case"turn.end":return null;case"turn.error":return{type:et.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:`[Error] ${e.error??"Unknown error"}`}}};case"turn.suggestions":return{type:et.AVAILABLE_COMMANDS_UPDATE,payload:{availableCommands:(e.items??[]).map(t=>({name:t.text,description:t.description??""}))}};case"turn.subagent_started":return{type:de.X_SUBAGENT_STARTED,payload:{agentId:e.subagentId,agentName:e.agentType,task:e.prompt}};case"turn.subagent_delta":return{type:de.X_SUBAGENT_DELTA,payload:{agentId:e.subagentId??e.agentType,text:e.text}};case"turn.subagent_ended":return{type:de.X_SUBAGENT_ENDED,payload:{agentId:e.subagentId,result:e.outputPreview}};case"turn.media_result":return{type:de.X_MEDIA_RESULT,payload:{mediaId:e.taskId??iv(),type:e.mediaType,url:e.url,metadata:{model:e.model,provider:e.provider}}};case"turn.media_progress":return{type:de.X_MEDIA_PROGRESS,payload:{mediaId:e.taskId,progress:e.percent,stage:e.status}};case"turn.skill_instruction":return{type:de.X_SKILL_INSTRUCTION,payload:{skillId:"unknown",instruction:String(e.instruction??"")}};case"turn.recovery":return{type:de.X_RECOVERY,payload:{errorType:e.action,message:e.detail??"",action:"retry"}};case"turn.ask_user":return{type:de.X_ASK_USER,payload:{question:(e.questions??[])[0]?.question??"",options:(e.questions??[])[0]?.options?.map(t=>t.label)}};case"session.info":return{type:de.X_SESSION_INFO,payload:{sessionId:e.sessionId,model:e.model,metadata:{cwd:e.cwd,turnCount:e.turnCount}}};case"memory.updated":return{type:de.X_MEMORY_UPDATED,payload:{memoryId:e.source,action:"updated",summary:e.summary}};case"team.member.notification":return{type:de.X_TEAM_MEMBER_UPDATE,payload:{memberId:e.memberId,type:e.method,payload:e.params??{}}};case"solo.progress":return{type:de.X_SOLO_STARTED,payload:{evaluationId:e.soloId,agents:[e.agentId],task:e.progress??""}};case"solo.agentDelta":return{type:de.X_SUBAGENT_DELTA,payload:{agentId:e.agentId,text:e.text}};case"solo.evaluation":return{type:de.X_SOLO_SELECTED,payload:{evaluationId:e.soloId,winnerId:e.winnerId,reason:e.reasoning}};case"product.taskStarted":return{type:de.X_PRODUCT_TASK_STARTED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:e.assignee}};case"product.taskCompleted":return{type:de.X_PRODUCT_TASK_COMPLETED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:"",result:e.result,status:"completed"}};case"product.taskFailed":return{type:de.X_PRODUCT_TASK_COMPLETED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:"",status:"failed"}};case"product.checkpointed":return{type:de.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 sv(r){if(r)try{return JSON.parse(r)}catch{return{raw:r}}}function iv(){return Math.random().toString(36).slice(2,10)}var Ju=["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 Vo=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 pv=new Set(["zhipu","zhipu-openai","zhipu-coding"]),mv="https://open.bigmodel.cn/api/paas/v4";function gv(r,e){if(!(!r||!e)&&pv.has(r))return new Vo({baseUrl:mv,apiKey:e})}function fv(r){let e=r.pathname.split("/").filter(Boolean),n=(e[e.length-1]??"").replace(/\.md$/i,"").replace(/[^a-zA-Z0-9_-]/g,"-");return/^(skill|readme|index|install|main)$/i.test(n)&&e.length>=2?e[e.length-2].replace(/[^a-zA-Z0-9_-]/g,"-"):n||""}var Ko=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 so;memoryPrefetchState=gt();qmemoryAdapter=null;qmemoryUserId="";memdir=null;memoryWriteState=Hu();fileWatcher=null;pendingAskUser=new Map;sessionTaskDomain;acpDetector=new Do;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 en,this.mediaClient=new Qt({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 wt({verbose:e.verbose}),this.taskStore.onTaskChange((s,i)=>{i&&this.sendNotification("task.updated",{taskId:s,type:i.type,lifecycle:i.lifecycle,label:i.label})}),Bd({log:{info:s=>this.log(s),warn:s=>this.log(`[warn] ${s}`),error:s=>this.log(`[error] ${s}`),debug:s=>{e.verbose&&this.log(`[debug] ${s}`)}},onExecProgress:s=>{this.sendNotification("turn.exec_progress",{output:s.output,elapsedTimeSeconds:s.elapsedTimeSeconds,totalLines:s.totalLines,totalBytes:s.totalBytes})}});let o=new Ho;o.ensureInitialized(),this.memdir=o}start(){this.running=!0,this.log("qlogicagent started, waiting for JSON-RPC messages..."),this.transport.onMessage(e=>{if(this.acpServer){if(dv(e)||cv(e)){this.acpServer.dispatchMessage(e);return}if(lv(e)){let t=e.method;if(t==="initialize"||t.startsWith("session/")||t.startsWith("x/")||t.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!av(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{qu().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:I.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=qo.split(".")[0];if(i!==a){this.log(`[initialize] protocol mismatch: host=${n} agent=${qo}`),e.id!==void 0&&this.sendResponse(e.id,void 0,{code:I.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${n}, agent=${qo}`});return}this.log(`[initialize] host=${o} v${s}`),e.id!==void 0&&this.sendResponse(e.id,{protocolVersion:qo,agent:{name:"qlogicagent",version:"0.1.0"},capabilities:{tools:Ye().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:[...Ju]}})}handleThreadCreate(e){let t=e.params,n=t?.id??ue();this.log(`[thread.create] id=${n} title=${t?.title??"(none)"}`),t?.cwd&&typeof t.cwd=="string"&&(Ro(t.cwd),this.currentProjectRoot=t.cwd),this.currentSessionId=n,this.sessionState=new It(n),this.sessionTaskDomain=void 0,this.memoryPrefetchState=gt(),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 jl(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:I.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:I.INVALID_PARAMS,message:"sessionId is required"});return}try{let o=await Nl(n,this.currentProjectRoot);if(!o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:I.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:I.INTERNAL_ERROR,message:`Failed to resume session: ${o.message}`})}}async handleTurn(e){let t=e.params??{},n=t.turnId??ue(),o=t.sessionId,s=t.messages??[],i=t.tools??[],a=t.config;a?.workdir&&typeof a.workdir=="string"&&(Ro(a.workdir),this.currentProjectRoot=a.workdir);{let d={},l=a?.provider,p=a?.apiKey;l&&p&&(d[l]=p);let u=a?.mediaApiKeys;u&&Object.assign(d,u),this.currentMediaApiKeys=d,Nd(this.mediaClient,d,(m,g,f)=>{this.sessionState?.addMediaUsage(m,g,f)},a?.mediaProviders,(m,g,f,y,k)=>{this.sendNotification("turn.media_progress",{turnId:n,taskId:m,mediaType:g,percent:f,status:y,...k?{provider:k}:{}})}),$d(gv(l,p))}Ud(async d=>{let l=`ask-${ue().slice(0,8)}`;return new Promise(p=>{this.pendingAskUser.set(l,{resolve:p}),this.sendNotification("turn.ask_user",{requestId:l,questions:d.map(u=>({header:u.header,question:u.question,options:u.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(()=>{}),Kl()),this.currentSessionId=o,this.sessionState=new It(o),this.sessionTaskDomain=void 0,this.memoryPrefetchState=gt(),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 b=d.provider??"",E=d.model??"";b&&E&&this.registry.getModelInfo(b,E)?.streamRequired&&(d.streamRequired=!0)}let l=this.resolveAgent(d);if(this.permissionChecker&&a?.permissions){let b=a.permissions,E=Xs(b);this.permissionChecker.ruleEngineRef.setMode(E.mode),E.rules.length>0&&this.permissionChecker.ruleEngineRef.replaceRules(E.rules),E.defaultBehavior&&this.permissionChecker.ruleEngineRef.setDefaultBehavior(E.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 p,u=a?.workdir??process.cwd();try{let b=await Vl(u,this.currentHooks??void 0);b.length>0&&(p=zl(b))}catch{}let m=s.filter(b=>b.role==="user").map(b=>typeof b.content=="string"?b.content:"").join(" "),{domain:g,source:f}=nc({cwd:u,hostOverride:a?.taskDomain,sessionDomain:this.sessionTaskDomain,userText:m});this.sessionTaskDomain=g,f==="auto-detect"&&rc(m,g)&&oc(u,g);let y=this.memdir,k=await Jl({basePrompt:a?.systemPrompt,instructionBlock:p,customSystemPrompt:a?.customSystemPrompt,appendSystemPrompt:a?.appendSystemPrompt,sections:[Yl(u),Xl(g),Ql(),lo("memory",()=>y&&y.getIndexForPrompt()||null,"memory INDEX.md may change between turns")]});for(let b of s)b.role==="user"&&rs(o,b,this.currentProjectRoot,n).catch(()=>{});await this.mcpReady;let w=Ye(),C=new Set(w.map(b=>b.function.name)),R=[...w,...i.filter(b=>!C.has(b.function.name))];for await(let b of l.run({turnId:n,sessionId:o,messages:s,tools:R,systemPrompt:k,config:d},c.signal)){let E=new Date().toISOString();switch(b.type){case"start":break;case"delta":this.sendNotification("turn.delta",{turnId:b.turnId,text:b.text,item:{id:`${n}-delta`,type:"message",role:"assistant",text:b.text,createdAt:E}});break;case"end":if(this.sendNotification("turn.end",{turnId:b.turnId,content:b.content,usage:b.usage,model:b.model,provider:b.provider,item:{id:`${n}-end`,type:"message",role:"assistant",text:b.content,createdAt:E}}),b.usage&&this.sessionState){this.sessionState.addUsage(b.usage,b.model??this.currentModel);let P=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:b.turnId,usage:b.usage,model:b.model??this.currentModel,sessionCostUSD:P.totalInputTokens*3e-6+P.totalOutputTokens*15e-6})}b.content&&rs(o,{role:"assistant",content:b.content},this.currentProjectRoot,n).catch(()=>{}),b.content&&this.qmemoryAdapter&&this.qmemoryUserId&&zu(m,b.content,{ingestExtracted:(P,U)=>this.qmemoryAdapter.ingestExtracted(P,U),searchMemories:(P,U)=>this.qmemoryAdapter.search(P,U,{limit:5}),removeMemory:P=>this.qmemoryAdapter.remove(P),userId:this.qmemoryUserId,log:{debug:P=>this.log(`[debug] ${P}`),warn:P=>this.log(`[warn] ${P}`)}},this.memoryWriteState).catch(()=>{});break;case"error":if(this.sendNotification("turn.error",{turnId:b.turnId,error:b.error,code:b.code}),b.usage&&this.sessionState){this.sessionState.addUsage(b.usage,this.currentModel);let P=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:b.turnId,usage:b.usage,model:this.currentModel,sessionCostUSD:P.totalInputTokens*3e-6+P.totalOutputTokens*15e-6})}break;case"skill_instruction":this.sendNotification("turn.skill_instruction",{turnId:b.turnId,instruction:b.instruction});break;case"tool_call":this.sendNotification("turn.tool_call",{turnId:b.turnId,callId:b.callId,name:b.name,arguments:b.arguments,item:{id:b.callId,type:"tool_call",role:"assistant",toolName:b.name,toolCallId:b.callId,arguments:b.arguments,createdAt:E}}),this.sessionState?.recordToolCall();break;case"tool_result":this.sendNotification("turn.tool_result",{turnId:b.turnId,callId:b.callId,name:b.name,ok:b.ok,...b.error?{error:b.error}:{},...b.outputPreview?{outputPreview:b.outputPreview}:{},item:{id:`${b.callId}-result`,type:"tool_result",role:"assistant",toolName:b.name,toolCallId:b.callId,output:b.ok?b.outputPreview??"":b.error,approved:b.ok,createdAt:E}});break;case"tool_blocked":this.sendNotification("turn.tool_blocked",{turnId:b.turnId,callId:b.callId,name:b.name,reason:b.reason,item:{id:`${b.callId}-blocked`,type:"tool_blocked",role:"system",toolName:b.name,toolCallId:b.callId,text:b.reason,approved:!1,createdAt:E}});break;case"recovery":this.sendNotification("turn.recovery",{turnId:b.turnId,action:b.action,...b.detail?{detail:b.detail}:{},item:{id:`${n}-recovery-${ue().slice(0,8)}`,type:"recovery",role:"system",strategy:b.action,text:b.detail,createdAt:E}});break;case"plan_update":this.sendNotification("turn.plan_update",{turnId:b.turnId,slug:b.slug,content:b.content,item:{id:`${n}-plan-${ue().slice(0,8)}`,type:"plan_update",role:"assistant",text:b.content,createdAt:E}});break;case"reasoning_delta":this.sendNotification("turn.reasoning_delta",{turnId:b.turnId,text:b.text});break;case"suggestions":this.sendNotification("turn.suggestions",{turnId:b.turnId,items:b.items});break;case"media_result":this.sendNotification("turn.media_result",{turnId:b.turnId,mediaType:b.mediaType,url:b.url,...b.model?{model:b.model}:{},...b.provider?{provider:b.provider}:{},...b.taskId?{taskId:b.taskId}:{}});break;case"artifact":this.sendNotification("turn.artifact",{turnId:b.turnId,artifactId:b.artifactId,type:b.artifactType,title:b.title,...b.filePath?{filePath:b.filePath}:{},...b.language?{language:b.language}:{},...b.content?{content:b.content}:{},...b.mimeType?{mimeType:b.mimeType}:{}});break;case"subagent_started":this.sendNotification("turn.subagent_started",{turnId:b.turnId,subagentId:b.subagentId,agentType:b.agentType,...b.prompt?{prompt:b.prompt}:{}});break;case"subagent_ended":this.sendNotification("turn.subagent_ended",{turnId:b.turnId,subagentId:b.subagentId,agentType:b.agentType,ok:b.ok,...b.outputPreview?{outputPreview:b.outputPreview}:{},...b.error?{error:b.error}:{}});break;case"annotations":this.sendNotification("turn.annotations",{turnId:b.turnId,annotations:b.annotations});break;case"heartbeat":this.sendNotification("turn.heartbeat",{turnId:b.turnId,message:b.message});break;case"tool_use_summary":this.sendNotification("turn.tool_use_summary",{turnId:b.turnId,summary:b.summary});break}}if(this.log(`turn ${n} completed`),this.sessionState?.recordTurnCompleted(),this.sessionState){Ul(o,this.sessionState.createSnapshot(),{model:this.currentModel,cwd:this.currentProjectRoot??process.cwd(),messageCount:s.length},this.currentProjectRoot).catch(()=>{});let b=this.sessionState.createSnapshot();this.sendNotification("session.info",{sessionId:o,model:this.currentModel||void 0,cwd:this.currentProjectRoot??process.cwd(),turnCount:b.turnCount}),this.currentTransport&&this.currentApiKey&&d.summaryModel&&Fl(o,{sessionId:o,createdAt:0,lastActiveAt:0,turnCount:b.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]
436
469
  Based on the conversation, suggest 1-3 short follow-up actions the user might naturally do next.
437
470
  Be specific: "run the tests" beats "continue".
438
471
  Stay silent if the next step isn't obvious.
439
- 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=Se(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(`
440
- `),error:y.details?.error}}catch(R){return{result:"",error:R instanceof Error?R.message:String(R)}}}},tools:Be(),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 Ka(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=Ar({provider:n,model:o,apiKey:s,baseUrl:i},this.registry);Pr()&&(a.transport=Ir(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=Se(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(`
441
- `),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 Re of X)this.sendNotification("turn.media_result",{turnId:h,mediaType:bn,url:Re,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 Qe=Array.isArray(G.details?.matches)?G.details.matches:void 0;return{result:ce,error:Z,toolReferences:Qe}}catch(K){return{result:"",error:K instanceof Error?K.message:String(K)}}}},l=Ca(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=Ia({baseUrl:u,apiKey:(process.env.QMEMORY_API_KEY??"").trim()||void 0,timeoutMs:5e3});this.qmemoryAdapter=h,this.qmemoryUserId=this.currentSessionId??"default",Aa(l,{memoryProvider:h,userId:this.currentSessionId??"default",log:{debug:k=>c.debug(k),warn:k=>c.warn(k)}},this.memoryPrefetchState)}Vi(l,c,{transport:a.transport,apiKey:a.apiKey});let p=e?.mcpServers,m=_s(p??{}),g=la();try{if(U.existsSync(g)){let h=JSON.parse(U.readFileSync(g,"utf8")),k=_s(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 co({servers:m,log:c}),pt(async()=>{await this.mcpManager?.disconnectAll()});let h=()=>this.mcpManager;fe(nd(h)),fe(od(h)),fe(Cd({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 Ke().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=Se(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(`
442
- `)}}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=ra();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);ad(f,c).then(h=>{if(h.length===0)return;this.pluginLoader=new po({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,_=Cs(T),R=new mo(_);this.permissionUnregister&&this.permissionUnregister(),this.permissionChecker=new fo({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=Be();this.permissionChecker.setToolMeta(y),this.permissionUnregister=this.permissionChecker.register();let M=[wr(),...Array.isArray(e?.skillPaths)?e.skillPaths:[]];fe(bd({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 M)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 M){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 M){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=Be(),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(M[0]??wr(),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(wd({abortSignal:void 0,currentForkDepth:0,forkAgent:async h=>{let k=_n(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=Ke(),C=er(x,k),L=Be().filter(E=>C.includes(E.function.name)),K=Gr(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(vd({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()};pt(async()=>{for(let h of F.values())h.timerId&&clearTimeout(h.timerId)}),fe(Sd({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;pt(async()=>{for(let h of re.values())h.cleanup();re.clear()}),fe(_d({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 St({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")});pt(async()=>{B.dispose()}),fe(Rd({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 hc(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 yc(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 xo({persistToDisk:!0});h.loadFromDiskSync(),this.memoryStore=h;let k={providerId:"null",search:async()=>[],ingest:async()=>{}},x=this.qmemoryAdapter??k;fe({name:Kd,label:Xd,description:Yd,parameters:Jd,execute:async(C,A)=>{let L=await Qd(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=Id(h,this.currentSessionId||"default");fe(Pd(k))}let ye=e?.workdir??process.cwd(),$e=tu({projectRoot:ye,ruleEngine:R,hooks:l,log:h=>c.info(`[settings] ${h}`)});pt(async()=>{$e()}),this.currentSessionId&&l.invoke("session.created",{sessionId:this.currentSessionId}).catch(()=>{}),this.fileWatcher&&this.fileWatcher.stop();let be=e?.workdir??process.cwd();return nl({projectRoot:be,sessionId:this.currentSessionId,hooks:l,log:h=>c.debug(h),onInstructionCacheReset:al}).then(h=>{this.fileWatcher=h,pt(async()=>{this.fileWatcher?.stop()})}).catch(h=>{c.warn(`[file-watcher] init error: ${h instanceof Error?h.message:h}`)}),this.agent=new jt({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:oa(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=Be(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(!Mr(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(!Mr(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=Se("todo");if(!t){e.id!==void 0&&this.sendResponse(e.id,{items:[],summary:wt([])});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:wt(i)})}catch{e.id!==void 0&&this.sendResponse(e.id,{items:[],summary:wt([])})}}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(`
443
- \xA7
444
- `).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(`
445
- \xA7
446
- `).filter(m=>m.trim()),l=d.length,u=d.filter(m=>!m.includes(t.match));a[o]=u.join(`
447
- \xA7
448
- `),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=Se(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(`
449
- `)||"OK"}catch(i){return`Error: ${i instanceof Error?i.message:String(i)}`}}async ensureAgentConfigStore(){return this.agentConfigStore||(this.agentConfigStore=new ko(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 St({log:{info:n=>process.stderr.write(`[solo:pm] ${n}
472
+ 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 p of n.stream({model:s,messages:c,temperature:.3,maxTokens:200},o))p.type==="delta"&&(d+=p.text);let l=d.match(/\[[\s\S]*\]/);if(l){let p=JSON.parse(l[0]),u=Array.isArray(p)?p.filter(m=>typeof m.text=="string"&&m.text.length>0).slice(0,5):[];u.length>0&&this.sendNotification("turn.suggestions",{turnId:e,items:u})}}catch{}}async handleDream(e){let t=e.params??{},n=t.turnId??ue(),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 u=l.provider??"",m=l.model??"";u&&m&&this.registry.getModelInfo(u,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 u={context:{memoryRoot:i,transcriptDir:a,currentSessionId:o,listSessionsSince:async()=>c},triggerConfig:{force:s?.force!==!1},transport:this.currentTransport,toolInvoker:{invoke:async(g,f,y,k)=>{if(f.startsWith("$"))return{result:y};let w=Ae(f);if(!w)return{result:"",error:`Unknown tool: ${f}`};let C=`tc_${ue().slice(0,8)}`;try{let R=JSON.parse(y),b=await w.execute(C,R,k);return{result:b.content.map(P=>P.text??"").join(`
473
+ `),error:b.details?.error}}catch(R){return{result:"",error:R instanceof Error?R.message:String(R)}}}},tools:Ye(),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 Pl(u);m.ok?(this.qmemoryAdapter&&this.qmemoryUserId&&Dl({adapter:this.qmemoryAdapter,userId:this.qmemoryUserId,memoryRoot:i,log:{info:g=>this.log(g),debug:g=>{this.verbose&&this.log(g)}}}).catch(g=>this.log(`[decay] post-dream decay error: ${g instanceof Error?g.message:String(g)}`)),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(u){if(d.signal.aborted)this.sendNotification("turn.error",{turnId:n,error:"Dream aborted",code:"ABORTED"});else{let m=u instanceof Error?u.message:String(u);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=Jr({provider:n,model:o,apiKey:s,baseUrl:i},this.registry);Yr()&&(a.transport=Xr(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,T,x,A)=>{if(T.startsWith("$"))return{result:x};let S=Ae(T);if(!S)return{result:"",error:`Unknown tool: ${T}`};let O=`tc_${ue().slice(0,8)}`;try{let N=JSON.parse(x),G=await S.execute(O,N,A),F=G.content.map(me=>me.text??"").join(`
474
+ `),j=G.details?.error,z=G.details?.type,se=z?.split("_")[0];if(z==="three_d_generate"&&(se="3d"),se&&["image","tts","video","music","3d"].includes(se)){let me=G.details?.mediaUrls??[],Me=se;for(let Mn of me)this.sendNotification("turn.media_result",{turnId:h,mediaType:Me,url:Mn,model:G.details?.model,provider:G.details?.provider,...G.details?.durationMs?{durationSeconds:G.details.durationMs/1e3}:{},...G.details?.taskId?{taskId:G.details.taskId}:{}})}if(z==="todo"&&!j)try{let me=JSON.parse(F);me.todoList&&this.sendNotification("turn.todos_updated",{turnId:h,items:me.todoList,summary:{total:me.total??me.todoList.length,completed:me.completed??0,inProgress:me.inProgress??0,notStarted:me.notStarted??0}})}catch{}let ve=Array.isArray(G.details?.matches)?G.details.matches:void 0;return{result:F,error:j,toolReferences:ve}}catch(N){return{result:"",error:N instanceof Error?N.message:String(N)}}}},l=nl(c);this.currentHooks=l,this.taskStore.setHooks(l,this.currentSessionId??"");let p=(process.env.QMEMORY_BASE_URL??process.env.QLOGICAGENT_QMEMORY_BASE_URL??"").trim().replace(/\/+$/,"");if(p){let h=ul({baseUrl:p,apiKey:(process.env.QMEMORY_API_KEY??"").trim()||void 0,timeoutMs:5e3});this.qmemoryAdapter=h,this.qmemoryUserId=this.currentSessionId??"default",al(l,{memoryProvider:h,userId:this.currentSessionId??"default",log:{debug:T=>c.debug(T),warn:T=>c.warn(T)}},this.memoryPrefetchState)}cl(l,{currentCwd:this.currentProjectRoot??void 0,log:{debug:h=>c.debug(h),warn:h=>c.warn(h)}}),ya(l,c,{transport:a.transport,apiKey:a.apiKey});let u=e?.mcpServers,m=Js(u??{}),g=La();try{if(W.existsSync(g)){let h=JSON.parse(W.readFileSync(g,"utf8")),T=Js(h),x=new Set(m.map(A=>A.name));m=[...m,...T.filter(A=>!x.has(A.name))]}}catch{}if(m.length>0){this.mcpManager&&this.mcpManager.disconnectAll().catch(()=>{}),this.mcpManager=new Ao({servers:m,log:c}),Tt(async()=>{await this.mcpManager?.disconnectAll()});let h=()=>this.mcpManager;be(Wd(h)),be(Gd(h)),be(mu({listServers:async()=>{let T=this.mcpManager;return T?T.getConnectedServers().map(A=>({name:A,status:"connected",transport:"stdio",toolCount:0,resourceCount:0,promptCount:0})):[]},listTools:async T=>{if(!this.mcpManager)return[];let A=`mcp__${T.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`;return nt().filter(S=>S.startsWith(A)).map(S=>({name:S.slice(A.length),prefixedName:S}))},callTool:async(T,x,A,S)=>{let N=`mcp__${T.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`+x,G=Ae(N);if(!G)return{success:!1,error:`Tool not found: ${N}`};try{return{success:!0,content:(await G.execute(`mcp_${Date.now()}`,A??{},S)).content.map(z=>z.text??"").join(`
475
+ `)}}catch(F){return{success:!1,error:F.message}}},listResources:async T=>{let x=this.mcpManager;return x?(await x.listResources(T)).map(S=>({uri:S.uri,name:S.name,mimeType:S.mimeType,description:S.description,server:S.server})):[]},readResource:async(T,x)=>{let A=this.mcpManager;if(!A)throw new Error("MCP not initialized");return(await A.readResource(T,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(),c.info(`[mcp] ${this.mcpManager?.getToolCount()??0} tools from ${this.mcpManager?.getConnectedServers().length??0} servers`)}).catch(T=>{c.warn(`[mcp] connection error: ${T instanceof Error?T.message:T}`)})}let f=[],y=Ea();W.existsSync(y)&&f.push(y);let k=e?.pluginPaths;if(Array.isArray(k))for(let h of k)typeof h=="string"&&W.existsSync(h)&&f.push(h);qd(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 T=this.pluginLoader;l.register({point:"turn.submitted",handler:async()=>(await T.refreshActivations(),{action:"continue"}),label:"plugin-activation-refresh",priority:50})}).catch(h=>{c.warn(`[plugins] marketplace resolve error: ${h instanceof Error?h.message:h}`)});let w=e?.permissions,C=Xs(w),R=new Po(C);this.permissionUnregister&&this.permissionUnregister(),this.permissionChecker=new Oo({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(T=>`${T.pattern}:${T.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,T)=>{c.warn(`[permissions] blocked "${h}": ${T}`)}});let b=Ye();this.permissionChecker.setToolMeta(b),this.permissionUnregister=this.permissionChecker.register();let E=this.currentProjectRoot?Wn(this.currentProjectRoot):void 0,P=[Rt(),...E?[E]:[],...Array.isArray(e?.skillPaths)?e.skillPaths:[]];be(ru({listSkills:()=>{let h=[];this.pluginLoader&&h.push(...this.pluginLoader.getPluginSkills());let T=e?.skillPaths;if(Array.isArray(T)){for(let x of T)if(typeof x=="string"){let A=K.basename(x);h.some(S=>S.name===A)||h.push({name:A,source:"gateway",filePath:K.join(x,"SKILL.md"),baseDir:x})}}return h},listSkillsFull:async h=>{let T=[],x=new Set,A=Rt();for(let S of P)try{let O=await W.promises.readdir(S,{withFileTypes:!0});for(let N of O){if(!N.isDirectory())continue;let G=K.join(S,N.name,"SKILL.md");try{let F=await W.promises.readFile(G,"utf8"),j=K.basename(S);if(h&&j!==h)continue;x.add(j);let z=S===A?"global":S===E?"project":"config",ve=F.match(/^---\n[\s\S]*?^version:\s*(\S+)/m)?.[1],me=F.startsWith(`---
476
+ `)?F.indexOf("---",4):-1,Pn=(me>=0?F.slice(me+3).trimStart():F).split(`
477
+ `).find($t=>$t.trim()&&!$t.startsWith("#"))?.trim()??`Skill from ${j}`;T.push({name:N.name,description:Pn,category:j,scope:z,version:ve})}catch{}}}catch{}if(this.pluginLoader)for(let S of this.pluginLoader.getPluginSkills())h&&S.source!==h||(x.add(S.source??"plugin"),T.push({name:S.name,description:`Plugin skill (${S.source})`,category:S.source,scope:"plugin"}));return{skills:T,categories:[...x]}},readSkillContent:async h=>{for(let T of P){let x=K.join(T,h,"SKILL.md");try{return await W.promises.readFile(x,"utf8")}catch{}}return null},viewSkill:async(h,T)=>{for(let x of P){let A=T?K.join(x,h,T):K.join(x,h,"SKILL.md");try{let S=await W.promises.readFile(A,"utf8");return{name:h,content:S}}catch{}}return null},executeSkillSubturn:async(h,T,x,A)=>{let S=`skill_${h}_${ue().slice(0,8)}`,O=this.agent;if(!O)return"[skill] Cannot execute: no LLM provider configured";let N=this.currentSessionId??"skill";this.currentHooks?.invoke("subagent.started",{sessionId:N,turnId:S,subagentId:S,agentType:`skill:${h}`}).catch(()=>{});let G=Ye(),F=x??`Execute skill "${h}" instructions.`,j=[],z;for await(let se of O.run({turnId:S,sessionId:N,messages:[{role:"user",content:F}],tools:G,systemPrompt:T,config:{parentDepth:1}},A)){if(se.type==="end"&&se.content)return this.currentHooks?.invoke("subagent.stopped",{sessionId:N,turnId:S,subagentId:S,agentType:`skill:${h}`,reason:"normal"}).catch(()=>{}),se.content;if(se.type==="delta"&&se.text&&j.push(se.text),se.type==="error"){z=se.error;break}}return this.currentHooks?.invoke("subagent.stopped",{sessionId:N,turnId:S,subagentId:S,agentType:`skill:${h}`,reason:z?"error":"normal",error:z}).catch(()=>{}),z?`[skill "${h}"] error: ${z}`:j.join("")||`[skill "${h}"] completed (no output)`},manageSkill:async h=>{let T=this.currentProjectRoot,x=T?Wn(T):P[0]??Rt(),A=K.join(x,h.name),S=K.join(A,"SKILL.md");switch(h.action){case"create":{if(await W.promises.mkdir(A,{recursive:!0}),await W.promises.writeFile(S,h.content??"","utf8"),this.sendNotification("turn.skill_instruction",{turnId:`skill-create-${Date.now()}`,instruction:{name:h.name,category:h.category??"learned",content:h.content??"",scope:"project"}}),an(),this.qmemoryAdapter&&this.qmemoryUserId){let N=(h.content??"").split(`
478
+ `).slice(0,3).join(" ").slice(0,200),G=T?K.basename(T):"unknown";this.qmemoryAdapter.ingestExtracted([{text:`Learned skill "${h.name}" in project "${G}": ${N}`,category:"skill-learning"}],this.qmemoryUserId).catch(()=>{})}let O=T?` (project-scoped). To make it available across all projects, use: skill promote name:"${h.name}"`:"";return{success:!0,message:`Skill "${h.name}" created${O}`,path:A}}case"edit":return await W.promises.writeFile(S,h.content??"","utf8"),this.sendNotification("turn.skill_instruction",{turnId:`skill-edit-${Date.now()}`,instruction:{name:h.name,category:h.category??"learned",content:h.content??"",scope:"project"}}),{success:!0,message:`Skill "${h.name}" updated`,path:S};case"patch":{let O=await W.promises.readFile(S,"utf8");if(!h.oldString||!O.includes(h.oldString))return{success:!1,message:"oldString not found in SKILL.md"};let N=O.replace(h.oldString,h.newString??"");return await W.promises.writeFile(S,N,"utf8"),this.sendNotification("turn.skill_instruction",{turnId:`skill-patch-${Date.now()}`,instruction:{name:h.name,category:h.category??"learned",content:N,scope:"project"}}),{success:!0,message:`Skill "${h.name}" patched`,path:S}}case"delete":return await W.promises.rm(A,{recursive:!0,force:!0}),this.sendNotification("turn.skill_instruction",{turnId:`skill-delete-${Date.now()}`,instruction:{name:h.name,category:h.category??"learned",action:"delete",scope:"project"}}),an(),{success:!0,message:`Skill "${h.name}" deleted`};default:return{success:!1,message:`Unknown action: ${h.action}`}}},promoteSkill:async h=>{let T=Wn(this.currentProjectRoot??void 0),x=K.join(T,h,"SKILL.md");try{await W.promises.access(x)}catch{return{success:!1,message:`Skill "${h}" not found in project skills. Cannot promote.`}}let A=Rt(),S=K.join(A,h);await W.promises.mkdir(S,{recursive:!0});let O=K.join(T,h),N=await W.promises.readdir(O);for(let G of N){let F=await W.promises.readFile(K.join(O,G));await W.promises.writeFile(K.join(S,G),F)}return this.sendNotification("turn.skill_instruction",{turnId:`skill-promote-${Date.now()}`,instruction:{name:h,category:"promoted",content:await W.promises.readFile(x,"utf8"),scope:"global"}}),await W.promises.rm(O,{recursive:!0,force:!0}),this.sendNotification("turn.skill_instruction",{turnId:`skill-promote-cleanup-${Date.now()}`,instruction:{name:h,category:"learned",action:"delete",scope:"project"}}),an(),{success:!0,message:`Skill "${h}" promoted to global (user-level) and removed from project scope. It will now be available across all projects.`,path:S}},installSkill:async(h,T)=>{let x;try{if(x=new URL(h),!["http:","https:"].includes(x.protocol))return{success:!1,message:`Invalid URL scheme: ${x.protocol}. Only http/https allowed.`}}catch{return{success:!1,message:`Invalid URL: ${h}`}}let A=T??fv(x);if(!A)return{success:!1,message:"Cannot derive skill name from URL. Please provide 'name' parameter."};try{let S=await fetch(h,{signal:AbortSignal.timeout(3e4)});if(!S.ok)return{success:!1,message:`Download failed: HTTP ${S.status} ${S.statusText}`};let O=S.headers.get("content-length");if(O&&parseInt(O,10)>512e3)return{success:!1,message:"Content too large (>512KB). Skill files should be small markdown documents."};let N=await S.text();if(!N.trim())return{success:!1,message:"Downloaded content is empty."};if(N.length>512e3)return{success:!1,message:"Content too large (>512KB). Skill files should be small markdown documents."};if(N.trimStart().startsWith("<!DOCTYPE")||N.trimStart().startsWith("<html"))return{success:!1,message:"URL returned an HTML page, not a raw markdown file. Use a raw/direct download link."};let G=Rt(),F=K.join(G,A);return await W.promises.mkdir(F,{recursive:!0}),await W.promises.writeFile(K.join(F,"SKILL.md"),N,"utf8"),this.sendNotification("turn.skill_instruction",{turnId:`skill-install-${Date.now()}`,instruction:{name:A,category:"installed",content:N,scope:"global"}}),an(),{success:!0,message:`Skill "${A}" installed from ${x.host}. Available globally across all projects.`,path:F}}catch(S){return{success:!1,message:`Install failed: ${S instanceof Error?S.message:String(S)}`}}}})),be(au({abortSignal:void 0,currentForkDepth:0,forkAgent:async h=>{let T=Nn(h.agent);if(!T)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=nt(),A=wr(x,T),O=Ye().filter(z=>A.includes(z.function.name)),N=ps(O,!0),G=h.maxTurns??T.maxTurns??200,F=await ln({promptMessages:[{role:"user",content:h.prompt}],tools:N,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:z=>{z.type==="delta"&&z.text&&this.sendNotification("turn.subagent_delta",{agentType:h.agent,text:z.text})}}),j=F.events.filter(z=>z.type==="end"&&"content"in z).map(z=>z.content??"").join("")||F.events.filter(z=>z.type==="delta"&&"text"in z).map(z=>z.text).join("");return{agentId:`fork-${h.agent}-${ue().slice(0,8)}`,status:F.ok?"completed":"failed",output:j||void 0,error:F.error,tokensUsed:F.totalUsage.prompt+F.totalUsage.completion}}}));let U=_t(),v=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"]}]]),ie=async()=>{try{return JSON.parse(await W.promises.readFile(U,"utf8"))}catch{return{}}},Y=async h=>{await W.promises.mkdir(K.dirname(U),{recursive:!0}),await W.promises.writeFile(U,JSON.stringify(h,null,2),"utf8")};be(lu({getConfig:async h=>{let T=v.get(h);if(!T)return{success:!1,error:`Unknown key: ${h}`};let x=await ie(),A=h in x?x[h]:T.value;return{success:!0,setting:{...T,value:A,readOnly:kn.includes(h)}}},setConfig:async(h,T)=>{let x=v.get(h);if(!x)return{success:!1,error:`Unknown key: ${h}`};let A=await ie(),S=h in A?A[h]:x.value;return A[h]=T,await Y(A),{success:!0,previousValue:S,setting:{...x,value:T}}},listConfig:async()=>{let h=await ie();return{success:!0,settings:[...v.values()].map(x=>({...x,value:x.key in h?h[x.key]:x.value,readOnly:kn.includes(x.key)}))}},resetConfig:async h=>{let T=v.get(h);if(!T)return{success:!1,error:`Unknown key: ${h}`};let x=await ie();return delete x[h],await Y(x),{success:!0,setting:T}},isValidKey:h=>v.has(h)}));let D=new Map,pe=h=>{let T=/^(\d+)([smhd])$/.exec(h.trim());if(!T)return null;let x=parseInt(T[1],10),A=T[2];return x*({s:1e3,m:6e4,h:36e5,d:864e5}[A]??6e4)},Re=h=>{h.timerId&&clearTimeout(h.timerId);let T=pe(h.schedule);if(!T)return;let x=Date.now(),A=T-x%T||T;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?Re(h):(h.state="paused",h.enabled=!1)},A),h.nextRunAt=new Date(x+A).toISOString()};Tt(async()=>{for(let h of D.values())h.timerId&&clearTimeout(h.timerId)}),be(du({createJob:async h=>{let T=`cron_${ue().slice(0,8)}`,x={id:T,name:h.name??`Job ${T}`,prompt:h.prompt,schedule:h.schedule,scheduleDisplay:h.schedule,state:"scheduled",enabled:!0,repeat:{times:h.repeat??null,completed:0},allowedTools:h.allowedTools};return D.set(T,x),Re(x),{success:!0,job:{...x,timerId:void 0}}},listJobs:async()=>({success:!0,jobs:[...D.values()].map(T=>({...T,timerId:void 0}))}),getJob:async h=>{let T=D.get(h);return T?{success:!0,job:{...T,timerId:void 0}}:{success:!1,error:`Job not found: ${h}`}},updateJob:async(h,T)=>{let x=D.get(h);return x?(T.prompt!==void 0&&(x.prompt=T.prompt),T.schedule!==void 0&&(x.schedule=T.schedule,x.scheduleDisplay=T.schedule),T.name!==void 0&&(x.name=T.name),T.enabled!==void 0&&(x.enabled=T.enabled,x.state=T.enabled?"scheduled":"paused"),T.repeat!==void 0&&(x.repeat.times=T.repeat),T.allowedTools!==void 0&&(x.allowedTools=T.allowedTools),x.enabled?Re(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 T=D.get(h);return T?(T.timerId&&clearTimeout(T.timerId),D.delete(h),{success:!0}):{success:!1,error:`Job not found: ${h}`}},pauseJob:async h=>{let T=D.get(h);return T?(T.state="paused",T.enabled=!1,T.timerId&&(clearTimeout(T.timerId),T.timerId=void 0),{success:!0,job:{...T,timerId:void 0}}):{success:!1,error:`Job not found: ${h}`}},resumeJob:async h=>{let T=D.get(h);return T?(T.state="scheduled",T.enabled=!0,Re(T),{success:!0,job:{...T,timerId:void 0}}):{success:!1,error:`Job not found: ${h}`}},triggerJob:async h=>{let T=D.get(h);return T?(T.lastRunAt=new Date().toISOString(),T.repeat.completed++,T.lastStatus="success",{success:!0,job:{...T,timerId:void 0}}):{success:!1,error:`Job not found: ${h}`}},validateSchedule:h=>pe(h)!==null||/^\d{1,2}\s/.test(h)?null:`Invalid schedule: ${h}. Use shorthand (5m, 1h, 1d) or cron expression.`}));let ae=new Map;Tt(async()=>{for(let h of ae.values())h.cleanup();ae.clear()}),be(uu({startMonitor:async h=>{if(ae.has(h.monitorId))return{action:"start",success:!1,error:`Monitor "${h.monitorId}" already exists.`};let T={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 A=W.watch(h.target,{persistent:!1},()=>{T.eventCount++,c.info(`[monitor] file change detected: ${h.target}`)});x=()=>A.close()}catch{return{action:"start",success:!1,error:`Cannot watch: ${h.target}`}}if(h.timeoutSeconds>0){let A=setTimeout(()=>{let O=ae.get(h.monitorId);O&&(O.cleanup(),ae.delete(h.monitorId))},h.timeoutSeconds*1e3),S=x;x=()=>{clearTimeout(A),S()}}return ae.set(h.monitorId,{info:T,cleanup:x}),{action:"start",success:!0,monitorId:h.monitorId}},stopMonitor:async h=>{let T=ae.get(h);return T?(T.cleanup(),ae.delete(h),{action:"stop",success:!0,monitorId:h}):{action:"stop",success:!1,error:`Monitor "${h}" not found.`}},listMonitors:async()=>[...ae.values()].map(h=>h.info)}));let H=new Map,X={info:h=>c.info(h),warn:h=>c.warn(h)},te=new Ot({onNotification:(h,T,x)=>{this.sendNotification("team.member.notification",{memberId:h,method:T,params:x})},onStateChange:(h,T)=>{this.sendNotification("team.member.state",{memberId:h,state:T});let x=te.getHandle(h),S=te.getUsageTracker(h)?.getUsage();this.emitAgentStatus(h,T,{missedBeats:te.getMissedBeats(h),lastActivityAt:x?.lastActivityAt,usage:S&&S.totalTokens>0?{inputTokens:S.inputTokens,outputTokens:S.outputTokens,totalTokens:S.totalTokens}:void 0})},onExit:(h,T,x)=>{for(let A of H.values()){let S=A.members.find(O=>O.cwd&&`team-${A.name}-${O.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase()===h.replace(/^team-/,""));S&&(S.isActive=!1)}c.info(`[team] member ${h} exited (code=${T}, signal=${x})`)},onMcpToolCall:(h,T,x)=>this.handleMcpToolCall(h,T,x),log:{info:h=>c.info(h),warn:h=>c.warn(h),debug:h=>c.debug(h)},sessionDir:K.join(Z(),"agent-logs")});Tt(async()=>{te.dispose()}),be(pu({createTeam:async h=>{if(H.has(h.teamName))return{success:!1,error:`Team "${h.teamName}" already exists.`};let T=await fn(),x=[];for(let S of h.members??[]){let O={...S,isActive:!0};if(T){let N=`team-${h.teamName}-${S.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),G=await nd(T,N,X);G?(O.worktreePath=G.worktreePath,O.worktreeBranch=G.branch,O.cwd=G.worktreePath,c.info(`[team] provisioned worktree for ${S.name}: ${G.worktreePath}`)):(O.cwd=process.cwd(),c.warn(`[team] worktree provision failed for ${S.name}, using shared cwd`))}else O.cwd=process.cwd();x.push(O)}let A={name:h.teamName,description:h.description,leadId:this.currentSessionId??"default",members:x,createdAt:new Date().toISOString()};H.set(h.teamName,A);for(let S of x){if(!S.cwd)continue;let O=`team-${h.teamName}-${S.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase();try{await te.spawn({memberId:O,name:S.name,cwd:S.cwd,prompt:`You are the "${S.name}" team member. Role: ${S.role}.`,agentType:S.role,verbose:this.verbose}),c.info(`[team] spawned child process for ${S.name} in ${S.cwd}`)}catch(N){c.warn(`[team] failed to spawn child process for ${S.name}: ${N instanceof Error?N.message:String(N)}`),S.isActive=!1}}return this.sendNotification("team.updated",{teamName:h.teamName,action:"created",members:A.members.map(S=>({agentName:S.name,role:S.role,worktreePath:S.worktreePath,pid:te.getHandle(`team-${h.teamName}-${S.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase())?.pid}))}),{success:!0,team:A}},deleteTeam:async h=>{let T=H.get(h);if(!T)return{success:!1,error:`Team "${h}" not found.`};for(let A of T.members){let S=`team-${h}-${A.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase();te.kill(S),te.remove(S)}let x=await fn();if(x)for(let A of T.members)A.worktreePath&&A.worktreeBranch&&(await od(x,A.worktreePath,A.worktreeBranch,X),c.info(`[team] cleaned up worktree for ${A.name}: ${A.worktreePath}`));return H.delete(h),this.sendNotification("team.updated",{teamName:h,action:"destroyed",members:[]}),{success:!0}},listTeams:async()=>({success:!0,teams:[...H.values()]}),getTeamStatus:async h=>{let T=H.get(h);if(!T)return{success:!1,error:`Team "${h}" not found.`};let x={};for(let A of T.members){let S=`team-${h}-${A.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),O=te.getStatus(S);O&&(A.isActive=O.alive,x[A.name]={mediaProgress:O.mediaProgress,lastToolCall:O.lastToolCall,idleFor:O.idleFor,runningFor:O.runningFor})}return{success:!0,team:T,memberProgress:x}}}));{let h=this.memdir;be({name:Eu,label:Ou,description:$u,parameters:Du,execute:async(T,x)=>{let A=await Lu(x,{memdir:h,provider:this.qmemoryAdapter??void 0,userId:this.qmemoryUserId||this.currentSessionId||"default"});return{content:[{type:"text",text:A.message}],details:{type:"memory",action:A.action,ok:A.ok}}}})}ll(l,{getMemdir:()=>this.memdir,log:{debug:h=>c.debug(h),warn:h=>c.warn(h)}},this.memoryPrefetchState);{let h=e?.workdir??process.cwd(),T=hu(h,this.currentSessionId||"default");be(fu(T))}let Ge=e?.workdir??process.cwd(),we=Vu({projectRoot:Ge,ruleEngine:R,hooks:l,log:h=>c.info(`[settings] ${h}`)});Tt(async()=>{we()}),this.currentSessionId&&l.invoke("session.created",{sessionId:this.currentSessionId}).catch(()=>{}),this.fileWatcher&&this.fileWatcher.stop();let He=e?.workdir??process.cwd();return Wl({projectRoot:He,sessionId:this.currentSessionId,hooks:l,log:h=>c.debug(h),onInstructionCacheReset:ql}).then(h=>{this.fileWatcher=h,Tt(async()=>{this.fileWatcher?.stop()})}).catch(h=>{c.warn(`[file-watcher] init error: ${h instanceof Error?h.message:h}`)}),this.agent=new Kt({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=_t();if(!W.existsSync(e))return;let t=W.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:Pa(t),agentHome:Z(),settings:_t()},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=[];this.memdir&&t.push({id:"memdir",type:"file",path:di()}),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??"memdir",o=t?.target??"index";if(n==="memdir"||n==="local"){if(!this.memdir){e.id!==void 0&&this.sendResponse(e.id,{source:"memdir",target:o,content:""});return}try{if(o==="index"){let s=this.memdir.getIndexRaw();e.id!==void 0&&this.sendResponse(e.id,{source:"memdir",target:"index",content:s})}else{let s=await this.memdir.readFile(o);e.id!==void 0&&this.sendResponse(e.id,{source:"memdir",target:o,content:s.content??""})}}catch{e.id!==void 0&&this.sendResponse(e.id,{source:"memdir",target:o,content:""})}}else e.id!==void 0&&this.sendResponse(e.id,void 0,{code:I.INVALID_PARAMS,message:`Unknown memory source: ${n}`})}async handleMemoryWrite(e){let t=e.params,n=t?.target??"index",o=t?.content;if(o==null){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:I.INVALID_PARAMS,message:"content is required."});return}if(!this.memdir){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:I.INTERNAL_ERROR,message:"Memory system not initialized."});return}try{if(n==="index"){let s=await this.memdir.addToIndex(o);e.id!==void 0&&this.sendResponse(e.id,{ok:s.ok,target:"index",message:s.message})}else{let s=await this.memdir.writeFile(n,o);e.id!==void 0&&this.sendResponse(e.id,{ok:s.ok,target:n,message:s.message})}this.sendNotification("memory.updated",{target:n,source:"rpc"})}catch(s){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:I.INTERNAL_ERROR,message:s instanceof Error?s.message:String(s)})}}handleToolsList(e){let t=e.params,o=Ye(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:I.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(!Qr(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:I.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(!Qr(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=_t(),n={};if(W.existsSync(t)){let o=W.readFileSync(t,"utf-8");n=JSON.parse(o)}e.id!==void 0&&this.sendResponse(e.id,{config:n,paths:{userSettings:t,agentHome:Z()}})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:I.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:I.INVALID_PARAMS,message:"updates (object) is required."});return}try{let n=_t(),o={};try{let s=await W.promises.readFile(n,"utf-8");o=JSON.parse(s)}catch{}Object.assign(o,t.updates),await W.promises.mkdir(K.dirname(n),{recursive:!0}),await W.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:I.INTERNAL_ERROR,message:n instanceof Error?n.message:String(n)})}}async handleTodosList(e){let t=Ae("todo");if(!t){e.id!==void 0&&this.sendResponse(e.id,{items:[],summary:Mt([])});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:Mt(i)})}catch{e.id!==void 0&&this.sendResponse(e.id,{items:[],summary:Mt([])})}}async handleMemorySearch(e){let t=e.params;if(!t?.query){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:I.INVALID_PARAMS,message:"query is required."});return}if(!this.qmemoryAdapter){if(this.memdir)try{let n=await this.memdir.searchLocal(t.query);e.id!==void 0&&this.sendResponse(e.id,{results:n.slice(0,t.limit??10).map((o,s)=>({id:`memdir-${s}`,text:o.snippet,score:o.score,source:"memdir",metadata:{file:o.file}}))})}catch{e.id!==void 0&&this.sendResponse(e.id,{results:[]})}else 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:I.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:I.INVALID_PARAMS,message:"match is required."});return}let n=t.source??"memdir";if(n==="memdir"||n==="local"){if(!this.memdir){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:I.INTERNAL_ERROR,message:"Memory system not initialized."});return}let o=t.target??"index";try{if(o==="index"){let s=await this.memdir.removeFromIndex(t.match);e.id!==void 0&&this.sendResponse(e.id,{ok:s.ok,removedCount:s.ok?1:0,message:s.message}),s.ok&&this.sendNotification("memory.updated",{source:"memdir",target:"index"})}else{let s=await this.memdir.deleteFile(o);e.id!==void 0&&this.sendResponse(e.id,{ok:s.ok,removedCount:s.ok?1:0,message:s.message}),s.ok&&this.sendNotification("memory.updated",{source:"memdir",target:o})}}catch(s){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:I.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:I.INTERNAL_ERROR,message:o instanceof Error?o.message:String(o)})}else e.id!==void 0&&this.sendResponse(e.id,void 0,{code:I.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:I.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=Ae(t);if(!o)return`Error: Unknown tool "${t}"`;let s=`mcp_${e}_${ue().slice(0,8)}`;try{return(await o.execute(s,n)).content.map(a=>a.text??"").join(`
479
+ `)||"OK"}catch(i){return`Error: ${i instanceof Error?i.message:String(i)}`}}async ensureAgentConfigStore(){return this.agentConfigStore||(this.agentConfigStore=new Uo(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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}ensureSoloEvaluator(){if(!this.soloEvaluator){let e=new Ot({log:{info:n=>process.stderr.write(`[solo:pm] ${n}
450
480
  `),warn:n=>process.stderr.write(`[solo:pm] WARN ${n}
451
- `)},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}
481
+ `)},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:K.join(Z(),"agent-logs")}),t={log:{info:n=>process.stderr.write(`${n}
452
482
  `),warn:n=>process.stderr.write(`${n}
453
- `)},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 wo(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 St({log:{info:n=>process.stderr.write(`[product:pm] ${n}
483
+ `)},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 jo(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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}ensureProductOrchestrator(){if(!this.productOrchestrator){let e=new Ot({log:{info:n=>process.stderr.write(`[product:pm] ${n}
454
484
  `),warn:n=>process.stderr.write(`[product:pm] WARN ${n}
455
- `)},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}
485
+ `)},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:K.join(Z(),"agent-logs")}),t={log:{info:n=>process.stderr.write(`${n}
456
486
  `),warn:n=>process.stderr.write(`${n}
457
- `)},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 vo(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(`
487
+ `)},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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.INVALID_PARAMS,message:"agentId is required."});return}let n=K.join(Z(),"agent-logs"),o=K.join(n,`${t.agentId}.stderr.log`),s="";try{s=W.readFileSync(o,"utf-8")}catch{}t.tail&&t.tail>0&&s&&(s=s.split(`
458
488
  `).slice(-t.tail).join(`
459
- `)),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)ou(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}
460
- `)}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 So(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:IT,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 Tt(t),this.sessionTaskDomain=void 0,this.memoryPrefetchState=kt(),e.cwd&&typeof e.cwd=="string"&&(io(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=Be(),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=_n(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}}};function su(r){let e={verbose:!1};for(let t of r.slice(2))(t==="--verbose"||t==="-v")&&(e.verbose=!0);return e}import{writeFileSync as LT,appendFileSync as iu,mkdirSync as DT}from"node:fs";import{join as Gs}from"node:path";import{homedir as $T}from"node:os";var au=Gs(process.env.QLOGICAGENT_HOME||Gs($T(),".qlogicagent"),"debug-logs");try{DT(au,{recursive:!0})}catch{}var Ws=Gs(au,"acp-session.log");try{LT(Ws,"")}catch{}function we(r){let e=`[${new Date().toISOString()}] ${r}
461
- `;lu.call(process.stderr,e);try{iu(Ws,e)}catch{}}var lu=process.stderr.write.bind(process.stderr);process.stderr.write=((r,...e)=>{let t=typeof r=="string"?r:Buffer.from(r).toString();try{iu(Ws,t)}catch{}return lu(r,...e)});we(`PID=${process.pid} argv=${JSON.stringify(process.argv.slice(1))} cwd=${process.cwd()} HOME=${process.env.QLOGICAGENT_HOME??"(unset)"} NODE=${process.version}`);var cu=su(process.argv),NT=!process.argv.includes("--no-acp"),UT=new mt({verbose:cu.verbose}),Ao=new Co({verbose:cu.verbose,transport:UT});NT&&(Ao.initAcpServer(),we("ACP server initialized, waiting for messages"));process.on("unhandledRejection",r=>{we(`unhandledRejection: ${r instanceof Error?r.stack??r.message:String(r)}`)});process.on("uncaughtException",r=>{we(`uncaughtException: ${r.stack??r.message}`)});process.stdin.on("end",()=>{we("stdin END received")});process.stdin.on("close",()=>{we("stdin CLOSE received")});process.stdout.on("error",r=>{we(`stdout ERROR: ${r.message}`)});process.stdout.on("close",()=>{we("stdout CLOSE")});process.on("exit",r=>{we(`process.exit code=${r}`)});process.on("SIGTERM",()=>{we("SIGTERM received"),Ao.stop(),process.exit(0)});process.on("SIGINT",()=>{we("SIGINT received"),Ao.stop(),process.exit(0)});process.on("SIGHUP",()=>{we("SIGHUP received")});we("calling server.start()");Ao.start();we("server.start() returned, event loop active");
489
+ `)),e.id!==void 0&&this.sendResponse(e.id,{log:s})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:I.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:I.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:I.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:I.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:I.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:I.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:I.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:I.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)Ku(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}
490
+ `)}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=Z(),n={jsonrpc:"2.0",id:void 0,method:"memory.dream",params:{turnId:`idle-dream-${ue().slice(0,8)}`,sessionId:this.currentSessionId,config:{memoryRoot:t,transcriptDir:K.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 zo(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:uv,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??ue();return this.log(`[acp] session/new: id=${t}`),this.currentSessionId=t,this.sessionState=new It(t),this.sessionTaskDomain=void 0,this.memoryPrefetchState=gt(),e.cwd&&typeof e.cwd=="string"&&(Ro(e.cwd),this.currentProjectRoot=e.cwd),this.enableIdleDream(),{sessionId:t}}async acpHandleSessionPrompt(e){let t=ue(),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=Ye(),c,d="end_turn";for await(let l of i.run({turnId:e,sessionId:t,messages:n,tools:a,config:s},o.signal)){let p=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:p}});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:p}});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:p}});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:p}});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:p}});break;case"recovery":this.sendNotification("turn.recovery",{turnId:l.turnId,action:l.action,...l.detail?{detail:l.detail}:{},item:{id:`${e}-recovery-${ue().slice(0,8)}`,type:"recovery",role:"system",strategy:l.action,text:l.detail,createdAt:p}});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=Z(),n={jsonrpc:"2.0",id:`acp-dream-${ue().slice(0,8)}`,method:"memory.dream",params:{turnId:`dream-${ue().slice(0,8)}`,sessionId:e.sessionId||this.currentSessionId,config:{memoryRoot:e.config?.memoryRoot||t,transcriptDir:e.config?.transcriptDir||K.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=Nn(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 ln({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}}};function Yu(r){let e={verbose:!1};for(let t of r.slice(2))(t==="--verbose"||t==="-v")&&(e.verbose=!0);return e}import{writeFileSync as hv,appendFileSync as Xu,mkdirSync as yv}from"node:fs";import{join as fi}from"node:path";import{homedir as bv}from"node:os";var Qu=fi(process.env.QLOGICAGENT_HOME||fi(bv(),".qlogicagent"),"debug-logs");try{yv(Qu,{recursive:!0})}catch{}var hi=fi(Qu,"acp-session.log");try{hv(hi,"")}catch{}function Se(r){let e=`[${new Date().toISOString()}] ${r}
491
+ `;Zu.call(process.stderr,e);try{Xu(hi,e)}catch{}}var Zu=process.stderr.write.bind(process.stderr);process.stderr.write=((r,...e)=>{let t=typeof r=="string"?r:Buffer.from(r).toString();try{Xu(hi,t)}catch{}return Zu(r,...e)});Se(`PID=${process.pid} argv=${JSON.stringify(process.argv.slice(1))} cwd=${process.cwd()} HOME=${process.env.QLOGICAGENT_HOME??"(unset)"} NODE=${process.version}`);var ep=Yu(process.argv),kv=!process.argv.includes("--no-acp"),Tv=new wt({verbose:ep.verbose}),Jo=new Ko({verbose:ep.verbose,transport:Tv});kv&&(Jo.initAcpServer(),Se("ACP server initialized, waiting for messages"));process.on("unhandledRejection",r=>{Se(`unhandledRejection: ${r instanceof Error?r.stack??r.message:String(r)}`)});process.on("uncaughtException",r=>{Se(`uncaughtException: ${r.stack??r.message}`)});process.stdin.on("end",()=>{Se("stdin END received")});process.stdin.on("close",()=>{Se("stdin CLOSE received")});process.stdout.on("error",r=>{Se(`stdout ERROR: ${r.message}`)});process.stdout.on("close",()=>{Se("stdout CLOSE")});process.on("exit",r=>{Se(`process.exit code=${r}`)});process.on("SIGTERM",()=>{Se("SIGTERM received"),Jo.stop(),process.exit(0)});process.on("SIGINT",()=>{Se("SIGINT received"),Jo.stop(),process.exit(0)});process.on("SIGHUP",()=>{Se("SIGHUP received")});Se("calling server.start()");Jo.start();Se("server.start() returned, event loop active");