qlogicagent 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/agent.js +7 -7
  2. package/dist/cli.js +223 -206
  3. package/dist/contracts.js +1 -1
  4. package/dist/index.js +222 -205
  5. package/dist/orchestration.js +6 -6
  6. package/dist/types/agent/types.d.ts +3 -1
  7. package/dist/types/cli/stdio-server.d.ts +19 -1
  8. package/dist/types/cli/tool-bootstrap.d.ts +8 -0
  9. package/dist/types/contracts/index.d.ts +0 -1
  10. package/dist/types/contracts/todo.d.ts +8 -21
  11. package/dist/types/llm/adapters/aliyun-oss-file-upload-adapter.d.ts +44 -0
  12. package/dist/types/llm/adapters/gemini-file-upload-adapter.d.ts +26 -0
  13. package/dist/types/llm/adapters/hub-oss-file-upload-adapter.d.ts +29 -0
  14. package/dist/types/llm/adapters/index.d.ts +10 -0
  15. package/dist/types/llm/adapters/openai-file-upload-adapter.d.ts +38 -0
  16. package/dist/types/llm/adapters/volcengine-file-upload-adapter.d.ts +24 -0
  17. package/dist/types/llm/file-upload-service.d.ts +68 -0
  18. package/dist/types/llm/transports/anthropic-messages.d.ts +4 -0
  19. package/dist/types/llm/transports/gemini-generatecontent.d.ts +4 -0
  20. package/dist/types/llm/transports/media-resolve.d.ts +37 -12
  21. package/dist/types/llm/transports/openai-chat.d.ts +4 -0
  22. package/dist/types/llm/transports/openai-responses.d.ts +3 -0
  23. package/dist/types/llm/transports/volcengine-responses.d.ts +4 -0
  24. package/dist/types/orchestration/tool-loop/tool-schema.d.ts +1 -0
  25. package/dist/types/protocol/methods.d.ts +70 -0
  26. package/dist/types/protocol/notifications.d.ts +42 -0
  27. package/dist/types/runtime/execution/dream-category-context.d.ts +1 -1
  28. package/dist/types/runtime/infra/agent-paths.d.ts +6 -0
  29. package/dist/types/runtime/infra/index.d.ts +3 -1
  30. package/dist/types/runtime/infra/media-persistence.d.ts +71 -0
  31. package/dist/types/runtime/infra/project-instructions-store.d.ts +30 -0
  32. package/dist/types/runtime/infra/project-plan-store.d.ts +27 -0
  33. package/dist/types/runtime/infra/project-store.d.ts +30 -0
  34. package/dist/types/skills/index.d.ts +2 -4
  35. package/dist/types/skills/memory/categories.d.ts +5 -0
  36. package/dist/types/skills/memory/memdir.d.ts +6 -1
  37. package/dist/types/skills/memory/recall-category-filter.d.ts +1 -1
  38. package/dist/types/skills/permissions/group-security-policy.d.ts +15 -0
  39. package/dist/types/skills/permissions/index.d.ts +1 -0
  40. package/dist/types/skills/plugins/plugin-loader.d.ts +5 -0
  41. package/dist/types/skills/portable-tool.d.ts +13 -2
  42. package/dist/types/skills/tools/plan-mode-tool.d.ts +1 -1
  43. package/dist/types/skills/tools/read-tool.d.ts +2 -2
  44. package/dist/types/skills/tools/task-tool.d.ts +64 -75
  45. package/package.json +1 -1
  46. package/dist/types/contracts/planner.d.ts +0 -35
  47. package/dist/types/orchestration/error-handling/failover-error.d.ts +0 -33
  48. package/dist/types/skills/memory/memory-write-gate.d.ts +0 -46
  49. package/dist/types/skills/memory/memory-write-hook.d.ts +0 -44
  50. package/dist/types/skills/todo-tool.d.ts +0 -72
package/dist/index.js CHANGED
@@ -1,44 +1,44 @@
1
- var Ku=Object.defineProperty;var Ju=(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 gi=(r,e)=>{for(var t in e)Ku(r,t,{get:e[t],enumerable:!0})};function $e(r){if(!r||typeof r!="object")return r;if(Array.isArray(r))return r.map(n=>$e(n));let e=r,t={};for(let[n,o]of Object.entries(e))if(!Yu.has(n)){if(n==="properties"&&o&&typeof o=="object"&&!Array.isArray(o)){t[n]=Object.fromEntries(Object.entries(o).map(([s,i])=>[s,$e(i)]));continue}if(n==="items"&&o&&typeof o=="object"){t[n]=Array.isArray(o)?o.map(s=>$e(s)):$e(o);continue}if((n==="anyOf"||n==="oneOf"||n==="allOf")&&Array.isArray(o)){t[n]=o.map(s=>$e(s));continue}if(o&&typeof o=="object"&&!Array.isArray(o)){t[n]=$e(o);continue}if(Array.isArray(o)){t[n]=o.map(s=>$e(s));continue}t[n]=o}return t}var Yu,Xo=Q(()=>{"use strict";Yu=new Set(["patternProperties","additionalProperties","$schema","$id","$ref","$defs","definitions","examples","minLength","maxLength","minimum","maximum","multipleOf","pattern","format","minItems","maxItems","uniqueItems","minProperties","maxProperties","const"])});function Qo(r,e,t,n){return{role:"assistant",content:e||null,tool_calls:r,...t&&t.length>0?{thinkingBlocks:t}:{},...n?{reasoning_content:n}:{}}}function Nt(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 fi=Q(()=>{"use strict";Xo()});function lt(r,e){if(!r)return!1;let t=r.toLowerCase();return e.some(n=>n instanceof RegExp?n.test(t):t.includes(n))}function pp(r){return lt(r,at.format)}function hi(r){return lt(r,at.rateLimit)}function mp(r){return lt(r,at.timeout)}function gp(r){return Xu.test(r)}function Zo(r){let e=r.toLowerCase();return e?r.length>ep?Zu.test(e):lt(e,at.billing)?!0:Qu.test(r)?e.includes("upgrade")||e.includes("credits")||e.includes("payment")||e.includes("plan"):!1:!1}function yi(r){return lt(r,at.authPermanent)}function fp(r){return lt(r,at.auth)}function bi(r){return lt(r,at.overloaded)}function it(r,e){return e.some(t=>r.includes(t))}function hp(r){return it(r,op)||it(r,rp)&&r.includes("limit")||r.includes("billing hard limit")||r.includes("hard limit reached")||r.includes("maximum allowed")&&r.includes("limit")}function yp(r){let e=it(r,sp),t=r.includes("spend limit")||r.includes("spending limit"),n=it(r,lp);return it(r,ip)&&it(r,ap)||e&&(r.includes("usage limit")||t)||e&&r.includes("limit")&&r.includes("reset")||n&&r.includes("limit")&&(t||it(r,cp))}function bp(r){return r.trim().toLowerCase().replace(up,"").trim()}function ki(r){let e=bp(r);return!e||hp(e)?"billing":hi(e)||yp(e)?"rate_limit":"billing"}function kp(r){return dp.test(r)?ki(r):null}function Ti(r){let e=r.match(tp);if(!e)return null;let t=Number(e[1]);return Number.isFinite(t)?{code:t,rest:(e[2]??"").trim()}:null}function Tp(r){if(!r)return!1;let e=r.toLowerCase();return e.includes('"type":"api_error"')&&e.includes("internal server error")}function wp(r){let e=r.trim();if(!e)return!1;let t=Ti(e);return t?np.has(t.code):!1}function wi(r,e){return typeof r!="number"||!Number.isFinite(r)?null:r===402?e?ki(e):"billing":r===429?"rate_limit":r===401||r===403?e&&yi(e)?"auth_permanent":"auth":r===408?"timeout":r===503?e&&bi(e)?"overloaded":"timeout":r===502||r===504?"timeout":r===529?"overloaded":r===400?e&&Zo(e)?"billing":"format":null}function vp(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 xp(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 vi(r){if(xp(r))return"session_expired";if(vp(r))return"model_not_found";let e=kp(r);return e||(gp(r)?Zo(r)?"billing":"rate_limit":hi(r)?"rate_limit":bi(r)?"overloaded":wp(r)?Ti(r.trim())?.code===529?"overloaded":"timeout":Tp(r)?"timeout":pp(r)?"format":Zo(r)?"billing":mp(r)?"timeout":yi(r)?"auth_permanent":fp(r)?"auth":null)}var Xu,at,Qu,Zu,ep,tp,np,op,rp,sp,ip,ap,lp,cp,dp,up,xi=Q(()=>{"use strict";Xu=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,at={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]},Qu=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,Zu=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,ep=512,tp=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i,np=new Set([500,502,503,504,521,522,523,524,529]),op=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],rp=["upgrade your plan","upgrade plan","current plan","subscription"],sp=["daily","weekly","monthly"],ip=["try again","retry","temporary","cooldown"],ap=["usage limit","rate limit","organization usage"],lp=["organization","workspace"],cp=["billing period","exceeded","reached","exhausted"],dp=/["']?(?: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,up=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i});function Tt(r,e){let t=wi(r,e)??(e?vi(e):null);return t?Sp[t]:typeof r=="number"&&r>=400&&r<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function er(r){return Rp.has(r)}var Sp,Rp,Si=Q(()=>{"use strict";xi();Sp={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"},Rp=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"])});function Gt(r){return typeof r.compressAsync=="function"}function _p(r,e){if(r.length<=e)return r;let t=r.slice(0,e);if(r.trimStart().startsWith("{")||r.trimStart().startsWith("[")){let s=Math.max(t.lastIndexOf("},"),t.lastIndexOf("],"),t.lastIndexOf(`}
1
+ var Ap=Object.defineProperty;var Q=(r,e)=>()=>(r&&(e=r(r=0)),e);var Ui=(r,e)=>{for(var t in e)Ap(r,t,{get:e[t],enumerable:!0})};function Ge(r){if(!r||typeof r!="object")return r;if(Array.isArray(r))return r.map(n=>Ge(n));let e=r,t={};for(let[n,o]of Object.entries(e))if(!Pp.has(n)){if(n==="properties"&&o&&typeof o=="object"&&!Array.isArray(o)){t[n]=Object.fromEntries(Object.entries(o).map(([s,i])=>[s,Ge(i)]));continue}if(n==="items"&&o&&typeof o=="object"){t[n]=Array.isArray(o)?o.map(s=>Ge(s)):Ge(o);continue}if((n==="anyOf"||n==="oneOf"||n==="allOf")&&Array.isArray(o)){t[n]=o.map(s=>Ge(s));continue}if(o&&typeof o=="object"&&!Array.isArray(o)){t[n]=Ge(o);continue}if(Array.isArray(o)){t[n]=o.map(s=>Ge(s));continue}t[n]=o}return t}var Pp,hr=Q(()=>{"use strict";Pp=new Set(["patternProperties","additionalProperties","$schema","$id","$ref","$defs","definitions","examples","minLength","maxLength","minimum","maximum","multipleOf","pattern","format","minItems","maxItems","uniqueItems","minProperties","maxProperties","const"])});function yr(r,e,t,n){return{role:"assistant",content:e||null,tool_calls:r,...t&&t.length>0?{thinkingBlocks:t}:{},...n?{reasoning_content:n}:{}}}function Vt(r,e){let t=e.ok?typeof e.payload=="string"?e.payload:JSON.stringify(e.payload??""):`Error: ${e.error??"Tool execution failed"}`;return{role:"tool",tool_call_id:r,content:t,...e.toolReferences?.length?{toolReferences:e.toolReferences}:{},...e.imageUrls?.length?{imageUrls:e.imageUrls}:{}}}var Ni=Q(()=>{"use strict";hr()});function ft(r,e){if(!r)return!1;let t=r.toLowerCase();return e.some(n=>n instanceof RegExp?n.test(t):t.includes(n))}function zp(r){return ft(r,gt.format)}function ji(r){return ft(r,gt.rateLimit)}function Vp(r){return ft(r,gt.timeout)}function qp(r){return Ip.test(r)}function br(r){let e=r.toLowerCase();return e?r.length>Op?Ep.test(e):ft(e,gt.billing)?!0:Mp.test(r)?e.includes("upgrade")||e.includes("credits")||e.includes("payment")||e.includes("plan"):!1:!1}function Fi(r){return ft(r,gt.authPermanent)}function Kp(r){return ft(r,gt.auth)}function Bi(r){return ft(r,gt.overloaded)}function mt(r,e){return e.some(t=>r.includes(t))}function Jp(r){return mt(r,$p)||mt(r,Up)&&r.includes("limit")||r.includes("billing hard limit")||r.includes("hard limit reached")||r.includes("maximum allowed")&&r.includes("limit")}function Yp(r){let e=mt(r,Np),t=r.includes("spend limit")||r.includes("spending limit"),n=mt(r,Bp);return mt(r,jp)&&mt(r,Fp)||e&&(r.includes("usage limit")||t)||e&&r.includes("limit")&&r.includes("reset")||n&&r.includes("limit")&&(t||mt(r,Gp))}function Xp(r){return r.trim().toLowerCase().replace(Hp,"").trim()}function Gi(r){let e=Xp(r);return!e||Jp(e)?"billing":ji(e)||Yp(e)?"rate_limit":"billing"}function Qp(r){return Wp.test(r)?Gi(r):null}function Wi(r){let e=r.match(Dp);if(!e)return null;let t=Number(e[1]);return Number.isFinite(t)?{code:t,rest:(e[2]??"").trim()}:null}function Zp(r){if(!r)return!1;let e=r.toLowerCase();return e.includes('"type":"api_error"')&&e.includes("internal server error")}function em(r){let e=r.trim();if(!e)return!1;let t=Wi(e);return t?Lp.has(t.code):!1}function Hi(r,e){return typeof r!="number"||!Number.isFinite(r)?null:r===402?e?Gi(e):"billing":r===429?"rate_limit":r===401||r===403?e&&Fi(e)?"auth_permanent":"auth":r===408?"timeout":r===503?e&&Bi(e)?"overloaded":"timeout":r===502||r===504?"timeout":r===529?"overloaded":r===400?e&&br(e)?"billing":"format":null}function tm(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 nm(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 zi(r){if(nm(r))return"session_expired";if(tm(r))return"model_not_found";let e=Qp(r);return e||(qp(r)?br(r)?"billing":"rate_limit":ji(r)?"rate_limit":Bi(r)?"overloaded":em(r)?Wi(r.trim())?.code===529?"overloaded":"timeout":Zp(r)?"timeout":zp(r)?"format":br(r)?"billing":Vp(r)?"timeout":Fi(r)?"auth_permanent":Kp(r)?"auth":null)}var Ip,gt,Mp,Ep,Op,Dp,Lp,$p,Up,Np,jp,Fp,Bp,Gp,Wp,Hp,Vi=Q(()=>{"use strict";Ip=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,gt={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]},Mp=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,Ep=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,Op=512,Dp=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i,Lp=new Set([500,502,503,504,521,522,523,524,529]),$p=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],Up=["upgrade your plan","upgrade plan","current plan","subscription"],Np=["daily","weekly","monthly"],jp=["try again","retry","temporary","cooldown"],Fp=["usage limit","rate limit","organization usage"],Bp=["organization","workspace"],Gp=["billing period","exceeded","reached","exhausted"],Wp=/["']?(?: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,Hp=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i});function Pt(r,e){let t=Hi(r,e)??(e?zi(e):null);return t?om[t]:typeof r=="number"&&r>=400&&r<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function kr(r){return rm.has(r)}var om,rm,qi=Q(()=>{"use strict";Vi();om={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"},rm=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"])});function Xt(r){return typeof r.compressAsync=="function"}function sm(r,e){if(r.length<=e)return r;let t=r.slice(0,e);if(r.trimStart().startsWith("{")||r.trimStart().startsWith("[")){let s=Math.max(t.lastIndexOf("},"),t.lastIndexOf("],"),t.lastIndexOf(`}
2
2
  `),t.lastIndexOf(`]
3
3
  `));if(s>e*.5)return t.slice(0,s+1)+`
4
4
  [...truncated: ${r.length-s-1} chars omitted]`}let o=t.lastIndexOf(`
5
5
  `);return o>e*.7?t.slice(0,o)+`
6
6
  [...truncated: ${r.length-o} chars omitted]`:t+`
7
- [...truncated: ${r.length-e} chars omitted]`}function tr(...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 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"}},async compressAsync(e,t){let n=e,o=0,s=[],i=0,a=!1,c=!1;for(let d of r){let l=Gt(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 _i(r,e){let t=r.filter(i=>i.role==="user"),n=r.filter(i=>i.tool_calls!=null),o=r.filter(i=>i.role==="tool"),s=["You are a conversation summarizer. Produce a structured summary of the conversation history below.","","## Instructions","Analyze the conversation and produce a summary with these sections:","","### 1. Primary Objective","What is the user's main goal or task? State it in one sentence.","","### 2. Key Decisions Made","List the important decisions, choices, or conclusions reached during the conversation.","","### 3. Current Progress",`Describe the current state. ${n.length>0?`${n.length} tool calls and ${o.length} tool results were exchanged.`:"No tools were used."}`,"","### 4. Pending Tasks","List any tasks that are in-progress or planned but not yet completed.","","### 5. Important Context","MUST preserve verbatim: IP addresses, file paths, URLs, port numbers, credentials/tokens, specific numeric values, version numbers, proper nouns, identifiers, and any user-provided data points. These MUST appear exactly as stated in the original conversation.","","### 6. Error & Recovery History","Summarize any errors encountered and how they were resolved.","","### 7. User Preferences Expressed",`The user sent ${t.length} messages. Note any stated preferences about style, approach, or constraints.`,"","### 8. Technical State","Note file paths, variable names, API endpoints, or configuration values that were discussed.","","### 9. Conversation Flow","Briefly describe the overall flow: what happened first, what changed, where we are now."];return e?.taskContext&&s.push("","## Additional Context",e.taskContext),s.push("","## Conversation to Summarize","",...r.map(i=>{let a=typeof i.content=="string"?i.content:JSON.stringify(i.content??""),c=i.role==="user"?a:a.length>2e3?a.slice(0,2e3)+"...":a;return`[${i.role}]: ${c}`}),"","## Output Format","Respond with a concise summary covering all 9 sections above. Use markdown headers.","Keep the total summary under 800 words. Focus on actionable information."),s.join(`
8
- `)}function On(r={}){let e={...Ci,...r},t=Math.floor(e.modelContextWindow*e.targetUsageRatio);return Math.max(e.minBudget,Math.min(t,e.maxBudget))}function Ht(r,e){let t=r/e;return t<=.8?"none":t<=1?"trim-only":t<=1.5?"sliding-window":"llm-summarize"}function Cp(r){let e=[],t=[];for(let n of r)n.role==="system"?e.push(n):t.push(n);return{system:e,nonSystem:t}}function or(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 Ip(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 rr(r,e,t){let n=t.estimateTokens??(u=>Math.ceil(u.length/4)),o=Ip(e);if(o.length===0)return r;let s=r.map(u=>typeof u.content=="string"?u.content:"").join(`
9
- `),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}]
7
+ [...truncated: ${r.length-e} chars omitted]`}function wr(...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 Tr(...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=Xt(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 Ji(r,e){let t=r.filter(i=>i.role==="user"),n=r.filter(i=>i.tool_calls!=null),o=r.filter(i=>i.role==="tool"),s=["You are a conversation summarizer. Produce a structured summary of the conversation history below.","","## Instructions","Analyze the conversation and produce a summary with these sections:","","### 1. Primary Objective","What is the user's main goal or task? State it in one sentence.","","### 2. Key Decisions Made","List the important decisions, choices, or conclusions reached during the conversation.","","### 3. Current Progress",`Describe the current state. ${n.length>0?`${n.length} tool calls and ${o.length} tool results were exchanged.`:"No tools were used."}`,"","### 4. Pending Tasks","List any tasks that are in-progress or planned but not yet completed.","","### 5. Important Context","MUST preserve verbatim: IP addresses, file paths, URLs, port numbers, credentials/tokens, specific numeric values, version numbers, proper nouns, identifiers, and any user-provided data points. These MUST appear exactly as stated in the original conversation.","","### 6. Error & Recovery History","Summarize any errors encountered and how they were resolved.","","### 7. User Preferences Expressed",`The user sent ${t.length} messages. Note any stated preferences about style, approach, or constraints.`,"","### 8. Technical State","Note file paths, variable names, API endpoints, or configuration values that were discussed.","","### 9. Conversation Flow","Briefly describe the overall flow: what happened first, what changed, where we are now."];return e?.taskContext&&s.push("","## Additional Context",e.taskContext),s.push("","## Conversation to Summarize","",...r.map(i=>{let a=typeof i.content=="string"?i.content:JSON.stringify(i.content??""),c=i.role==="user"?a:a.length>2e3?a.slice(0,2e3)+"...":a;return`[${i.role}]: ${c}`}),"","## Output Format","Respond with a concise summary covering all 9 sections above. Use markdown headers.","Keep the total summary under 800 words. Focus on actionable information."),s.join(`
8
+ `)}function qn(r={}){let e={...Yi,...r},t=Math.floor(e.modelContextWindow*e.targetUsageRatio);return Math.max(e.minBudget,Math.min(t,e.maxBudget))}function Qt(r,e){let t=r/e;return t<=.8?"none":t<=1?"trim-only":t<=1.5?"sliding-window":"llm-summarize"}function im(r){let e=[],t=[];for(let n of r)n.role==="system"?e.push(n):t.push(n);return{system:e,nonSystem:t}}function vr(r){let e=typeof r.content=="string"?r.content:r.content!=null?JSON.stringify(r.content):"";return Math.ceil(e.length/4)}function Vn(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 lm(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 xr(r,e,t){let n=t.estimateTokens??(p=>Math.ceil(p.length/4)),o=lm(e);if(o.length===0)return r;let s=r.map(p=>typeof p.content=="string"?p.content:"").join(`
9
+ `),i=o.filter(p=>!s.includes(p));if(i.length===0)return r;let a=t.maxTokenBudget,c=[],d=0;for(let p of i){if(d>=t.maxFiles||a<=0)break;let g=await t.readFile(p);if(!g)continue;let f=n(g);f>a||(a-=f,d++,c.push({role:"system",content:`[Post-compact file recovery: ${p}]
10
10
 
11
- ${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 sr(r,e,t=or){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 Ri,wt,ct,jt,Ft,Ci,Bt,Wt,Ap,et,ir=Q(()=>{"use strict";Ri=4,wt=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>=Ri)break;if(s-u<0&&c<Ri){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"}}},ct=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:_p(s.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};jt=class{config;constructor(e){this.config={protectedHeadExchanges:e.protectedHeadExchanges,protectedTailMessages:e.protectedTailMessages,summarize:e.summarize,estimateTokens:e.estimateTokens??or,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}=Cp(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=_i(u,{taskContext:this.config.taskContext}),f=await this.config.summarize(u,g),y={role:"system",content:`[Conversation summary \u2014 ${u.length} messages compressed]
11
+ ${g}`}))}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 Sr(r,e,t=vr){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 Ki,It,ht,qt,Kt,Yi,Jt,Yt,am,at,Rr=Q(()=>{"use strict";Ki=4,It=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>=Ki)break;if(s-p<0&&c<Ki){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"}}},ht=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:sm(s.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};qt=class{config;constructor(e){this.config={protectedHeadExchanges:e.protectedHeadExchanges,protectedTailMessages:e.protectedTailMessages,summarize:e.summarize,estimateTokens:e.estimateTokens??vr,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}=im(e),i=e.reduce((S,b)=>S+this.config.estimateTokens(b),0);if(i<=t)return{messages:e,droppedCount:0,strategy:"head-tail-protected"};let a=0,c=0;for(let S=0;S<s.length&&(s[S].role==="user"&&c++,!(c>this.config.protectedHeadExchanges));S++)a=S+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),g=s.slice(l),f=Ji(p,{taskContext:this.config.taskContext}),m=await this.config.summarize(p,f),y={role:"system",content:`[Conversation summary \u2014 ${p.length} messages compressed]
12
12
 
13
- ${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}}}},Ft=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=Gt(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}}}},Ci={modelContextWindow:128e3,targetUsageRatio:.75,minBudget:16e3,maxBudget:12e4};Bt=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}},Wt=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}))}};Ap=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"]),et=class{constructor(e=20,t=or){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||!Ap.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 ar(){return{stages:[]}}function lr(r,e,t){let n=t?.thresholdMessages??40;if(r.filter(a=>a.role!=="system").length<=n)return{messages:r,stagedCount:0};let s=Ai(r,e),i=Mp(s,e,n);if(i.length===0)return{messages:s,stagedCount:0};for(let a of i)e.stages.push(a);return s=Ai(r,e),{messages:s,stagedCount:i.length}}function cr(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:Ii(r,e),committed:t}}function Ai(r,e){return e.stages.filter(n=>n.committed).length===0?r:Ii(r,e)}function Ii(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 Mp(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 Mi=Q(()=>{"use strict"});function Pp(r){return!(!r.ok||r.existingSkillName||!r.multiStep||r.toolCallCount<3||r.distinctToolCount<2)}function Ep(r){return r.existingSkillName?r.feedback==="negative":!1}function zt(r,e){return Ep(r)?{type:"skill.improve",skillName:r.existingSkillName,reason:"negative user feedback on existing skill execution"}:Pp(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 Pi=Q(()=>{"use strict"});function Ei(r){return r.function&&typeof r.function=="object"&&typeof r.function.name=="string"?r.function.name.trim():typeof r.name=="string"?r.name.trim():""}function Op(r){return r==="enabled-eligible"||r==="installed-awaiting-approval"}function Dp(r){return new Map((r??[]).map(e=>[e.toolName,e]))}function Lp(r){if(!r.eligibility?.length)return[...r.tools];let e=Dp(r.eligibility);return r.tools.filter(t=>{let n=Ei(t);if(!n)return!1;let o=e.get(n);return!o||Op(o.status)})}function $p(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 dr(r){let e=$p({toolChoice:r.toolChoice,thinkingEnabled:r.thinkingEnabled,compatibility:r.compatibility}),t=e.normalizedToolChoice,n=[...e.warnings],o=Lp({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=>Ei(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 Oi=Q(()=>{"use strict"});function Di(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:[...Di(r.content),...Di(e.content)]}}function Fp(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 Bp(r){return new Set((r??Up).map(e=>e.trim().toLowerCase()))}function Wp(r,e){return r?Bp(e).has(r.trim().toLowerCase()):!1}function ur(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=>Fp(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 pr(r,e){return Wp(e?.stopReason,e?.forcedStopReasons)?r.map(t=>{if(t.role!=="assistant")return{...t};let n={...t};for(let o of Np)delete n[o];return n}):[...r]}function mr(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 gr(r,e){let t=ur(r),n=pr(t,e);return mr(n,e)}var Up,Np,fr=Q(()=>{"use strict";Up=["stop","aborted","timeout","cancelled","interrupted","error"],Np=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"]});function Gp(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 Hp(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 zp(r){return{round:r.round??0,maxRounds:r.maxRounds,pendingToolCallIds:[...r.pendingToolCallIds??[]],completedToolCallIds:[...r.completedToolCallIds??[]],lastStopReason:r.lastStopReason,replayMessages:[...r.replayMessages??[]]}}function hr(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 Dn(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=ur(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=pr(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=mr(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:zp({maxRounds:r.maxRounds,round:r.round,lastStopReason:r.lastStopReason,replayMessages:o,pendingToolCallIds:Gp(o),completedToolCallIds:Hp(o)}),recoveryActions:e}}var Li=Q(()=>{"use strict";fr()});function yr(r){return r?Vp.has(r):!0}function br(r){return r===429||r===529}function $n(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 kr(){let r=process.env.QLOGICAGENT_PERSISTENT_RETRY;return r==="1"||r==="true"}var Vp,xv,Vt,$i=Q(()=>{"use strict";Vp=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);xv={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};Vt=class extends Error{constructor(t,n){super(`Model fallback triggered: ${t} -> ${n}`);this.originalModel=t;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel}});function Tr(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 wr=Q(()=>{"use strict"});function Un(r){return Zp.find(e=>e.name===r)}var qp,Kp,Jp,Yp,Xp,Qp,Zp,vr=Q(()=>{"use strict";qp={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},Kp={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},Jp={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},Yp={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolAccessMode:"full",canFork:!0},Xp={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},Qp={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},Zp=[qp,Kp,Jp,Yp,Xp,Qp]});var Ui=Q(()=>{"use strict"});function xr(r){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:r.maxOutputTokens,consecutiveTruncations:0,aborted:r.abortSignal?.aborted??!1}}function Sr(r,e){if(r.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let t=e.contextWindowTokens-e.responseBufferTokens-r.currentMaxOutputTokens,n=t>0?r.promptTokens/t*100:100;return r.promptTokens>=t?r.hasAttemptedReactiveCompact||!e.reactiveCompactEnabled?{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:n>=85?{level:"warning",usagePercent:n,remainingTokens:t-r.promptTokens}:{level:"ok"}}function Rr(r,e,t){let n=r.message?.toLowerCase()??"",o=r.status??0;return o===413||n.includes("prompt_too_long")||n.includes("context_length_exceeded")?!e.hasAttemptedReactiveCompact&&t.reactiveCompactEnabled?{action:"reactive_compact"}:{action:"abort",reason:"prompt_too_long_unrecoverable"}:o>=500&&o<600?{action:"retry",reason:`server_error_${o}`}:o===429?{action:"retry",reason:"rate_limited"}:o===401||o===403?{action:"abort",reason:"auth_error"}:o===404?{action:"abort",reason:"model_not_found"}:{action:"abort",reason:n||"unknown_error"}}function _r(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 Cr(r,e){return r.aborted?!0:e.abortSignal?.aborted?(r.aborted=!0,!0):!1}var Ni=Q(()=>{"use strict"});function Ar(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function vt(r,e=em){return!(r.attemptedThisTurn||r.consecutiveFailures>=e.maxConsecutiveFailures)}var em,ji=Q(()=>{"use strict";em={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50}});var xt=Q(()=>{"use strict";fi();Si();ir();ir();Mi();Pi();Oi();fr();Li();$i();wr();vr();Ui();Ni();ji()});function Ir(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 Mr=Q(()=>{"use strict"});var Fi,Bi,Wi,Gi,Hi,zi,Vi,qi,Ki,Ji,qt,Pr,Yi,Xi,Qi,Er,Nn=Q(()=>{"use strict";Fi=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),Bi=3,Wi=128e3,Gi=13e3,Hi=16384,zi=65536,Vi=3,qi=65536,Ki=3e4,Ji=3,qt=10,Pr=500,Yi=3,Xi=5e4,Qi=2e5,Er=2e3});import{mkdir as nm,writeFile as om}from"fs/promises";import{join as Zi}from"path";import{tmpdir as rm}from"os";function ta(){return{seenIds:new Set,replacements:new Map}}function na(r){return Zi(rm(),"qlogicagent-sessions",r,sm)}async function am(r){try{await nm(na(r),{recursive:!0})}catch{}}function lm(r,e){let t=e.replace(/[^a-zA-Z0-9_-]/g,"_");return Zi(na(r),`${t}.txt`)}function cm(r,e){if(r.length<=e)return{preview:r,hasMore:!1};let n=r.slice(0,e).lastIndexOf(`
14
- `),o=n>e*.5?n:e;return{preview:r.slice(0,o),hasMore:!0}}function oa(r){return r.includes(ea)}async function ra(r,e,t){await am(t);let n=lm(t,e);try{await om(n,r,{encoding:"utf-8",flag:"wx"})}catch(i){if(i.code!=="EEXIST")return null}let{preview:o,hasMore:s}=cm(r,Er);return{filepath:n,originalSize:r.length,preview:o,hasMore:s}}function sa(r){let e=`${ea}
13
+ ${m}`},k=[...o,...u,y,...g],w=Date.now()-n,x=k.reduce((S,b)=>S+this.config.estimateTokens(b),0);return{messages:k,droppedCount:p.length,strategy:"head-tail-protected",metrics:{tokensBefore:i,tokensAfter:x,compressionRatio:i>0?x/i:1,latencyMs:w,usedLlm:!0,cacheInvalidated:!0}}}},Kt=class{config;constructor(e){this.config=e}compress(e,t){let n=Vn(e),o=this.config.inner.compress(e,t),s=Vn(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=Vn(e),o=Xt(this.config.inner)?await this.config.inner.compressAsync(e,t):this.config.inner.compress(e,t),s=Vn(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}}}},Yi={modelContextWindow:128e3,targetUsageRatio:.75,minBudget:16e3,maxBudget:12e4};Jt=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}},Yt=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}))}};am=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"]),at=class{constructor(e=20,t=vr){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||!am.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 _r(){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=Xi(r,e),i=cm(s,e,n);if(i.length===0)return{messages:s,stagedCount:0};for(let a of i)e.stages.push(a);return s=Xi(r,e),{messages:s,stagedCount:i.length}}function Ar(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:Qi(r,e),committed:t}}function Xi(r,e){return e.stages.filter(n=>n.committed).length===0?r:Qi(r,e)}function Qi(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 cm(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 Zi=Q(()=>{"use strict"});function dm(r){return!(!r.ok||r.existingSkillName||!r.multiStep||r.toolCallCount<3||r.distinctToolCount<2)}function um(r){return r.existingSkillName?r.feedback==="negative":!1}function Zt(r,e){return um(r)?{type:"skill.improve",skillName:r.existingSkillName,reason:"negative user feedback on existing skill execution"}:dm(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 ea=Q(()=>{"use strict"});function ta(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 pm(r){return r==="enabled-eligible"||r==="installed-awaiting-approval"}function mm(r){return new Map((r??[]).map(e=>[e.toolName,e]))}function gm(r){if(!r.eligibility?.length)return[...r.tools];let e=mm(r.eligibility);return r.tools.filter(t=>{let n=ta(t);if(!n)return!1;let o=e.get(n);return!o||pm(o.status)})}function fm(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 Pr(r){let e=fm({toolChoice:r.toolChoice,thinkingEnabled:r.thinkingEnabled,compatibility:r.compatibility}),t=e.normalizedToolChoice,n=[...e.warnings],o=gm({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=>ta(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 na=Q(()=>{"use strict"});function oa(r){return r==null?[]:typeof r=="string"?r.length>0?[{type:"text",text:r}]:[]:Array.isArray(r)?r:[{type:"text",text:String(r)}]}function bm(r,e){return{...r,content:[...oa(r.content),...oa(e.content)]}}function km(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 wm(r){return new Set((r??hm).map(e=>e.trim().toLowerCase()))}function Tm(r,e){return r?wm(e).has(r.trim().toLowerCase()):!1}function Ir(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=>km(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]=bm(c,a);continue}i.push(a)}return i}function Mr(r,e){return Tm(e?.stopReason,e?.forcedStopReasons)?r.map(t=>{if(t.role!=="assistant")return{...t};let n={...t};for(let o of ym)delete n[o];return n}):[...r]}function Er(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 Or(r,e){let t=Ir(r),n=Mr(t,e);return Er(n,e)}var hm,ym,Dr=Q(()=>{"use strict";hm=["stop","aborted","timeout","cancelled","interrupted","error"],ym=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"]});function vm(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 xm(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 Sm(r){return{round:r.round??0,maxRounds:r.maxRounds,pendingToolCallIds:[...r.pendingToolCallIds??[]],completedToolCallIds:[...r.completedToolCallIds??[]],lastStopReason:r.lastStopReason,replayMessages:[...r.replayMessages??[]]}}function Lr(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 Kn(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 Jn(r){let e=[],t=Ir(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=Er(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:Sm({maxRounds:r.maxRounds,round:r.round,lastStopReason:r.lastStopReason,replayMessages:o,pendingToolCallIds:vm(o),completedToolCallIds:xm(o)}),recoveryActions:e}}var ra=Q(()=>{"use strict";Dr()});function $r(r){return r?Rm.has(r):!0}function Ur(r){return r===429||r===529}function Yn(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 Nr(){let r=process.env.QLOGICAGENT_PERSISTENT_RETRY;return r==="1"||r==="true"}var Rm,Ax,en,sa=Q(()=>{"use strict";Rm=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);Ax={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};en=class extends Error{constructor(t,n){super(`Model fallback triggered: ${t} -> ${n}`);this.originalModel=t;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel}});function jr(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 Fr=Q(()=>{"use strict"});function Xn(r){return Em.find(e=>e.name===r)}var _m,Cm,Am,Pm,Im,Mm,Em,Br=Q(()=>{"use strict";_m={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},Cm={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},Am={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","task","tool_search"],canFork:!1},Pm={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolAccessMode:"full",canFork:!0},Im={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},Mm={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},Em=[_m,Cm,Am,Pm,Im,Mm]});var ia=Q(()=>{"use strict"});function Gr(r){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:r.maxOutputTokens,consecutiveTruncations:0,aborted:r.abortSignal?.aborted??!1}}function Wr(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 Hr(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 zr(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 Vr(r,e){return r.aborted?!0:e.abortSignal?.aborted?(r.aborted=!0,!0):!1}var aa=Q(()=>{"use strict"});function qr(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function Mt(r,e=Om){return!(r.attemptedThisTurn||r.consecutiveFailures>=e.maxConsecutiveFailures)}var Om,la=Q(()=>{"use strict";Om={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50}});var Et=Q(()=>{"use strict";Ni();qi();Rr();Rr();Zi();ea();na();Dr();ra();sa();Fr();Br();ia();aa();la()});function Kr(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 Jr=Q(()=>{"use strict"});var ca,da,ua,pa,ma,ga,fa,ha,ya,ba,tn,Yr,ka,wa,Ta,Xr,Qn=Q(()=>{"use strict";ca=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),da=3,ua=128e3,pa=13e3,ma=16384,ga=65536,fa=3,ha=65536,ya=3e4,ba=3,tn=10,Yr=500,ka=3,wa=5e4,Ta=2e5,Xr=2e3});import{mkdir as Lm,writeFile as $m}from"fs/promises";import{join as va}from"path";import{tmpdir as Um}from"os";function Sa(){return{seenIds:new Set,replacements:new Map}}function Ra(r){return va(Um(),"qlogicagent-sessions",r,Nm)}async function Fm(r){try{await Lm(Ra(r),{recursive:!0})}catch{}}function Bm(r,e){let t=e.replace(/[^a-zA-Z0-9_-]/g,"_");return va(Ra(r),`${t}.txt`)}function Gm(r,e){if(r.length<=e)return{preview:r,hasMore:!1};let n=r.slice(0,e).lastIndexOf(`
14
+ `),o=n>e*.5?n:e;return{preview:r.slice(0,o),hasMore:!0}}function _a(r){return r.includes(xa)}async function Ca(r,e,t){await Fm(t);let n=Bm(t,e);try{await $m(n,r,{encoding:"utf-8",flag:"wx"})}catch(i){if(i.code!=="EEXIST")return null}let{preview:o,hasMore:s}=Gm(r,Xr);return{filepath:n,originalSize:r.length,preview:o,hasMore:s}}function Aa(r){let e=`${xa}
15
15
  `;return e+=`Output too large (${r.originalSize} chars). Full output saved to: ${r.filepath}
16
16
 
17
- `,e+=`Preview (first ${Er} bytes):
17
+ `,e+=`Preview (first ${Xr} bytes):
18
18
  `,e+=r.preview,e+=r.hasMore?`
19
19
  ...
20
20
  `:`
21
- `,e+=im,e}async function ia(r,e,t,n=Xi){if(r.length<=n||oa(r))return r;let o=await ra(r,e,t);return o?sa(o):r.slice(0,n)+`
22
- ...[truncated ${r.length-n} chars]`}function dm(r){let e=[],t=[];for(let n of r)n.role==="tool"&&typeof n.content=="string"&&n.tool_call_id?oa(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 um(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 pm(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 aa(r,e,t,n=Qi){let o=dm(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}=um(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?pm(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 ra(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=sa(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 sm,ea,im,Or=Q(()=>{"use strict";Nn();sm="tool-results",ea="<persisted-output>",im="</persisted-output>"});function fm(r){try{return JSON.parse(r)}catch{return}}var mm,gm,jn,la=Q(()=>{"use strict";xt();Or();mm=new Set(["read_file","file_read","FileRead","grep","Grep","glob","Glob","search","list_dir","find_files","web_fetch","web_search","WebFetch","WebSearch"]),gm=new Set(["bash","execute_command","Bash","shell"]),jn=class{tools=[];hasErrored=!1;erroredToolDescription="";discarded=!1;siblingAbortController;progressResolve;config;concurrencySafe;constructor(e){this.config=e,this.concurrencySafe=e.concurrencySafeTools??mm,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:Nt(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:fm(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:Nt(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 ia(y,e.id,a));let k=Nt(e.id,{ok:f,payload:y,error:m.error,toolReferences:m.toolReferences});f||(p=!0,gm.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 hm}from"node:fs/promises";function dt(r){let e=typeof r.content=="string"?r.content:r.content!=null?JSON.stringify(r.content):"";return Math.ceil(e.length/4)}function ut(r){let e=0;for(let t of r)e+=dt(t);return e}function ua(r){if(!r)return 128e3;if(r in Dr)return Dr[r];let e=r.toLowerCase();for(let[t,n]of Object.entries(Dr))if(e.startsWith(t.toLowerCase()))return n;return 128e3}function bm(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??ym;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):
21
+ `,e+=jm,e}async function Pa(r,e,t,n=wa){if(r.length<=n||_a(r))return r;let o=await Ca(r,e,t);return o?Aa(o):r.slice(0,n)+`
22
+ ...[truncated ${r.length-n} chars]`}function Wm(r){let e=[],t=[];for(let n of r)n.role==="tool"&&typeof n.content=="string"&&n.tool_call_id?_a(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 Hm(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 zm(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 Ia(r,e,t,n=Ta){let o=Wm(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:g}=Hm(l,e);for(let w of u)s.set(w.toolCallId,w.replacement);if(g.length===0){for(let w of l)e.seenIds.add(w.toolCallId);continue}let f=p.reduce((w,x)=>w+x.size,0),m=g.reduce((w,x)=>w+x.size,0),y=f+m>n?zm(g,f,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 u=await Ca(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=Aa(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 Nm,xa,jm,Qr=Q(()=>{"use strict";Qn();Nm="tool-results",xa="<persisted-output>",jm="</persisted-output>"});function Km(r){try{return JSON.parse(r)}catch{return}}var Vm,qm,Zn,Ma=Q(()=>{"use strict";Et();Qr();Vm=new Set(["read_file","file_read","FileRead","grep","Grep","glob","Glob","search","list_dir","find_files","web_fetch","web_search","WebFetch","WebSearch"]),qm=new Set(["bash","execute_command","Bash","shell"]),Zn=class{tools=[];hasErrored=!1;erroredToolDescription="";discarded=!1;siblingAbortController;progressResolve;config;concurrencySafe;constructor(e){this.config=e,this.concurrencySafe=e.concurrencySafeTools??Vm,this.siblingAbortController=new AbortController,e.signal&&e.signal.addEventListener("abort",()=>{this.siblingAbortController.abort("parent_abort")},{once:!0})}discard(){this.discarded=!0}addTool(e){let t=this.concurrencySafe.has(e.function.name);this.tools.push({id:e.id,toolCall:e,status:"queued",isConcurrencySafe:t,results:[],pendingProgress:[]}),this.processQueue()}canExecuteTool(e){let t=this.tools.filter(o=>o.status==="executing"),n=this.config.maxConcurrentTools;return n&&n>0&&t.length>=n?!1:t.length===0||e&&t.every(o=>o.isConcurrencySafe)}async processQueue(){for(let e of this.tools)if(e.status==="queued"){if(this.canExecuteTool(e.isConcurrencySafe))await this.executeTool(e);else if(!e.isConcurrencySafe)break}}getAbortReason(){return this.discarded?"discarded":this.hasErrored?"sibling_error":this.config.signal?.aborted?"user_interrupted":null}getToolDescription(e){let t;try{t=JSON.parse(e.toolCall.function.arguments)}catch{}let n=t?.command??t?.file_path??t?.pattern??"";if(typeof n=="string"&&n.length>0){let o=n.length>40?n.slice(0,40)+"\u2026":n;return`${e.toolCall.function.name}(${o})`}return e.toolCall.function.name}createSyntheticError(e,t){let n=this.erroredToolDescription,o=t==="user_interrupted"?"User rejected tool use":t==="discarded"?"Streaming fallback - tool execution discarded":n?`Cancelled: parallel tool call ${n} errored`:"Cancelled: parallel tool call errored";return{callId:e.id,toolName:e.toolCall.function.name,ok:!1,error:o,message:Vt(e.id,{ok:!1,error:o})}}async executeTool(e){e.status="executing";let n=(async()=>{let o=this.getAbortReason();if(o){e.results.push(this.createSyntheticError(e,o)),e.status="completed";return}let{toolInvoker:s,hooks:i,sessionId:a,turnId:c,log:d}=this.config,l=e.toolCall.function.name,u=!1,p=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:Km(p)});if(w.action==="abort"){let x=w.reason??"blocked by policy";d.info(`tool ${l} blocked: ${x}`),e.results.push({callId:e.id,toolName:l,ok:!1,error:x,blocked:!0,blockReason:x,message:Vt(e.id,{ok:!1,error:x})}),e.status="completed";return}w.action==="continue"&&w.context?.arguments&&(p=JSON.stringify(w.context.arguments))}catch{}let g=await s.invoke(c,l,p,this.siblingAbortController.signal),f=this.getAbortReason();if(f&&!u){e.results.push(this.createSyntheticError(e,f)),e.status="completed";return}let m=!g.error,y=g.result;m&&y&&y.length>5e4&&(y=await Pa(y,e.id,a));let k=Vt(e.id,{ok:m,payload:y,error:g.error,toolReferences:g.toolReferences,imageUrls:g.imageUrls});m||(u=!0,qm.has(l)&&(this.hasErrored=!0,this.erroredToolDescription=this.getToolDescription(e),this.siblingAbortController.abort("sibling_error"))),i?.invoke(m?"tool.after_invoke":"tool.invoke_failed",{sessionId:a,turnId:c,callId:e.id,toolName:l,ok:m,...g.error?{error:g.error}:{}}).catch(()=>{}),e.results.push({callId:e.id,toolName:l,ok:m,error:g.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 Jm}from"node:fs/promises";function yt(r){let e=typeof r.content=="string"?r.content:r.content!=null?JSON.stringify(r.content):"";return Math.ceil(e.length/4)}function bt(r){let e=0;for(let t of r)e+=yt(t);return e}function Da(r){if(!r)return 128e3;if(r in Zr)return Zr[r];let e=r.toLowerCase();for(let[t,n]of Object.entries(Zr))if(e.startsWith(t.toLowerCase()))return n;return 128e3}function Xm(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"),es(t);try{let i="",a=e?.model??Ym;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"),es(t))}catch(i){return r.warn({err:i.message},"[context-compression] summarize call error \u2014 using fallback"),es(t)}}}function es(r){let e=r.filter(n=>n.role==="user"),t=e.slice(0,10).map(n=>{let o=typeof n.content=="string"?n.content:JSON.stringify(n.content??"");return`- ${o.slice(0,200)}${o.length>200?"...":""}`});return`User requests (${e.length} messages):
23
23
  ${t.join(`
24
- `)}`}function km(){return tr(new ct($r),new et(20,dt),new wt(dt))}function da(r,e){let t=nr(new ct($r),new et(20,dt),new jt({protectedHeadExchanges:1,protectedTailMessages:8,summarize:r,estimateTokens:dt}),new wt(dt));return new Ft({inner:t,estimateTokens:dt,onCacheInvalidated:e?.onCacheInvalidated})}function ma(r,e){let t=e?.budget??On({modelContextWindow:ua(e?.model)}),o=(e?.pipeline??km()).compress(r,t);if(o.droppedCount>0){let s=ut(r),i=ut(o.messages);pa.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:Ht(s,t)})}return o.droppedCount>0&&Ur?.(o.droppedCount,ut(o.messages)),o}async function Tm(r,e,t){let n=t??On({modelContextWindow:ua(e.model)}),o=ut(r),s=Ht(o,n),i;switch(s){case"none":i={messages:r,droppedCount:0,strategy:"none"};break;case"trim-only":i=new ct($r).compress(r,n);break;case"sliding-window":{i=await da(e.summarize).compressAsync(r,n);break}case"llm-summarize":{let a=e.pipeline??da(e.summarize);i=Gt(a)?await a.compressAsync(r,n):a.compress(r,n);break}}return i.droppedCount>0&&(i={...i,messages:await rr(i.messages,r,{maxFiles:5,maxTokenBudget:5e4,readFile:async a=>{try{return await hm(a,"utf-8")}catch{return null}}})}),wm(r,i,n),i}function wm(r,e,t){if(e.droppedCount>0||e.metrics?.usedLlm){let n=e.metrics?.tokensBefore||ut(r),o=e.metrics?.tokensAfter||ut(e.messages);pa.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:Ht(n,t)})}if(e.droppedCount>0){let n=e.metrics?.tokensAfter||ut(e.messages);Ur?.(e.droppedCount,n)}}function vm(r,e){let t=bm(r,e),n={id:"builtin-compressor",label:"4-Layer Compression Funnel (built-in)",async compressAsync(o,s,i){return Tm(o,{budget:s,model:i?.model,sessionId:i?.sessionId,summarize:t},s)}};ca.register(n),ca.activate(n.id),r.info(`[context-compression] registered context engine: ${n.id}`)}function ga(r,e,t){vm(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"}}}),Ur=(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 Dr,$r,ym,pa,ca,Ur,Nr=Q(()=>{"use strict";xt();Dr={"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};$r=8e3,ym="deepseek-v4-flash",pa=new Bt(200),ca=new Wt;Ur=null});function fa(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 ha=Q(()=>{"use strict"});var ya={};gi(ya,{resolveToolEligibility:()=>Cm});function Sm(r,e){if(xm.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 Rm(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||Sm(t,e.dangerousPatterns)?(o.push("dangerous_tool"),{level:3,reasons:o}):{level:2,reasons:o}}function _m(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 Cm(r,e={}){let t=new Map,n=[],o=[],s=[];for(let i of r){let a=i.function.name,{level:c,reasons:d}=Rm(i,e),l=_m(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 xm,ba=Q(()=>{"use strict";xm=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:write_file|delete_file|move_file|create_directory)$/i,/^(?:git_push|git_reset|git_force)$/i]});function Pm(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 Em(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 Om(r){return typeof r=="number"&&Number.isFinite(r)&&r>=1?Math.min(Math.round(r),100):Fi}function ka(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 Dm(r){return r==="length"||r==="max_tokens"}function Ta(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 Lm(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 $m(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 Um(r){return r.filter(e=>e.role!=="assistant"?!0:!(typeof e.content=="string"&&e.content.trim()===""))}async function*wa(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(()=>(ba(),ya)),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*Nm(o,c,i,d,l,u,e,n);return}let C=Om(r.maxRounds),R={contextWindowTokens:r.contextWindowTokens??Wi,responseBufferTokens:Gi,maxOutputTokens:r.maxOutputTokens??Hi,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:xr(R),reactiveCompactState:Ar(),toolLoopState:Ln({maxRounds:C,replayMessages:[...i]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{prompt:0,completion:0},collapseStore:ar(),currentModel:c,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:void 0,lastResponseId:void 0,snipRemovedIds:new Set,contentReplacementState:ta(),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||Kt(v.messages,n);yield{type:"end",turnId:o,content:_,usage:v.totalUsage,model:v.currentModel};return}let{messages:D,maxOutputTokensRecoveryCount:pe,hasAttemptedReactiveCompact:Se,maxOutputTokensOverride:ae,turnCount:H,guardState:X,reactiveCompactState:te,collapseStore:We}=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(Cr(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 Ge=Sr(X,R);if(Ge.level==="blocking"){Ge.reason==="prompt_too_long"&&vt(te)&&(te.attemptedThisTurn=!0,X.hasAttemptedReactiveCompact=!0,n.info(`token budget blocking (${Ge.reason}), reactive compact needed`),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"token budget pre-check"}),n.info(`token budget blocking (${Ge.reason}), ending tool loop`);break}Ge.level==="warning"&&n.info(`token budget warning: ${Ge.usagePercent}% used, ${Ge.remainingTokens} remaining`);let h;{let _=await aa(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 _=sr(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 et().compress(h,0);M.droppedCount>0&&(h=M.messages,n.info(`microcompact: cleared ${M.droppedCount} old tool results`))}if(h=lr(h,We).messages,X.promptTokens>0){let _=ma(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=Um(h);let T=dr({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,Ir(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 Vt&&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(_),$=typeof _?.status=="number"?_.status:void 0;if(!$&&M&&(M.includes("ECONNRESET")||M.includes("EPIPE"))){let ne=(v.consecutiveApiRetries??0)+1;if(ne>qt){n.info(`stale connection retry limit reached (${qt}), 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=$m({status:$,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(br($)){if(v.consecutive529Errors++,v.consecutive529Errors>=Ji&&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(kr()){let ne=$n(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 (${$})`};let ge=Math.min(J,Ki);await new Promise(Yo=>setTimeout(Yo,ge)),J-=ge}v={...v,transition:void 0};continue}if(yr(f)){let J=Lm({status:$,message:M})??$n(v.consecutive529Errors);n.info(`transient ${$}: retry in ${J}ms`),yield{type:"recovery",turnId:o,action:"retry",detail:`${$} retry in ${J}ms`},await new Promise(ge=>setTimeout(ge,J)),v={...v,transition:void 0};continue}n.info(`background source ${f}: not retrying ${$}`)}j={status:$,message:M}}if(j&&p?.invoke("turn.after_inference",{...m,model:v.currentModel,response:{error:j.message}}).catch(()=>{}),j)if(ka(j))z=!0,n.info(`withheld prompt_too_long error (status=${j.status})`);else if(Ta(j))z=!0,n.info(`withheld media_size error (status=${j.status})`);else{let _=Rr({status:j.status??500,message:j.message},X,R);if(_.action==="reactive_compact"&&vt(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 $=(v.consecutiveApiRetries??0)+1;if($>qt){n.info(`API retry limit reached (${qt}), aborting`);let V=Tt(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:$,transition:void 0};continue}let M=Tt(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 Ie=[...N.values()].map(_=>({id:_.id||`tc_${o}_${H}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:_.name,arguments:_.arguments}}));if(Ie.length===0&&!S){if(z&&j&&ka(j)){if(v.transition?.reason!=="collapse_drain_retry"){let $=cr(h,We);if($.committed>0){n.info(`collapse drain: committed ${$.committed} stages`),yield{type:"recovery",turnId:o,action:"collapse_drain",detail:`${$.committed} stages committed`},v={...v,messages:$.messages,transition:{reason:"collapse_drain_retry",committed:$.committed}};continue}}if(vt(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&&Ta(j)){if(vt(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(Dm(G)){X.consecutiveTruncations+=1;let $=r.modelMaxOutputTokens??zi,V=_r(X,R,$);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:qi,transition:{reason:"max_output_tokens_escalate"}};continue}if(pe<Vi){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=Dn(we,{replayMessages:D,lastStopReason:"completed"}),p){let $=await p.invoke("stop",{sessionId:s,reason:"completed"});if($.action==="prevent"){n.info(`stop hook prevented continuation: ${$.reason??"no reason"}`),yield{type:"end",turnId:o,content:v.finalText,usage:v.totalUsage,model:v.currentModel};return}if($.action==="abort"){let V=$.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 $=v.totalUsage.prompt+v.totalUsage.completion+(v.totalUsage.reasoning??0),V=$/r.tokenBudget*100,ne=$-v.lastBudgetGlobalTokens,J=v.budgetContinuationCount>=Yi&&ne<Pr&&v.lastBudgetDeltaTokens<Pr;if(J&&n.info(`token budget early stop: diminishing returns at ${Math.round(V)}% (delta=${ne})`),!J&&V<90){let ge=v.budgetContinuationCount+1,Yo={role:"user",content:fa(V,$,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 qu={role:"assistant",content:v.finalText,...ve.length>0&&{thinkingBlocks:[...ve]}};v={...v,messages:[...D,qu,Yo],budgetContinuationCount:ge,lastBudgetDeltaTokens:ne,lastBudgetGlobalTokens:$,transition:{reason:"token_budget_continuation"}};continue}}if(E>0){let $={ok:!0,toolCallCount:E,distinctToolCount:b.size,multiStep:E>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},V=zt($,{tools:[...b]});V&&(yield{type:"skill_instruction",turnId:o,instruction:V})}let M=v.finalText||Kt(D,n);yield{type:"end",turnId:o,content:M,usage:v.totalUsage,model:v.currentModel};return}for(let _ of Ie){let M=_.function.arguments,$=P.find(V=>V.function.name===_.function.name);if($?.backfillObservableInput)try{let V=JSON.parse(_.function.arguments),ne={...V};$.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(Qo(Ie,v.finalText||void 0,ve.length>0?ve:void 0,Mn)),we=hr(we,{replayMessages:D,pendingToolCallIds:Ie.map(_=>_.id),completedToolCallIds:we.completedToolCallIds,lastStopReason:"tool_calls"});let Pn=[];try{let _=new jn({toolInvoker:t,hooks:p,sessionId:s,turnId:o,log:n,signal:u,maxConcurrentTools:r?.maxConcurrentTools});for(let M of Ie)_.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 $=typeof M.message?.content=="string"?M.message.content:"",V=M.ok&&$?$.slice(0,2e3):void 0;if(yield{type:"tool_result",turnId:o,callId:M.callId,name:M.toolName,ok:M.ok,error:M.error,outputPreview:V},M.ok){let ne=Ie.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(Mm.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:Pm(ge),title:ge.split(/[\\/]/).pop()||ge,filePath:ge,language:Em(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=Dn(we,{replayMessages:D,completedToolCallIds:[...we.completedToolCallIds,...Pn],lastStopReason:"tool_calls"}),r.generateToolUseSummary&&Ie.length>0){let _=Ie.map(M=>({name:M.function.name,arguments:M.function.arguments}));U=r.generateToolUseSummary(_).catch(()=>null)}let $t=D.slice(-Ie.length),Vu=$t.length>0&&$t.every(_=>{let M=_?.content;return typeof M!="string"?!1:M.startsWith("Error: ")}),Ut=v.consecutiveFailedRounds;if(Vu){if(Ut+=1,Ut>=Bi){let _=v.finalText||Kt(D,n);n.info(`early exit: ${Ut} consecutive failed rounds, returning ${v.finalText?"partial":"fallback"} response`),yield{type:"end",turnId:o,content:_,usage:v.totalUsage,model:v.currentModel};return}}else Ut=0;let Jo=H+1;if(g>0&&Jo>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 $=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:$}],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}let _=v.finalText||Kt(D,n);yield{type:"end",turnId:o,content:_,usage:v.totalUsage,model:v.currentModel};return}if(Jo>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},$=zt(M,{tools:[...b]});$&&(yield{type:"skill_instruction",turnId:o,instruction:$})}let _=v.finalText||Kt(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:Jo,transition:{reason:"next_turn"},guardState:X,reactiveCompactState:te,toolLoopState:we,consecutiveFailedRounds:Ut,finalText:v.finalText,totalUsage:v.totalUsage,collapseStore:We,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 Kt(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(`
24
+ `)}`}function Qm(){return wr(new ht(ts),new at(20,yt),new It(yt))}function Oa(r,e){let t=Tr(new ht(ts),new at(20,yt),new qt({protectedHeadExchanges:1,protectedTailMessages:8,summarize:r,estimateTokens:yt}),new It(yt));return new Kt({inner:t,estimateTokens:yt,onCacheInvalidated:e?.onCacheInvalidated})}function $a(r,e){let t=e?.budget??qn({modelContextWindow:Da(e?.model)}),o=(e?.pipeline??Qm()).compress(r,t);if(o.droppedCount>0){let s=bt(r),i=bt(o.messages);La.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:Qt(s,t)})}return o.droppedCount>0&&ns?.(o.droppedCount,bt(o.messages)),o}async function Zm(r,e,t){let n=t??qn({modelContextWindow:Da(e.model)}),o=bt(r),s=Qt(o,n),i;switch(s){case"none":i={messages:r,droppedCount:0,strategy:"none"};break;case"trim-only":i=new ht(ts).compress(r,n);break;case"sliding-window":{i=await Oa(e.summarize).compressAsync(r,n);break}case"llm-summarize":{let a=e.pipeline??Oa(e.summarize);i=Xt(a)?await a.compressAsync(r,n):a.compress(r,n);break}}return i.droppedCount>0&&(i={...i,messages:await xr(i.messages,r,{maxFiles:5,maxTokenBudget:5e4,readFile:async a=>{try{return await Jm(a,"utf-8")}catch{return null}}})}),eg(r,i,n),i}function eg(r,e,t){if(e.droppedCount>0||e.metrics?.usedLlm){let n=e.metrics?.tokensBefore||bt(r),o=e.metrics?.tokensAfter||bt(e.messages);La.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:Qt(n,t)})}if(e.droppedCount>0){let n=e.metrics?.tokensAfter||bt(e.messages);ns?.(e.droppedCount,n)}}function tg(r,e){let t=Xm(r,e),n={id:"builtin-compressor",label:"4-Layer Compression Funnel (built-in)",async compressAsync(o,s,i){return Zm(o,{budget:s,model:i?.model,sessionId:i?.sessionId,summarize:t},s)}};Ea.register(n),Ea.activate(n.id),r.info(`[context-compression] registered context engine: ${n.id}`)}function Ua(r,e,t){tg(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"}}}),ns=(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 Zr,ts,Ym,La,Ea,ns,os=Q(()=>{"use strict";Et();Zr={"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};ts=8e3,Ym="deepseek-v4-flash",La=new Jt(200),Ea=new Yt;ns=null});function Na(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 ja=Q(()=>{"use strict"});var Fa={};Ui(Fa,{resolveToolEligibility:()=>ig});function og(r,e){if(ng.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 rg(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||og(t,e.dangerousPatterns)?(o.push("dangerous_tool"),{level:3,reasons:o}):{level:2,reasons:o}}function sg(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 ig(r,e={}){let t=new Map,n=[],o=[],s=[];for(let i of r){let a=i.function.name,{level:c,reasons:d}=rg(i,e),l=sg(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 ng,Ba=Q(()=>{"use strict";ng=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:write_file|delete_file|move_file|create_directory)$/i,/^(?:git_push|git_reset|git_force)$/i]});function dg(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 ug(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 pg(r){return typeof r=="number"&&Number.isFinite(r)&&r>=1?Math.min(Math.round(r),100):ca}function Ga(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 mg(r){return r==="length"||r==="max_tokens"}function Wa(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 gg(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 fg(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 hg(r){return r.filter(e=>e.role!=="assistant"?!0:!(typeof e.content=="string"&&e.content.trim()===""))}async function*Ha(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,g={sessionId:s,turnId:o},f=r.maxTurns??0,m=r.querySource,{resolveToolEligibility:y}=await Promise.resolve().then(()=>(Ba(),Fa)),k=y(a,r.toolEligibilityContext),w=k.eligibleTools;for(let W of k.blockedTools)yield{type:"tool_blocked",turnId:o,callId:"",name:W.toolName,reason:"blocked-by-policy"};if(!w.length){yield*yg(o,c,i,d,l,p,e,n);return}let x=pg(r.maxRounds),S={contextWindowTokens:r.contextWindowTokens??ua,responseBufferTokens:pa,maxOutputTokens:r.maxOutputTokens??ma,abortSignal:p,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},b=new Set,I=0,O=w,U,v={messages:[...i],maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:1,transition:void 0,guardState:Gr(S),reactiveCompactState:qr(),toolLoopState:Jn({maxRounds:x,replayMessages:[...i]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{prompt:0,completion:0},collapseStore:_r(),currentModel:c,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:void 0,lastResponseId:void 0,snipRemovedIds:new Set,contentReplacementState:Sa(),budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0},ie=Math.max(f*5,200),Y=0;for(;;){if(Y++,Y>ie){n.info(`hard iteration cap reached (${ie}), forcing completion`);let C=v.finalText||nn(v.messages,n);yield{type:"end",turnId:o,content:C,usage:v.totalUsage,model:v.currentModel};return}let{messages:W,maxOutputTokensRecoveryCount:ee,hasAttemptedReactiveCompact:Oe,maxOutputTokensOverride:_e,turnCount:H,guardState:V,reactiveCompactState:he,collapseStore:ue}=v,{toolLoopState:ve}=v;if(U){try{let C=await U;C&&(yield{type:"tool_use_summary",turnId:o,summary:C})}catch{}U=void 0}if(r.refreshTools&&H>1){let C=r.refreshTools();C!==O&&(O=C,n.debug(`tools refreshed: ${C.length} tools`))}if(Vr(V,S)){n.info(`turn aborted by guard at turn ${H}`),yield{type:"error",turnId:o,error:"Turn aborted",code:"ABORTED",usage:v.totalUsage};return}let Je=Wr(V,S);if(Je.level==="blocking"){Je.reason==="prompt_too_long"&&Mt(he)&&(he.attemptedThisTurn=!0,V.hasAttemptedReactiveCompact=!0,n.info(`token budget blocking (${Je.reason}), reactive compact needed`),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"token budget pre-check"}),n.info(`token budget blocking (${Je.reason}), ending tool loop`);break}Je.level==="warning"&&n.info(`token budget warning: ${Je.usagePercent}% used, ${Je.remainingTokens} remaining`);let pe;{let C=await Ia(W,v.contentReplacementState,s);pe=C.messages,C.newlyReplacedCount>0&&(n.info(`tool-result-budget: persisted ${C.newlyReplacedCount} oversized tool results`),yield{type:"recovery",turnId:o,action:"tool_result_budget",detail:`${C.newlyReplacedCount} persisted`})}{let C=Sr(pe,v.snipRemovedIds);pe=C.messages,C.removedCount>0&&(n.info(`snip: removed ${C.removedCount} messages, freed ~${C.tokensFreed} tokens`),yield{type:"recovery",turnId:o,action:"snip",detail:`${C.removedCount} messages`})}{let M=new at().compress(pe,0);M.droppedCount>0&&(pe=M.messages,n.info(`microcompact: cleared ${M.droppedCount} old tool results`))}if(pe=Cr(pe,ue).messages,V.promptTokens>0){let C=$a(pe,{budget:S.contextWindowTokens*.75,model:v.currentModel});C.droppedCount>0&&(pe=C.messages,n.info(`autocompact: ${C.strategy}, dropped ${C.droppedCount}`),yield{type:"recovery",turnId:o,action:"autocompact",detail:`${C.strategy}: ${C.droppedCount} dropped`},v.hasAttemptedReactiveCompact=!1,u?.invoke("context.after_compact",{...g,removedCount:C.droppedCount}).catch(()=>{}))}pe=hg(pe);let h=Pr({tools:O,toolChoice:r.toolChoice??"auto"}),T=Jn({maxRounds:x,replayMessages:pe,lastStopReason:ve.lastStopReason,options:{stopReason:ve.lastStopReason}}),R=h.extraSystemPrompt?[{role:"system",content:h.extraSystemPrompt},...T.state.replayMessages]:T.state.replayMessages;ve=T.state,T.recoveryActions.length>0&&n.debug(`tool loop recovery: ${T.recoveryActions.map(C=>C.detail??C.kind).join("; ")}`),n.debug(`turn ${H}, messages: ${R.length}`),u?.invoke("turn.before_inference",{...g,model:v.currentModel}).catch(()=>{});let P=!1,_=[],$=new Map,j="stop",L,D=null,ae=!1,z=[],te=[];try{for await(let C of e.stream({model:v.currentModel,messages:R,tools:h.tools,toolChoice:h.normalizedToolChoice??"auto",temperature:l,maxTokens:(_e??V.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(C.type){case"delta":_.push(C.text),P||(yield{type:"delta",turnId:o,text:C.text});break;case"tool_call_delta":P=!0,Kr($,C);break;case"reasoning_delta":z.push(C.text);break;case"reasoning_block_complete":C.signature&&te.push({thinking:z.join(""),signature:C.signature}),z.length=0;break;case"usage":L={prompt:C.promptTokens,completion:C.completionTokens,reasoning:C.reasoningTokens,cacheRead:C.cacheReadTokens,cacheCreation:C.cacheCreationTokens};break;case"response_id":v.lastResponseId=C.id;break;case"annotations":yield{type:"annotations",turnId:o,annotations:C.annotations};break;case"builtin_tool_status":yield{type:"heartbeat",turnId:o,message:`${C.toolType}: ${C.event}`};break;case"done":j=C.finishReason;break}if(P||u?.invoke("turn.after_inference",{...g,model:v.currentModel}).catch(()=>{}),r.postSamplingHooks&&r.postSamplingHooks.length>0){let C=v.currentModel;for(let M of r.postSamplingHooks)try{M({messages:[...pe],model:C,sessionId:s})}catch{}}}catch(C){if(C instanceof en&&r.fallbackModel){n.info(`model fallback triggered: ${C.originalModel} \u2192 ${C.fallbackModel}`),yield{type:"recovery",turnId:o,action:"model_fallback",detail:`${C.originalModel} \u2192 ${C.fallbackModel}`},v={...v,currentModel:C.fallbackModel,consecutive529Errors:0,consecutiveApiRetries:0,transition:void 0};continue}let M=C instanceof Error?C.message:String(C),N=typeof C?.status=="number"?C.status:void 0;if(!N&&M&&(M.includes("ECONNRESET")||M.includes("EPIPE"))){let ne=(v.consecutiveApiRetries??0)+1;if(ne>tn){n.info(`stale connection retry limit reached (${tn}), 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 q=fg({status:N,message:M});if(q!==null){n.info(`max_tokens overflow: adjusting to ${q}`),V.currentMaxOutputTokens=q,v={...v,maxOutputTokensOverride:q,transition:void 0};continue}if(Ur(N)){if(v.consecutive529Errors++,v.consecutive529Errors>=ba&&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(Nr()){let ne=Yn(v.consecutive529Errors);n.info(`persistent retry: waiting ${ne}ms (attempt ${v.consecutive529Errors})`);let X=ne;for(;X>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(X/1e3)}s (${N})`};let me=Math.min(X,ya);await new Promise(fr=>setTimeout(fr,me)),X-=me}v={...v,transition:void 0};continue}if($r(m)){let X=gg({status:N,message:M})??Yn(v.consecutive529Errors);n.info(`transient ${N}: retry in ${X}ms`),yield{type:"recovery",turnId:o,action:"retry",detail:`${N} retry in ${X}ms`},await new Promise(me=>setTimeout(me,X)),v={...v,transition:void 0};continue}n.info(`background source ${m}: not retrying ${N}`)}D={status:N,message:M}}if(D&&u?.invoke("turn.after_inference",{...g,model:v.currentModel,response:{error:D.message}}).catch(()=>{}),D)if(Ga(D))ae=!0,n.info(`withheld prompt_too_long error (status=${D.status})`);else if(Wa(D))ae=!0,n.info(`withheld media_size error (status=${D.status})`);else{let C=Hr({status:D.status??500,message:D.message},V,S);if(C.action==="reactive_compact"&&Mt(he)&&(he.attemptedThisTurn=!0,V.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:o,action:"reactive_compact",detail:`API ${D.status??500}: ${D.message}`}),C.action==="retry"){let N=(v.consecutiveApiRetries??0)+1;if(N>tn){n.info(`API retry limit reached (${tn}), aborting`);let q=Pt(D.status,D.message);yield{type:"error",turnId:o,error:D.message,code:q,usage:v.totalUsage};return}yield{type:"recovery",turnId:o,action:"retry",detail:C.reason},v={...v,consecutiveApiRetries:N,transition:void 0};continue}let M=Pt(D.status,D.message);u?.invoke("stop.failure",{sessionId:s,reason:M,error:D.message}).catch(()=>{}),yield{type:"error",turnId:o,error:D.message,code:M,usage:v.totalUsage};return}L&&(v.totalUsage.prompt+=L.prompt,v.totalUsage.completion+=L.completion,L.reasoning&&(v.totalUsage.reasoning=(v.totalUsage.reasoning??0)+L.reasoning),L.cacheRead&&(v.totalUsage.cacheRead=(v.totalUsage.cacheRead??0)+L.cacheRead),L.cacheCreation&&(v.totalUsage.cacheCreation=(v.totalUsage.cacheCreation??0)+L.cacheCreation)),L?.prompt&&(V.promptTokens=L.prompt);let Fe=_.join("");Fe&&(v.finalText=Fe);let xe=[...$.values()].map(C=>({id:C.id||`tc_${o}_${H}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:C.name,arguments:C.arguments}}));if(xe.length===0&&!P){if(ae&&D&&Ga(D)){if(v.transition?.reason!=="collapse_drain_retry"){let N=Ar(pe,ue);if(N.committed>0){n.info(`collapse drain: committed ${N.committed} stages`),yield{type:"recovery",turnId:o,action:"collapse_drain",detail:`${N.committed} stages committed`},v={...v,messages:N.messages,transition:{reason:"collapse_drain_retry",committed:N.committed}};continue}}if(Mt(he)){he.attemptedThisTurn=!0,V.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:D.message}).catch(()=>{}),yield{type:"error",turnId:o,error:D.message,code:"PROMPT_TOO_LONG",usage:v.totalUsage};return}if(ae&&D&&Wa(D)){if(Mt(he)){he.attemptedThisTurn=!0,V.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:D.message}).catch(()=>{}),yield{type:"error",turnId:o,error:D.message,code:"IMAGE_ERROR",usage:v.totalUsage};return}if(mg(j)){V.consecutiveTruncations+=1;let N=r.modelMaxOutputTokens??ga,q=zr(V,S,N);if(q.shouldEscalate&&_e===void 0){V.currentMaxOutputTokens=q.newMax,n.info(`max_output_tokens escalate: ${q.newMax} tokens`),yield{type:"recovery",turnId:o,action:"output_escalation",detail:`${q.newMax} tokens`},v={...v,maxOutputTokensOverride:ha,transition:{reason:"max_output_tokens_escalate"}};continue}if(ee<fa){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 #${ee+1}`),yield{type:"recovery",turnId:o,action:"max_output_tokens_recovery",detail:`attempt ${ee+1}`},v={...v,messages:[...pe,ne],maxOutputTokensRecoveryCount:ee+1,maxOutputTokensOverride:void 0,transition:{reason:"max_output_tokens_recovery",attempt:ee+1}};continue}n.info("max_output_tokens recovery exhausted, completing with partial content")}else V.consecutiveTruncations=0;if(ve=Kn(ve,{replayMessages:W,lastStopReason:"completed"}),u){let N=await u.invoke("stop",{sessionId:s,reason:"completed"});if(N.action==="prevent"){n.info(`stop hook prevented continuation: ${N.reason??"no reason"}`),yield{type:"end",turnId:o,content:v.finalText,usage:v.totalUsage,model:v.currentModel};return}if(N.action==="abort"){let q=N.reason??"Stop hook requested continuation";n.info(`stop hook blocking: ${q}`);let ne={role:"user",content:q},X={role:"assistant",content:v.finalText,...te.length>0&&{thinkingBlocks:[...te]}};v={...v,messages:[...W,X,ne],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(r.tokenBudget&&r.tokenBudget>0&&v.budgetContinuationCount<5){let N=v.totalUsage.prompt+v.totalUsage.completion+(v.totalUsage.reasoning??0),q=N/r.tokenBudget*100,ne=N-v.lastBudgetGlobalTokens,X=v.budgetContinuationCount>=ka&&ne<Yr&&v.lastBudgetDeltaTokens<Yr;if(X&&n.info(`token budget early stop: diminishing returns at ${Math.round(q)}% (delta=${ne})`),!X&&q<90){let me=v.budgetContinuationCount+1,fr={role:"user",content:Na(q,N,r.tokenBudget)};n.info(`token budget continuation #${me}: ${Math.round(q)}% used`),yield{type:"recovery",turnId:o,action:"budget_continuation",detail:`${Math.round(q)}% used (#${me})`};let Cp={role:"assistant",content:v.finalText,...te.length>0&&{thinkingBlocks:[...te]}};v={...v,messages:[...W,Cp,fr],budgetContinuationCount:me,lastBudgetDeltaTokens:ne,lastBudgetGlobalTokens:N,transition:{reason:"token_budget_continuation"}};continue}}if(I>0){let N={ok:!0,toolCallCount:I,distinctToolCount:b.size,multiStep:I>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},q=Zt(N,{tools:[...b]});q&&(yield{type:"skill_instruction",turnId:o,instruction:q})}let M=v.finalText||nn(W,n);yield{type:"end",turnId:o,content:M,usage:v.totalUsage,model:v.currentModel};return}for(let C of xe){let M=C.function.arguments,N=O.find(q=>q.function.name===C.function.name);if(N?.backfillObservableInput)try{let q=JSON.parse(C.function.arguments),ne={...q};N.backfillObservableInput(ne),Object.keys(ne).some(me=>!(me in q))&&(M=JSON.stringify(ne))}catch{}yield{type:"tool_call",turnId:o,callId:C.id,name:C.function.name,arguments:M}}let zn=te.length===0&&z.length>0?z.join(""):void 0;W.push(yr(xe,v.finalText||void 0,te.length>0?te:void 0,zn)),ve=Lr(ve,{replayMessages:W,pendingToolCallIds:xe.map(C=>C.id),completedToolCallIds:ve.completedToolCallIds,lastStopReason:"tool_calls"});let oe=[];try{let C=new Zn({toolInvoker:t,hooks:u,sessionId:s,turnId:o,log:n,signal:p,maxConcurrentTools:r?.maxConcurrentTools});for(let M of xe)C.addTool(M);for await(let M of C.getRemainingResults()){M.blocked&&(yield{type:"tool_blocked",turnId:o,callId:M.callId,name:M.toolName,reason:M.blockReason??"blocked"}),W.push(M.message),oe.push(M.callId),b.add(M.toolName),I++;let N=typeof M.message?.content=="string"?M.message.content:"",q=M.ok&&N?N.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:q},M.ok){let ne=xe.find(X=>X.id===M.callId);if(ne){if(M.toolName==="plan_mode")try{let X=JSON.parse(ne.function.arguments);X.action==="exit"&&typeof X.plan=="string"&&X.plan.length>0&&(yield{type:"plan_update",turnId:o,slug:"approved-plan",content:X.plan})}catch{}if(cg.has(M.toolName))try{let X=JSON.parse(ne.function.arguments),me=typeof X.file_path=="string"?X.file_path:typeof X.filePath=="string"?X.filePath:typeof X.path=="string"?X.path:void 0;me&&(yield{type:"artifact",turnId:o,artifactId:`artifact-${M.callId}`,artifactType:dg(me),title:me.split(/[\\/]/).pop()||me,filePath:me,language:ug(me)})}catch{}}}}}catch(C){let M=C instanceof Error?C.message:String(C);yield{type:"error",turnId:o,error:M,code:"TOOL_EXECUTION_ERROR",usage:v.totalUsage};return}if(ve=Kn(ve,{replayMessages:W,completedToolCallIds:[...ve.completedToolCallIds,...oe],lastStopReason:"tool_calls"}),r.generateToolUseSummary&&xe.length>0){let C=xe.map(M=>({name:M.function.name,arguments:M.function.arguments}));U=r.generateToolUseSummary(C).catch(()=>null)}let it=W.slice(-xe.length),Be=it.length>0&&it.every(C=>{let M=C?.content;return typeof M!="string"?!1:M.startsWith("Error: ")}),ye=v.consecutiveFailedRounds;if(Be){if(ye+=1,ye>=da){let C=v.finalText||nn(W,n);n.info(`early exit: ${ye} consecutive failed rounds, returning ${v.finalText?"partial":"fallback"} response`),yield{type:"end",turnId:o,content:C,usage:v.totalUsage,model:v.currentModel};return}}else ye=0;let gr=H+1;if(f>0&&gr>f){if(n.info(`max turns reached (${f}), completing`),u){let M=await u.invoke("stop",{sessionId:s,reason:"max_turns"});if(M.action==="abort"){let N=M.reason??"Stop hook requested continuation after max_turns",q={role:"assistant",content:v.finalText,...te.length>0&&{thinkingBlocks:[...te]}};v={...v,messages:[...W,q,{role:"user",content:N}],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}let C=v.finalText||nn(W,n);yield{type:"end",turnId:o,content:C,usage:v.totalUsage,model:v.currentModel};return}if(gr>x){if(n.info(`tool loop budget exhausted (${x} rounds), returning`),I>0){let M={ok:!0,toolCallCount:I,distinctToolCount:b.size,multiStep:I>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},N=Zt(M,{tools:[...b]});N&&(yield{type:"skill_instruction",turnId:o,instruction:N})}let C=v.finalText||nn(W,n);yield{type:"end",turnId:o,content:C,usage:v.totalUsage,model:v.currentModel};return}v={messages:W,maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:gr,transition:{reason:"next_turn"},guardState:V,reactiveCompactState:he,toolLoopState:ve,consecutiveFailedRounds:ye,finalText:v.finalText,totalUsage:v.totalUsage,collapseStore:ue,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 nn(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
25
 
26
- `)):""}async function*Nm(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 Mm,va=Q(()=>{"use strict";Mr();xt();la();Nr();ha();Or();Nn();Mm=new Set(["write","edit","patch","apply_patch"])});function xa(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=Fm[t.scenario];return{scenario:t.scenario,preferred:n.preferred,deprioritized:n.deprioritized,confidence:t.score}}function jr(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 Sa(r){let e=r.replace(/\.md$/,"").toLowerCase();for(let[t,n]of Object.entries(Bm))if(e.startsWith(t+"-")||e.startsWith(t+"_")||e===t)return n;return null}var jm,Fm,Bm,Fr=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:[]},Fm={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:[]}};Bm={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 _a={};gi(_a,{Agent:()=>St});var St,Fn=Q(()=>{"use strict";xt();va();Nn();Fr();St=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=gr(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=xa(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(`
26
+ `)):""}async function*yg(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 cg,za=Q(()=>{"use strict";Jr();Et();Ma();os();ja();Qr();Qn();cg=new Set(["write","edit","patch","apply_patch"])});function Va(r){if(!r||r.length<5)return{scenario:"general",preferred:[],deprioritized:[],confidence:0};let e=[];for(let[o,s]of Object.entries(bg)){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=kg[t.scenario];return{scenario:t.scenario,preferred:n.preferred,deprioritized:n.deprioritized,confidence:t.score}}function rs(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 qa(r){let e=r.replace(/\.md$/,"").toLowerCase();for(let[t,n]of Object.entries(wg))if(e.startsWith(t+"-")||e.startsWith(t+"_")||e===t)return n;return null}var bg,kg,wg,ss=Q(()=>{"use strict";bg={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:[]},kg={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:[]}};wg={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 Ja={};Ui(Ja,{Agent:()=>Ot});var Ot,eo=Q(()=>{"use strict";Et();za();Qn();ss();Ot=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=Or(o),l=[];if(i&&l.push({role:"system",content:i}),l.push(...d),this.hooks){let g=d.filter(m=>m.role==="user").pop(),f=typeof g?.content=="string"?g.content.slice(0,500):void 0;if(f)try{let m=Va(f),y=await this.hooks.invoke("memory.before_recall",{sessionId:e.sessionId,turnId:n,query:f,preferredCategories:m.preferred.length>0?m.preferred:void 0,deprioritizedCategories:m.deprioritized.length>0?m.deprioritized:void 0}),k=y?.context?.recalledMemories;if(k&&k.length>0){let w=k.map(x=>`- ${x.text}`).join(`
27
27
  `);l.splice(i?1:0,0,{role:"system",content:`[Recalled from long-term memory]
28
- ${w}`})}this.hooks.invoke("memory.after_recall",{sessionId:e.sessionId,turnId:n,blockCount: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 wa(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=Tt(f,g);this.log.error(`turn ${n} error [${y}, retryable=${er(y)}]: ${g}`),this.hooks?.invoke("turn.failed",{...c,code:y,error:g}).catch(()=>{}),yield{type:"error",turnId:n,error:g,code:y}}}}}});Fn();function Gm(r){let e={verbose:!1};for(let t of r.slice(2))(t==="--verbose"||t==="-v")&&(e.verbose=!0);return e}import{createInterface as Hm}from"node:readline";var Jt=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)}
28
+ ${w}`})}this.hooks.invoke("memory.after_recall",{sessionId:e.sessionId,turnId:n,blockCount:y?.context?.recalledMemories?.length??0}).catch(()=>{})}catch{}}let u=a?.model??"",p=Math.min(a?.maxRounds??this.maxRounds,100);try{let g=a?.summaryModel?async y=>{try{let k=y.map(S=>`${S.name}(${S.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),x="";for await(let S of w)S.type==="delta"&&(x+=S.text);return x.trim()||null}catch{return null}}:void 0,f={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:g,signal:t},m;for await(let y of Ha(f,this.transport,this.toolInvoker,this.log))m=y,yield y;m?.type==="end"?this.hooks?.invoke("turn.completed",{...c}).catch(()=>{}):m?.type==="error"&&this.hooks?.invoke("turn.failed",{...c,code:m.code,error:m.error}).catch(()=>{})}catch(g){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 f=g instanceof Error?g.message:String(g),m=typeof g?.status=="number"?g.status:void 0,y=Pt(m,f);this.log.error(`turn ${n} error [${y}, retryable=${kr(y)}]: ${f}`),this.hooks?.invoke("turn.failed",{...c,code:y,error:f}).catch(()=>{}),yield{type:"error",turnId:n,error:f,code:y}}}}}});eo();function vg(r){let e={verbose:!1};for(let t of r.slice(2))(t==="--verbose"||t==="-v")&&(e.verbose=!0);return e}import{createInterface as xg}from"node:readline";var on=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
29
  `)}start(){process.stdin.on("data",t=>{process.stderr.write(`[transport] raw stdin data (${t.length} bytes): ${t.toString().slice(0,300)}
30
- `)});let e=Hm({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)}
30
+ `)});let e=xg({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
31
  `);try{let o=JSON.parse(n);this.messageHandler?.(o)}catch{this.log(`invalid JSON on stdin: ${n.slice(0,200)}`)}}}),e.on("close",()=>{this.closeHandler?.()})}close(){}log(e){this.verbose&&process.stderr.write(`[transport] ${e}
32
- `)}};import{randomUUID as ue}from"node:crypto";Fn();Mr();var Ee=class{supportedTypes=["image","video","3d"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??18e4}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"video":return this.generateVideo(e,t,n);case"3d":return this.generate3D(e,t,n);default:throw new Error(`VolcengineMediaTransport: unsupported mediaType "${e.mediaType}"`)}}canHandle(e){return!!this.supportedTypes.includes(e.mediaType)}async generateImage(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v3/images/generations`,i={model:e.model,prompt:e.prompt,size:e.size??"2K",n:e.n??1,response_format:"url",sequential_image_generation:"disabled",watermark:!0};e.imageUrl&&(i.image=e.imageUrl),e.referenceImages&&e.referenceImages.length>0&&(i.image_urls=e.referenceImages),e.style&&(i.style=e.style),e.quality&&(i.quality=e.quality),e.seed!==void 0&&(i.seed=e.seed),e.guidanceScale!==void 0&&(i.guidance_scale=e.guidanceScale),e.enhancePrompt!==void 0&&(i.enhance_prompt=e.enhancePrompt),e.streamImage&&(i.stream=!0);let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let l=await a.text().catch(()=>"");throw new Error(`Volcengine image API error ${a.status}: ${l}`)}return e.streamImage&&a.body?this.parseStreamingImage(a.body,e,o):{mediaUrls:((await a.json()).data??[]).map(l=>l.url).filter(l=>!!l),model:e.model,size:e.size??"1024x1024",durationMs:Date.now()-o}}async parseStreamingImage(e,t,n){let o=new TextDecoder,s="",i="",a=e.getReader();try{for(;;){let{done:c,value:d}=await a.read();if(c)break;s+=o.decode(d,{stream:!0});let l;for(;(l=s.indexOf(`
33
- `))!==-1;){let 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 Km,mkdirSync as Jm}from"node:fs";import{join as Ga}from"node:path";import{randomUUID as Ym}from"node:crypto";import{homedir as zm}from"node:os";import{join as ee}from"node:path";import{existsSync as Ca,readdirSync as Vm,readFileSync as qm}from"node:fs";var ye=".qlogicagent";function Z(){return process.env.QLOGICAGENT_HOME||ee(zm(),ye)}function Bn(){return ee(Z(),"sessions")}function Aa(r){return ee(Bn(),r)}function Ia(){return ee(Z(),"plugins")}function Rt(){return ee(Z(),"skills")}function _t(){return ee(Z(),"settings.json")}function Oe(){return ee(Z(),"cache")}function Ma(){return ee(Z(),"debug-logs")}function Pa(r){let e=ee(Z(),"checkpoints");return r?ee(e,r):e}function Ea(){return ee(Z(),"plugin-cache")}function Oa(){return ee(Z(),"mcp.json")}function Da(){return ee(Z(),"marketplace.json")}function La(){return ee(Z(),"workflows")}function $a(){return ee(Z(),"rules")}function He(r){return ee(r??process.cwd(),ye)}function Ua(r){return ee(He(r),"workflows")}function Wn(r){return ee(He(r),"skills")}function Na(r){return ee(He(r),"INSTRUCTIONS.md")}function ja(r){return ee(He(r),"rules")}function Fa(r){return ee(He(r),"sessions")}function Ba(r){return ee(r,ye,"hooks")}function Wa(r){let e=Bn();if(!Ca(e))return[];let t=new Set;try{let n=Vm(e,{withFileTypes:!0});for(let o of n){if(!o.isDirectory())continue;let s=ee(e,o.name,"state.json");try{let i=qm(s,"utf8"),c=JSON.parse(i).metadata?.cwd;c&&c!==r&&Ca(ee(c,ye,"skills"))&&t.add(c)}catch{}}}catch{}return[...t]}var Xm=18e4,Yt=class{supportedTypes=["image","tts"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??Xm}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"tts":return this.generateTTS(e,t,n);default:throw new Error(`OpenAIMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateImage(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v1/images/generations`,i={model:e.model,prompt:e.prompt,n:e.n??1,size:e.size??"1024x1024",response_format:"url"};e.quality&&(i.quality=e.quality),e.style&&(i.style=e.style),e.background&&(i.background=e.background);let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let l=await a.text().catch(()=>"");throw new Error(`OpenAI images API error ${a.status}: ${l}`)}return{mediaUrls:((await a.json()).data??[]).map(l=>l.url).filter(l=>!!l),model:e.model,size:e.size??"1024x1024",durationMs:Date.now()-o}}async generateTTS(e,t,n){let o=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("OpenAIMediaTransport: text or prompt is required for TTS");let i=`${this.baseUrl}/v1/audio/speech`,a={model:e.model||"tts-1",input:s,voice:e.voice??"alloy",response_format:e.audioFormat??"mp3"};e.speed!==void 0&&(a.speed=e.speed);let c=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(a),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let m=await c.text().catch(()=>"");throw new Error(`OpenAI TTS API error ${c.status}: ${m}`)}let d=Buffer.from(await c.arrayBuffer()),l=Ga(Oe(),"tts");Jm(l,{recursive:!0});let p=`openai-tts-${Ym()}.mp3`,u=Ga(l,p);return Km(u,d),{mediaUrls:[`file://${u}`],model:e.model||"tts-1",durationMs:Date.now()-o,billingUnit:"per_character",billingQuantity:s.length}}};var pt=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 za,mkdirSync as Va}from"node:fs";import{join as Hn}from"node:path";import{randomUUID as qa}from"node:crypto";import{writeFileSync as Qm,mkdirSync as Zm}from"node:fs";import{join as Ha}from"node:path";import{randomUUID as eg}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 Br(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=tg(l,48e3,2,16),u=Ha(Oe(),"gemini-music-realtime");Zm(u,{recursive:!0});let m=`lyria-rt-${eg()}.wav`,g=Ha(u,m);return Qm(g,p),t.onProgress?.(100,"completed"),{filePath:`file://${g}`,durationMs:Date.now()-o}}finally{s.close()}}function tg(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 ng=18e4,og=1e4,Wr=6e5,Xt=class{supportedTypes=["image","video","music","music_realtime","tts","embedding"];apiBase;timeoutMs;constructor(e){this.apiBase=e.baseUrl.replace(/\/openai\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??ng}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 Br(t,{baseUrl:this.apiBase},{prompts:[{text:e.prompt,weight:1}],durationSeconds:e.duration??30,musicConfig:{audioFormat:e.audioFormat==="wav"?"pcm16":void 0,sampleRateHz:48e3},model:e.model,signal:n,onProgress:e.onProgress});return{mediaUrls:[o.filePath],model:e.model,durationMs:o.durationMs}}async generateTTS(e,t,n){let o=Date.now(),s=`${this.apiBase}/models/${e.model}:generateContent`,i={responseModalities:["AUDIO"]};e.voice&&(i.speechConfig={voiceConfig:{prebuiltVoiceConfig:{voiceName:e.voice}}});let a={contents:[{parts:[{text:e.text??e.prompt}]}],generationConfig:i},c=await this.postJson(s,a,t,n);return{mediaUrls:this.extractInlineAudio(c,"gemini-tts"),model:e.model,durationMs:Date.now()-o}}async generateEmbedding(e,t,n){let o=Date.now(),s=`${this.apiBase}/models/${e.model}:embedContent`,i={content:{parts:[{text:e.text??e.prompt}]}},a=e.metadata?.outputDimensionality;a!==void 0&&(i.output_dimensionality=a);let d=(await this.postJson(s,i,t,n)).embeddings?.[0]?.values??[];return{mediaUrls:[],model:e.model,durationMs:Date.now()-o,metadata:{embedding:d,dimensions:d.length}}}async postJson(e,t,n,o){let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json","x-goog-api-key":n},body:JSON.stringify(t),signal:o??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Gemini API error ${s.status}: ${i}`)}return s.json()}async pollOperation(e,t,n,o,s){let i=Date.now()+Wr;for(;Date.now()<i;){n?.throwIfAborted();let a=`${this.apiBase}/${e}`,c=await fetch(a,{method:"GET",headers:{"x-goog-api-key":t},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let 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-Wr),p=Math.min(95,Math.round(l/Wr*100));o?.(p,"running",s),await new Promise(u=>setTimeout(u,og))}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(Oe(),"gemini-images");Va(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-${qa()}.${i}`,c=Hn(n,a);za(c,Buffer.from(s.inlineData.data,"base64")),t.push(`file://${c}`)}return t}extractInlineAudio(e,t){let n=[],o=Hn(Oe(),t);Va(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"?rg(c,24e3,1,16):c,l=`gemini-${qa()}.${a==="pcm"?"wav":a}`,p=Hn(o,l);za(p,d),n.push(`file://${p}`)}return n}};function rg(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 sg(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 sg(r){return new Promise(e=>setTimeout(e,r))}import{writeFileSync as ig,mkdirSync as ag}from"node:fs";import{join as Ka}from"node:path";import{randomUUID as lg}from"node:crypto";var cg=18e4,dg=3e3,Vn=6e5,ug=new Set(["glm-image"]),Qt=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??cg}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 ug.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=Ka(Oe(),"tts");ag(l,{recursive:!0});let p=e.audioFormat??"wav",u=`zhipu-tts-${lg()}.${p}`,m=Ka(l,u);return ig(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,dg))}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 Zt=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=gg(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?pg(n):void 0,a=s.find(c=>c.mediaType!==t?!1:!i||!c.mediaCapabilities?!0:mg(c.mediaCapabilities,i));if(a)return{providerId:e,providerDef:o,modelInfo:a,mediaType:t}}};function pg(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 mg(r,e){return!("operations"in r)||!r.operations?!0:r.operations.includes(e)}function gg(r){let e=r.baseUrl;switch(r.id){case"volcengine":return new Ee({baseUrl:e});case"openai":return new Yt({baseUrl:e});case"minimax":return new pt({baseUrl:e});case"google":return new Xt({baseUrl:e});case"qwen":return new zn({baseUrl:e});case"zhipu":return new Qt({baseUrl:e.replace(/\/api\/anthropic\/?$/,"/api/paas/v4")});case"zhipu-openai":case"zhipu-coding":return new Qt({baseUrl:e.replace(/\/api\/coding\/paas\/v4\/?$/,"/api/paas/v4")});default:return}}var Gr=[{id:"deepseek",name:"DeepSeek",transport:"anthropic-messages",baseUrl:"https://api.deepseek.com/anthropic",apiKeyEnvVars:["DEEPSEEK_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"deepseek-v4-flash",quirks:{useEffortInsteadOfBudget:!0,filterImageBlocks:!0,maxReasoningEffort:"max",supportsPrefixCompletion:!0},models:[{id:"deepseek-v4-flash",name:"DeepSeek V4 Flash",contextWindow:1e6,maxOutput:384e3,toolCall:!0,reasoning:!0,vision:!1,costInput:.14,costOutput:.28,costCacheRead:.003},{id:"deepseek-v4-pro",name:"DeepSeek V4 Pro",contextWindow:1e6,maxOutput:384e3,toolCall:!0,reasoning:!0,vision:!1,costInput:1.74,costOutput:3.48,costCacheRead:.014}]},{id:"qwen",name:"Alibaba Qwen (DashScope)",transport:"anthropic-messages",baseUrl:"https://dashscope.aliyuncs.com/apps/anthropic",apiKeyEnvVars:["DASHSCOPE_API_KEY","QWEN_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"qwen3.6-plus",models:[{id:"qwen3.6-max-preview",name:"Qwen3.6 Max (Preview)",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:2,costOutput:8,costCacheRead:.2,costCacheWrite:2.5},{id:"qwen3.6-plus",name:"Qwen3.6 Plus",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:3,costCacheRead:.05,costCacheWrite:.625},{id:"qwen3.6-flash",name:"Qwen3.6 Flash",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.1,costOutput:.5,costCacheRead:.01,costCacheWrite:.125},{id:"qwq-plus",name:"QwQ Plus",contextWindow:131072,maxOutput:65536,toolCall:!0,reasoning:!0,reasoningRequired:!0,streamRequired:!0,vision:!1,costInput:.5,costOutput:3,costCacheRead:.05,costCacheWrite:.625},{id:"qwen-max",name:"Qwen Max",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:2,costOutput:6,costCacheRead:.2,costCacheWrite:2.5},{id:"qwen-plus",name:"Qwen Plus",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:.85,costCacheRead:.03,costCacheWrite:.375},{id:"qwen-flash",name:"Qwen Flash",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1},{id:"qwen-turbo",name:"Qwen Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!1},{id:"qwen-vl-max",name:"Qwen VL Max",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:3,costOutput:8.5},{id:"qwen3.5-omni-plus",name:"Qwen3.5 Omni Plus",contextWindow:131072,maxOutput:16384,toolCall:!1,reasoning:!1,streamRequired:!0,vision:!0},{id:"qwen-vl-ocr",name:"Qwen VL OCR",contextWindow:131072,maxOutput:4096,toolCall:!1,reasoning:!1,vision:!0,mediaType:"document_parsing",mediaCapabilities:{type:"document_parsing",supportedFormats:["jpg","jpeg","png","bmp","tiff","pdf"],maxFileSizeMB:10}},{id:"qwen3-tts-voicedesign",name:"Qwen3 TTS VoiceDesign",contextWindow:32768,maxOutput:16384,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],maxCharacters:32768,formats:["mp3","wav"]}},{id:"cosyvoice-v2",name:"CosyVoice V2",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],maxCharacters:1e4,formats:["mp3","wav","pcm"]}},{id:"wan2.7-image-pro",name:"Wan 2.7 Image Pro",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","1280x720","720x1280","2048x2048","3840x2160"]}},{id:"wanx2.1-t2i-turbo",name:"Wan 2.1 Text-to-Image Turbo",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","720x1280","1280x720"]}},{id:"wan2.7-t2v-plus",name:"Wan 2.7 Text/Image-to-Video Plus",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:15,resolutions:["720P","1080P"]}},{id:"wanx2.1-t2v-turbo",name:"Wan 2.1 Text/Image-to-Video Turbo",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:5,resolutions:["480P","720P"]}},{id:"text-embedding-v4",name:"Text Embedding V4",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:1024,maxTokens:8192}},{id:"wanx-background-generation-v2",name:"Wan Background Generation V2",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["inpainting"],sizes:["1024x1024","1280x720","720x1280"]}},{id:"qwen3-rerank",name:"Qwen3 Rerank",contextWindow:32768,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"rerank",mediaCapabilities:{type:"rerank",maxDocuments:100}}]},{id:"zhipu",name:"\u667A\u8C31 GLM (Zhipu)",group:"zhipu",transport:"anthropic-messages",baseUrl:"https://open.bigmodel.cn/api/anthropic",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"glm-5.1",quirks:{filterThinkingBlocks:!0},models:[{id:"glm-5.1",name:"GLM-5.1",contextWindow:2e5,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:6,costOutput:24,costCacheRead:1.3},{id:"glm-5",name:"GLM-5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-5-turbo",name:"GLM-5 Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1,costCacheRead:.1},{id:"glm-4.7",name:"GLM-4.7",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.6",name:"GLM-4.6",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.5-air",name:"GLM-4.5 Air",contextWindow:131072,maxOutput:98304,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1.5,costCacheRead:.1},{id:"glm-4-long",name:"GLM-4 Long",contextWindow:1e6,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.1},{id:"glm-4.7-flash",name:"GLM-4.7 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-4.5-flash",name:"GLM-4.5 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-5v-turbo",name:"GLM-5V Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:1},{id:"glm-4.6v",name:"GLM-4.6V",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:3.2},{id:"glm-4.6v-flash",name:"GLM-4.6V Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:0,costOutput:0},{id:"cogview-4-250304",name:"CogView-4",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","768x1344","864x1152","1344x768","1152x864","1440x720","720x1440"]}},{id:"cogview-3-flash",name:"CogView-3 Flash (Free)",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","768x1344","864x1152","1344x768","1152x864","1440x720","720x1440"]}},{id:"glm-image",name:"GLM-Image",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1280x1280","1568x1056","1056x1568","1472x1088","1088x1472","1728x960","960x1728"]}},{id:"cogvideox-3",name:"CogVideoX-3",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["1080p"]}},{id:"cogvideox-flash",name:"CogVideoX Flash (Free)",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:6}},{id:"glm-tts",name:"GLM-TTS",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech"],voices:["tongtong","chuichui","xiaochen","jam","kazi","douji","luodo"],maxCharacters:1024,formats:["wav","pcm"]}},{id:"glm-tts-clone",name:"GLM-TTS Clone",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"voice_clone",mediaCapabilities:{type:"voice_clone",maxSampleDurationSeconds:30,maxSampleSizeMB:10,formats:["wav","mp3"]}},{id:"glm-asr-2512",name:"GLM-ASR-2512",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"stt",mediaCapabilities:{type:"stt",languages:["zh","en"],maxDurationSeconds:30,formats:["wav","mp3"]}},{id:"embedding-3",name:"Embedding-3",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:2048,maxTokens:3072}},{id:"embedding-2",name:"Embedding-2",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:1024,maxTokens:512}},{id:"rerank",name:"GLM Rerank",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"rerank",mediaCapabilities:{type:"rerank",maxDocuments:128,maxQueryLength:4096,maxDocumentLength:4096}},{id:"glm-ocr",name:"GLM-OCR",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"document_parsing",mediaCapabilities:{type:"document_parsing",supportedFormats:["pdf","jpg","png"],maxPageCount:100,maxFileSizeMB:50}}]},{id:"zhipu-openai",name:"\u667A\u8C31 GLM OpenAI (Zhipu)",group:"zhipu",transport:"openai-chat",baseUrl:"https://open.bigmodel.cn/api/paas/v4",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"glm-5.1",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,supportsToolStream:!0,builtinWebSearch:!0,builtinCodeInterpreter:!0},models:[{id:"glm-5.1",name:"GLM-5.1",contextWindow:2e5,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:6,costOutput:24,costCacheRead:1.3},{id:"glm-5",name:"GLM-5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-5-turbo",name:"GLM-5 Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1,costCacheRead:.1},{id:"glm-4.7",name:"GLM-4.7",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.6",name:"GLM-4.6",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.5-air",name:"GLM-4.5 Air",contextWindow:131072,maxOutput:98304,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1.5,costCacheRead:.1},{id:"glm-4-long",name:"GLM-4 Long",contextWindow:1e6,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.1},{id:"glm-4.7-flash",name:"GLM-4.7 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-4.5-flash",name:"GLM-4.5 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-5v-turbo",name:"GLM-5V Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:1},{id:"glm-4.6v",name:"GLM-4.6V",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:3.2},{id:"glm-4.6v-flash",name:"GLM-4.6V Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:0,costOutput:0}]},{id:"zhipu-coding",name:"\u667A\u8C31 GLM Coding (Zhipu)",group:"zhipu",transport:"openai-chat",baseUrl:"https://open.bigmodel.cn/api/coding/paas/v4",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"codegeex-4",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,supportsToolStream:!0},models:[{id:"codegeex-4",name:"CodeGeeX-4",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.1,costOutput:.1}]},{id:"minimax",name:"MiniMax",group:"minimax",transport:"anthropic-messages",baseUrl:"https://api.minimaxi.com/anthropic",apiKeyEnvVars:["MINIMAX_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"MiniMax-M2.7",omitZeroTemperature:!0,quirks:{filterImageBlocks:!0},models:[{id:"MiniMax-M2.7",name:"MiniMax M2.7",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2,costCacheRead:.06,costCacheWrite:.375},{id:"MiniMax-M2.7-highspeed",name:"MiniMax M2.7 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2,costCacheRead:.06,costCacheWrite:.375},{id:"MiniMax-M2.5",name:"MiniMax M2.5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6,costCacheRead:.03,costCacheWrite:.19},{id:"MiniMax-M2.5-highspeed",name:"MiniMax M2.5 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6,costCacheRead:.03,costCacheWrite:.19},{id:"MiniMax-M2.1",name:"MiniMax M2.1 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1-highspeed",name:"MiniMax M2.1 Highspeed (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2",name:"MiniMax M2 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.4},{id:"music-2.6",name:"MiniMax Music 2.6",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:300,formats:["mp3","wav"]}},{id:"music-cover",name:"MiniMax Music Cover",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"music",mediaCapabilities:{type:"music",operations:["cover"],maxDurationSeconds:300,formats:["mp3","wav"]}},{id:"MiniMax-Hailuo-2.3",name:"Hailuo 2.3",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["768P","1080P"]}},{id:"MiniMax-Hailuo-2.3-Fast",name:"Hailuo 2.3 Fast",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["768P","1080P"]}},{id:"MiniMax-Hailuo-02",name:"Hailuo 02",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["512P","768P","1080P"]}},{id:"image-01",name:"MiniMax Image 01",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["512x512","1024x1024","2048x2048"]}},{id:"image-01-live",name:"MiniMax Image 01 Live",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024"]}},{id:"speech-2.8-hd",name:"MiniMax Speech 2.8 HD",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],formats:["mp3","pcm","flac","wav","opus"]}},{id:"speech-2.8-turbo",name:"MiniMax Speech 2.8 Turbo",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],formats:["mp3","pcm","flac","wav","opus"]}}]},{id:"minimax-openai",name:"MiniMax (OpenAI)",group:"minimax",transport:"openai-chat",baseUrl:"https://api.minimaxi.com/v1",apiKeyEnvVars:["MINIMAX_API_KEY"],authType:"bearer",isAggregator:!1,omitZeroTemperature:!0,defaultModel:"MiniMax-M2.7",quirks:{supportsReasoningSplit:!0},models:[{id:"MiniMax-M2.7",name:"MiniMax M2.7",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2},{id:"MiniMax-M2.7-highspeed",name:"MiniMax M2.7 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2},{id:"MiniMax-M2.5",name:"MiniMax M2.5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.5-highspeed",name:"MiniMax M2.5 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1",name:"MiniMax M2.1 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1-highspeed",name:"MiniMax M2.1 Highspeed (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6}]},{id:"moonshot",name:"Moonshot (Kimi)",transport:"openai-chat",baseUrl:"https://api.moonshot.cn",apiKeyEnvVars:["MOONSHOT_API_KEY"],authType:"bearer",isAggregator:!1,omitZeroTemperature:!0,defaultModel:"kimi-k2.6",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,builtinWebSearch:!0},models:[{id:"kimi-k2.6",name:"Kimi K2.6",contextWindow:262144,maxOutput:262144,toolCall:!0,reasoning:!0,vision:!0,costInput:.95,costOutput:4,costCacheRead:.16},{id:"kimi-k2.5",name:"Kimi K2.5",contextWindow:262144,maxOutput:262144,toolCall:!0,reasoning:!0,vision:!0,costInput:.8,costOutput:4,costCacheRead:.2},{id:"moonshot-v1-128k",name:"Moonshot V1 128K",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.84,costOutput:.84}]},{id:"volcengine",name:"\u8C46\u5305 (Doubao/Volcengine)",transport:"volcengine-responses",baseUrl:"https://ark.cn-beijing.volces.com/api",apiKeyEnvVars:["ARK_API_KEY","DOUBAO_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"doubao-seed-2-0-lite-260215",models:[{id:"doubao-seed-2-0-pro-260215",name:"Doubao Seed 2.0 Pro",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-lite-260428",name:"Doubao Seed 2.0 Lite (0428)",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-lite-260215",name:"Doubao Seed 2.0 Lite",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-mini-260428",name:"Doubao Seed 2.0 Mini (0428)",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-mini-260215",name:"Doubao Seed 2.0 Mini",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-code-preview-260215",name:"Doubao Seed 2.0 Code Preview",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-1-8-251228",name:"Doubao Seed 1.8",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seedance-2-0-260128",name:"Doubao Seedance 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video","video2video","edit","merge","upscale"],maxDurationSeconds:15,resolutions:["480p","720p","1080p"],aspectRatios:["16:9","9:16","1:1"],fps:[24]}},{id:"doubao-seedance-2-0-fast-260128",name:"Doubao Seedance 2.0 Fast",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video","video2video","edit","merge","upscale"],maxDurationSeconds:15,resolutions:["480p","720p"],aspectRatios:["16:9","9:16","1:1"],fps:[24]}},{id:"doubao-seedream-5-0-260128",name:"Doubao Seedream 5.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["512x512","1024x1024","2K"]}},{id:"doubao-seedream-4-5-251128",name:"Doubao Seedream 4.5",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["512x512","1024x1024","2K"]}},{id:"doubao-seed3d-2-0-260328",name:"Doubao Seed3D 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["img2_3d"],outputFormats:["glb","obj","usd","usdz"]}},{id:"hyper3d-gen2-260112",name:"Hyper3D Gen2",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["text2_3d","img2_3d"],outputFormats:["glb","obj"]}},{id:"hitem3d-2-0-251223",name:"HiTem3D 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["img2_3d"],outputFormats:["glb","obj","usd"]}}]},{id:"openai",name:"OpenAI",transport:"openai-responses",baseUrl:"https://api.openai.com",apiKeyEnvVars:["OPENAI_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"gpt-5.5",quirks:{builtinWebSearch:!0,builtinCodeInterpreter:!0,builtinFileSearch:!0},models:[{id:"gpt-5.5",name:"GPT-5.5",contextWindow:105e4,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:30,costCacheRead:.5},{id:"gpt-5.4",name:"GPT-5.4",contextWindow:105e4,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:2.5,costOutput:15,costCacheRead:.25},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini",contextWindow:4e5,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:.75,costOutput:4.5,costCacheRead:.075},{id:"gpt-5.4-nano",name:"GPT-5.4 Nano",contextWindow:4e5,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:.2,costOutput:1.25,costCacheRead:.02},{id:"gpt-image-2",name:"GPT Image 2",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img","inpainting"],sizes:["1024x1024","1536x1024","1024x1536","auto"],transparentBackground:!0}},{id:"gpt-realtime-2",name:"GPT Realtime 2",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!0,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}},{id:"gpt-realtime-translate",name:"GPT Realtime Translate",contextWindow:128e3,maxOutput:16e3,toolCall:!1,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!1}},{id:"gpt-realtime-1.5",name:"GPT Realtime 1.5",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}},{id:"gpt-realtime-mini",name:"GPT Realtime Mini",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}}]},{id:"anthropic",name:"Anthropic",transport:"anthropic-messages",baseUrl:"https://api.anthropic.com",apiKeyEnvVars:["ANTHROPIC_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"claude-opus-4-7",models:[{id:"claude-opus-4-7",name:"Claude Opus 4.7",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5,costCacheWrite:6.25},{id:"claude-opus-4-6",name:"Claude Opus 4.6",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5,costCacheWrite:6.25},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",contextWindow:1e6,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:3,costOutput:15,costCacheRead:.3,costCacheWrite:3.75},{id:"claude-sonnet-4-5",name:"Claude Sonnet 4.5",contextWindow:2e5,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:3,costOutput:15,costCacheRead:.3,costCacheWrite:3.75},{id:"claude-haiku-4-5",name:"Claude Haiku 4.5",contextWindow:2e5,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:5,costCacheRead:.1,costCacheWrite:1.25}]},{id:"google",name:"Google Gemini",transport:"gemini-generatecontent",baseUrl:"https://generativelanguage.googleapis.com/v1beta",apiKeyEnvVars:["GOOGLE_API_KEY","GEMINI_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"gemini-3-flash-preview",quirks:{builtinWebSearch:!0,builtinCodeInterpreter:!0,builtinUrlContext:!0,builtinMapsGrounding:!0,builtinFileSearch:!0},models:[{id:"gemini-3.1-pro-preview",name:"Gemini 3.1 Pro",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,reasoningRequired:!0,vision:!0,costInput:2,costOutput:12},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:3},{id:"gemini-3.1-flash-lite",name:"Gemini 3.1 Flash-Lite",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.25,costOutput:1.5},{id:"gemini-3.1-flash-image-preview",name:"Gemini 3.1 Flash Image (Nano Banana 2)",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["1024x1024"]}},{id:"gemini-3-pro-image-preview",name:"Gemini 3 Pro Image (Nano Banana Pro)",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["1024x1024"]}},{id:"veo-3.1-generate-preview",name:"Veo 3.1 Standard",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P","4K"]}},{id:"veo-3.1-fast-generate-preview",name:"Veo 3.1 Fast",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P","4K"]}},{id:"veo-3.1-lite-generate-preview",name:"Veo 3.1 Lite",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P"]}},{id:"lyria-3-pro-preview",name:"Lyria 3 Pro",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:300,formats:["mp3"]}},{id:"lyria-3-clip-preview",name:"Lyria 3 Clip",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:30,formats:["mp3"]}},{id:"lyria-realtime-exp",name:"Lyria RealTime (Experimental)",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music_realtime",mediaCapabilities:{type:"music",operations:["realtime"],formats:["wav"]}},{id:"gemini-3.1-flash-tts-preview",name:"Gemini 3.1 Flash TTS",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:1,costOutput:20,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech"],maxCharacters:8e3,formats:["mp3","wav"]}},{id:"gemini-embedding-2",name:"Gemini Embedding 2 (Multimodal)",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:.2,costOutput:0,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:3072,maxTokens:8192}}]},{id:"openrouter",name:"OpenRouter",transport:"openai-chat",baseUrl:"https://openrouter.ai/api",apiKeyEnvVars:["OPENROUTER_API_KEY"],authType:"bearer",isAggregator:!0,defaultModel:"anthropic/claude-opus-4.7",extraHeaders:{"HTTP-Referer":"https://claw.bot","X-Title":"XiaozhiClaw"},models:[{id:"anthropic/claude-opus-4.7",name:"Claude Opus 4.7 (via OpenRouter)",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5},{id:"anthropic/claude-opus-4.6",name:"Claude Opus 4.6 (via OpenRouter)",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5},{id:"deepseek/deepseek-v4-flash",name:"DeepSeek V4 Flash (via OpenRouter)",contextWindow:1048576,maxOutput:393216,toolCall:!0,reasoning:!0,vision:!1,costInput:.14,costOutput:.28,costCacheRead:.028}]},{id:"qwen-coding",name:"Alibaba Qwen (Coding Plan)",transport:"anthropic-messages",baseUrl:"https://coding.dashscope.aliyuncs.com/apps/anthropic",apiKeyEnvVars:["DASHSCOPE_API_KEY","QWEN_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"qwen3-coder-plus",models:[{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus (Coding Plan)",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!1},{id:"qwen3-coder-flash",name:"Qwen3 Coder Flash (Coding Plan)",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!1}]}];import{existsSync as fg,mkdirSync as hg,readFileSync as yg,writeFileSync as bg}from"node:fs";import{join as kg}from"node:path";var Tg="https://models.dev/api.json",wg=3e4,vg=1440*60*1e3,xg=300*1e3,Sg={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"},en=class{cache=null;cacheDir;cacheFile;ttlMs;fetching=!1;lastFetchAttempt=0;constructor(e){this.cacheDir=e?.cacheDir??Oe(),this.cacheFile=kg(this.cacheDir,"model_catalog.json"),this.ttlMs=e?.ttlMs??vg}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(!fg(this.cacheFile))return;let e=yg(this.cacheFile,"utf8"),t=JSON.parse(e);if(!t.fetchedAt||!t.data)return;this.cache={fetchedAt:t.fetchedAt,providers:Ja(t.data)}}catch{}}saveToDisk(e){try{hg(this.cacheDir,{recursive:!0});let t=JSON.stringify({fetchedAt:Date.now(),data:e},null,0);bg(this.cacheFile,t,"utf8")}catch{}}backgroundFetch(){this.fetching||Date.now()-this.lastFetchAttempt<xg||(this.fetching=!0,this.fetchRemote().finally(()=>{this.fetching=!1}))}async fetchRemote(){this.lastFetchAttempt=Date.now();try{let e=await fetch(Tg,{signal:AbortSignal.timeout(wg),headers:{Accept:"application/json"}});if(!e.ok)return!1;let t=await e.json(),n=Ja(t);return n.size===0?!1:(this.cache={fetchedAt:Date.now(),providers:n},this.saveToDisk(t),!0)}catch{return!1}}};function Ja(r){let e=new Map;if(!r||typeof r!="object")return e;for(let[t,n]of Object.entries(r)){let o=Sg[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=Rg(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 Rg(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 _g={claude:"anthropic",gemini:"google",doubao:"volcengine"},Ct=class{builtins=new Map;catalog;overrides=new Map;constructor(e){for(let t of Gr)this.builtins.set(t.id,t);this.catalog=e?.catalog??new en}applyOverride(e,t){this.overrides.set(e,{...this.overrides.get(e),...t})}getProvider(e){let t=_g[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 Cg=/^https?:\/\/(127\.0\.0\.1|localhost|0\.0\.0\.0|\[::1\])(:\d+)?/i;function L(r){return Cg.test(r)}async function le(r,e){if(r.startsWith("data:")||!L(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||Ag(r)};base64,${n.toString("base64")}`}function Ag(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 Hr=new Set([429,529,502,503,504]),Ue=9e4;function Ne(r){let e=Math.min(1e3*Math.pow(2,r-1),3e4),t=Math.random()*.25*e;return e+t}function ze(r){return r!=null&&Hr.has(r)}function je(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 Ve(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 At=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:Pg(await Mg(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 je(Ne(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(!ze(Ve(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()},Ue)};try{i();let a=e.getReader();try{for(;;){let{done:c,value:d}=await a.read();if(c)break;if(s.signal.aborted)throw new Error("Stream idle timeout");i(),n+=t.decode(d,{stream:!0});let l;for(;(l=n.indexOf(`
34
- `))!==-1;){let 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:Ig(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(`
35
- `))!==-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 Ig(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 Mg(r){return r.some(t=>t.audioUrls?.some(L)||t.imageUrls?.some(L))?Promise.all(r.map(async t=>{if(t.role!=="user")return t;let n={};return t.audioUrls?.some(L)&&(n.audioUrls=await Promise.all(t.audioUrls.map(o=>L(o)?le(o):Promise.resolve(o)))),t.imageUrls?.some(L)&&(n.imageUrls=await Promise.all(t.imageUrls.map(o=>L(o)?le(o):Promise.resolve(o)))),Object.keys(n).length>0?{...t,...n}:t})):r}function Pg(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 je(Ne(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(!ze(Ve(c))&&!p||d===3)throw c}}}async buildRequestBody(e){let t={model:e.model,input:Og(await Eg(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()},Ue)};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(`
36
- `))!==-1;){let g=n.slice(0,m).trim();if(n=n.slice(m+1),!g){o="";continue}if(!g.startsWith(":")){if(g.startsWith("event:")){o=g.slice(6).trim();continue}if(g.startsWith("data:")){let f=g.slice(5).trim();if(f==="[DONE]")return;let 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 Eg(r){return r.some(t=>t.audioUrls?.some(L)||t.imageUrls?.some(L))?Promise.all(r.map(async t=>{if(t.role!=="user")return t;let n={};return t.audioUrls?.some(L)&&(n.audioUrls=await Promise.all(t.audioUrls.map(o=>L(o)?le(o):Promise.resolve(o)))),t.imageUrls?.some(L)&&(n.imageUrls=await Promise.all(t.imageUrls.map(o=>L(o)?le(o):Promise.resolve(o)))),Object.keys(n).length>0?{...t,...n}:t})):r}function Og(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 Dg=18e4,Lg=3e5,$g=64e3,Ug="[Tool execution failed; output not available during conversation recovery]",Ng="interleaved-thinking-2025-05-14",jg="context-1m-2025-08-07",Fg="token-efficient-tools-2026-03-28",Bg="prompt-caching-scope-2026-01-05",Wg="pdfs-2024-09-25";function Gg(r){let e=r.toLowerCase();return e.includes("opus-4-6")||e.includes("opus-4-7")||e.includes("sonnet-4-6")}function Hg(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(jg),n.push(Wg),e&&!o.includes("haiku")&&n.push(Ng),t&&n.push(Fg),n.push(Bg);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??Dg,this.streamIdleTimeoutMs=e.streamIdleTimeoutMs??Ue,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=Kg(e.messages),i=await Jg(s),{system:a,messages:c}=Yg(i,this.quirks,e.model),d=qg(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(Xg);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(Gg(e.model))u.thinking={type:"adaptive"};else{let y=Vg(e.reasoning.effort,e.maxTokens);u.thinking={type:"enabled",budget_tokens:Math.min(p-1,y)}}let m=Hg(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 je(Ne(y),n);try{yield*this.streamWithWatchdog(o,g,u,n);return}catch(k){f=k instanceof Error?k:new Error(String(k));let w=Qg(f.message),C=w!==null&&Hr.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=Zg({...n,stream:!1}),i=AbortSignal.timeout(Lg),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:Xa(o)})}async*parseSSEStream(e,t,n){let o=new TextDecoder,s="",i="",a=new Map,c={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheCreationTokens:0,reasoningTokens:0};for await(let d of e){if(t(),n())break;s+=o.decode(d,{stream:!0});let l;for(;(l=s.indexOf(`
37
- `))!==-1;){let 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&&(Ya(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&&(Ya(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:Xa(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 Ya(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 Xa(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 zr={high:16e3,medium:8e3,low:4e3};function Vg(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 zr.high}return zr[r]??zr.high}function qg(r,e){if(r)return e?[{type:"text",text:r,cache_control:{type:"ephemeral"}}]:r}function Kg(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 Jg(r){return r.some(t=>t.imageUrls?.some(L)||t.fileIds?.some(n=>L(n.id)))?Promise.all(r.map(async t=>{if(t.role!=="user")return t;let n={};return t.imageUrls?.some(L)&&(n.imageUrls=await Promise.all(t.imageUrls.map(o=>L(o)?le(o):Promise.resolve(o)))),t.fileIds?.some(o=>L(o.id))&&(n.fileIds=await Promise.all(t.fileIds.map(async o=>{if(!L(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 Yg(r,e={},t){let n,o=[];for(let s of r){if(s.role==="system"){n=n?`${n}
38
-
39
- ${s.content??""}`:s.content??"";continue}if(s.role==="user"){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===Ug,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 Xg(r){return{name:r.function.name,description:r.function.description,input_schema:r.function.parameters??{type:"object",properties:{}}}}function Qg(r){let e=/Anthropic API error (\d{3})/.exec(r);return e?parseInt(e[1],10):null}function Zg(r){let e=typeof r.max_tokens=="number"?r.max_tokens:8192,t=Math.min(e,$g),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 je(Ne(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(!ze(Ve(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 ef(t.messages),o={model:t.model,input:tf(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()},Ue)};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(`
40
- `))!==-1;){let g=n.slice(0,m).trim();if(n=n.slice(m+1),!g){o="";continue}if(!g.startsWith(":")){if(g.startsWith("event:")){o=g.slice(6).trim();continue}if(g.startsWith("data:")){let f=g.slice(5).trim();if(f==="[DONE]")return;let 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 ef(r){return r.some(t=>t.imageUrls?.some(L)||t.videoUrls?.some(L)||t.audioUrls?.some(L))?Promise.all(r.map(async t=>{if(t.role!=="user")return t;let n={};return t.imageUrls?.some(L)&&(n.imageUrls=await Promise.all(t.imageUrls.map(o=>L(o)?le(o):Promise.resolve(o)))),t.videoUrls?.some(L)&&(n.videoUrls=await Promise.all(t.videoUrls.map(o=>L(o)?le(o):Promise.resolve(o)))),t.audioUrls?.some(L)&&(n.audioUrls=await Promise.all(t.audioUrls.map(o=>L(o)?le(o):Promise.resolve(o)))),Object.keys(n).length>0?{...t,...n}:t})):r}function tf(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}Xo();var nf=[{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 of(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 je(Ne(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(!ze(Ve(a))&&!l)throw a;if(c===3){if((l||ze(Ve(a)))&&!e.streamRequired)try{yield*this.nonStreamingFallback(e,t,n);return}catch{throw a}throw a}}}}async buildRequestBody(e){let t=await rf(e.messages),{systemInstruction:n,contents:o}=sf(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=nf,e.cachedContent&&(s.cachedContent=e.cachedContent),s}buildTools(e){let t=[];if(e.tools&&e.tools.length>0){let n=e.tools.map(af);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=of(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()},Ue)};try{i();let a=e.getReader();try{for(;;){let{done:c,value:d}=await a.read();if(c)break;if(s.signal.aborted)throw new Error("Stream idle timeout");i(),n+=t.decode(d,{stream:!0});let l;for(;(l=n.indexOf(`
41
- `))!==-1;){let 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:`
32
+ `)}};import{randomUUID as de}from"node:crypto";eo();Jr();var De=class{supportedTypes=["image","video","3d"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??18e4}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"video":return this.generateVideo(e,t,n);case"3d":return this.generate3D(e,t,n);default:throw new Error(`VolcengineMediaTransport: unsupported mediaType "${e.mediaType}"`)}}canHandle(e){return!!this.supportedTypes.includes(e.mediaType)}async generateImage(e,t,n){let o=Date.now(),s=`${this.baseUrl}/v3/images/generations`,i={model:e.model,prompt:e.prompt,size:e.size??"2K",n:e.n??1,response_format:"url",sequential_image_generation:"disabled",watermark:!0};e.imageUrl&&(i.image=e.imageUrl),e.referenceImages&&e.referenceImages.length>0&&(i.image_urls=e.referenceImages),e.style&&(i.style=e.style),e.quality&&(i.quality=e.quality),e.seed!==void 0&&(i.seed=e.seed),e.guidanceScale!==void 0&&(i.guidance_scale=e.guidanceScale),e.enhancePrompt!==void 0&&(i.enhance_prompt=e.enhancePrompt),e.streamImage&&(i.stream=!0);let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let l=await a.text().catch(()=>"");throw new Error(`Volcengine image API error ${a.status}: ${l}`)}return e.streamImage&&a.body?this.parseStreamingImage(a.body,e,o):{mediaUrls:((await a.json()).data??[]).map(l=>l.url).filter(l=>!!l),model:e.model,size:e.size??"1024x1024",durationMs:Date.now()-o}}async parseStreamingImage(e,t,n){let o=new TextDecoder,s="",i="",a=e.getReader();try{for(;;){let{done:c,value:d}=await a.read();if(c)break;s+=o.decode(d,{stream:!0});let l;for(;(l=s.indexOf(`
33
+ `))!==-1;){let u=s.slice(0,l).trim();if(s=s.slice(l+1),!u||u.startsWith(":")||!u.startsWith("data:"))continue;let p=u.slice(5).trim();if(p==="[DONE]")break;try{let f=JSON.parse(p).data?.[0]?.url;f&&(i=f,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,x=(e.imageRoles?.length??0)>0;if(k||w||x){if(e.prompt&&l.push({type:"text",text:e.prompt}),e.referenceImages?.length)for(let S=0;S<e.referenceImages.length;S++){let b=e.imageRoles?.[S]??"reference_image";l.push({type:"image_url",image_url:{url:e.referenceImages[S]},role:b})}if(k)for(let S of e.referenceVideos)l.push({type:"video_url",video_url:{url:S},role:"reference_video"});if(w)for(let S of e.referenceAudios)l.push({type:"audio_url",audio_url:{url:S},role:"reference_audio"})}else if(e.referenceImages?.length){for(let S of e.referenceImages)l.push({type:"image_url",image_url:{url:S}});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(k=>({type:k})));let p=await this.submitTask(s,u,t,n),g=await this.pollTask(`${this.baseUrl}/v3/contents/generations/tasks/${p}`,t,n,e.onProgress,p),f=[],m=g.content;typeof m?.video_url=="string"&&f.push(m.video_url);let y=typeof m?.last_frame_url=="string"?m.last_frame_url:void 0;return{mediaUrls:f,model:e.model,durationMs:Date.now()-o,lastFrameUrl:y,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[,f]of Object.entries(p))typeof f=="string"&&/^https?:\/\//.test(f)&&u.push(f);let g=l.output;if(g?.model_urls){let f=g.model_urls;for(let m of Object.values(f))m&&!u.includes(m)&&u.push(m)}if(u.length===0){let f=Object.keys(l),m=p?Object.keys(p):[],y=g?Object.keys(g):[];console.error(`[volcengine-3d] No media URLs found. Response keys: [${f}], content keys: [${m}], output keys: [${y}]`);let k=l.data;if(k?.content){let w=k.content;for(let[,x]of Object.entries(w))typeof x=="string"&&/^https?:\/\//.test(x)&&u.push(x)}}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:g?Object.keys(g):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 g=await c.text().catch(()=>"");throw new Error(`Volcengine task poll error ${c.status}: ${g}`)}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 g=d.error?.message??"Task failed";throw new Error(`Volcengine task failed: ${g}`)}a++;let u=Date.now()-(i-6e5),p=Math.min(95,Math.round(u/6e5*100));o?.(p,l??"running",s),await new Promise(g=>setTimeout(g,3e3))}throw new Error("Volcengine task timed out after polling")}};import{writeFileSync as Cg,mkdirSync as Ag}from"node:fs";import{join as gl}from"node:path";import{randomUUID as Pg}from"node:crypto";import{homedir as Sg}from"node:os";import{join as Z}from"node:path";import{existsSync as Ya,readdirSync as Rg,readFileSync as _g}from"node:fs";var be=".qlogicagent";function K(){return process.env.QLOGICAGENT_HOME||Z(Sg(),be)}function to(){return Z(K(),"sessions")}function Xa(r){return Z(to(),r)}function Qa(){return Z(K(),"plugins")}function Dt(){return Z(K(),"skills")}function Lt(){return Z(K(),"settings.json")}function Le(){return Z(K(),"cache")}function Za(){return Z(K(),"debug-logs")}function el(r){let e=Z(K(),"checkpoints");return r?Z(e,r):e}function tl(){return Z(K(),"plugin-cache")}function nl(){return Z(K(),"mcp.json")}function ol(){return Z(K(),"marketplace.json")}function rl(){return Z(K(),"workflows")}function sl(){return Z(K(),"rules")}function $e(r){return Z(r??process.cwd(),be)}function il(r){return Z($e(r),"workflows")}function kt(r){return Z($e(r),"skills")}function al(r){return Z($e(r),"INSTRUCTIONS.md")}function ll(r){return Z($e(r),"instructions")}function cl(r){return Z($e(r),"plans")}function dl(r){return Z($e(r),"rules")}function ul(r){return Z($e(r),"sessions")}function pl(r){return Z(r,be,"hooks")}function ml(r){let e=to();if(!Ya(e))return[];let t=new Set;try{let n=Rg(e,{withFileTypes:!0});for(let o of n){if(!o.isDirectory())continue;let s=Z(e,o.name,"state.json");try{let i=_g(s,"utf8"),c=JSON.parse(i).metadata?.cwd;c&&c!==r&&Ya(Z(c,be,"skills"))&&t.add(c)}catch{}}}catch{}return[...t]}var Ig=18e4,rn=class{supportedTypes=["image","tts"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??Ig}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 g=await c.text().catch(()=>"");throw new Error(`OpenAI TTS API error ${c.status}: ${g}`)}let d=Buffer.from(await c.arrayBuffer()),l=gl(Le(),"tts");Ag(l,{recursive:!0});let u=`openai-tts-${Pg()}.mp3`,p=gl(l,u);return Cg(p,d),{mediaUrls:[`file://${p}`],model:e.model||"tts-1",durationMs:Date.now()-o,billingUnit:"per_character",billingQuantity:s.length}}};var wt=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 g=await a.text().catch(()=>"");throw new Error(`MiniMax music error ${a.status}: ${g}`)}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 g=e.imageRoles.indexOf("first_frame"),f=e.imageRoles.indexOf("last_frame");i.first_frame_image=e.referenceImages[g],i.last_frame_image=e.referenceImages[f]}else if(u){let g=e.imageRoles.indexOf("first_frame");i.first_frame_image=e.referenceImages[g]}else i.subject_reference=e.referenceImages.map((g,f)=>({type:"character",image:g}))}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 g=await a.text().catch(()=>"");throw new Error(`MiniMax video poll error ${a.status}: ${g}`)}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 g;if(c.file_id)try{g=await this.getFileDownloadUrl(c.file_id,t,n)}catch{}return{fileId:c.file_id,downloadUrl:g,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(g=>setTimeout(g,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 hl,mkdirSync as yl}from"node:fs";import{join as oo}from"node:path";import{randomUUID as bl}from"node:crypto";import{writeFileSync as Mg,mkdirSync as Eg}from"node:fs";import{join as fl}from"node:path";import{randomUUID as Og}from"node:crypto";var no=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 is(r,e,t){let n=t.durationSeconds??30,o=Date.now(),s=new no(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 m=Date.now()-o,y=n*1e3,k=Math.min(95,Math.round(10+m/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),u=Dg(l,48e3,2,16),p=fl(Le(),"gemini-music-realtime");Eg(p,{recursive:!0});let g=`lyria-rt-${Og()}.wav`,f=fl(p,g);return Mg(f,u),t.onProgress?.(100,"completed"),{filePath:`file://${f}`,durationMs:Date.now()-o}}finally{s.close()}}function Dg(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 Lg=18e4,$g=1e4,as=6e5,sn=class{supportedTypes=["image","video","music","music_realtime","tts","embedding"];apiBase;timeoutMs;constructor(e){this.apiBase=e.baseUrl.replace(/\/openai\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??Lg}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 u=l;e.onProgress?.(5,"submitted",u);let f=(await this.pollOperation(l,t,n,e.onProgress,u)).response?.generateVideoResponse?.generatedSamples??[],m=[];for(let y of f)y.video?.uri&&m.push(y.video.uri);return{mediaUrls:m,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 is(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()+as;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-as),u=Math.min(95,Math.round(l/as*100));o?.(u,"running",s),await new Promise(p=>setTimeout(p,$g))}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=oo(Le(),"gemini-images");yl(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-${bl()}.${i}`,c=oo(n,a);hl(c,Buffer.from(s.inlineData.data,"base64")),t.push(`file://${c}`)}return t}extractInlineAudio(e,t){let n=[],o=oo(Le(),t);yl(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"?Ug(c,24e3,1,16):c,l=`gemini-${bl()}.${a==="pcm"?"wav":a}`,u=oo(o,l);hl(u,d),n.push(`file://${u}`)}return n}};function Ug(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 ro=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 f=await l.text().catch(()=>"");throw new Error(`DashScope TTS submit error ${l.status}: ${f}`)}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 f=this.extractMediaUrl(u);return{mediaUrls:f?[f]:[],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 Ng(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 f=e.imageRoles.indexOf("first_frame"),m=e.imageRoles.indexOf("last_frame");f>=0&&(i.img_url=e.referenceImages[f]),m>=0&&(i.tail_image_url=e.referenceImages[m]);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 f=await l.text().catch(()=>"");throw new Error(`DashScope video submit error ${l.status}: ${f}`)}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 Ng(r){return new Promise(e=>setTimeout(e,r))}import{writeFileSync as jg,mkdirSync as Fg}from"node:fs";import{join as kl}from"node:path";import{randomUUID as Bg}from"node:crypto";var Gg=18e4,Wg=3e3,so=6e5,Hg=new Set(["glm-image"]),an=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??Gg}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 Hg.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 f=await c.text().catch(()=>"");throw new Error(`Zhipu TTS API error ${c.status}: ${f}`)}let d=Buffer.from(await c.arrayBuffer()),l=kl(Le(),"tts");Fg(l,{recursive:!0});let u=e.audioFormat??"wav",p=`zhipu-tts-${Bg()}.${u}`,g=kl(l,p);return jg(g,d),{mediaUrls:[`file://${g}`],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()+so,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-so);o?.(Math.min(95,Math.round(d/so*100)),c.task_status??"running",e),await new Promise(l=>setTimeout(l,Wg))}throw new Error(`Zhipu async task timed out after ${so/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 ln=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=qg(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?zg(n):void 0,a=s.find(c=>c.mediaType!==t?!1:!i||!c.mediaCapabilities?!0:Vg(c.mediaCapabilities,i));if(a)return{providerId:e,providerDef:o,modelInfo:a,mediaType:t}}};function zg(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 Vg(r,e){return!("operations"in r)||!r.operations?!0:r.operations.includes(e)}function qg(r){let e=r.baseUrl;switch(r.id){case"volcengine":return new De({baseUrl:e});case"openai":return new rn({baseUrl:e});case"minimax":return new wt({baseUrl:e});case"google":return new sn({baseUrl:e});case"qwen":return new ro({baseUrl:e});case"zhipu":return new an({baseUrl:e.replace(/\/api\/anthropic\/?$/,"/api/paas/v4")});case"zhipu-openai":case"zhipu-coding":return new an({baseUrl:e.replace(/\/api\/coding\/paas\/v4\/?$/,"/api/paas/v4")});default:return}}var ls=[{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 Kg,mkdirSync as Jg,readFileSync as Yg,writeFileSync as Xg}from"node:fs";import{join as Qg}from"node:path";var Zg="https://models.dev/api.json",ef=3e4,tf=1440*60*1e3,nf=300*1e3,of={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"},cn=class{cache=null;cacheDir;cacheFile;ttlMs;fetching=!1;lastFetchAttempt=0;constructor(e){this.cacheDir=e?.cacheDir??Le(),this.cacheFile=Qg(this.cacheDir,"model_catalog.json"),this.ttlMs=e?.ttlMs??tf}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(!Kg(this.cacheFile))return;let e=Yg(this.cacheFile,"utf8"),t=JSON.parse(e);if(!t.fetchedAt||!t.data)return;this.cache={fetchedAt:t.fetchedAt,providers:wl(t.data)}}catch{}}saveToDisk(e){try{Jg(this.cacheDir,{recursive:!0});let t=JSON.stringify({fetchedAt:Date.now(),data:e},null,0);Xg(this.cacheFile,t,"utf8")}catch{}}backgroundFetch(){this.fetching||Date.now()-this.lastFetchAttempt<nf||(this.fetching=!0,this.fetchRemote().finally(()=>{this.fetching=!1}))}async fetchRemote(){this.lastFetchAttempt=Date.now();try{let e=await fetch(Zg,{signal:AbortSignal.timeout(ef),headers:{Accept:"application/json"}});if(!e.ok)return!1;let t=await e.json(),n=wl(t);return n.size===0?!1:(this.cache={fetchedAt:Date.now(),providers:n},this.saveToDisk(t),!0)}catch{return!1}}};function wl(r){let e=new Map;if(!r||typeof r!="object")return e;for(let[t,n]of Object.entries(r)){let o=of[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??{},g=l.modalities??{},f=Array.isArray(g.input)?g.input:[],m=Array.isArray(g.output)?g.output:[],y=rf(m,f,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||f.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:y})}}return e}function rf(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 sf={claude:"anthropic",gemini:"google",doubao:"volcengine"},$t=class{builtins=new Map;catalog;overrides=new Map;constructor(e){for(let t of ls)this.builtins.set(t.id,t);this.catalog=e?.catalog??new cn}applyOverride(e,t){this.overrides.set(e,{...this.overrides.get(e),...t})}getProvider(e){let t=sf[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 af={".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",".avi":"video/x-msvideo",".mkv":"video/x-matroska",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".aac":"audio/aac",".flac":"audio/flac",".m4a":"audio/mp4",".opus":"audio/opus",".pdf":"application/pdf",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".txt":"text/plain",".csv":"text/csv",".json":"application/json"};function lf(r){let e=r.slice(r.lastIndexOf(".")).toLowerCase();return af[e]||"application/octet-stream"}var cf=/^https?:\/\/(127\.0\.0\.1|localhost|0\.0\.0\.0|\[::1\])(:\d+)?/i;function df(r){return cf.test(r)}async function Tl(r,e,t,n){if(r.startsWith("data:")||!df(r))return r;let o=await fetch(r,{signal:n});if(!o.ok)throw new Error(`Failed to fetch local media ${r}: ${o.status}`);let s=Buffer.from(await o.arrayBuffer()),i=uf(r),a=o.headers.get("content-type")||lf(i);return(await e.uploadFile(s,i,a,t,n)).url}function uf(r){try{let t=new URL(r).pathname.split("/").pop();return t&&t.includes(".")?t:"upload"}catch{return"upload"}}var pf=/^https?:\/\/(127\.0\.0\.1|localhost|0\.0\.0\.0|\[::1\])(:\d+)?/i;function F(r){return pf.test(r)}async function Ue(r,e){return Tl(r,e.uploadAdapter,e.apiKey,e.signal)}var mf=20*1024*1024;async function io(r,e){if(r.startsWith("data:")||!F(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());if(n.byteLength>mf)throw new Error(`Local media too large for base64 (${(n.byteLength/1024/1024).toFixed(1)}MB). Use file upload API instead.`);return`data:${t.headers.get("content-type")||e||gf(r)};base64,${n.toString("base64")}`}function gf(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 cs=new Set([429,529,502,503,504]),We=9e4;function He(r){let e=Math.min(1e3*Math.pow(2,r-1),3e4),t=Math.random()*.25*e;return e+t}function Ye(r){return r!=null&&cs.has(r)}function ze(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 Xe(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 ao(r){return r.toLowerCase().startsWith("gpt-5")}function lo(r){return r.toLowerCase().includes("5.4-nano")}function dn(r){return/^o[1-4](-|$)/.test(r.toLowerCase())}var Ut=class{baseUrl;extraHeaders;timeoutMs;supportsStreamOptions;omitZeroTemperature;quirks;fileUploadAdapter;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??{},this.fileUploadAdapter=e.fileUploadAdapter}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:yf(await hf(e.messages,this.fileUploadAdapter,t,n),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 m=a.tools;this.quirks.builtinCodeInterpreter?m.push({type:"web_search",web_search:{enable:!0,search_result:!0}}):(m.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=ao(e.model);if(e.temperature!==void 0&&(this.omitZeroTemperature&&e.temperature===0||(p||!dn(e.model)&&!l&&!u)&&(a.temperature=e.temperature)),e.topP!==void 0&&(p||!dn(e.model)&&!l&&!u)&&(a.top_p=e.topP),e.maxTokens!==void 0&&(p||dn(e.model)||e.model.startsWith("kimi-k2")?a.max_completion_tokens=e.maxTokens:a.max_tokens=e.maxTokens),e.reasoning)if(p){let m=e.reasoning.effort==="minimal"?"none":e.reasoning.effort;lo(e.model)&&(m==="high"||m==="xhigh")&&(m="medium"),a.reasoning={effort:m}}else if(dn(e.model))a.reasoning_effort=e.reasoning.effort;else if(this.quirks.useEffortInsteadOfBudget){a.thinking={type:"enabled"};let m=this.quirks.maxReasoningEffort??"high",y=e.reasoning.effort??"high";a.reasoning_effort=y==="low"||y==="medium"?"high":m}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 g={"Content-Type":"application/json",Authorization:`Bearer ${t}`,...this.extraHeaders},f=null;for(let m=0;m<=3;m++){if(n?.aborted)throw new Error("Request aborted");m>0&&f&&await ze(He(m),n);try{yield*this.fetchAndStream(i,g,a,n);return}catch(y){f=y instanceof Error?y:new Error(String(y));let k=f.message.includes("Stream idle timeout");if(!Ye(Xe(f))&&!k||m===3)throw f}}}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()},We)};try{i();let a=e.getReader();try{for(;;){let{done:c,value:d}=await a.read();if(c)break;if(s.signal.aborted)throw new Error("Stream idle timeout");i(),n+=t.decode(d,{stream:!0});let l;for(;(l=n.indexOf(`
34
+ `))!==-1;){let u=n.slice(0,l).trim();if(n=n.slice(l+1),!u||u.startsWith(":")||!u.startsWith("data: "))continue;let p=u.slice(6);if(p==="[DONE]")return;let g;try{g=JSON.parse(p)}catch{continue}yield*this.processChunk(g)}}}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:ff(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 f=await l.text().catch(()=>"");throw new Error(`FIM API error ${l.status}: ${f.slice(0,500)}`)}if(!l.body)throw new Error("FIM API returned no response body");let u=new TextDecoder,p="",g=l.body.getReader();try{for(;;){let{done:f,value:m}=await g.read();if(f)break;p+=u.decode(m,{stream:!0});let y;for(;(y=p.indexOf(`
35
+ `))!==-1;){let k=p.slice(0,y).trim();if(p=p.slice(y+1),!k||k.startsWith(":")||!k.startsWith("data: "))continue;let w=k.slice(6);if(w==="[DONE]")return;let x;try{x=JSON.parse(w)}catch{continue}for(let S of x.choices??[])S.text&&(yield{type:"delta",text:S.text}),S.finish_reason&&(yield{type:"done",finishReason:S.finish_reason})}}}finally{g.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 ff(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 hf(r,e,t,n){return r.some(s=>s.audioUrls?.some(F)||s.imageUrls?.some(F))?Promise.all(r.map(async s=>{if(s.role!=="user"&&s.role!=="tool")return s;let i={};if(s.role==="user"&&s.audioUrls?.some(F)&&(i.audioUrls=await Promise.all(s.audioUrls.map(a=>F(a)?io(a):Promise.resolve(a)))),s.imageUrls?.some(F)){if(!e||!t)throw new Error("FileUploadAdapter required for local image URLs. Configure OSS_ACCESS_KEY_ID/OSS_ACCESS_KEY_SECRET or QLOGICAGENT_HUB_URL.");i.imageUrls=await Promise.all(s.imageUrls.map(a=>F(a)?Ue(a,{uploadAdapter:e,apiKey:t,signal:n}):Promise.resolve(a)))}return Object.keys(i).length>0?{...s,...i}:s})):r}function yf(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,u=t.audioFormat??"mp3";if(d.startsWith("data:")){let p=/^data:audio\/([^;]+);base64,(.+)$/.exec(d);p&&(u=p[1]==="mpeg"?"mp3":p[1],l=p[2])}c.push({type:"input_audio",input_audio:{data:l,format:u}})}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}if(t.role==="tool"){if(t.imageUrls&&t.imageUrls.length>0&&!e.filterImageBlocks){let n=[];t.content&&n.push({type:"text",text:t.content});for(let o of t.imageUrls)n.push({type:"image_url",image_url:{url:o}});return{role:"tool",content:n,tool_call_id:t.tool_call_id??""}}return{role:"tool",content:t.content??"",tool_call_id:t.tool_call_id??""}}return{role:t.role,content:t.content??""}})}var co=class{baseUrl;extraHeaders;timeoutMs;quirks;fileUploadAdapter;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??{},this.fileUploadAdapter=e.fileUploadAdapter}async*stream(e,t,n){let s=/\/v\d+$/.test(this.baseUrl)?`${this.baseUrl}/responses`:`${this.baseUrl}/v1/responses`,i=await this.buildRequestBody(e,t,n),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 ze(He(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(!Ye(Xe(c))&&!u||d===3)throw c}}}async buildRequestBody(e,t,n){let o={model:e.model,input:kf(await bf(e.messages,this.fileUploadAdapter,t,n)),stream:!0};if(e.conversationId?o.conversation=e.conversationId:e.previousResponseId&&(o.previous_response_id=e.previousResponseId),e.store!==void 0&&(o.store=e.store),e.instructions&&(o.instructions=e.instructions),e.structuredOutput&&(e.structuredOutput.mode==="json_object"?o.text={format:{type:"json_object"}}:o.text={format:{type:"json_schema",name:e.structuredOutput.name,strict:e.structuredOutput.strict??!0,schema:e.structuredOutput.schema}}),e.tools&&e.tools.length>0&&(o.tools=e.tools.map(s=>({type:"function",name:s.function.name,description:s.function.description,parameters:s.function.parameters,strict:!0}))),e.toolChoice!==void 0&&(typeof e.toolChoice=="string"?o.tool_choice=e.toolChoice:o.tool_choice={type:e.toolChoice.type,name:e.toolChoice.name}),e.temperature!==void 0&&(o.temperature=e.temperature),e.topP!==void 0&&(o.top_p=e.topP),e.maxTokens!==void 0&&(o.max_output_tokens=e.maxTokens),e.reasoning){let s=e.reasoning.effort==="minimal"?"none":e.reasoning.effort;lo(e.model)&&(s==="high"||s==="xhigh")&&(s="medium");let i={effort:s};i.summary="auto",i.generate_summary="auto",o.reasoning=i}if(e.prediction&&ao(e.model)&&(o.prediction=e.prediction),o.truncation="auto",e.promptCacheKey&&(o.prompt_cache_key=e.promptCacheKey),e.promptCacheRetention&&(o.prompt_cache_retention=e.promptCacheRetention),e.serviceTier&&(o.service_tier=e.serviceTier),e.reasoning?.includeEncryptedReasoning&&(e.store===void 0&&(o.store=!1),o.include=["reasoning.encrypted_content"]),e.contextManagement&&(o.context_management=e.contextManagement.edits.map(s=>{let i={type:s.type};return s.type==="clear_thinking"&&s.keep!==void 0?i.keep=s.keep:s.type==="clear_tool_uses"&&(s.trigger&&(i.trigger=s.trigger),s.keep&&(i.keep=s.keep),s.excludeTools&&(i.exclude_tools=s.excludeTools),s.clearToolInput!==void 0&&(i.clear_tool_input=s.clearToolInput)),i})),!e.disableBuiltinTools){let s=o.tools??[],i=o.include??[];if(e.openaiBuiltinTools&&e.openaiBuiltinTools.length>0){for(let c of e.openaiBuiltinTools)s.push({...c});let a=new Set(e.openaiBuiltinTools.map(c=>c.type));a.has("web_search_preview")&&i.push("web_search_call.action.sources"),a.has("file_search")&&i.push("file_search_call.results"),a.has("code_interpreter")&&i.push("code_interpreter_call.outputs"),a.has("computer_use_preview")&&i.push("computer_call_output.output.image_url")}else this.quirks.builtinWebSearch&&(s.push({type:"web_search_preview"}),i.push("web_search_call.action.sources")),this.quirks.builtinCodeInterpreter&&(s.push({type:"code_interpreter"}),i.push("code_interpreter_call.outputs")),this.quirks.builtinFileSearch&&(s.push({type:"file_search"}),i.push("file_search_call.results"));s.length>0&&(o.tools=s),i.length>0&&(o.include=i)}if(e.maxToolCalls!==void 0&&(o.max_tool_calls=e.maxToolCalls),e.parallelToolCalls!==void 0&&(o.parallel_tool_calls=e.parallelToolCalls),e.textVerbosity){let s=o.text??{};s.verbosity=e.textVerbosity,o.text=s}return 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(`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()},We)};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 g;for(;(g=n.indexOf(`
36
+ `))!==-1;){let f=n.slice(0,g).trim();if(n=n.slice(g+1),!f){o="";continue}if(!f.startsWith(":")){if(f.startsWith("event:")){o=f.slice(6).trim();continue}if(f.startsWith("data:")){let m=f.slice(5).trim();if(m==="[DONE]")return;let y;try{y=JSON.parse(m)}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 bf(r,e,t,n){return r.some(s=>s.audioUrls?.some(F)||s.imageUrls?.some(F))?Promise.all(r.map(async s=>{if(s.role!=="user"&&s.role!=="tool")return s;let i={};if(s.role==="user"&&s.audioUrls?.some(F)&&(i.audioUrls=await Promise.all(s.audioUrls.map(a=>F(a)?io(a):Promise.resolve(a)))),s.imageUrls?.some(F)){if(!e||!t)throw new Error("FileUploadAdapter required for local image URLs. Configure OSS_ACCESS_KEY_ID/OSS_ACCESS_KEY_SECRET or QLOGICAGENT_HUB_URL.");i.imageUrls=await Promise.all(s.imageUrls.map(a=>F(a)?Ue(a,{uploadAdapter:e,apiKey:t,signal:n}):Promise.resolve(a)))}return Object.keys(i).length>0?{...s,...i}:s})):r}function kf(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,u=t.audioFormat??"mp3";if(d.startsWith("data:")){let p=/^data:audio\/([^;]+);base64,(.+)$/.exec(d);p&&(u=p[1]==="mpeg"?"mp3":p[1],l=p[2])}c.push({type:"input_audio",data:l,format:u})}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;if(t.imageUrls&&t.imageUrls.length>0){let n=[];t.content&&n.push({type:"input_text",text:t.content});for(let o of t.imageUrls)n.push({type:"input_image",image_url:o});e.push({type:"function_call_output",call_id:t.tool_call_id,output:n})}else e.push({type:"function_call_output",call_id:t.tool_call_id,output:t.content??""});continue}}return e}var wf=18e4,Tf=3e5,vf=64e3,xf="[Tool execution failed; output not available during conversation recovery]",Sf="interleaved-thinking-2025-05-14",Rf="context-1m-2025-08-07",_f="token-efficient-tools-2026-03-28",Cf="prompt-caching-scope-2026-01-05",Af="pdfs-2024-09-25";function Pf(r){let e=r.toLowerCase();return e.includes("opus-4-6")||e.includes("opus-4-7")||e.includes("sonnet-4-6")}function If(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(Rf),n.push(Af),e&&!o.includes("haiku")&&n.push(Sf),t&&n.push(_f),n.push(Cf);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 un=class{baseUrl;apiVersion;timeoutMs;streamIdleTimeoutMs;enablePromptCaching;maxRetries;omitZeroTemperature;quirks;fileUploadAdapter;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??wf,this.streamIdleTimeoutMs=e.streamIdleTimeoutMs??We,this.enablePromptCaching=e.enablePromptCaching??!0,this.maxRetries=e.maxRetries??3,this.omitZeroTemperature=e.omitZeroTemperature??!1,this.quirks=e.quirks??{},this.fileUploadAdapter=e.fileUploadAdapter}async*stream(e,t,n){let o=`${this.baseUrl}/v1/messages`,s=Df(e.messages),i=await Lf(s,this.fileUploadAdapter,t,n),{system:a,messages:c}=$f(i,this.quirks,e.model),d=Of(a,this.enablePromptCaching),l=!!e.reasoning,u=e.maxTokens??8192,p={model:e.model,messages:c,max_tokens:l?Math.max(u,4096):u,stream:!0};if(d&&(p.system=d),e.tools&&e.tools.length>0){let y=e.tools.map(Uf);this.enablePromptCaching&&y.length>0&&(y[y.length-1].cache_control={type:"ephemeral"}),p.tools=y,e.toolChoice&&(p.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||(p.temperature=e.temperature)),!l&&e.topP!==void 0&&(p.top_p=e.topP),l)if(this.quirks.useEffortInsteadOfBudget){p.thinking={type:"enabled"};let y=this.quirks.maxReasoningEffort??"high",k=e.reasoning?.effort??"high",w=k==="low"||k==="medium"?"high":y;if(p.output_config={effort:w},a){let x=2166136261;for(let S=0;S<a.length;S++)x^=a.charCodeAt(S),x=Math.imul(x,16777619);p.metadata={user_id:`qa-${(x>>>0).toString(36)}`}}}else if(Pf(e.model))p.thinking={type:"adaptive"};else{let y=Ef(e.reasoning.effort,e.maxTokens);p.thinking={type:"enabled",budget_tokens:Math.min(u-1,y)}}let g=If(e.model,l,(e.tools?.length??0)>0),f={"Content-Type":"application/json","x-api-key":t,"anthropic-version":this.apiVersion};g.length>0&&(f["anthropic-beta"]=g.join(","));let m=null;for(let y=0;y<=this.maxRetries;y++){if(n?.aborted)throw new Error("Request aborted");y>0&&m&&await ze(He(y),n);try{yield*this.streamWithWatchdog(o,f,p,n);return}catch(k){m=k instanceof Error?k:new Error(String(k));let w=Nf(m.message),x=w!==null&&cs.has(w),S=m.message.includes("Stream idle timeout");if(m.message.includes("model_context_window_exceeded")||m.message.includes("context_length_exceeded")||!x&&!S)throw m;if(y===this.maxRetries){if((S||x)&&!e.streamRequired)try{yield*this.nonStreamingFallback(o,f,p,n);return}catch{throw m}throw m}}}if(m)throw m}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(()=>""),g=new Error(`Anthropic API error ${a.status}: ${p.slice(0,500)}`);throw g.status=a.status,g}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=jf({...n,stream:!1}),i=AbortSignal.timeout(Tf),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:xl(o)})}async*parseSSEStream(e,t,n){let o=new TextDecoder,s="",i="",a=new Map,c={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheCreationTokens:0,reasoningTokens:0};for await(let d of e){if(t(),n())break;s+=o.decode(d,{stream:!0});let l;for(;(l=s.indexOf(`
37
+ `))!==-1;){let u=s.slice(0,l).trim();if(s=s.slice(l+1),!u){i="";continue}if(u.startsWith("event:")){i=u.slice(6).trimStart();continue}if(!u.startsWith("data:"))continue;let p=u.slice(5).trimStart(),g;try{g=JSON.parse(p)}catch{continue}yield*this.mapEvent(i,g,a,c)}}}*mapEvent(e,t,n,o){switch(e){case"message_start":{let i=t.message?.usage;i&&(vl(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&&(vl(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:xl(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 vl(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 xl(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 Mf(r){return!/haiku/i.test(r)}var ds={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 ds.high}return ds[r]??ds.high}function Of(r,e){if(r)return e?[{type:"text",text:r,cache_control:{type:"ephemeral"}}]:r}function Df(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}async function Lf(r,e,t,n){return r.some(s=>s.imageUrls?.some(F)||s.fileIds?.some(i=>F(i.id)))?Promise.all(r.map(async s=>{if(s.role!=="user"&&s.role!=="tool")return s;let i={};if(s.imageUrls?.some(F)){if(!e||!t)throw new Error("FileUploadAdapter required for local image URLs. Configure OSS_ACCESS_KEY_ID/OSS_ACCESS_KEY_SECRET or QLOGICAGENT_HUB_URL.");i.imageUrls=await Promise.all(s.imageUrls.map(a=>F(a)?Ue(a,{uploadAdapter:e,apiKey:t,signal:n}):Promise.resolve(a)))}if(s.role==="user"&&s.fileIds?.some(a=>F(a.id))){if(!e||!t)throw new Error("FileUploadAdapter required for local file URLs. Configure OSS_ACCESS_KEY_ID/OSS_ACCESS_KEY_SECRET or QLOGICAGENT_HUB_URL.");i.fileIds=await Promise.all(s.fileIds.map(async a=>{if(!F(a.id))return a;let c=await Ue(a.id,{uploadAdapter:e,apiKey:t,signal:n});return{...a,id:c}}))}return Object.keys(i).length>0?{...s,...i}:s})):r}function $f(r,e={},t){let n,o=[];for(let s of r){if(s.role==="system"){n=n?`${n}
38
+
39
+ ${s.content??""}`:s.content??"";continue}if(s.role==="user"){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 u=l[1];u==="application/pdf"?c.push({type:"document",source:{type:"base64",media_type:u,data:l[2]}}):c.push({type:"image",source:{type:"base64",media_type:u,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 u=/^data:[^;]+;base64,(.+)$/.exec(d.id);u&&c.push({type:"document",source:{type:"base64",media_type:"application/pdf",data:u[1]}})}else c.push({type:"document",source:{type:"url",url:d.id}});else{let u=l?`[Attached: ${d.id} (${l})]`:`[Attached: ${d.id}]`;c.push({type:"text",text:u})}}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===xf,c=s.toolReferences,d=c&&c.length>0&&!a&&(!t||Mf(t)),l=s.imageUrls,u;if(d)u=c.map(f=>({type:"tool_reference",tool_name:f}));else if(l&&l.length>0&&!a){let f=[];i&&f.push({type:"text",text:i});for(let m of l)if(m.startsWith("data:")){let y=/^data:([^;]+);base64,(.+)$/.exec(m);y&&f.push({type:"image",source:{type:"base64",media_type:y[1],data:y[2]}})}else f.push({type:"image",source:{type:"url",url:m}});u=f}else u=i;let p={type:"tool_result",tool_use_id:s.tool_call_id??"",content:u,...a&&{is_error:!0}},g=o[o.length-1];g&&g.role==="user"&&Array.isArray(g.content)?g.content.push(p):o.push({role:"user",content:[p]})}}return{system:n,messages:o}}function Uf(r){return{name:r.function.name,description:r.function.description,input_schema:r.function.parameters??{type:"object",properties:{}}}}function Nf(r){let e=/Anthropic API error (\d{3})/.exec(r);return e?parseInt(e[1],10):null}function jf(r){let e=typeof r.max_tokens=="number"?r.max_tokens:8192,t=Math.min(e,vf),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 uo=class{baseUrl;extraHeaders;timeoutMs;quirks;fileUploadAdapter;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??{},this.fileUploadAdapter=e.fileUploadAdapter}async*stream(e,t,n){let s=`${this.baseUrl.replace(/\/v\d+$/,"")}/v3/responses`,i=await this.buildRequestBody(e,t,n),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 ze(He(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(!Ye(Xe(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}async buildRequestBody(e,t,n){let o=this.resolveConstraints(e),s=await Ff(o.messages,this.fileUploadAdapter,t,n),i={model:o.model,input:Bf(s),stream:!0};if(o.previousResponseId&&(i.previous_response_id=o.previousResponseId),o.store!==void 0&&(i.store=o.store),o.storeExpireAt!==void 0&&(i.expire_at=o.storeExpireAt),o.instructions&&(i.instructions=o.instructions),o.structuredOutput)if(o.structuredOutput.mode==="json_object")i.text={format:{type:"json_object"}};else{let c={type:"json_schema",name:o.structuredOutput.name,schema:o.structuredOutput.schema};o.structuredOutput.strict!==void 0&&(c.strict=o.structuredOutput.strict),i.text={format:c}}if(o.caching){let c={type:o.caching.type};o.caching.prefix!==void 0&&(c.prefix=o.caching.prefix),i.caching=c,o.caching.prefix&&(i.stream=!1)}if(o.contextManagement){let c=o.contextManagement.edits.map(d=>{let l={type:d.type};return d.type==="clear_thinking"&&d.keep!==void 0?l.keep=d.keep:d.type==="clear_tool_uses"&&(d.trigger&&(l.trigger=d.trigger),d.keep&&(l.keep=d.keep),d.excludeTools&&(l.exclude_tools=d.excludeTools),d.clearToolInput!==void 0&&(l.clear_tool_input=d.clearToolInput)),l});i.context_management={edits:c}}let a=[];if(o.tools&&o.tools.length>0)for(let c of o.tools)a.push({type:"function",name:c.function.name,description:c.function.description,parameters:c.function.parameters});if(o.builtinTools&&!o.disableBuiltinTools&&o.builtinTools.length>0)for(let c of o.builtinTools){let l={type:c.type.replace(/^builtin_/,"")};c.config&&Object.assign(l,c.config),a.push(l)}if(a.length>0&&(i.tools=a),o.maxToolCalls!==void 0&&(i.max_tool_calls=o.maxToolCalls),o.toolChoice!==void 0&&(typeof o.toolChoice=="string"?i.tool_choice=o.toolChoice:i.tool_choice={type:o.toolChoice.type,name:o.toolChoice.name}),o.temperature!==void 0&&(i.temperature=o.temperature),o.topP!==void 0&&(i.top_p=o.topP),o.maxTokens!==void 0&&(i.max_output_tokens=o.maxTokens),o.reasoning){let c=o.reasoning.effort??"high";c==="minimal"?i.thinking={type:"disabled"}:(i.thinking={type:"enabled"},i.reasoning={effort:c}),o.reasoning.includeEncryptedReasoning&&(i.include=["reasoning.encrypted_content"])}return o.prefixMessage&&i.input.push({role:"assistant",content:o.prefixMessage,partial:!0}),i}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()},We)};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 g;for(;(g=n.indexOf(`
40
+ `))!==-1;){let f=n.slice(0,g).trim();if(n=n.slice(g+1),!f){o="";continue}if(!f.startsWith(":")){if(f.startsWith("event:")){o=f.slice(6).trim();continue}if(f.startsWith("data:")){let m=f.slice(5).trim();if(m==="[DONE]")return;let y;try{y=JSON.parse(m)}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}))})}}if(s?.type==="function_call"){let i=s.call_id,a=s.name,c=s.arguments??"";if(i&&c){let d=n.get(i),l=d!==void 0;l||(d=o(),n.set(i,d)),yield{type:"tool_call_delta",index:d,id:i,name:l?void 0:a,arguments:c}}}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 Ff(r,e,t,n){if(!r.some(i=>i.imageUrls?.some(F)||i.videoUrls?.some(F)||i.audioUrls?.some(F)))return r;let s=i=>{if(!F(i))return Promise.resolve(i);if(!e||!t)throw new Error("FileUploadAdapter required for local media URLs. Configure OSS_ACCESS_KEY_ID/OSS_ACCESS_KEY_SECRET or QLOGICAGENT_HUB_URL.");return Ue(i,{uploadAdapter:e,apiKey:t,signal:n})};return Promise.all(r.map(async i=>{if(i.role!=="user"&&i.role!=="tool")return i;let a={};return i.imageUrls?.some(F)&&(a.imageUrls=await Promise.all(i.imageUrls.map(s))),i.role==="user"&&i.videoUrls?.some(F)&&(a.videoUrls=await Promise.all(i.videoUrls.map(s))),i.role==="user"&&i.audioUrls?.some(F)&&(a.audioUrls=await Promise.all(i.audioUrls.map(s))),Object.keys(a).length>0?{...i,...a}:i}))}function Bf(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"){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;if(t.imageUrls&&t.imageUrls.length>0){let n=[];t.content&&n.push({type:"input_text",text:t.content});for(let o of t.imageUrls)n.push({type:"input_image",image_url:o});e.push({type:"function_call_output",call_id:t.tool_call_id,output:n})}else e.push({type:"function_call_output",call_id:t.tool_call_id,output:t.content??""});continue}}return e}hr();var Gf=[{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 Wf(r){switch(r){case"minimal":return"MINIMAL";case"low":return"LOW";case"medium":return"MEDIUM";case"high":return"HIGH";default:return"HIGH"}}var pn=class{baseUrl;timeoutMs;quirks;fileUploadAdapter;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??{},this.fileUploadAdapter=e.fileUploadAdapter}async*stream(e,t,n){let o=`${this.baseUrl}/models/${encodeURIComponent(e.model)}:streamGenerateContent?alt=sse`,s=await this.buildRequestBody(e,t,n),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 ze(He(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(!Ye(Xe(a))&&!l)throw a;if(c===3){if((l||Ye(Xe(a)))&&!e.streamRequired)try{yield*this.nonStreamingFallback(e,t,n);return}catch{throw a}throw a}}}}async buildRequestBody(e,t,n){let o=await Hf(e.messages,this.fileUploadAdapter,t,n),{systemInstruction:s,contents:i}=zf(o),a={contents:i};s&&(a.system_instruction=s);let c=this.buildTools(e);c.length>0&&(a.tools=c),e.tools&&e.tools.length>0&&e.toolChoice&&(a.toolConfig=this.buildToolConfig(e.toolChoice));let d=this.buildGenerationConfig(e);return Object.keys(d).length>0&&(a.generationConfig=d),a.safetySettings=Gf,e.cachedContent&&(a.cachedContent=e.cachedContent),a}buildTools(e){let t=[];if(e.tools&&e.tools.length>0){let n=e.tools.map(Vf);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=Wf(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()},We)};try{i();let a=e.getReader();try{for(;;){let{done:c,value:d}=await a.read();if(c)break;if(s.signal.aborted)throw new Error("Stream idle timeout");i(),n+=t.decode(d,{stream:!0});let l;for(;(l=n.indexOf(`
41
+ `))!==-1;){let u=n.slice(0,l).trim();if(n=n.slice(l+1),!u||u.startsWith(":")||!u.startsWith("data: "))continue;let p=u.slice(6);if(p==="[DONE]")return;let g;try{g=JSON.parse(p)}catch{continue}yield*this.processResponse(g)}}}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:`
42
42
  \`\`\`output
43
43
  ${s.codeExecutionResult.output??""}
44
44
  \`\`\`
@@ -46,27 +46,28 @@ ${s.codeExecutionResult.output??""}
46
46
  \`\`\`${s.executableCode.language??"python"}
47
47
  ${s.executableCode.code}
48
48
  \`\`\`
49
- `};continue}}if(t.groundingMetadata?.groundingChunks){let s=t.groundingMetadata.groundingChunks.filter(i=>i.web?.uri).map(i=>({type:"web_search",url:i.web.uri,title:i.web.title}));s.length>0&&(yield{type:"annotations",annotations:s})}t.finishReason&&(yield{type:"done",finishReason:lf(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 rf(r){return r.some(t=>t.imageUrls?.some(L)||t.videoUrls?.some(L)||t.audioUrls?.some(L)||t.fileIds?.some(n=>L(n.id)))?Promise.all(r.map(async t=>{if(t.role!=="user")return t;let n={};return t.imageUrls?.some(L)&&(n.imageUrls=await Promise.all(t.imageUrls.map(o=>L(o)?le(o):Promise.resolve(o)))),t.videoUrls?.some(L)&&(n.videoUrls=await Promise.all(t.videoUrls.map(o=>L(o)?le(o):Promise.resolve(o)))),t.audioUrls?.some(L)&&(n.audioUrls=await Promise.all(t.audioUrls.map(o=>L(o)?le(o):Promise.resolve(o)))),t.fileIds?.some(o=>L(o.id))&&(n.fileIds=await Promise.all(t.fileIds.map(async o=>{if(!L(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 sf(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 af(r){let e={name:r.function.name,description:r.function.description};return r.function.parameters&&(e.parameters=$e(r.function.parameters)),e}function lf(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 Xn(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:cf(t,n),apiKey:r.apiKey,resolvedModel:r.model,providerDef:t}}function cf(r,e){let t;switch(r.transport){case"openai-chat":t=new At({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 At({baseUrl:n,quirks:r.quirks});return new Vr(t,o)}return t}var Vr=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 df}from"node:path";import{mkdirSync as uf,appendFileSync as pf}from"node:fs";var Qa=Ma();function qr(){return process.env.QLOGICAGENT_DEBUG==="1"}function Kr(r,e){let t=df(Qa,`${e}.jsonl`),n=!1;function o(){n||(uf(Qa,{recursive:!0}),n=!0)}function s(i){try{o(),pf(t,JSON.stringify(i)+`
50
- `,"utf8")}catch{}}return{async*stream(i,a,c){let d=Date.now();s({type:"request",timestamp:new Date(d).toISOString(),model:i.model,messageCount:i.messages.length,toolCount:i.tools?.length??0,toolChoice:i.toolChoice,temperature:i.temperature,maxTokens:i.maxTokens,reasoning:i.reasoning});let l=0,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 Jr(r){return typeof r.deleteVideoTask=="function"&&typeof r.listVideoTasks=="function"}function Yr(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 Za,readdir as mf,stat as gf}from"node:fs/promises";import{existsSync as el}from"node:fs";import{join as ff}from"node:path";var Me={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 tl(r,e,t=new Set){if(!r.trim()||!el(e))return[];let n=r.trim().split(/\s+/);if(n.length<2&&n[0].length<4)return[];let o=await hf(e);if(o.length===0)return[];let s=o.filter(c=>!t.has(c.filePath));if(s.length===0)return[];let a=yf(r,s).filter(c=>c.score>=Me.MIN_SCORE).slice(0,Me.MAX_SELECTED);return a.length===0?[]:bf(a)}async function hf(r){if(!el(r))return[];let e;try{e=await mf(r)}catch{return[]}let t=e.filter(o=>o.endsWith(".md")&&o!=="INDEX.md");return(await Promise.allSettled(t.map(async o=>{let s=ff(r,o),i=await gf(s),c=(await Za(s,"utf-8")).split(`
51
- `),d=null;for(let p=0;p<Math.min(c.length,Me.HEADER_LINES);p++){let u=c[p].trim();if(!(!u||u.startsWith("#")||u.startsWith("---"))){d=u.slice(0,150);break}}let l=kf(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,Me.MAX_SCAN_FILES)}function yf(r,e){let t=Xr(r);if(t.length===0)return[];let n=Date.now(),o=Me.RECENCY_DAYS*24*60*60*1e3;return e.map(i=>{let a=0,c=Xr(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=Xr(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&&Tf(r).includes(i.category)&&(a+=.1),n-i.mtimeMs<o&&(a+=Me.RECENCY_BOOST),{header:i,score:a}}).sort((i,a)=>a.score-i.score)}async function bf(r){let e=[],t=0;for(let{header:n,score:o}of r){if(t>=Me.MAX_TOTAL_BYTES)break;try{let s=await Za(n.filePath,"utf-8"),i=!1;s.length>Me.MAX_FILE_BYTES&&(s=s.slice(0,Me.MAX_FILE_BYTES)+`
49
+ `};continue}}if(t.groundingMetadata?.groundingChunks){let s=t.groundingMetadata.groundingChunks.filter(i=>i.web?.uri).map(i=>({type:"web_search",url:i.web.uri,title:i.web.title}));s.length>0&&(yield{type:"annotations",annotations:s})}t.finishReason&&(yield{type:"done",finishReason:qf(t.finishReason)})}}async*nonStreamingFallback(e,t,n){let o=`${this.baseUrl}/models/${encodeURIComponent(e.model)}:generateContent`,s=await this.buildRequestBody(e,t,n),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 Hf(r,e,t,n){if(!r.some(i=>i.imageUrls?.some(F)||i.videoUrls?.some(F)||i.audioUrls?.some(F)||i.fileIds?.some(a=>F(a.id))))return r;let s=(i,a)=>{if(!F(i))return Promise.resolve(i);if(!e||!t)throw new Error("FileUploadAdapter required for local media URLs. Configure OSS_ACCESS_KEY_ID/OSS_ACCESS_KEY_SECRET or QLOGICAGENT_HUB_URL.");return Ue(i,{uploadAdapter:e,apiKey:t,signal:n})};return Promise.all(r.map(async i=>{if(i.role!=="user"&&i.role!=="tool")return i;let a={};return i.imageUrls?.some(F)&&(a.imageUrls=await Promise.all(i.imageUrls.map(c=>s(c)))),i.role==="user"&&i.videoUrls?.some(F)&&(a.videoUrls=await Promise.all(i.videoUrls.map(c=>s(c)))),i.role==="user"&&i.audioUrls?.some(F)&&(a.audioUrls=await Promise.all(i.audioUrls.map(c=>s(c)))),i.role==="user"&&i.fileIds?.some(c=>F(c.id))&&(a.fileIds=await Promise.all(i.fileIds.map(async c=>{if(!F(c.id))return c;let d=await s(c.id,c.mimeType);return{...c,id:d}}))),Object.keys(a).length>0?{...i,...a}:i}))}function zf(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??""}}if(n.push({functionResponse:{name:s.name??"",response:i,id:s.tool_call_id??""}}),s.imageUrls&&s.imageUrls.length>0)for(let a of s.imageUrls)if(a.startsWith("data:")){let c=/^data:([^;]+);base64,(.+)$/.exec(a);c&&n.push({inlineData:{mimeType:c[1],data:c[2]}})}else{let c=a.endsWith(".png")?"image/png":a.endsWith(".jpg")||a.endsWith(".jpeg")?"image/jpeg":a.endsWith(".gif")?"image/gif":a.endsWith(".webp")?"image/webp":"image/png";n.push({fileData:{mimeType:c,fileUri:a}})}break}}return o(),{systemInstruction:e,contents:t}}function Vf(r){let e={name:r.function.name,description:r.function.description};return r.function.parameters&&(e.parameters=Ge(r.function.parameters)),e}function qf(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()}}var po=class{config;constructor(e){this.config=e}async uploadFile(e,t,n,o,s){let i=this.config.baseUrl.replace(/\/+$/,""),c=/\/v\d+$/.test(i)?`${i}/files`:`${i}/v1/files`,d=new FormData,l=new Blob([e],{type:n});d.append("file",l,t),d.append("purpose",this.config.defaultPurpose??"file-extract");let u=await fetch(c,{method:"POST",headers:{Authorization:`Bearer ${o}`,...this.config.extraHeaders},body:d,signal:s??AbortSignal.timeout(this.config.timeoutMs??12e4)});if(!u.ok){let m=await u.text().catch(()=>"");throw new Error(`File upload to ${this.config.provider} failed (${u.status}): ${m}`)}let p=await u.json(),g=String(p.id??"");return{url:String(p.download_url??p.url??p.file_url??"")||g,fileId:g,filename:String(p.filename??t),bytes:Number(p.bytes??e.byteLength),mimeType:n,provider:this.config.provider}}};var mo=class{config;constructor(e){this.config=e}async uploadFile(e,t,n,o,s){let a=`${this.config.baseUrl.replace(/\/+$/,"")}/v3/files`,c=new FormData,d=new Blob([e],{type:n});c.append("file",d,t),c.append("purpose",this.config.defaultPurpose??"user_data");let l=await fetch(a,{method:"POST",headers:{Authorization:`Bearer ${o}`},body:c,signal:s??AbortSignal.timeout(this.config.timeoutMs??12e4)});if(!l.ok){let g=await l.text().catch(()=>"");throw new Error(`Volcengine file upload failed (${l.status}): ${g}`)}let u=await l.json(),p=String(u.id??"");return{url:p,fileId:p,filename:t,bytes:e.byteLength,mimeType:n,provider:"volcengine"}}};var go=class{config;constructor(e){this.config=e}async uploadFile(e,t,n,o,s){let i=this.config.timeoutMs??18e4,a=s??AbortSignal.timeout(i),c=this.config.baseUrl.replace(/(\/v1beta)$/,"/upload$1/files"),d=await fetch(c,{method:"POST",headers:{"x-goog-api-key":o,"X-Goog-Upload-Protocol":"resumable","X-Goog-Upload-Command":"start","X-Goog-Upload-Header-Content-Length":String(e.length),"X-Goog-Upload-Header-Content-Type":n,"Content-Type":"application/json"},body:JSON.stringify({file:{display_name:t}}),signal:a});if(!d.ok){let f=await d.text().catch(()=>"");throw new Error(`Gemini file upload init failed (${d.status}): ${f.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");let u=await fetch(l,{method:"PUT",headers:{"Content-Length":String(e.length),"X-Goog-Upload-Offset":"0","X-Goog-Upload-Command":"upload, finalize"},body:e,signal:a});if(!u.ok){let f=await u.text().catch(()=>"");throw new Error(`Gemini file upload failed (${u.status}): ${f.slice(0,500)}`)}let g=(await u.json()).file;return g.state==="PROCESSING"&&await this.waitForProcessing(g.name,o,a),{url:g.uri,fileId:g.name,filename:t,bytes:parseInt(g.sizeBytes??"0",10)||e.length,mimeType:n,provider:"gemini"}}async waitForProcessing(e,t,n,o=30){let s=`${this.config.baseUrl}/files/${e.replace("files/","")}`;for(let i=0;i<o;i++){if(await new Promise(d=>setTimeout(d,2e3)),n.aborted)throw new Error("Upload aborted during processing wait");let a=await fetch(`${s}?key=${t}`,{signal:n});if(!a.ok)continue;let c=await a.json();if(c.state==="ACTIVE")return;if(c.state==="FAILED")throw new Error("Gemini file processing failed")}}};var fo=class{config;constructor(e){this.config=e}async uploadFile(e,t,n,o,s){let a=`${this.config.hubBaseUrl.replace(/\/+$/,"")}/api/v1/files/upload`,c=new FormData,d=new Blob([e],{type:n});c.append("file",d,t),c.append("purpose","llm_input");let l={};this.config.hubApiKey&&(l.Authorization=`Bearer ${this.config.hubApiKey}`);let u=await fetch(a,{method:"POST",headers:l,body:c,signal:s??AbortSignal.timeout(this.config.timeoutMs??12e4)});if(!u.ok){let g=await u.text().catch(()=>"");throw new Error(`Hub OSS upload failed ${u.status}: ${g.slice(0,200)}`)}let p=await u.json();if(!p.url)throw new Error("Hub OSS upload response missing 'url' field");return{url:p.url,fileId:p.fileId??t,filename:t,bytes:p.bytes??e.byteLength,mimeType:n,provider:this.config.provider??"hub-oss"}}};import{createHmac as Kf,randomUUID as Jf}from"node:crypto";function Sl(){let r=(process.env.OSS_ACCESS_KEY_ID??process.env.ALIYUN_OSS_ACCESS_KEY_ID??"").trim(),e=(process.env.OSS_ACCESS_KEY_SECRET??process.env.ALIYUN_OSS_ACCESS_KEY_SECRET??"").trim();if(!(!r||!e))return new us({accessKeyId:r,accessKeySecret:e,bucket:(process.env.OSS_BUCKET??process.env.ALIYUN_OSS_BUCKET??"qlogicagent").trim(),region:(process.env.OSS_REGION??process.env.ALIYUN_OSS_REGION??"cn-beijing").trim(),endpoint:(process.env.OSS_ENDPOINT??"").trim()||void 0})}var us=class{config;constructor(e){let t=e.bucket||"qlogicagent",n=e.region||"cn-beijing";this.config={accessKeyId:e.accessKeyId,accessKeySecret:e.accessKeySecret,bucket:t,region:n,endpoint:e.endpoint||`${t}.oss-${n}.aliyuncs.com`,pathPrefix:e.pathPrefix||"media",timeoutMs:e.timeoutMs??12e4}}async uploadFile(e,t,n,o,s){let i=new Date().toISOString().slice(0,10),a=Jf().slice(0,8),c=t.replace(/[^a-zA-Z0-9._-]/g,"_"),d=`${this.config.pathPrefix}/${i}/${a}_${c}`,l=`https://${this.config.endpoint}/${d}`,u=new Date().toUTCString(),p=["PUT","",n,u,`/${this.config.bucket}/${d}`].join(`
50
+ `),g=Kf("sha1",this.config.accessKeySecret).update(p).digest("base64"),f={Date:u,"Content-Type":n,"Content-Length":String(e.byteLength),Authorization:`OSS ${this.config.accessKeyId}:${g}`},m=await fetch(l,{method:"PUT",headers:f,body:e,signal:s??AbortSignal.timeout(this.config.timeoutMs)});if(!m.ok){let y=await m.text().catch(()=>"");throw new Error(`Aliyun OSS upload failed ${m.status}: ${y.slice(0,300)}`)}return{url:l,fileId:d,filename:c,bytes:e.byteLength,mimeType:n,provider:"aliyun-oss"}}};function ho(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:Qf(t,n),apiKey:r.apiKey,resolvedModel:r.model,providerDef:t}}function Yf(r,e,t){switch(r){case"openai-chat":case"openai-responses":return new po({baseUrl:e,provider:t.id,extraHeaders:t.extraHeaders});case"volcengine-responses":return new mo({baseUrl:e});case"gemini-generatecontent":return new go({baseUrl:e});default:return Xf()}}var Tt=null;function Xf(){if(Tt!==null)return Tt||void 0;let r=(process.env.QLOGICAGENT_HUB_URL??process.env.HUB_BASE_URL??"").trim();if(r)return Tt=new fo({hubBaseUrl:r,hubApiKey:(process.env.QLOGICAGENT_HUB_API_KEY??process.env.HUB_API_KEY??"").trim()||void 0}),Tt;let e=Sl();if(e)return Tt=e,Tt;Tt=void 0}function Qf(r,e){let t,n=Yf(r.transport,e,r);switch(r.transport){case"openai-chat":t=new Ut({baseUrl:e,extraHeaders:r.extraHeaders,supportsStreamOptions:r.supportsStreamOptions,omitZeroTemperature:r.omitZeroTemperature,quirks:r.quirks,fileUploadAdapter:n});break;case"openai-responses":t=new co({baseUrl:e,extraHeaders:r.extraHeaders,quirks:r.quirks,fileUploadAdapter:n});break;case"anthropic-messages":t=new un({baseUrl:e,omitZeroTemperature:r.omitZeroTemperature,quirks:r.quirks,fileUploadAdapter:n});break;case"volcengine-responses":t=new uo({baseUrl:e,extraHeaders:r.extraHeaders,quirks:r.quirks,fileUploadAdapter:n});break;case"gemini-generatecontent":t=new pn({baseUrl:e,quirks:r.quirks,fileUploadAdapter:n});break;default:throw new Error(`Unsupported transport type: "${r.transport}" for provider "${r.id}"`)}if(r.transport==="anthropic-messages"&&r.quirks?.supportsPrefixCompletion){let o=e.replace(/\/anthropic\/?$/,""),s=new Ut({baseUrl:o,quirks:r.quirks});return new ps(t,s)}return t}var ps=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 mn=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 g=await d.text().catch(()=>"");throw new Error(`Gemini file upload init error ${d.status}: ${g.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 g=await u.text().catch(()=>"");throw new Error(`Gemini file upload error ${u.status}: ${g.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 Zf}from"node:path";import{mkdirSync as eh,appendFileSync as th}from"node:fs";var Rl=Za();function ms(){return process.env.QLOGICAGENT_DEBUG==="1"}function gs(r,e){let t=Zf(Rl,`${e}.jsonl`),n=!1;function o(){n||(eh(Rl,{recursive:!0}),n=!0)}function s(i){try{o(),th(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,g="",f;try{for await(let m of r.stream(i,a,c))m.type==="usage"?(l=m.promptTokens,u=m.completionTokens,p=m.reasoningTokens??0):m.type==="done"&&(g=m.finishReason),yield m}catch(m){throw f=m instanceof Error?m.message:String(m),m}finally{let m=Date.now()-d;s({type:"response",timestamp:new Date().toISOString(),model:i.model,elapsedMs:m,promptTokens:l,completionTokens:u,reasoningTokens:p,finishReason:g,...f?{error:f}:{}})}}}}function fs(r){return typeof r.deleteVideoTask=="function"&&typeof r.listVideoTasks=="function"}function hs(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 _l,readdir as nh,stat as oh}from"node:fs/promises";import{existsSync as Cl}from"node:fs";import{join as rh}from"node:path";var Ee={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 Al(r,e,t=new Set){if(!r.trim()||!Cl(e))return[];let n=r.trim().split(/\s+/);if(n.length<2&&n[0].length<4)return[];let o=await sh(e);if(o.length===0)return[];let s=o.filter(c=>!t.has(c.filePath));if(s.length===0)return[];let a=ih(r,s).filter(c=>c.score>=Ee.MIN_SCORE).slice(0,Ee.MAX_SELECTED);return a.length===0?[]:ah(a)}async function sh(r){if(!Cl(r))return[];let e;try{e=await nh(r)}catch{return[]}let t=e.filter(o=>o.endsWith(".md")&&o!=="INDEX.md");return(await Promise.allSettled(t.map(async o=>{let s=rh(r,o),i=await oh(s),c=(await _l(s,"utf-8")).split(`
52
+ `),d=null;for(let u=0;u<Math.min(c.length,Ee.HEADER_LINES);u++){let p=c[u].trim();if(!(!p||p.startsWith("#")||p.startsWith("---"))){d=p.slice(0,150);break}}let l=lh(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,Ee.MAX_SCAN_FILES)}function ih(r,e){let t=ys(r);if(t.length===0)return[];let n=Date.now(),o=Ee.RECENCY_DAYS*24*60*60*1e3;return e.map(i=>{let a=0,c=ys(i.filename.replace(/\.md$/,"").replace(/[-_]/g," ")),d=t.filter(l=>c.some(u=>u.includes(l)||l.includes(u))).length;if(a+=Math.min(.5,d/t.length*.5),i.description){let l=ys(i.description),u=t.filter(p=>l.some(g=>g.includes(p)||p.includes(g))).length;a+=Math.min(.3,u/t.length*.3)}return i.category&&ch(r).includes(i.category)&&(a+=.1),n-i.mtimeMs<o&&(a+=Ee.RECENCY_BOOST),{header:i,score:a}}).sort((i,a)=>a.score-i.score)}async function ah(r){let e=[],t=0;for(let{header:n,score:o}of r){if(t>=Ee.MAX_TOTAL_BYTES)break;try{let s=await _l(n.filePath,"utf-8"),i=!1;s.length>Ee.MAX_FILE_BYTES&&(s=s.slice(0,Ee.MAX_FILE_BYTES)+`
52
53
 
53
- > [Truncated at ${Me.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>Me.MAX_TOTAL_BYTES){let c=Me.MAX_TOTAL_BYTES-t;s=s.slice(0,c)+`
54
+ > [Truncated at ${Ee.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>Ee.MAX_TOTAL_BYTES){let c=Ee.MAX_TOTAL_BYTES-t;s=s.slice(0,c)+`
54
55
 
55
- > [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 Xr(r){return r.toLowerCase().replace(/[^\w\u4e00-\u9fff]+/g," ").split(/\s+/).filter(e=>e.length>1)}function kf(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 Tf(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 nl(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}
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 ys(r){return r.toLowerCase().replace(/[^\w\u4e00-\u9fff]+/g," ").split(/\s+/).filter(e=>e.length>1)}function lh(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 ch(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 Pl(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}
56
57
 
57
58
  ${n.content}`}).join(`
58
59
 
59
60
  ---
60
61
 
61
- `)}Fr();var It={MAX_SESSION_BYTES:60*1024,LIMIT_PER_RECALL:10,MAX_SURFACED_ENTRIES:100};function mt(){return{surfacedPaths:new Set,sessionBytes:0}}function ol(r,e,t){let n=[],o=t??mt(),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>=It.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:It.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>It.MAX_SESSION_BYTES)return!1;if(o.surfacedPaths.add(g),o.sessionBytes+=f,o.surfacedPaths.size>It.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:jr(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 rl(r,e,t){let n=t??mt();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>=It.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 tl(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:jr(f.score,Sa(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>It.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=nl(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 eo from"node:fs";import*as sn from"node:path";var Zn={MAX_RECALLED_SKILLS:3,MAX_SKILL_CONTENT_CHARS:800,CACHE_TTL_MS:300*1e3};function wf(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=vf(r);return s.length>0?s:null}function vf(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 Qn=null,Qr=0;function xf(r){let e=Date.now();if(Qn&&e-Qr<Zn.CACHE_TTL_MS)return Qn;let t=[],n=Wa(r);for(let o of n){let s=sn.join(o,".qlogicagent","skills");try{let i=eo.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=eo.readFileSync(c,"utf8"),l=d.split(`
62
- `).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 Qn=t,Qr=e,t}function Sf(r,e){if(r.length===0)return[];let t=xf(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,Zn.MAX_RECALLED_SKILLS).map(o=>o.skill)}function sl(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=wf(s);if(!i)return{action:"continue",context:o};e.log.debug(`skill-recall: retrospective trigger detected, keywords: [${i.join(", ")}]`);let a=Sf(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>Zn.MAX_SKILL_CONTENT_CHARS?l.content.slice(0,Zn.MAX_SKILL_CONTENT_CHARS)+`
63
- ...(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(`
64
- `),score:.85}});return{action:"continue",context:{...o,recalledMemories:[...c,...d]}}}})}function an(){Qn=null,Qr=0}import{ClawQMemoryAdapter as Rf}from"qlogicagent-adapter-claw";var il="qmemory";function al(r){let e=new Rf({baseUrl:r.baseUrl,apiKey:r.apiKey,timeout:r.timeoutMs??5e3});function t(n){return r.userIdPrefix?`${r.userIdPrefix}:${n}`:n}return{providerId:il,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:il,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 fl,writeFile as es,stat as vl,unlink as Ff,mkdir as Bf}from"node:fs/promises";import{join as to,resolve as hl,isAbsolute as yl,normalize as bl}from"node:path";import{randomUUID as Wf}from"node:crypto";function ll(){return{toolUseCount:0,latestInputTokens:0,cumulativeOutputTokens:0,recentActivities:[]}}function _f(r){return r.latestInputTokens+r.cumulativeOutputTokens}var Cf=new Set(["grep","glob","search","Grep","Glob","list_dir","find_files"]),cl=new Set(["read_file","file_read","cat","head","tail","FileRead"]);function Af(r){return{isSearch:Cf.has(r)||void 0,isRead:cl.has(r)||void 0}}function If(r,e){let t=e.file_path??e.path??e.filePath;if(typeof t=="string")return`${cl.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 dl(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 ul(r,e,t,n){r.toolUseCount++;let o=Af(e),s={toolName:e,input:t,activityDescription:n?.(e,t)??If(e,t),isSearch:o.isSearch,isRead:o.isRead};for(r.recentActivities.push(s);r.recentActivities.length>5;)r.recentActivities.shift()}function Zr(r){return{toolUseCount:r.toolUseCount,tokenCount:_f(r),lastActivity:r.recentActivities.length>0?r.recentActivities[r.recentActivities.length-1]:void 0,recentActivities:[...r.recentActivities]}}import{randomUUID as pl}from"node:crypto";function Mf(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=ll(),{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=Mf(w),U=`fork-${f}-${pl().slice(0,8)}`,v=`fork-session-${pl().slice(0,8)}`;m.info(`[fork:${f}] starting \u2014 ${s.length} initial messages, model=${u}`);let ie=c?{invoke:async(Se,ae,H,X)=>{let te={};try{te=JSON.parse(H)}catch{}let We=c(ae,te);return We.allowed?l.invoke(Se,ae,H,X):(m.info(`[fork:${f}] tool ${ae} denied: ${We.reason}`),{result:"",error:We.reason})}}:l,Y=!0,D;try{let{Agent:Se}=await Promise.resolve().then(()=>(Fn(),_a)),ae=new Se({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&&(dl(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{}ul(o,H.name,X),R?.(Zr(o))}H.type==="error"&&(Y=!1,D=H.error)}}catch(Se){Y=!1,D=Se instanceof Error?Se.message:String(Se),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:Zr(o),durationMs:pe,ok:Y,error:D}}import{readFile as Pf,readdir as Ef}from"node:fs/promises";import{existsSync as Of}from"node:fs";import{join as Df}from"node:path";var Lf={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"},$f={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 Uf(r){let e=r.replace(/\.md$/,"").toLowerCase();for(let[t,n]of Object.entries(Lf))if(e.startsWith(t+"-")||e.startsWith(t+"_")||e===t)return n;return null}function Nf(r){let e=r.slice(0,500),t=null,n=0;for(let[o,s]of Object.entries($f)){let i=s.filter(a=>a.test(e)).length;i>n&&(n=i,t=o)}return t}async function ml(r){let e={},t=0,n=0;if(!Of(r))return{categories:e,totalFiles:0,uncategorizedCount:0};let o;try{o=await Ef(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=Df(r,i);try{let c=await Pf(a,"utf-8");t++;let d=Uf(i)??Nf(c)??"uncategorized";d==="uncategorized"&&n++;let l=c.split(`
65
- `),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 jf={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 gl(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(`
62
+ `)}ss();var Nt={MAX_SESSION_BYTES:60*1024,LIMIT_PER_RECALL:10,MAX_SURFACED_ENTRIES:100};function vt(){return{surfacedPaths:new Set,sessionBytes:0}}function Il(r,e,t){let n=[],o=t??vt(),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>=Nt.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:Nt.LIMIT_PER_RECALL}),l=d.filter(p=>{let g=p,f=g.path??g.id??"";if(!f)return!0;if(o.surfacedPaths.has(f))return!1;let m=(g.content?.length??0)*2;if(o.sessionBytes+m>Nt.MAX_SESSION_BYTES)return!1;if(o.surfacedPaths.add(f),o.sessionBytes+=m,o.surfacedPaths.size>Nt.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 u=l.map(p=>{let g=p;return{text:g.text??g.content??"",score:g.score,category:g.metadata?.category??null}}).filter(p=>p.text);if(c.preferredCategories?.length||c.deprioritizedCategories?.length){let p={scenario:"general",preferred:c.preferredCategories??[],deprioritized:c.deprioritizedCategories??[],confidence:1};u=u.map(g=>({...g,score:rs(g.score??.5,g.category,p)})).sort((g,f)=>(f.score??0)-(g.score??0))}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=[]}}function Ml(r,e,t){let n=t??vt();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>=Nt.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 Al(i.query,c,n.surfacedPaths);if(d.length===0)return{action:"continue",context:i};if(i.preferredCategories?.length||i.deprioritizedCategories?.length){let f={scenario:"general",preferred:i.preferredCategories??[],deprioritized:i.deprioritizedCategories??[],confidence:1};d=d.map(m=>({...m,score:rs(m.score,qa(m.filename),f)})).sort((m,y)=>y.score-m.score)}let l=d.filter(f=>{let m=Buffer.byteLength(f.content,"utf-8");return n.sessionBytes+m>Nt.MAX_SESSION_BYTES?!1:(n.surfacedPaths.add(f.filePath),n.sessionBytes+=m,!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 u=Pl(l),p=i.recalledMemories??[];return{action:"continue",context:{...i,recalledMemories:[...[{text:u,score:.9}],...p]}}}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 ko from"node:fs";import*as gn from"node:path";var bo={MAX_RECALLED_SKILLS:3,MAX_SKILL_CONTENT_CHARS:800,CACHE_TTL_MS:300*1e3};function dh(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=uh(r);return s.length>0?s:null}function uh(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 yo=null,bs=0;function ph(r){let e=Date.now();if(yo&&e-bs<bo.CACHE_TTL_MS)return yo;let t=[],n=ml(r);for(let o of n){let s=gn.join(o,".qlogicagent","skills");try{let i=ko.readdirSync(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory())continue;let c=gn.join(s,a.name,"SKILL.md");try{let d=ko.readFileSync(c,"utf8"),l=d.split(`
63
+ `).slice(0,5).join(" ").toLowerCase();t.push({name:a.name,projectDir:o,projectName:gn.basename(o),content:d,searchText:`${a.name.toLowerCase()} ${l}`})}catch{}}}catch{}}return yo=t,bs=e,t}function mh(r,e){if(r.length===0)return[];let t=ph(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,bo.MAX_RECALLED_SKILLS).map(o=>o.skill)}function El(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=dh(s);if(!i)return{action:"continue",context:o};e.log.debug(`skill-recall: retrospective trigger detected, keywords: [${i.join(", ")}]`);let a=mh(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 u=l.content.length>bo.MAX_SKILL_CONTENT_CHARS?l.content.slice(0,bo.MAX_SKILL_CONTENT_CHARS)+`
64
+ ...(truncated)`:l.content;return{text:[`[Cross-project skill available] Skill "${l.name}" learned in project "${l.projectName}" (${l.projectDir}):`,u,`\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 fn(){yo=null,bs=0}import{ClawQMemoryAdapter as gh}from"qlogicagent-adapter-claw";var Ol="qmemory";function Dl(r){let e=new gh({baseUrl:r.baseUrl,apiKey:r.apiKey,timeout:r.timeoutMs??5e3});function t(n){return r.userIdPrefix?`${r.userIdPrefix}:${n}`:n}return{providerId:Ol,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:Ol,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 Gl,writeFile as ws,stat as Jl,unlink as Ph,mkdir as Ih}from"node:fs/promises";import{join as wo,resolve as Wl,isAbsolute as Hl,normalize as zl}from"node:path";import{randomUUID as Mh}from"node:crypto";function Ll(){return{toolUseCount:0,latestInputTokens:0,cumulativeOutputTokens:0,recentActivities:[]}}function fh(r){return r.latestInputTokens+r.cumulativeOutputTokens}var hh=new Set(["grep","glob","search","Grep","Glob","list_dir","find_files"]),$l=new Set(["read_file","file_read","cat","head","tail","FileRead"]);function yh(r){return{isSearch:hh.has(r)||void 0,isRead:$l.has(r)||void 0}}function bh(r,e){let t=e.file_path??e.path??e.filePath;if(typeof t=="string")return`${$l.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 Ul(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 Nl(r,e,t,n){r.toolUseCount++;let o=yh(e),s={toolName:e,input:t,activityDescription:n?.(e,t)??bh(e,t),isSearch:o.isSearch,isRead:o.isRead};for(r.recentActivities.push(s);r.recentActivities.length>5;)r.recentActivities.shift()}function ks(r){return{toolUseCount:r.toolUseCount,tokenCount:fh(r),lastActivity:r.recentActivities.length>0?r.recentActivities[r.recentActivities.length-1]:void 0,recentActivities:[...r.recentActivities]}}import{randomUUID as jl}from"node:crypto";function kh(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 hn(r){let e=Date.now(),t=[],n={prompt:0,completion:0},o=Ll(),{promptMessages:s,systemPrompt:i,tools:a,canUseTool:c,transport:d,toolInvoker:l,apiKey:u,model:p,log:g,hooks:f,forkLabel:m,maxTurns:y,temperature:k,parentSignal:w,onEvent:x,onProgress:S,budgetTokens:b,parentDepth:I}=r,O=kh(w),U=`fork-${m}-${jl().slice(0,8)}`,v=`fork-session-${jl().slice(0,8)}`;g.info(`[fork:${m}] starting \u2014 ${s.length} initial messages, model=${p}`);let ie=c?{invoke:async(Oe,_e,H,V)=>{let he={};try{he=JSON.parse(H)}catch{}let ue=c(_e,he);return ue.allowed?l.invoke(Oe,_e,H,V):(g.info(`[fork:${m}] tool ${_e} denied: ${ue.reason}`),{result:"",error:ue.reason})}}:l,Y=!0,W;try{let{Agent:Oe}=await Promise.resolve().then(()=>(eo(),Ja)),_e=new Oe({llmTransport:d,apiKey:u,toolInvoker:ie,log:g,hooks:f,maxRounds:y});for await(let H of _e.run({turnId:U,sessionId:v,messages:s,tools:a,systemPrompt:i,config:{model:p,apiKey:u,temperature:k,maxOutputTokens:r.maxOutputTokens,parentDepth:I}},O.signal)){if(t.push(H),x?.(H),H.type==="end"&&H.usage&&(Ul(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 V=n.prompt+n.completion+(n.reasoning??0);V>=b&&(g.info(`[fork:${m}] budget exceeded (${V} / ${b} tokens), aborting`),O.abort("budget_exceeded"))}if(H.type==="tool_call"){let V={};try{V=JSON.parse(H.arguments??"{}")}catch{}Nl(o,H.name,V),S?.(ks(o))}H.type==="error"&&(Y=!1,W=H.error)}}catch(Oe){Y=!1,W=Oe instanceof Error?Oe.message:String(Oe),g.warn(`[fork:${m}] error: ${W}`)}finally{O.signal.aborted||O.abort("fork_complete")}let ee=Date.now()-e;return g.info(`[fork:${m}] finished in ${ee}ms \u2014 ${t.length} events, usage: prompt=${n.prompt} completion=${n.completion}, ok=${Y}`),{events:t,totalUsage:n,progress:ks(o),durationMs:ee,ok:Y,error:W}}import{readFile as wh,readdir as Th}from"node:fs/promises";import{existsSync as vh}from"node:fs";import{join as xh}from"node:path";var Sh={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"},Rh={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 _h(r){let e=r.replace(/\.md$/,"").toLowerCase();for(let[t,n]of Object.entries(Sh))if(e.startsWith(t+"-")||e.startsWith(t+"_")||e===t)return n;return null}function Ch(r){let e=r.slice(0,500),t=null,n=0;for(let[o,s]of Object.entries(Rh)){let i=s.filter(a=>a.test(e)).length;i>n&&(n=i,t=o)}return t}async function Fl(r){let e={},t=0,n=0;if(!vh(r))return{categories:e,totalFiles:0,uncategorizedCount:0};let o;try{o=await Th(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=xh(r,i);try{let c=await wh(a,"utf-8");t++;let d=_h(i)??Ch(c)??"uncategorized";d==="uncategorized"&&n++;let l=c.split(`
66
+ `),u="";for(let g of l){let f=g.trim();if(!(!f||f.startsWith("#")||f.startsWith("---"))){u=f.slice(0,120);break}}let p=l.filter(g=>/^\s*[-*+]\s|^\s*\d+[.)]\s/.test(g)).length;e[d]||(e[d]=[]),e[d].push({filename:i,category:d,description:u,sizeBytes:Buffer.byteLength(c,"utf-8"),entryCount:p})}catch{}}return{categories:e,totalFiles:t,uncategorizedCount:n}}var Ah={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(`
66
67
  ## Category Context (${r.totalFiles} files)
67
68
  `),e.push(`Use category-specific merge rules when updating files:
68
- `);for(let[t,n]of Object.entries(r.categories)){if(n.length===0)continue;let o=jf[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(`
69
- `)}var xl={minHours:24,minSessions:5,scanIntervalMs:6e5},no=".consolidate-lock",Gf=3600*1e3,kl="CLAUDE.md",Hf=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"]),Vf=new Set(["log","show","diff","status","branch","tag","remote","rev-parse","rev-list","ls-files","ls-tree","describe","blame","shortlog","name-rev","cat-file"]),qf=/[|>&]|>>|>\s|rm\s|mv\s|cp\s|chmod\s|chown\s|mkdir\s|touch\s/;function Kf(r){let e=r.trim();if(!e||qf.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||!Vf.has(o))return!1}return!0}function Jf(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 Kf(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"&&Sl(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 Sl(r,e){let t=yl(r)?r:hl(r),n=yl(e)?e:hl(e),o=bl(t),s=bl(n);return o.startsWith(s)}function Rl(r,e,t,n){let o=n?.hasQMemory?`
69
+ `);for(let[t,n]of Object.entries(r.categories)){if(n.length===0)continue;let o=Ah[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 Yl={minHours:24,minSessions:5,scanIntervalMs:6e5},To=".consolidate-lock",Eh=3600*1e3,Vl="CLAUDE.md",Oh=100,Dh=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"]),Lh=new Set(["log","show","diff","status","branch","tag","remote","rev-parse","rev-list","ls-files","ls-tree","describe","blame","shortlog","name-rev","cat-file"]),$h=/[|>&]|>>|>\s|rm\s|mv\s|cp\s|chmod\s|chown\s|mkdir\s|touch\s/;function Uh(r){let e=r.trim();if(!e||$h.test(e))return!1;let t=e.split(/\s+/),n=t[0]?.replace(/^(\/usr\/bin\/|\/bin\/|\/usr\/local\/bin\/)/,"")??"";if(!Dh.has(n))return!1;if(n==="git"){let o=t[1];if(!o||!Lh.has(o))return!1}return!0}function Nh(r,e){let{toolName:t,input:n}=e;if(new Set(["read","search","read_file","grep","glob","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==="exec"||t==="bash"||t==="execute_command"||t==="Bash"){let i=n.command??n.cmd??"";return Uh(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==="write"||t==="edit"||t==="patch"||t==="file_edit"||t==="file_write"||t==="FileEdit"||t==="FileWrite"){let i=n.file_path??n.path??n.filePath??"";return typeof i=="string"&&Xl(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, search, read-only exec, and memory-scoped write/edit/patch are allowed.`}}function Xl(r,e){let t=Hl(r)?r:Wl(r),n=Hl(e)?e:Wl(e),o=zl(t),s=zl(n);return o.startsWith(s)}function Ql(r,e,t,n){let o=n?.hasQMemory?`
70
71
 
71
72
  ## Phase 2.5 \u2014 Long-term memory triage (QMemory)
72
73
 
@@ -101,7 +102,7 @@ Session transcripts: \`${e}\` (large JSONL files \u2014 grep narrowly, don't rea
101
102
  ## Phase 1 \u2014 Orient
102
103
 
103
104
  - \`ls\` the memory directory to see what already exists
104
- - Read \`${kl}\` to understand the current index
105
+ - Read \`${Vl}\` to understand the current index
105
106
  - Skim existing topic files so you improve them rather than creating duplicates
106
107
  - If \`logs/\` or \`sessions/\` subdirectories exist, review recent entries there
107
108
 
@@ -127,7 +128,7 @@ Focus on:
127
128
 
128
129
  ## Phase 4 \u2014 Prune and index
129
130
 
130
- Update \`${kl}\` so it stays under ${Hf} 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 \`${Vl}\` so it stays under ${Oh} 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
132
 
132
133
  - Remove pointers to memories that are now stale, wrong, or superseded
133
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
@@ -142,162 +143,164 @@ Sessions since last consolidation (${t.length}):
142
143
  ${t.map(s=>`- ${s}`).join(`
143
144
  `)}
144
145
 
145
- Return a brief summary of what you consolidated, updated, or pruned. If nothing changed (memories are already tight), say so.`}var Tl=0;async function Yf(r,e={}){let t={...xl,...e},n;try{n=await _l(r.memoryRoot)}catch{n=0}let o=(Date.now()-n)/36e5;if(!t.force&&o<t.minHours)return null;let s=Date.now()-Tl;if(!t.force&&s<t.scanIntervalMs)return null;Tl=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 _l(r){let e=to(r,no);return(await vl(e)).mtimeMs}function Xf(r){try{return process.kill(r,0),!0}catch{return!1}}async function Qf(r){let e=to(r,no),t,n;try{let[s,i]=await Promise.all([vl(e),fl(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<Gf&&n!==void 0&&Xf(n))return null;await Bf(r,{recursive:!0}),await es(e,String(process.pid));let o;try{o=await fl(e,"utf8")}catch{return null}return parseInt(o.trim(),10)!==process.pid?null:t??0}async function wl(r,e){let t=to(r,no);try{if(e===0){await Ff(t);return}await es(t,"");let{utimes:n}=await import("node:fs/promises"),o=e/1e3;await n(t,o,o)}catch{}}async function Zf(r){let e=to(r,no);await es(e,String(process.pid))}function eh(r){return{taskId:`dream-${Wf().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 th(r,e={}){let t={...xl,...e},n=await Yf(r,t);if(!n)return null;let o;if(t.force)try{o=await _l(r.memoryRoot)}catch{o=0}else if(o=await Qf(r.memoryRoot),o===null)return null;let s=Rl(r.memoryRoot,r.transcriptDir,n.sessionIds),i=eh({sessionId:r.currentSessionId,sessionsReviewing:n.sessionIds.length,priorLockMtime:o});return{prompt:s,taskState:i,sessionIds:n.sessionIds}}async function Cl(r){let e=Date.now(),t=await th(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 ml(r.context.memoryRoot);u.totalFiles>0&&(s=gl(u))}catch{}let i=!!(r.qmemoryAdapter&&r.qmemoryUserId),a=Rl(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)=>Jf(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&&Sl(y,r.context.memoryRoot)&&m.push(y)}catch{}return u.ok?(await Zf(r.context.memoryRoot),r.log.info(`[dream] consolidation complete \u2014 ${m.length} files touched, ${u.durationMs}ms`)):(await wl(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 wl(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 oo from"node:fs/promises";import*as ts from"node:path";var Al={minIntervalHours:24,temporalExpiry:!0,stalenessDecay:!0,noiseArchival:!0},Il=".last-decay";async function nh(r,e={}){let t=(e.minIntervalHours??Al.minIntervalHours)*36e5,n=ts.join(r,Il);try{let o=await oo.readFile(n,"utf-8"),s=parseInt(o.trim(),10);return isNaN(s)?!0:Date.now()-s>=t}catch{return!0}}async function oh(r){let e=ts.join(r,Il);await oo.writeFile(e,String(Date.now()),"utf-8")}async function Ml(r){let e=Date.now(),t={...Al,...r.config};if(!await nh(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 oh(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 Mt=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 _e from"node:fs";import*as qe from"node:path";var Pl="transcript.jsonl",cn="state.json",rh=50,sh=50,ih=30;function El(r){return r?Fa(r):Bn()}function ro(r,e){let t=r.replace(/[^a-zA-Z0-9_-]/g,"_");return qe.join(El(e),t)}async function ns(r,e,t,n){let o=ro(r,t);await _e.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)+`
146
- `;await _e.promises.appendFile(qe.join(o,Pl),i,"utf8")}async function Ol(r,e,t,n){let o=ro(r,n);await _e.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=qe.join(o,cn+".tmp");await _e.promises.writeFile(i,JSON.stringify(s,null,2),"utf8"),await _e.promises.rename(i,qe.join(o,cn))}async function Dl(r,e){let t=ro(r,e),n=qe.join(t,Pl),o=qe.join(t,cn),s=[];try{s=(await _e.promises.readFile(n,"utf8")).split(`
147
- `).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 _e.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 Ll(r=rh,e){let t=El(e),n;try{n=await _e.promises.readdir(t)}catch{return[]}let o=[];for(let s of n){let i=qe.join(t,s,cn);try{let a=await _e.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 ah(r){return r.turnCount<sh?!1:r.taskSummaryGeneratedAt?r.turnCount-(r.taskSummaryGeneratedAt??0)>=ih:!0}async function $l(r,e,t,n,o){if(!ah(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(`
148
- `),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=ro(r,o),l=qe.join(d,cn);try{let p=await _e.promises.readFile(l,"utf8"),u=JSON.parse(p);u.metadata.taskSummary=c,u.metadata.taskSummaryGeneratedAt=e.turnCount;let m=l+".tmp";await _e.promises.writeFile(m,JSON.stringify(u,null,2),"utf8"),await _e.promises.rename(m,l)}catch{}return c}catch{return null}}Nr();import{randomUUID as l_}from"node:crypto";var lh=3e4;var io=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),!so(n.lifecycle)&&so(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&&so(t.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=lh){let t=Date.now();for(let[n,o]of this.tasks)so(o.lifecycle)&&o.endedAt&&t-o.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function so(r){return r==="completed"||r==="failed"||r==="cancelled"||r==="timeout"}import{watch as ch}from"node:fs";import{stat as dh}from"node:fs/promises";import{join as Ul,relative as uh,resolve as ph}from"node:path";var mh=[`${ye}/settings.json`,"INSTRUCTIONS.md",`${ye}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${ye}/rules`],gh=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${ye}/rules`],os=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 mh){let t=Ul(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=ch(e,{persistent:!1,recursive:t.includes("/")?!1:void 0},(o,s)=>{let i=s?Ul(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 dh(e)}catch{o="deleted"}let s=uh(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(()=>{}),gh.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let t=ph(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 os(r);return await e.start(),e}import{readFile as fh,readdir as hh,stat as yh}from"node:fs/promises";import{dirname as ao,extname as bh,isAbsolute as kh,join as ft,parse as Fl,resolve as jl}from"node:path";import{homedir as Th}from"node:os";var wh=5;var vh="INSTRUCTIONS.md",xh="INSTRUCTIONS.local.md",Sh="INSTRUCTIONS.md",Rh=[".instructions.md"],_h=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 Ch(r){try{return await fh(r,"utf-8")}catch{return null}}function Ah(r){return r.includes("<!--")?r.replace(/^[ \t]*<!--[\s\S]*?-->[ \t]*$/gm,""):r}function Ih(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 Mh(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=ft(Th(),a.slice(2));else if(kh(a))d=a;else if(a.startsWith("./"))d=jl(ao(e),a);else if(/^[a-zA-Z0-9._-]/.test(a)&&!a.startsWith("@"))d=jl(ao(e),a);else continue;t.add(d)}return[...t]}async function gt(r,e,t,n=0,o){let s=r.toLowerCase();if(t.has(s)||n>=wh)return[];let i=bh(r).toLowerCase();if(i&&!_h.has(i))return[];t.add(s);let a=await Ch(r);if(!a?.trim())return[];let{content:c,globs:d}=Ih(a),l=Ah(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=Mh(c,r);for(let g of m){let f=await gt(g,e,t,n+1,r);p.push(...f)}return p}async function rs(r,e,t,n,o=new Set){if(o.has(r))return[];o.add(r);let s=[];try{let i=await hh(r,{withFileTypes:!0});for(let a of i){let c=ft(r,a.name);if(a.isDirectory())s.push(...await rs(c,e,t,n,o));else if(a.isFile()&&a.name.endsWith(".md")){let d=await gt(c,e,t);s.push(...d.filter(l=>n?!!l.globs:!l.globs))}}}catch{}return s}async function Ph(r){let e=r,t=Fl(e).root;for(;e!==t;){try{let n=ft(e,".git"),o=await yh(n);if(o.isDirectory()||o.isFile())return e}catch{}e=ao(e)}return null}async function Eh(r,e){let t=[],n=new Set,o=Z(),s=ft(o,Sh);t.push(...await gt(s,"User",n));let i=$a();t.push(...await rs(i,"User",n,!1));let c=await Ph(r)??Fl(r).root,d=[],l=r;for(;d.push(l),!(l===c&&l!==r);){let p=ao(l);if(p===l)break;l=p}for(let p of d.reverse()){t.push(...await gt(ft(p,vh),"Project",n));for(let u of Rh)t.push(...await gt(ft(p,u),"Project",n));t.push(...await gt(Na(p),"Project",n)),t.push(...await rs(ja(p),"Project",n,!1)),t.push(...await gt(ft(p,xh),"Local",n))}return e&&t.length>0&&e.invoke("instructions.loaded",{sessionId:"",source:r,fileCount:t.length}).catch(()=>{}),t}function Bl(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 ql=0;async function jh(r,e={}){let t={...Yl,...e},n;try{n=await Zl(r.memoryRoot)}catch{n=0}let o=(Date.now()-n)/36e5;if(!t.force&&o<t.minHours)return null;let s=Date.now()-ql;if(!t.force&&s<t.scanIntervalMs)return null;ql=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 Zl(r){let e=wo(r,To);return(await Jl(e)).mtimeMs}function Fh(r){try{return process.kill(r,0),!0}catch{return!1}}async function Bh(r){let e=wo(r,To),t,n;try{let[s,i]=await Promise.all([Jl(e),Gl(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<Eh&&n!==void 0&&Fh(n))return null;await Ih(r,{recursive:!0}),await ws(e,String(process.pid));let o;try{o=await Gl(e,"utf8")}catch{return null}return parseInt(o.trim(),10)!==process.pid?null:t??0}async function Kl(r,e){let t=wo(r,To);try{if(e===0){await Ph(t);return}await ws(t,"");let{utimes:n}=await import("node:fs/promises"),o=e/1e3;await n(t,o,o)}catch{}}async function Gh(r){let e=wo(r,To);await ws(e,String(process.pid))}function Wh(r){return{taskId:`dream-${Mh().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 Hh(r,e={}){let t={...Yl,...e},n=await jh(r,t);if(!n)return null;let o;if(t.force)try{o=await Zl(r.memoryRoot)}catch{o=0}else if(o=await Bh(r.memoryRoot),o===null)return null;let s=Ql(r.memoryRoot,r.transcriptDir,n.sessionIds),i=Wh({sessionId:r.currentSessionId,sessionsReviewing:n.sessionIds.length,priorLockMtime:o});return{prompt:s,taskState:i,sessionIds:n.sessionIds}}async function ec(r){let e=Date.now(),t=await Hh(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 f=await Fl(r.context.memoryRoot);f.totalFiles>0&&(s=Bl(f))}catch{}let i=!!(r.qmemoryAdapter&&r.qmemoryUserId),a=Ql(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=(f,m)=>Nh(r.context.memoryRoot,{toolName:f,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(f,m,y,k)=>{let w=r.qmemoryAdapter,x=r.qmemoryUserId;if(m==="qmemory_search"){let{query:S,limit:b}=JSON.parse(y),I=await w.search(S,x,{limit:b??10});return{result:JSON.stringify(I)}}if(m==="qmemory_store"){if(!w.addText)return{result:"",error:"addText not supported"};let{text:S,source:b}=JSON.parse(y),I=await w.addText(S,x,{sessionId:r.context.currentSessionId,source:b??"dream-consolidation"});return{result:JSON.stringify(I)}}if(m==="qmemory_feedback"){let{memoryIds:S,signal:b}=JSON.parse(y);return w.feedback&&await w.feedback(S,b,r.context.currentSessionId),{result:"Feedback recorded successfully."}}return r.toolInvoker.invoke(f,m,y,k)}}:r.toolInvoker,u=new Set(["read","write","edit","patch","exec","search","qmemory_search","qmemory_store","qmemory_feedback"]),g=[...r.tools.filter(f=>u.has(f.function.name)),...d];try{let f=await hn({promptMessages:[{role:"user",content:"Begin memory consolidation."}],systemPrompt:a,tools:g,canUseTool:c,transport:r.transport,toolInvoker:l,apiKey:r.apiKey,model:r.model,log:r.log,hooks:void 0,forkLabel:"dream-consolidation",maxTurns:15,parentSignal:r.parentSignal,skipTranscript:!0}),m=[];for(let y of f.events)if(y.type==="tool_call")try{let k=JSON.parse(y.arguments),w=k.file_path??k.path??k.filePath;w&&Xl(w,r.context.memoryRoot)&&m.push(w)}catch{}return f.ok?(await Gh(r.context.memoryRoot),r.log.info(`[dream] consolidation complete \u2014 ${m.length} files touched, ${f.durationMs}ms`)):(await Kl(r.context.memoryRoot,n.priorLockMtime),r.log.warn(`[dream] consolidation failed: ${f.error}`)),r.hooks?.invoke("subagent.stopped",{sessionId:r.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream",reason:f.ok?"normal":"error",error:f.error}).catch(()=>{}),{ok:f.ok,sessionsReviewed:o.length,filesTouched:[...new Set(m)],turns:[],durationMs:Date.now()-e,error:f.error}}catch(f){await Kl(r.context.memoryRoot,n.priorLockMtime).catch(()=>{});let m=f instanceof Error?f.message:String(f);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 vo from"node:fs/promises";import*as Ts from"node:path";var tc={minIntervalHours:24,temporalExpiry:!0,stalenessDecay:!0,noiseArchival:!0},nc=".last-decay";async function zh(r,e={}){let t=(e.minIntervalHours??tc.minIntervalHours)*36e5,n=Ts.join(r,nc);try{let o=await vo.readFile(n,"utf-8"),s=parseInt(o.trim(),10);return isNaN(s)?!0:Date.now()-s>=t}catch{return!0}}async function Vh(r){let e=Ts.join(r,nc);await vo.writeFile(e,String(Date.now()),"utf-8")}async function oc(r){let e=Date.now(),t={...tc,...r.config};if(!await zh(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 Vh(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 jt=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 Ae from"node:fs";import*as Qe from"node:path";var rc="transcript.jsonl",yn="state.json",qh=50,Kh=50,Jh=30;function sc(r){return r?ul(r):to()}function xo(r,e){let t=r.replace(/[^a-zA-Z0-9_-]/g,"_");return Qe.join(sc(e),t)}async function vs(r,e,t,n){let o=xo(r,t);await Ae.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 Ae.promises.appendFile(Qe.join(o,rc),i,"utf8")}async function ic(r,e,t,n){let o=xo(r,n);await Ae.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=Qe.join(o,yn+".tmp");await Ae.promises.writeFile(i,JSON.stringify(s,null,2),"utf8"),await Ae.promises.rename(i,Qe.join(o,yn))}async function ac(r,e){let t=xo(r,e),n=Qe.join(t,rc),o=Qe.join(t,yn),s=[];try{s=(await Ae.promises.readFile(n,"utf8")).split(`
148
+ `).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 Ae.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 lc(r=qh,e){let t=sc(e),n;try{n=await Ae.promises.readdir(t)}catch{return[]}let o=[];for(let s of n){let i=Qe.join(t,s,yn);try{let a=await Ae.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 Yh(r){return r.turnCount<Kh?!1:r.taskSummaryGeneratedAt?r.turnCount-(r.taskSummaryGeneratedAt??0)>=Jh:!0}async function cc(r,e,t,n,o){if(!Yh(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(`
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 u of a)u.type==="delta"&&(c+=u.text);if(c=c.trim(),!c)return null;let d=xo(r,o),l=Qe.join(d,yn);try{let u=await Ae.promises.readFile(l,"utf8"),p=JSON.parse(u);p.metadata.taskSummary=c,p.metadata.taskSummaryGeneratedAt=e.turnCount;let g=l+".tmp";await Ae.promises.writeFile(g,JSON.stringify(p,null,2),"utf8"),await Ae.promises.rename(g,l)}catch{}return c}catch{return null}}os();import{randomUUID as _C}from"node:crypto";var Xh=3e4;var Ro=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),!So(n.lifecycle)&&So(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&&So(t.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=Xh){let t=Date.now();for(let[n,o]of this.tasks)So(o.lifecycle)&&o.endedAt&&t-o.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function So(r){return r==="completed"||r==="failed"||r==="cancelled"||r==="timeout"}import{watch as Qh}from"node:fs";import{stat as Zh}from"node:fs/promises";import{join as dc,relative as ey,resolve as ty}from"node:path";var ny=[`${be}/settings.json`,"INSTRUCTIONS.md",`${be}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${be}/rules`],oy=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${be}/rules`],xs=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 ny){let t=dc(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=Qh(e,{persistent:!1,recursive:t.includes("/")?!1:void 0},(o,s)=>{let i=s?dc(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 Zh(e)}catch{o="deleted"}let s=ey(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(()=>{}),oy.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let t=ty(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 uc(r){let e=new xs(r);return await e.start(),e}import{readFile as ry,readdir as sy,stat as iy}from"node:fs/promises";import{dirname as _o,extname as ay,isAbsolute as ly,join as St,parse as mc,resolve as pc}from"node:path";import{homedir as cy}from"node:os";var dy=5;var uy="INSTRUCTIONS.md",py="INSTRUCTIONS.local.md",my="INSTRUCTIONS.md",gy=[".instructions.md"],fy=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 hy(r){try{return await ry(r,"utf-8")}catch{return null}}function yy(r){return r.includes("<!--")?r.replace(/^[ \t]*<!--[\s\S]*?-->[ \t]*$/gm,""):r}function by(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 ky(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=St(cy(),a.slice(2));else if(ly(a))d=a;else if(a.startsWith("./"))d=pc(_o(e),a);else if(/^[a-zA-Z0-9._-]/.test(a)&&!a.startsWith("@"))d=pc(_o(e),a);else continue;t.add(d)}return[...t]}async function xt(r,e,t,n=0,o){let s=r.toLowerCase();if(t.has(s)||n>=dy)return[];let i=ay(r).toLowerCase();if(i&&!fy.has(i))return[];t.add(s);let a=await hy(r);if(!a?.trim())return[];let{content:c,globs:d}=by(a),l=yy(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 g=ky(c,r);for(let f of g){let m=await xt(f,e,t,n+1,r);u.push(...m)}return u}async function Ss(r,e,t,n,o=new Set){if(o.has(r))return[];o.add(r);let s=[];try{let i=await sy(r,{withFileTypes:!0});for(let a of i){let c=St(r,a.name);if(a.isDirectory())s.push(...await Ss(c,e,t,n,o));else if(a.isFile()&&a.name.endsWith(".md")){let d=await xt(c,e,t);s.push(...d.filter(l=>n?!!l.globs:!l.globs))}}}catch{}return s}async function wy(r){let e=r,t=mc(e).root;for(;e!==t;){try{let n=St(e,".git"),o=await iy(n);if(o.isDirectory()||o.isFile())return e}catch{}e=_o(e)}return null}async function Ty(r,e){let t=[],n=new Set,o=K(),s=St(o,my);t.push(...await xt(s,"User",n));let i=sl();t.push(...await Ss(i,"User",n,!1));let c=await wy(r)??mc(r).root,d=[],l=r;for(;d.push(l),!(l===c&&l!==r);){let u=_o(l);if(u===l)break;l=u}for(let u of d.reverse()){t.push(...await xt(St(u,uy),"Project",n));for(let p of gy)t.push(...await xt(St(u,p),"Project",n));t.push(...await xt(al(u),"Project",n)),t.push(...await Ss(dl(u),"Project",n,!1)),t.push(...await xt(St(u,py),"Local",n))}return e&&t.length>0&&e.invoke("instructions.loaded",{sessionId:"",source:r,fileCount:t.length}).catch(()=>{}),t}function gc(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}:
149
150
 
150
151
  ${n.content.trim()}`)}return t.length>0?`${e}
151
152
 
152
153
  ${t.join(`
153
154
 
154
- `)}`:""}var dn=null,ss=null;async function Wl(r,e){return dn&&ss===r||(dn=await Eh(r,e),ss=r),dn}function Gl(){dn=null,ss=null}function is(r,e){return{name:r,compute:e,cacheBreak:!1}}function co(r,e,t){return{name:r,compute:e,cacheBreak:!0}}var lo=new Map;async function Oh(r){return(await Promise.all(r.map(async t=>{if(!t.cacheBreak&&lo.has(t.name))return lo.get(t.name)??null;let n=await t.compute();return lo.set(t.name,n),n}))).filter(t=>t!=null)}function Hl(){lo.clear()}async function zl(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 Oh(r.sections);e.push(...t)}return r.appendSystemPrompt&&e.push(r.appendSystemPrompt),e.filter(Boolean).join(`
155
+ `)}`:""}var bn=null,Rs=null;async function fc(r,e){return bn&&Rs===r||(bn=await Ty(r,e),Rs=r),bn}function hc(){bn=null,Rs=null}function _s(r,e){return{name:r,compute:e,cacheBreak:!1}}function kn(r,e,t){return{name:r,compute:e,cacheBreak:!0}}var Co=new Map;async function vy(r){return(await Promise.all(r.map(async t=>{if(!t.cacheBreak&&Co.has(t.name))return Co.get(t.name)??null;let n=await t.compute();return Co.set(t.name,n),n}))).filter(t=>t!=null)}function yc(){Co.clear()}async function bc(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 vy(r.sections);e.push(...t)}return r.appendSystemPrompt&&e.push(r.appendSystemPrompt),e.filter(Boolean).join(`
155
156
 
156
- `)}import{release as Dh,homedir as Lh}from"node:os";import{resolve as $h}from"node:path";function Uh(){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 Nh(){let r=process.platform,e=Dh();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 Vl(r){return is("environment_context",()=>{let e=Uh(),t=Nh(),n=r??process.cwd(),o=process.version,s=Lh(),i=["# Environment","",`- Platform: ${t}`,`- Shell: ${e}`,`- Working directory: ${$h(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(`
157
- `)})}function uo(){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 jh(){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 Fh(){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 Bh(){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 ql(r="general"){return co("task_guidance",()=>{let e;switch(r){case"coding":e=[...jh(),"",...uo()];break;case"office":e=[...Fh(),"",...uo()];break;case"creative":e=[...Bh(),"",...uo()];break;default:e=["# Doing Tasks","","You are a versatile assistant that handles software engineering, office, and creative tasks.","",...uo(),"","## 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(`
158
- `)})}function Kl(){return is("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(`
159
- `))}import{existsSync as Jl,mkdirSync as Wh,readFileSync as un,writeFileSync as Yl}from"node:fs";import{join as pn}from"node:path";var po=new Set(["coding","office","creative","general"]),Xl="settings.yaml";function Gh(r){try{let e=pn(r,ye,Xl),n=un(e,"utf-8").match(/^taskDomain\s*:\s*(\w+)/m);if(n){let o=n[1].toLowerCase();if(po.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(po.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(po.has(s))return s}}}catch{}}var Hh=3;function zh(r,e){let t=Jh(r);return e?t===e||t==="general"?e:(ls(r)[t]??0)>=Hh?t:e:t}var Vh=/\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,qh=/\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,Kh=/\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 Jh(r){if(!r||r.trim().length===0)return"general";let e=ls(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 ls(r){return{coding:as(r,Vh),office:as(r,qh),creative:as(r,Kh),general:0}}function as(r,e){let t=new RegExp(e.source,"gi"),n=r.match(t);return n?n.length:0}function Ql(r){let e=Gh(r.cwd);if(e)return{domain:e,source:"project-file"};if(r.hostOverride&&po.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 Yh=3;function Zl(r,e){if(e==="general")return!1;try{let t=pn(r,ye),n=pn(t,Xl);if(Jl(n)){let s=un(n,"utf-8");if(/^taskDomain\s*:/m.test(s))return!1}Wh(t,{recursive:!0});let o=`# Auto-detected task domain for this workspace.
157
+ `)}import{release as xy,homedir as Sy}from"node:os";import{resolve as Ry}from"node:path";function _y(){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 Cy(){let r=process.platform,e=xy();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 kc(r){return _s("environment_context",()=>{let e=_y(),t=Cy(),n=r??process.cwd(),o=process.version,s=Sy(),i=["# Environment","",`- Platform: ${t}`,`- Shell: ${e}`,`- Working directory: ${Ry(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 Ao(){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 Ay(){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 Py(){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 Iy(){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 wc(r="general"){return kn("task_guidance",()=>{let e;switch(r){case"coding":e=[...Ay(),"",...Ao()];break;case"office":e=[...Py(),"",...Ao()];break;case"creative":e=[...Iy(),"",...Ao()];break;default:e=["# Doing Tasks","","You are a versatile assistant that handles software engineering, office, and creative tasks.","",...Ao(),"","## 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 Tc(){return _s("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 vc,mkdirSync as My,readFileSync as wn,writeFileSync as xc}from"node:fs";import{join as Tn}from"node:path";var Po=new Set(["coding","office","creative","general"]),Sc="settings.yaml";function Ey(r){try{let e=Tn(r,be,Sc),n=wn(e,"utf-8").match(/^taskDomain\s*:\s*(\w+)/m);if(n){let o=n[1].toLowerCase();if(Po.has(o))return o}}catch{}try{let e=Tn(r,be,"INSTRUCTIONS.md"),n=wn(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(Po.has(s))return s}}}catch{}try{let e=Tn(r,"INSTRUCTIONS.md"),n=wn(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(Po.has(s))return s}}}catch{}}var Oy=3;function Dy(r,e){let t=Ny(r);return e?t===e||t==="general"?e:(As(r)[t]??0)>=Oy?t:e:t}var Ly=/\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,$y=/\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,Uy=/\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 Ny(r){if(!r||r.trim().length===0)return"general";let e=As(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 As(r){return{coding:Cs(r,Ly),office:Cs(r,$y),creative:Cs(r,Uy),general:0}}function Cs(r,e){let t=new RegExp(e.source,"gi"),n=r.match(t);return n?n.length:0}function Rc(r){let e=Ey(r.cwd);if(e)return{domain:e,source:"project-file"};if(r.hostOverride&&Po.has(r.hostOverride))return{domain:r.hostOverride,source:"host-override"};let t=Dy(r.userText,r.sessionDomain);return r.sessionDomain&&t===r.sessionDomain?{domain:t,source:"session-sticky"}:{domain:t,source:"auto-detect"}}var jy=3;function _c(r,e){if(e==="general")return!1;try{let t=Tn(r,be),n=Tn(t,Sc);if(vc(n)){let s=wn(n,"utf-8");if(/^taskDomain\s*:/m.test(s))return!1}My(t,{recursive:!0});let o=`# Auto-detected task domain for this workspace.
160
161
  # Values: coding | office | creative | general
161
- `;if(Jl(n)){let s=un(n,"utf-8");Yl(n,s.trimEnd()+`
162
+ `;if(vc(n)){let s=wn(n,"utf-8");xc(n,s.trimEnd()+`
162
163
 
163
164
  `+o+`taskDomain: ${e}
164
- `,"utf-8")}else Yl(n,o+`taskDomain: ${e}
165
- `,"utf-8");return!0}catch{return!1}}function ec(r,e){return e==="general"?!1:(ls(r)[e]??0)>=Yh}import*as B from"node:fs";import*as q from"node:path";import{execFile as fk}from"node:child_process";var cs=new Set(["gateway","agents_list","session_status","sessions_send","sessions_list","sessions_history","sessions_spawn","cron","config","workflow"]),tc=new Set([...cs,"agent"]);function ds(r,e){let t=e?cs:tc;return r.filter(n=>n.function.name.startsWith("mcp__")?!0:!t.has(n.function.name))}var Ke=new Map,us=new Set;function nc(r){Ke.clear(),us.clear();for(let e of r)Ke.set(e.name,e)}function be(r){Ke.set(r.name,r)}function ps(r){for(let e of r)Ke.set(e.name,e)}function mo(r){return Ke.delete(r)}function Ce(r){return Ke.get(r)}function tt(){return Array.from(Ke.keys())}function oc(r){let e=Ke.get(r);return!e||e.isEnabled?.()===!1?!1:(us.add(r),!0)}function Je(r=!1){let e=[];for(let t of Ke.values())t.isEnabled?.()!==!1&&(!r&&t.shouldDefer&&!us.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 Xh="think",Qh={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(`
166
- `)}},required:["thought"]};function rc(){return{name:Xh,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(`
167
- `),parameters:Qh,execute:async(r,e)=>({content:[{type:"text",text:"Thought recorded. Now proceed with the best action based on your reasoning."}],details:{type:"think"}})}}function Pt(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 Zh="todo",ey=["create","update","delete","list"],ty={type:"object",properties:{action:{type:"string",enum:[...ey],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 sc(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=Pt(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:Zh,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:ty,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 xy,resolve as Sy}from"node:path";var ic=new Set(["find","grep","rg","ag","ack","locate","which","whereis"]),ac=new Set(["cat","head","tail","less","more","wc","stat","file","strings","jq","awk","cut","sort","uniq","tr"]),lc=new Set(["ls","tree","du"]);var cc=new Set(["mv","cp","rm","mkdir","rmdir","chmod","chown","chgrp","touch","ln","cd","export","unset","wait"]);function ny(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 dc(r){return/(?:^|[;&|])\s*(?:cd|pushd|popd)\b/.test(r)}function ms(r){let e=ny(r),t=e!==null&&ic.has(e),n=e!==null&&ac.has(e),o=e!==null&&lc.has(e),s=e!==null&&cc.has(e),i=/(?:[^2]>|^>|\|>)/.test(r),a=dc(r),c=(t||n||o)&&!i&&!a;return{firstCommand:e,isSearch:t,isRead:n,isList:o,isSilent:s,isConcurrencySafe:c,isReadOnly:c}}function gs(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 fy}from"node:child_process";import{constants as yo,readFileSync as hy,unlinkSync as yy}from"node:fs";import{mkdir as by,open as ky,realpath as gc}from"node:fs/promises";import{isAbsolute as Ty,resolve as wy}from"node:path";function go(){if(process.platform!=="win32")return!1;let r=process.env.QLOGICAGENT_USE_POWERSHELL;return r==="1"||r==="true"}function fs(){return go()?"powershell":"bash"}function hs(){return Math.floor(Math.random()*65536).toString(16).padStart(4,"0")}import{mkdir as oy,readFile as ry,writeFile as sy,unlink as iy}from"node:fs/promises";import{join as uc}from"node:path";import{tmpdir as ay}from"node:os";var ly=8*1024*1024,cy=5*1024*1024*1024;var ys;function mn(){if(!ys){let r=Math.random().toString(36).slice(2,10);ys=uc(ay(),"qla-tasks",r)}return ys}function pc(r){return uc(mn(),`${r}.output`)}function Ye(r="local_bash"){return`${r}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var nt=class{taskId;path;stdoutToFile;#e="";#n="";#r=0;#s=0;#t;#i;#o=0;#a=!1;constructor(e,t,n=!1,o=ly){this.taskId=e,this.path=pc(e),this.stdoutToFile=n,this.#t=o,this.#i=t}writeStdout(e){this.#e+=e,this.#s+=e.length,this.#r+=dy(e),this.#d()}writeStderr(e){this.#n+=e}async getStdout(){if(this.stdoutToFile)try{let e=await ry(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&&oy(mn(),{recursive:!0}).then(()=>sy(this.path,this.#e).catch(()=>{}))}async deleteOutputFile(){try{await iy(this.path)}catch{}}clear(){this.#a||(this.#a=!0,this.#e="",this.#n="",this.#i=null,this.deleteOutputFile())}};function dy(r){let e=0;for(let t=0;t<r.length;t++)r.charCodeAt(t)===10&&e++;return e}var bs=137,mc=143,uy=5e3,ks=5*1024*1024*1024,fo=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)}},Ts=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=ks){this.#t=e,this.#l=t,this.#g=n,this.#b=s,this.#d=i,this.taskOutput=o,this.#s=e.stderr?new fo(e.stderr,o,!0):null,this.#r=e.stdout?new fo(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(mc)}#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(bs))},()=>{}))},uy),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===bs,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 ${ks} bytes. ${n.stderr}`:e===mc&&(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??bs)}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 ws(r,e,t,n,o=!1,s=ks){return new Ts(r,e,t,n,o,s)}function ho(r,e){let t=new nt(Ye("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 vs(r){let e=new nt(Ye("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 py=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"]),my=["_SECRET","_TOKEN","_PASSWORD","_CREDENTIAL","_API_KEY","SECRET_","TOKEN_","PASSWORD_","CREDENTIAL_","_AUTH_","PRIVATE_KEY"];function xs(){let r={...process.env};for(let e of Object.keys(r))gy(e)&&delete r[e];return r}function gy(r){if(py.has(r))return!0;let e=r.toUpperCase();for(let t of my)if(e.includes(t))return!0;return!1}var vy=1800*1e3,bo=process.cwd(),fc=process.cwd();function ko(){return bo}function Ss(r,e){bo=Ty(r)?r:wy(e||bo,r)}function hc(){return fc}function To(r){bo=r,fc=r}var Rs=null;function gn(r){Rs={provider:r}}function yc(){if(!Rs)throw new Error("Shell provider not configured. Call setShellProvider() at startup.");return Rs.provider}async function wo(r,e,t,n){let{timeout:o,onProgress:s,preventCwdChanges:i,shouldAutoBackground:a,onStdout:c,cwd:d}=n??{},l=o||vy,p=t??fs(),u=yc(),m=hs(),{commandString:g,cwdFilePath:f}=await u.buildExecCommand(r,{id:m,useSandbox:!1}),y=g,k=d??ko();try{await gc(k)}catch{let v=hc();try{await gc(v),Ss(v),k=v}catch{return vs(`Working directory "${k}" no longer exists.`)}}if(e.aborted)return ho();let w=u.shellPath,C=u.getSpawnArgs(y),R=await u.getEnvironmentOverrides(r),b=!!c,E=Ye("local_bash"),P=new nt(E,s??null,!b);await by(mn(),{recursive:!0});let U;if(!b){let v=yo.O_NOFOLLOW??0;U=await ky(P.path,process.platform==="win32"?"w":yo.O_WRONLY|yo.O_CREAT|yo.O_APPEND|v)}try{let v=fy(w,C,{env:{...xs(),GIT_EDITOR:"true",QLOGICAGENT:"1",...R},cwd:k,stdio:b?["pipe","pipe","pipe"]:["pipe",U?.fd,U?.fd],detached:u.detached,windowsHide:!0}),ie=ws(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=hy(f,{encoding:"utf8"}).trim();D&&D.normalize("NFC")!==k&&Ss(D,k)}catch{}try{yy(f)}catch{}}}),ie}catch(v){if(U!==void 0)try{await U.close()}catch{}return P.clear(),ho(void 0,{code:126,stderr:v instanceof Error?v.message:String(v)})}}var Ry="exec",_y={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"]},Cy=12e4,Ay=6e5,vo=3e4;function _s(r,e){if(r.length<=e)return r;let t=Math.floor(e/2)-50;return`${r.slice(0,t)}
165
+ `,"utf-8")}else xc(n,o+`taskDomain: ${e}
166
+ `,"utf-8");return!0}catch{return!1}}function Cc(r,e){return e==="general"?!1:(As(r)[e]??0)>=jy}import*as G from"node:fs";import*as J from"node:path";import{execFile as iw}from"node:child_process";var Ps=new Set(["gateway","agents_list","session_status","sessions_send","sessions_list","sessions_history","sessions_spawn","cron","config","workflow"]),Ac=new Set([...Ps,"agent"]);function Is(r,e){let t=e?Ps:Ac;return r.filter(n=>n.function.name.startsWith("mcp__")?!0:!t.has(n.function.name))}var Ze=new Map,Ms=new Set;function Pc(r){Ze.clear(),Ms.clear();for(let e of r)Ze.set(e.name,e)}function ke(r){Ze.set(r.name,r)}function Es(r){for(let e of r)Ze.set(e.name,e)}function Io(r){return Ze.delete(r)}function Pe(r){return Ze.get(r)}function lt(){return Array.from(Ze.keys())}function Ic(r){let e=Ze.get(r);return!e||e.isEnabled?.()===!1?!1:(Ms.add(r),!0)}function et(r=!1){let e=[];for(let t of Ze.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 Fy="think",By={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 Mc(){return{name:Fy,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:By,execute:async(r,e)=>({content:[{type:"text",text:"Thought recorded. Now proceed with the best action based on your reasoning."}],details:{type:"think"}})}}var Gy="task",Wy=["create","update","delete","list","get"];var Hy={type:"object",properties:{action:{type:"string",enum:[...Wy],description:"create \u2014 add a new task (auto-assigns id). update \u2014 modify a task by id (partial, supports dependency wiring). delete \u2014 remove a task by id (cascades block refs). list \u2014 read current task list with summary. get \u2014 get a single task by id."},id:{type:"number",description:"[update|delete|get] Task id to operate on."},title:{type:"string",description:"[create|update] Task title (3-7 words, imperative form)."},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 (they depend on this task)."},addBlockedBy:{type:"array",items:{type:"number"},description:"[update] Task IDs that should block this task (this task depends on them)."}},required:["action"]};function Os(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}}function Ec(r,e){let t=[],n=0,o=r??{},s=o.verificationNudge!==!1;function i(){let m=t.reduce((y,k)=>Math.max(y,k.id),0);return n=Math.max(n,m)+1,n}function a(m){return{content:[{type:"text",text:`Error: ${m}`}],details:{type:"task",error:m}}}function c(m){let y=Os(t),k=new Set(t.filter(b=>b.status==="completed").map(b=>b.id)),w=t.map(b=>{let I=b.blockedBy?.filter(O=>!k.has(O));return{...b,...I?.length?{blockedBy:I}:{blockedBy:void 0}}}),x=[];if(x.push(`Task list updated. ${y.total} tasks: ${y.completed} completed, ${y.inProgress} in-progress, ${y.notStarted} not-started.`),y.blocked>0&&x.push(`${y.blocked} blocked.`),m?.created){let b=m.created;x.push(`Created task #${b.id}: "${b.title}"`)}if(m?.updated){let b=m.updated;x.push(`Updated task #${b.id}: "${b.title}"`)}if(m?.deleted!=null&&x.push(`Deleted task #${m.deleted}`),w.length>0){x.push("");for(let b of w){let I=b.status==="completed"?"\u2713":b.status==="in-progress"?"\u2192":"\u25CB",O=b.blockedBy?.length?` [blocked by #${b.blockedBy.join(", #")}]`:"",U=b.owner?` (${b.owner})`:"";x.push(` ${I} #${b.id}: ${b.title} (${b.status})${U}${O}`)}}let S=!1;if(s&&m?.updated&&m.updated.status==="completed"){let I=t.every(v=>v.status==="completed"),O=t.length,U=t.some(v=>/verif/i.test(v.title));I&&O>=3&&!U&&(S=!0,x.push(""),x.push("NOTE: You just closed out "+O+' tasks and none of them was a verification step. Before writing your final summary, spawn the verification agent (agent type="verify"). You cannot self-assign PARTIAL by listing caveats in your summary \u2014 only the verifier issues a verdict.'))}return{content:[{type:"text",text:x.join(`
169
+ `)}],details:{type:"task",...y,...m,taskList:w,agentId:o.agentId,...S&&{verificationNudgeNeeded:!0}}}}function d(m,y,k){let w=t.find(x=>x.id===m);if(w){if(y?.length){w.blocks=[...new Set([...w.blocks??[],...y])];for(let x of y){let S=t.find(b=>b.id===x);S&&(S.blockedBy=[...new Set([...S.blockedBy??[],m])])}}if(k?.length){w.blockedBy=[...new Set([...w.blockedBy??[],...k])];for(let x of k){let S=t.find(b=>b.id===x);S&&(S.blocks=[...new Set([...S.blocks??[],m])])}}}}function l(m){for(let y of t)y.blocks&&(y.blocks=y.blocks.filter(k=>k!==m)),y.blockedBy&&(y.blockedBy=y.blockedBy.filter(k=>k!==m))}function u(m){if(!m.title)return a("title is required for create action.");let y={id:i(),title:m.title,status:m.status??"not-started",...m.description!=null&&{description:m.description},...m.owner!=null&&{owner:m.owner}};return t.push(y),d(y.id,void 0,m.addBlockedBy),e?.onTaskCreated?.(y),c({created:{id:y.id,title:y.title}})}function p(m){if(m.id==null)return a("id is required for update action.");let y=t.find(k=>k.id===m.id);if(!y)return a(`Task #${m.id} not found.`);if(m.status==="in-progress"){let k=new Set(t.filter(x=>x.status==="completed").map(x=>x.id)),w=y.blockedBy?.filter(x=>!k.has(x));if(w?.length)return a(`Cannot set #${m.id} to in-progress: blocked by unresolved task(s) #${w.join(", #")}.`)}if(m.title!=null&&(y.title=m.title),m.description!=null&&(y.description=m.description),m.owner!=null&&(y.owner=m.owner),m.status!=null){let k=y.status;y.status=m.status,k!=="completed"&&m.status==="completed"&&e?.onTaskCompleted?.(y)}return d(y.id,m.addBlocks,m.addBlockedBy),c({updated:{id:y.id,title:y.title,status:y.status}})}function g(m){if(m.id==null)return a("id is required for delete action.");let y=t.findIndex(k=>k.id===m.id);return y===-1?a(`Task #${m.id} not found.`):(n=Math.max(n,m.id),t.splice(y,1),l(m.id),c({deleted:m.id}))}function f(m){if(m.id==null)return a("id is required for get action.");let y=t.find(S=>S.id===m.id);if(!y)return a(`Task #${m.id} not found.`);let k=new Set(t.filter(S=>S.status==="completed").map(S=>S.id)),w=y.blockedBy?.filter(S=>!k.has(S));return{content:[{type:"text",text:[`Task #${y.id}: ${y.title}`,`Status: ${y.status}`,y.description?`Description: ${y.description}`:"",y.owner?`Owner: ${y.owner}`:"",w?.length?`Blocked by: #${w.join(", #")}`:"",y.blocks?.length?`Blocks: #${y.blocks.join(", #")}`:""].filter(Boolean).join(`
170
+ `)}],details:{type:"task",action:"get",task:y}}}return{name:Gy,label:"Task",description:"Manage a structured task list to track multi-step work progress. Actions: create (add task), update (modify by id), delete (remove by id), list (read all), get (single task). Supports dependency tracking (blocks/blockedBy) \u2014 tasks cannot start until blockers complete. Use frequently during complex work to plan steps, coordinate subagents, and show progress.",parameters:Hy,searchHint:"manage session task checklist progress tracking dependencies planning",maxResultSizeChars:1e5,execute:async(m,y)=>{let k=y.action;switch(k){case"create":return u(y);case"update":return p(y);case"delete":return g(y);case"list":return c();case"get":return f(y);default:return a(`Unknown action: ${k}. Valid: create, update, delete, list, get.`)}}}}import{isAbsolute as pb,resolve as mb}from"node:path";var Oc=new Set(["find","grep","rg","ag","ack","locate","which","whereis"]),Dc=new Set(["cat","head","tail","less","more","wc","stat","file","strings","jq","awk","cut","sort","uniq","tr"]),Lc=new Set(["ls","tree","du"]);var $c=new Set(["mv","cp","rm","mkdir","rmdir","chmod","chown","chgrp","touch","ln","cd","export","unset","wait"]);function zy(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 Uc(r){return/(?:^|[;&|])\s*(?:cd|pushd|popd)\b/.test(r)}function Ds(r){let e=zy(r),t=e!==null&&Oc.has(e),n=e!==null&&Dc.has(e),o=e!==null&&Lc.has(e),s=e!==null&&$c.has(e),i=/(?:[^2]>|^>|\|>)/.test(r),a=Uc(r),c=(t||n||o)&&!i&&!a;return{firstCommand:e,isSearch:t,isRead:n,isList:o,isSilent:s,isConcurrencySafe:c,isReadOnly:c}}function Ls(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 rb}from"node:child_process";import{constants as Do,readFileSync as sb,unlinkSync as ib}from"node:fs";import{mkdir as ab,open as lb,realpath as Bc}from"node:fs/promises";import{isAbsolute as cb,resolve as db}from"node:path";function Mo(){if(process.platform!=="win32")return!1;let r=process.env.QLOGICAGENT_USE_POWERSHELL;return r==="1"||r==="true"}function $s(){return Mo()?"powershell":"bash"}function Us(){return Math.floor(Math.random()*65536).toString(16).padStart(4,"0")}import{mkdir as Vy,readFile as qy,writeFile as Ky,unlink as Jy}from"node:fs/promises";import{join as Nc}from"node:path";import{tmpdir as Yy}from"node:os";var Xy=8*1024*1024,Qy=5*1024*1024*1024;var Ns;function vn(){if(!Ns){let r=Math.random().toString(36).slice(2,10);Ns=Nc(Yy(),"qla-tasks",r)}return Ns}function jc(r){return Nc(vn(),`${r}.output`)}function tt(r="local_bash"){return`${r}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var ct=class{taskId;path;stdoutToFile;#e="";#n="";#r=0;#s=0;#t;#i;#o=0;#a=!1;constructor(e,t,n=!1,o=Xy){this.taskId=e,this.path=jc(e),this.stdoutToFile=n,this.#t=o,this.#i=t}writeStdout(e){this.#e+=e,this.#s+=e.length,this.#r+=Zy(e),this.#d()}writeStderr(e){this.#n+=e}async getStdout(){if(this.stdoutToFile)try{let e=await qy(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&&Vy(vn(),{recursive:!0}).then(()=>Ky(this.path,this.#e).catch(()=>{}))}async deleteOutputFile(){try{await Jy(this.path)}catch{}}clear(){this.#a||(this.#a=!0,this.#e="",this.#n="",this.#i=null,this.deleteOutputFile())}};function Zy(r){let e=0;for(let t=0;t<r.length;t++)r.charCodeAt(t)===10&&e++;return e}var js=137,Fc=143,eb=5e3,Fs=5*1024*1024*1024,Eo=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)}},Bs=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=Fs){this.#t=e,this.#l=t,this.#g=n,this.#b=s,this.#d=i,this.taskOutput=o,this.#s=e.stderr?new Eo(e.stderr,o,!0):null,this.#r=e.stdout?new Eo(e.stdout,o,!1):null,s&&(this.onTimeout=a=>{this.#u=a}),this.result=this.#R()}get status(){return this.#e}static#w(e){e.#b&&e.#u?e.#u(e.background.bind(e)):e.#y(Fc)}#T(){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(js))},()=>{}))},eb),this.#o.unref?.()}#R(){this.#c=this.#T.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.#w,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===js,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 ${Fs} bytes. ${n.stderr}`:e===Fc&&(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??js)}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 Gs(r,e,t,n,o=!1,s=Fs){return new Bs(r,e,t,n,o,s)}function Oo(r,e){let t=new ct(tt("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 Ws(r){let e=new ct(tt("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 tb=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"]),nb=["_SECRET","_TOKEN","_PASSWORD","_CREDENTIAL","_API_KEY","SECRET_","TOKEN_","PASSWORD_","CREDENTIAL_","_AUTH_","PRIVATE_KEY"];function Hs(){let r={...process.env};for(let e of Object.keys(r))ob(e)&&delete r[e];return r}function ob(r){if(tb.has(r))return!0;let e=r.toUpperCase();for(let t of nb)if(e.includes(t))return!0;return!1}var ub=1800*1e3,Lo=process.cwd(),Gc=process.cwd();function $o(){return Lo}function zs(r,e){Lo=cb(r)?r:db(e||Lo,r)}function Wc(){return Gc}function Uo(r){Lo=r,Gc=r}var Vs=null;function xn(r){Vs={provider:r}}function Hc(){if(!Vs)throw new Error("Shell provider not configured. Call setShellProvider() at startup.");return Vs.provider}async function No(r,e,t,n){let{timeout:o,onProgress:s,preventCwdChanges:i,shouldAutoBackground:a,onStdout:c,cwd:d}=n??{},l=o||ub,u=t??$s(),p=Hc(),g=Us(),{commandString:f,cwdFilePath:m}=await p.buildExecCommand(r,{id:g,useSandbox:!1}),y=f,k=d??$o();try{await Bc(k)}catch{let v=Wc();try{await Bc(v),zs(v),k=v}catch{return Ws(`Working directory "${k}" no longer exists.`)}}if(e.aborted)return Oo();let w=p.shellPath,x=p.getSpawnArgs(y),S=await p.getEnvironmentOverrides(r),b=!!c,I=tt("local_bash"),O=new ct(I,s??null,!b);await ab(vn(),{recursive:!0});let U;if(!b){let v=Do.O_NOFOLLOW??0;U=await lb(O.path,process.platform==="win32"?"w":Do.O_WRONLY|Do.O_CREAT|Do.O_APPEND|v)}try{let v=rb(w,x,{env:{...Hs(),GIT_EDITOR:"true",QLOGICAGENT:"1",...S},cwd:k,stdio:b?["pipe","pipe","pipe"]:["pipe",U?.fd,U?.fd],detached:p.detached,windowsHide:!0}),ie=Gs(v,e,l,O,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())}),m&&ie.result.then(Y=>{if(Y&&!i&&!Y.backgroundTaskId){try{let W=sb(m,{encoding:"utf8"}).trim();W&&W.normalize("NFC")!==k&&zs(W,k)}catch{}try{ib(m)}catch{}}}),ie}catch(v){if(U!==void 0)try{await U.close()}catch{}return O.clear(),Oo(void 0,{code:126,stderr:v instanceof Error?v.message:String(v)})}}var gb="exec",fb={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"]},hb=12e4,yb=6e5,jo=3e4;function qs(r,e){if(r.length<=e)return r;let t=Math.floor(e/2)-50;return`${r.slice(0,t)}
168
171
 
169
172
  ... [truncated ${r.length-e} chars] ...
170
173
 
171
- ${r.slice(-t)}`}function Iy(r){return r==null||r<=0?Cy:Math.min(r,Ay)}async function*My(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 wo(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=Ye("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 bc(r={}){return{name:Ry,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:_y,maxResultSizeChars:vo,execute:async(e,t)=>{let n=ms(t.command);if(!t.background){let u=gs(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=Iy(t.timeout),i=t.workdir?xy(t.workdir)?t.workdir:Sy(ko(),t.workdir):void 0;if(t.background){let u=await wo(t.command,o.signal,void 0,{shouldAutoBackground:!1,cwd:i}),m=Ye("bg");if(u.background(m))return{content:[{type:"text",text:`Background task started (id: ${m}).
172
- Use getOutput to check on it later.`}],details:{type:"exec_background",backgroundTaskId:m,description:t.description,classification:n}}}let a=My({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(_s(d.stdout,vo)),l.push(`[full output: ${d.outputFilePath} (${d.outputFileSize} bytes)]`)):d.stdout&&l.push(_s(d.stdout,vo)),d.stderr&&l.push(`[stderr]
173
- ${_s(d.stderr,Math.floor(vo/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(`
174
- `)}],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 Py}from"node:os";import{join as Ey,posix as Cs}from"node:path";function Oy(r){return r.replace(/(\d?)>nul\b/gi,(e,t)=>`${t||""}>/dev/null`)}function Dy(r){return!(/(?:^|[;&|])\s*<\s/.test(r)||/<<[-]?\s*['"]?[A-Za-z_]/.test(r))}function Ly(r,e){return`$'${r.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,"\\n")}'${e?" < /dev/null":""}`}function kc(r){return process.platform!=="win32"?r:r.replace(/^([A-Za-z]):/,(e,t)=>`/${t.toLowerCase()}`).replace(/\\/g,"/")}function xo(r,e){let t=e?.snapshotFilePath;return{type:"bash",shellPath:r,detached:!0,async buildExecCommand(n,o){let s=process.platform==="win32",i=Py(),a=s?kc(i):i,c=o.useSandbox&&o.sandboxTmpDir?Cs.join(o.sandboxTmpDir,`cwd-${o.id}`):Cs.join(a,`qla-${o.id}-cwd`),d=o.useSandbox&&o.sandboxTmpDir?Cs.join(o.sandboxTmpDir,`cwd-${o.id}`):Ey(i,`qla-${o.id}-cwd`),l=Oy(n),p=Dy(l),u=Ly(l,p),m=[];if(t){let f=s?kc(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 $y}from"node:os";import{join as Uy,posix as Ny}from"node:path";function Tc(r){return Buffer.from(r,"utf16le").toString("base64")}function jy(r){return["-NoProfile","-NonInteractive","-Command",r]}function As(r){return{type:"powershell",shellPath:r,detached:!1,async buildExecCommand(e,t){let n=t.useSandbox&&t.sandboxTmpDir?Ny.join(t.sandboxTmpDir,`qla-pwd-ps-${t.id}`):Uy($y(),`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(`
175
- ; `),i=e+s;return{commandString:t.useSandbox?[`'${r.replace(/'/g,"'\\''")}'`,"-NoProfile","-NonInteractive","-EncodedCommand",Tc(i)].join(" "):i,cwdFilePath:n}},getSpawnArgs(e){return jy(e)},async getEnvironmentOverrides(e){return{QLOGICAGENT:"1"}}}}var Fy=[{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"}],By=[{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 Is(r){for(let{pattern:e,warning:t}of Fy)if(e.test(r))return t;return null}function Ms(r){for(let{pattern:e,warning:t}of By)if(e.test(r))return t;return null}var Wy="read",Gy={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 wc(r){return{name:Wy,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:Gy,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(`
176
- `),c=Math.max(0,(o.offset??1)-1),d=Math.min(o.limit??2e3,2e3),l=a.slice(c,c+d),p=l.join(`
177
- `);p.length>5e4&&(p=p.slice(0,5e4)+`
178
- ... (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 Hy="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"]},vc=5e5;function xc(r){return{name:Hy,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>vc)return{content:[{type:"text",text:`Content too large (${t.content.length} chars, max ${vc}). 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(`
179
- `).length;return{content:[{type:"text",text:`Wrote ${o} lines to ${n}`}],details:{type:"write",path:n,lineCount:o}}}}}var Vy="edit",qy={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 Sc(r){return{name:Vy,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:qy,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(`
180
- `).length;return{content:[{type:"text",text:`Edited ${n} (line ${d})`}],details:{type:"edit",path:n,success:!0,firstChangedLine:d}}}}}var Ky="search",Jy={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"]},Rc=100,_c=250,Ps=1e5;function Cc(r){return{name:Ky,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:Jy,execute:async(e,t)=>{let n=t.path?r.resolvePath?r.resolvePath(t.path):t.path:"",o=t.mode;return o==="filename"?Yy(r,t,n):o==="content"?Xy(r,t,n):Qy(r,t,n)}}}async function Yy(r,e,t){let n=e.headLimit??Rc,{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(`
181
- `);return l&&(p+=`
182
-
183
- (Results truncated. ${d.length} shown. Use a more specific pattern or increase headLimit.)`),p=Es(p,Ps),{content:[{type:"text",text:p}],details:{mode:"filename",totalMatches:d.length,truncated:l}}}async function Xy(r,e,t){let n=e.headLimit??_c,{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(`
174
+ ${r.slice(-t)}`}function bb(r){return r==null||r<=0?hb:Math.min(r,yb)}async function*kb(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(f=>{l=()=>f(null)})}let p=await No(e,t.signal,void 0,{timeout:n,onProgress(f,m,y,k,w){i=m,a=y,c=k,l&&(l(),l=null)},shouldAutoBackground:o,cwd:s});for(p.onTimeout&&o&&p.onTimeout(f=>{let m=tt("bg");f(m)});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 g=await p.result;return p.cleanup(),g}function zc(r={}){return{name:gb,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:fb,maxResultSizeChars:jo,execute:async(e,t)=>{let n=Ds(t.command);if(!t.background){let p=Ls(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=bb(t.timeout),i=t.workdir?pb(t.workdir)?t.workdir:mb($o(),t.workdir):void 0;if(t.background){let p=await No(t.command,o.signal,void 0,{shouldAutoBackground:!1,cwd:i}),g=tt("bg");if(p.background(g))return{content:[{type:"text",text:`Background task started (id: ${g}).
175
+ Use getOutput to check on it later.`}],details:{type:"exec_background",backgroundTaskId:g,description:t.description,classification:n}}}let a=kb({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(qs(d.stdout,jo)),l.push(`[full output: ${d.outputFilePath} (${d.outputFileSize} bytes)]`)):d.stdout&&l.push(qs(d.stdout,jo)),d.stderr&&l.push(`[stderr]
176
+ ${qs(d.stderr,Math.floor(jo/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(`
177
+ `)}],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 wb}from"node:os";import{join as Tb,posix as Ks}from"node:path";function vb(r){return r.replace(/(\d?)>nul\b/gi,(e,t)=>`${t||""}>/dev/null`)}function xb(r){return!(/(?:^|[;&|])\s*<\s/.test(r)||/<<[-]?\s*['"]?[A-Za-z_]/.test(r))}function Sb(r,e){return`$'${r.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,"\\n")}'${e?" < /dev/null":""}`}function Vc(r){return process.platform!=="win32"?r:r.replace(/^([A-Za-z]):/,(e,t)=>`/${t.toLowerCase()}`).replace(/\\/g,"/")}function Fo(r,e){let t=e?.snapshotFilePath;return{type:"bash",shellPath:r,detached:!0,async buildExecCommand(n,o){let s=process.platform==="win32",i=wb(),a=s?Vc(i):i,c=o.useSandbox&&o.sandboxTmpDir?Ks.join(o.sandboxTmpDir,`cwd-${o.id}`):Ks.join(a,`qla-${o.id}-cwd`),d=o.useSandbox&&o.sandboxTmpDir?Ks.join(o.sandboxTmpDir,`cwd-${o.id}`):Tb(i,`qla-${o.id}-cwd`),l=vb(n),u=xb(l),p=Sb(l,u),g=[];if(t){let m=s?Vc(t):t;g.push(`source '${m}' 2>/dev/null || true`)}return e?.sessionEnvScript&&g.push(e.sessionEnvScript),g.push(`eval ${p}`),g.push(`pwd -P >| '${c}'`),{commandString:g.join(" && "),cwdFilePath:d}},getSpawnArgs(n){return["-c",...!!t?[]:["-l"],n]},async getEnvironmentOverrides(n){return{GIT_EDITOR:"true",QLOGICAGENT:"1"}}}}import{tmpdir as Rb}from"node:os";import{join as _b,posix as Cb}from"node:path";function qc(r){return Buffer.from(r,"utf16le").toString("base64")}function Ab(r){return["-NoProfile","-NonInteractive","-Command",r]}function Js(r){return{type:"powershell",shellPath:r,detached:!1,async buildExecCommand(e,t){let n=t.useSandbox&&t.sandboxTmpDir?Cb.join(t.sandboxTmpDir,`qla-pwd-ps-${t.id}`):_b(Rb(),`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(`
178
+ ; `),i=e+s;return{commandString:t.useSandbox?[`'${r.replace(/'/g,"'\\''")}'`,"-NoProfile","-NonInteractive","-EncodedCommand",qc(i)].join(" "):i,cwdFilePath:n}},getSpawnArgs(e){return Ab(e)},async getEnvironmentOverrides(e){return{QLOGICAGENT:"1"}}}}var Pb=[{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"}],Ib=[{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 Ys(r){for(let{pattern:e,warning:t}of Pb)if(e.test(r))return t;return null}function Xs(r){for(let{pattern:e,warning:t}of Ib)if(e.test(r))return t;return null}var Mb="read",Eb={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 Kc(r){return{name:Mb,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:Eb,execute:async(n,o)=>{let s=r.resolvePath(o.path);if(r.validatePath){let m=r.validatePath(s);if(m)return{content:[{type:"text",text:`Access denied: ${m}`}],details:{type:"read",path:s,error:"access_denied"}}}let i=await r.readFile(s);if(i.type==="image")return{content:[{type:"text",text:`[Image: ${s}] (${i.mimeType})`}],details:{type:"read",path:s,isImage:!0},imageUrls:[i.localPath]};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(`
179
+ `),c=Math.max(0,(o.offset??1)-1),d=Math.min(o.limit??2e3,2e3),l=a.slice(c,c+d),u=l.join(`
180
+ `);u.length>5e4&&(u=u.slice(0,5e4)+`
181
+ ... (truncated)`);let p=a.length,g=c+l.length,f=g<p;return{content:[{type:"text",text:u}],details:{type:"read",path:s,totalLines:p,startLine:c+1,endLine:g,hasMore:f}}}}}var Ob="write",Db={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"]},Jc=5e5;function Yc(r){return{name:Ob,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:Db,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>Jc)return{content:[{type:"text",text:`Content too large (${t.content.length} chars, max ${Jc}). 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(`
182
+ `).length;return{content:[{type:"text",text:`Wrote ${o} lines to ${n}`}],details:{type:"write",path:n,lineCount:o}}}}}var Lb="edit",$b={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 Xc(r){return{name:Lb,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:$b,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(`
183
+ `).length;return{content:[{type:"text",text:`Edited ${n} (line ${d})`}],details:{type:"edit",path:n,success:!0,firstChangedLine:d}}}}}var Ub="search",Nb={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"]},Qc=100,Zc=250,Qs=1e5;function ed(r){return{name:Ub,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:Nb,execute:async(e,t)=>{let n=t.path?r.resolvePath?r.resolvePath(t.path):t.path:"",o=t.mode;return o==="filename"?jb(r,t,n):o==="content"?Fb(r,t,n):Bb(r,t,n)}}}async function jb(r,e,t){let n=e.headLimit??Qc,{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(`
184
+ `);return l&&(u+=`
185
+
186
+ (Results truncated. ${d.length} shown. Use a more specific pattern or increase headLimit.)`),u=Zs(u,Qs),{content:[{type:"text",text:u}],details:{mode:"filename",totalMatches:d.length,truncated:l}}}async function Fb(r,e,t){let n=e.headLimit??Zc,{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(`
184
187
  `);return s&&(a+=`
185
188
 
186
- (Results truncated at ${o.length} matches. Use offset/headLimit for pagination.)`),a=Es(a,Ps),{content:[{type:"text",text:a}],details:{mode:"content",totalMatches:o.length,truncated:s}}}async function Qy(r,e,t){let[n,o]=await Promise.all([e.fileGlob?r.glob(e.fileGlob,{cwd:t,limit:Rc}):Promise.resolve({files:[],truncated:!1}),r.grep(e.pattern,{cwd:t,fileGlob:e.fileGlob,caseInsensitive:e.caseInsensitive,contextLines:e.contextLines,headLimit:e.headLimit??_c,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}):
189
+ (Results truncated at ${o.length} matches. Use offset/headLimit for pagination.)`),a=Zs(a,Qs),{content:[{type:"text",text:a}],details:{mode:"content",totalMatches:o.length,truncated:s}}}async function Bb(r,e,t){let[n,o]=await Promise.all([e.fileGlob?r.glob(e.fileGlob,{cwd:t,limit:Qc}):Promise.resolve({files:[],truncated:!1}),r.grep(e.pattern,{cwd:t,fileGlob:e.fileGlob,caseInsensitive:e.caseInsensitive,contextLines:e.contextLines,headLimit:e.headLimit??Zc,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
190
  ${i.join(`
188
- `)}`),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}):
191
+ `)}`),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
192
  ${l.join(`
190
193
  `)}`)}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(`
191
194
 
192
195
  `);return c&&(d+=`
193
196
 
194
- (Some results truncated. Use more specific patterns.)`),d=Es(d,Ps),{content:[{type:"text",text:d}],details:{mode:"both",totalMatches:i.length+o.matches.length,truncated:c}}}function Es(r,e){if(r.length<=e)return r;let t=Math.floor(e/2)-50;return`${r.slice(0,t)}
197
+ (Some results truncated. Use more specific patterns.)`),d=Zs(d,Qs),{content:[{type:"text",text:d}],details:{mode:"both",totalMatches:i.length+o.matches.length,truncated:c}}}function Zs(r,e){if(r.length<=e)return r;let t=Math.floor(e/2)-50;return`${r.slice(0,t)}
195
198
 
196
199
  ... [truncated ${r.length-e} chars] ...
197
200
 
198
- ${r.slice(-t)}`}var Zy="apply_patch",eb={type:"object",properties:{input:{type:"string",description:"Patch content using the *** Begin Patch / *** End Patch format."}},required:["input"]};function tb(r){let e=r.split(`
199
- `),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 nb(r,e){let n=[...r.split(`
201
+ ${r.slice(-t)}`}var Gb="apply_patch",Wb={type:"object",properties:{input:{type:"string",description:"Patch content using the *** Begin Patch / *** End Patch format."}},required:["input"]};function Hb(r){let e=r.split(`
202
+ `),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 zb(r,e){let n=[...r.split(`
200
203
  `)];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(`
201
- `)}function Ac(r){return{name:Zy,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:eb,execute:async(e,t)=>{let n=tb(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(`
202
- `);await r.writeFile(c,d),o.added.push(a.path);break}case"update":{let d=await r.readFile(c),l=nb(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(`
203
- `)||"No changes applied."}],details:{type:"apply_patch",summary:o,errors:s}}}}}var ob="patch",rb={type:"object",properties:{input:{type:"string",description:`Patch content. Supports two formats:
204
+ `)}function td(r){return{name:Gb,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:Wb,execute:async(e,t)=>{let n=Hb(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(`
205
+ `);await r.writeFile(c,d),o.added.push(a.path);break}case"update":{let d=await r.readFile(c),l=zb(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(`
206
+ `)||"No changes applied."}],details:{type:"apply_patch",summary:o,errors:s}}}}}var Vb="patch",qb={type:"object",properties:{input:{type:"string",description:`Patch content. Supports two formats:
204
207
  1) V4A unified diff (*** Begin Patch / *** End Patch markers)
205
208
  2) Simple find-replace: first line is file path, then <<<< SEARCH / ==== / >>>> REPLACE blocks.
206
- 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 sb(r){return r.replace(/\\n/g,`
207
- `).replace(/\\t/g," ").replace(/\\'/g,"'").replace(/\\"/g,'"')}function Ic(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 Mc(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 $c(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(`
208
- `).map(f=>f.trim()),i=r.split(`
209
- `),a=Pc(i,s,(f,y)=>f.trim()===y);if(a)return[{...Ec(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=Oc(r,d,o,c.length);if(f)return[{...f,strategy:"whitespace_normalized"}]}let l=Pc(i,s,(f,y)=>f.trimStart()===y.trimStart());if(l)return[{...Ec(r,i,l),strategy:"indentation_flexible"}];let p=sb(e);if(p!==e&&(o=r.indexOf(p),o!==-1))return[{start:o,end:o+p.length,strategy:"escape_normalized"}];let u=e.split(`
210
- `);if(u.length>=3){let f=u.slice(1,-1).join(`
211
- `),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(`
212
- `).length+1,R=r.indexOf(f,C);if(R!==-1){let b=R+f.length,E=r.indexOf(`
213
- `,b);if((E===-1?r.slice(b):r.slice(b,E)).trim()===k||E!==-1&&r.slice(b+1,r.indexOf(`
209
+ 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 Kb(r){return r.replace(/\\n/g,`
210
+ `).replace(/\\t/g," ").replace(/\\'/g,"'").replace(/\\"/g,'"')}function nd(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 od(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 cd(r,e,t){let n=[],o=r.indexOf(e);if(o!==-1){if(t){let m=0;for(;(o=r.indexOf(e,m))!==-1;)n.push({start:o,end:o+e.length,strategy:"exact"}),m=o+e.length}else n.push({start:o,end:o+e.length,strategy:"exact"});return n}let s=e.split(`
211
+ `).map(m=>m.trim()),i=r.split(`
212
+ `),a=rd(i,s,(m,y)=>m.trim()===y);if(a)return[{...sd(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 m=id(r,d,o,c.length);if(m)return[{...m,strategy:"whitespace_normalized"}]}let l=rd(i,s,(m,y)=>m.trimStart()===y.trimStart());if(l)return[{...sd(r,i,l),strategy:"indentation_flexible"}];let u=Kb(e);if(u!==e&&(o=r.indexOf(u),o!==-1))return[{start:o,end:o+u.length,strategy:"escape_normalized"}];let p=e.split(`
213
+ `);if(p.length>=3){let m=p.slice(1,-1).join(`
214
+ `),y=p[0].trim(),k=p[p.length-1].trim();for(let w=0;w<i.length;w++)if(i[w].trim()===y){let x=i.slice(0,w+1).join(`
215
+ `).length+1,S=r.indexOf(m,x);if(S!==-1){let b=S+m.length,I=r.indexOf(`
216
+ `,b);if((I===-1?r.slice(b):r.slice(b,I)).trim()===k||I!==-1&&r.slice(b+1,r.indexOf(`
214
217
  `,b+1)===-1?void 0:r.indexOf(`
215
218
  `,b+1)).trim()===k){let U=i.slice(0,w).join(`
216
- `).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(`
217
- `).length;return[{start:U,end:Y,strategy:"trimmed_boundary"}]}}}}}let m=Ic(e),g=Ic(r);if((m!==e||g!==r)&&(o=g.indexOf(m),o!==-1)){let f=Oc(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=>Mc(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+(w>0?1:0),v=w,ie=p.length;if(w+ie<=i.length){v=w+ie;let Y=i.slice(0,v).join(`
220
+ `).length;return[{start:U,end:Y,strategy:"trimmed_boundary"}]}}}}}let g=nd(e),f=nd(r);if((g!==e||f!==r)&&(o=f.indexOf(g),o!==-1)){let m=id(r,f,o,g.length);if(m)return[{...m,strategy:"unicode_normalized"}]}if(p.length>=3){let m=p[0],y=p[p.length-1];for(let k=0;k<i.length;k++)if(i[k]===m){for(let w=k+p.length-1;w<Math.min(k+p.length+2,i.length);w++)if(i[w]===y){let x=w-k+1,S=i.slice(k+1,w),b=p.slice(1,-1),I=b.filter(U=>S.some(v=>od(v,U)>=.7)).length;if((b.length>0?I/b.length:1)>=.5&&x<=p.length+2){let U=i.slice(0,k).join(`
218
221
  `).length+(k>0?1:0),v=i.slice(0,w+1).join(`
219
- `).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)=>Mc(C,y[R])).filter(C=>C>=.8).length/u.length>=.5){let C=i.slice(0,f).join(`
220
- `).length+(f>0?1:0),R=i.slice(0,f+u.length).join(`
221
- `).length;return[{start:C,end:R,strategy:"context_aware"}]}}return[]}function Pc(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 Ec(r,e,t){let n=e.slice(0,t.startIdx).join(`
222
+ `).length;return[{start:U,end:v,strategy:"block_anchor"}]}}}}if(p.length>=2)for(let m=0;m<=i.length-p.length;m++){let y=i.slice(m,m+p.length);if(p.map((x,S)=>od(x,y[S])).filter(x=>x>=.8).length/p.length>=.5){let x=i.slice(0,m).join(`
223
+ `).length+(m>0?1:0),S=i.slice(0,m+p.length).join(`
224
+ `).length;return[{start:x,end:S,strategy:"context_aware"}]}}return[]}function rd(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 sd(r,e,t){let n=e.slice(0,t.startIdx).join(`
222
225
  `).length+(t.startIdx>0?1:0),o=e.slice(0,t.endIdx).join(`
223
- `).length;return{start:n,end:o}}function Oc(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 Dc(r){let e=r.split(`
224
- `),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 ib(r){let e=[],t=r.split(/^(<<<< SEARCH)$/m);if(t.length<2)return[];let n=t[0].trim().split(`
226
+ `).length;return{start:n,end:o}}function id(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 ad(r){let e=r.split(`
227
+ `),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 Jb(r){let e=[],t=r.split(/^(<<<< SEARCH)$/m);if(t.length<2)return[];let n=t[0].trim().split(`
225
228
  `).pop()?.trim();if(!n)return[];for(let o=1;o<t.length;o+=2){let s=t[o+1]||"",i=s.indexOf(`
226
229
  ====
227
230
  `);if(i===-1)continue;let a=s.slice(0,i).replace(/^\n/,""),c=s.slice(i+6),d=c.indexOf(`
228
- >>>> REPLACE`),l=d===-1?c:c.slice(0,d);e.push({path:n,search:a,replace:l})}return e}function Lc(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(`
231
+ >>>> REPLACE`),l=d===-1?c:c.slice(0,d);e.push({path:n,search:a,replace:l})}return e}function ld(r,e,t){let n=e.lines.filter(f=>f.prefix===" ").map(f=>f.content),o=e.lines.filter(f=>f.prefix==="-").map(f=>f.content),s=e.lines.filter(f=>f.prefix==="+").map(f=>f.content),i=[],a="context";for(let f of e.lines)(f.prefix===" "||f.prefix==="-")&&i.push(f.content);let c=i.join(`
229
232
  `);if(!c)return{content:r+`
230
233
  `+s.join(`
231
- `),strategy:"exact"};let d=$c(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(`
232
- `),u=d[0];return{content:r.slice(0,u.start)+p+r.slice(u.end),strategy:u.strategy}}function Os(r){return{name:ob,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:rb,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=Dc(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(`
233
- `);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=Lc(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=Lc(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(`
234
+ `),strategy:"exact"};let d=cd(r,c,t);if(d.length===0)return null;let l=[];for(let f of e.lines)(f.prefix===" "||f.prefix==="+")&&l.push(f.content);let u=l.join(`
235
+ `),p=d[0];return{content:r.slice(0,p.start)+u+r.slice(p.end),strategy:p.strategy}}function ei(r){return{name:Vb,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:qb,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=ad(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(g=>g.lines.filter(f=>f.prefix==="+").map(f=>f.content)).join(`
236
+ `);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 g=r.resolvePath(l.newPath),f=p;for(let m of l.hunks){let y=ld(f,m,n);y&&(f=y.content,o.strategies[l.path]=y.strategy)}await r.writeFile(g,f),await r.deleteFile(u),o.filesModified.push(`${l.path} \u2192 ${l.newPath}`)}break}case"update":{let p=await r.readFile(u),g="exact",f=!0;for(let m of l.hunks){let y=ld(p,m,n);if(y)p=y.content,g=y.strategy;else{f=!1;let k=m.lines.filter(w=>w.prefix===" "||w.prefix==="-").map(w=>w.content).slice(0,5).join(`
234
237
  `);o.errors.push(`${l.path}: hunk not matched. Search begins with:
235
- ${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=ib(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=$c(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 Dc(`*** Begin Patch
238
+ ${k}`)}}(f||p!==await r.readFile(u))&&(await r.writeFile(u,p),o.filesModified.push(l.path),o.strategies[l.path]=g);break}}}catch(p){o.errors.push(`${l.type} ${l.path}: ${p instanceof Error?p.message:String(p)}`)}}}else if(i){let d=Jb(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),g=cd(p,l.search,n);if(g.length===0){o.errors.push(`${l.path}: search text not matched (tried all 9 strategies)`);continue}let f=[...g].sort((m,y)=>y.start-m.start);for(let m of f)p=p.slice(0,m.start)+l.replace+p.slice(m.end);await r.writeFile(u,p),o.filesModified.push(l.path),o.strategies[l.path]=g[0].strategy}catch(p){o.errors.push(`${l.path}: ${p instanceof Error?p.message:String(p)}`)}}}else return ad(`*** Begin Patch
236
239
  `+t.input+`
237
- *** End Patch`).length>0?Os(r).execute(e,{input:`*** Begin Patch
240
+ *** End Patch`).length>0?ei(r).execute(e,{input:`*** Begin Patch
238
241
  `+t.input+`
239
242
  *** 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(`
240
243
  Errors:
241
244
  ${o.errors.join(`
242
245
  `)}`);let c=o.errors.length===0;return{content:[{type:"text",text:a.join(`
243
- `)||"No changes applied."}],details:{type:"patch",...o,success:c}}}}}var ab="web_fetch",lb={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"]},cb=5e4;function Uc(r){return{name:ab,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:lb,execute:async(e,t)=>{let n=await r.fetchUrl({url:t.url,extractMode:t.extractMode,maxChars:t.maxChars??cb,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}
246
+ `)||"No changes applied."}],details:{type:"patch",...o,success:c}}}}}var Yb="web_fetch",Xb={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"]},Qb=5e4;function dd(r){return{name:Yb,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:Xb,execute:async(e,t)=>{let n=await r.fetchUrl({url:t.url,extractMode:t.extractMode,maxChars:t.maxChars??Qb,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
247
 
245
248
  ${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}
246
249
  `),o.push(n.content),n.relevantExcerpts?.length){o.push(`
247
250
  ---
248
251
  ## Relevant Excerpts
249
252
  `);for(let s of n.relevantExcerpts)o.push(`- ${s}`)}return{content:[{type:"text",text:o.join(`
250
- `)}],details:{type:"web_fetch",url:t.url,extractMode:t.extractMode??"markdown",hasExtraction:!!n.extraction,extraction:n.extraction}}}}}var db="web_search",ub={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"]},pb=10;function Nc(r){return{name:db,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:ub,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:pb});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(`
251
- `)}],details:{type:"web_search",query:n.query,resultCount:n.results.length}}}}}var mb="instructions",gb={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 jc(r){return{name:mb,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:gb,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(`
253
+ `)}],details:{type:"web_fetch",url:t.url,extractMode:t.extractMode??"markdown",hasExtraction:!!n.extraction,extraction:n.extraction}}}}}var Zb="web_search",ek={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"]},tk=10;function ud(r){return{name:Zb,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:ek,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:tk});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(`
254
+ `)}],details:{type:"web_search",query:n.query,resultCount:n.results.length}}}}}var nk="instructions",ok={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 pd(r){return{name:nk,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:ok,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(`
252
255
  `);return{content:[{type:"text",text:`Found ${n.length} instruction file(s):
253
- ${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 fb="worktree",hb={type:"object",properties:{action:{type:"string",enum:["enter","exit","list"],description:`enter: Create and switch to an isolated git worktree branch.
256
+ ${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 rk="worktree",sk={type:"object",properties:{action:{type:"string",enum:["enter","exit","list"],description:`enter: Create and switch to an isolated git worktree branch.
254
257
  exit: Leave worktree (keep or remove it).
255
- 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"]},yb=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]?$/;function Fc(r){return{name:fb,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:hb,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&&!yb.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(`
258
+ 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"]},ik=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]?$/;function md(r){return{name:rk,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:sk,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&&!ik.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
259
  `)}],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."}
257
260
  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(`
258
- `)}],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 bb}from"node:child_process";import{promisify as kb}from"node:util";import{join as ht,resolve as Bc,basename as Ds}from"node:path";import{mkdir as qc,rm as Kc,symlink as Tb,readdir as tA,stat as wb}from"node:fs/promises";var hn=kb(bb),vb=/^[a-zA-Z0-9._-]+$/,Wc=64;function Jc(r){if(r.length>Wc)throw new Error(`Invalid worktree name: must be ${Wc} 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(!vb.test(e))throw new Error(`Invalid worktree name "${r}": segment must contain only letters, digits, dots, underscores, and dashes`)}}function Ls(r){return r.replaceAll("/","+")}function Yc(r){return`worktree-${Ls(r)}`}var Ae=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 Gc(r){let{stdout:e,code:t}=await fe(["status","--porcelain"],r);return t!==0?-1:e.trim().split(`
259
- `).filter(Boolean).length}async function Hc(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 Xc(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=ht(r,o),i=ht(e,o);try{await Tb(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 xb(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 Sb(){try{return await hn("tmux",["-V"],{timeout:5e3}),!0}catch{return!1}}function Rb(r,e){return`${Ds(r)}_${e}`.replace(/[/.]/g,"_")}async function _b(r,e){if(!await Sb())return null;try{return await hn("tmux",["new-session","-d","-s",e,"-c",r],{timeout:1e4}),e}catch{return null}}async function zc(r){try{return await hn("tmux",["kill-session","-t",r],{timeout:5e3}),!0}catch{return!1}}async function Vc(r,e,t,n){let o=Ba(e),s=ht(o,r);try{if(!(await wb(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 Qc(r,e,t){Jc(e);let n=Ls(e),o=Yc(e),s=ht(r,".worktrees"),i=ht(s,n);await qc(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 Xc(r,i,["node_modules"],t),t?.info(`[worktree] agent worktree created: ${e} at ${i}`),{worktreePath:i,branch:o})}async function Zc(r,e,t,n){let{code:o}=await fe(["worktree","remove","--force",e],r);return o!==0&&(await Kc(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 ed(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 Vc("worktree-create",i,{WORKTREE_NAME:o??""},e);if(a){let P=process.cwd();return process.chdir(a),Ae={originalCwd:P,worktreePath:a,worktreeName:o??Ds(a),worktreeBranch:"",hookBased:!0,creationDurationMs:Date.now()-s},{success:!0,worktree:{name:Ae.worktreeName,path:a,branch:"",isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let c=o??`agent-${Date.now().toString(36)}`;Jc(c);let d=Ls(c),l=Yc(c),p=ht(i,".worktrees"),u=ht(p,d);await qc(p,{recursive:!0});let{stdout:m}=await fe(["worktree","list","--porcelain"],i),g=m.split(`
260
- `).find(P=>P.startsWith("worktree ")&&P.includes(d));if(g){let P=g.replace("worktree ","").trim(),U=process.cwd();return process.chdir(P),Ae={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 xb(u,i,n),C=!0),await Xc(i,u,t,e);let R=process.cwd();process.chdir(u);let b=Rb(i,l),E=await _b(u,b);return Ae={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(!Ae)return{success:!1,error:"Not in a worktree"};try{let i=Ae,a=await fn(i.originalCwd);if(!a)return{success:!1,error:"Original git root not found"};if(o==="remove"){let c=await Gc(i.worktreePath),d=await Hc(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),Ae=null,i.tmuxSessionName&&await zc(i.tmuxSessionName),await Vc("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 Kc(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 zc(i.tmuxSessionName),Ae=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(`
261
+ `)}],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 ak}from"node:child_process";import{promisify as lk}from"node:util";import{join as Rt,resolve as gd,basename as ti}from"node:path";import{mkdir as wd,rm as Td,symlink as ck,readdir as yP,stat as dk}from"node:fs/promises";var Rn=lk(ak),uk=/^[a-zA-Z0-9._-]+$/,fd=64;function vd(r){if(r.length>fd)throw new Error(`Invalid worktree name: must be ${fd} 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(!uk.test(e))throw new Error(`Invalid worktree name "${r}": segment must contain only letters, digits, dots, underscores, and dashes`)}}function ni(r){return r.replaceAll("/","+")}function xd(r){return`worktree-${ni(r)}`}var Ie=null;async function ge(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 Sn(r){let{stdout:e,code:t}=await ge(["rev-parse","--show-toplevel"],r);return t===0?e.trim():null}async function hd(r){let{stdout:e,code:t}=await ge(["status","--porcelain"],r);return t!==0?-1:e.trim().split(`
262
+ `).filter(Boolean).length}async function yd(r,e){let{stdout:t,code:n}=await ge(["rev-list",`origin/${e}..${e}`,"--count"],r);return n!==0?0:parseInt(t.trim(),10)||0}async function Sd(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=Rt(r,o),i=Rt(e,o);try{await ck(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 pk(r,e,t){let{code:n,stderr:o}=await ge(["sparse-checkout","set","--cone","--",...t],r);if(n!==0)throw await ge(["worktree","remove","--force",r],e),new Error(`Failed to configure sparse-checkout: ${o}`);let{code:s,stderr:i}=await ge(["checkout","HEAD"],r);if(s!==0)throw await ge(["worktree","remove","--force",r],e),new Error(`Failed to checkout sparse worktree: ${i}`);return!0}async function mk(){try{return await Rn("tmux",["-V"],{timeout:5e3}),!0}catch{return!1}}function gk(r,e){return`${ti(r)}_${e}`.replace(/[/.]/g,"_")}async function fk(r,e){if(!await mk())return null;try{return await Rn("tmux",["new-session","-d","-s",e,"-c",r],{timeout:1e4}),e}catch{return null}}async function bd(r){try{return await Rn("tmux",["kill-session","-t",r],{timeout:5e3}),!0}catch{return!1}}async function kd(r,e,t,n){let o=pl(e),s=Rt(o,r);try{if(!(await dk(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 Rd(r,e,t){vd(e);let n=ni(e),o=xd(e),s=Rt(r,".worktrees"),i=Rt(s,n);await wd(s,{recursive:!0});let{code:a,stderr:c}=await ge(["worktree","add","-B",o,i,"HEAD"],r);return a!==0?(t?.warn(`[worktree] agent worktree creation failed: ${c}`),null):(await Sd(r,i,["node_modules"],t),t?.info(`[worktree] agent worktree created: ${e} at ${i}`),{worktreePath:i,branch:o})}async function _d(r,e,t,n){let{code:o}=await ge(["worktree","remove","--force",e],r);return o!==0&&(await Td(e,{recursive:!0,force:!0}).catch(()=>{}),await ge(["worktree","prune"],r)),await ge(["branch","-D",t],r),n?.info(`[worktree] agent worktree removed: ${e}`),!0}function Cd(r){let{log:e,symlinkDirs:t=["node_modules"],sparsePaths:n}=r;return{async enterWorktree(o){try{let s=Date.now(),i=await Sn();if(!i)return{success:!1,error:"Not in a git repository"};let a=await kd("worktree-create",i,{WORKTREE_NAME:o??""},e);if(a){let O=process.cwd();return process.chdir(a),Ie={originalCwd:O,worktreePath:a,worktreeName:o??ti(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)}`;vd(c);let d=ni(c),l=xd(c),u=Rt(i,".worktrees"),p=Rt(u,d);await wd(u,{recursive:!0});let{stdout:g}=await ge(["worktree","list","--porcelain"],i),f=g.split(`
263
+ `).find(O=>O.startsWith("worktree ")&&O.includes(d));if(f){let O=f.replace("worktree ","").trim(),U=process.cwd();return process.chdir(O),Ie={originalCwd:U,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 m=n&&n.length>0,y=["worktree","add"];m&&y.push("--no-checkout"),y.push("-B",l,p,"HEAD");let{code:k,stderr:w}=await ge(y,i);if(k!==0)return{success:!1,error:`git worktree add failed: ${w.trim()}`};let x=!1;m&&n&&(await pk(p,i,n),x=!0),await Sd(i,p,t,e);let S=process.cwd();process.chdir(p);let b=gk(i,l),I=await fk(p,b);return Ie={originalCwd:S,worktreePath:p,worktreeName:c,worktreeBranch:l,tmuxSessionName:I??void 0,creationDurationMs:Date.now()-s,usedSparsePaths:x},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(!Ie)return{success:!1,error:"Not in a worktree"};try{let i=Ie,a=await Sn(i.originalCwd);if(!a)return{success:!1,error:"Original git root not found"};if(o==="remove"){let c=await hd(i.worktreePath),d=await yd(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 bd(i.tmuxSessionName),await kd("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 ge(l,a);u!==0&&(e.warn(`[worktree] git worktree remove failed: ${p.trim()}, cleaning up manually`),await Td(i.worktreePath,{recursive:!0,force:!0}).catch(()=>{}),await ge(["worktree","prune"],a)),await ge(["branch","-D",i.worktreeBranch],a),e.info(`[worktree] removed: ${i.worktreeName}`)}else process.chdir(i.originalCwd),i.tmuxSessionName&&await bd(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 ge(["worktree","list","--porcelain"]);if(s!==0)return{success:!0,worktrees:[]};let i=[],a=process.cwd(),c=o.split(`
261
264
 
262
265
  `).filter(Boolean);for(let d of c){let l=d.split(`
263
- `),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=Bc(p)===Bc(a),g=await Gc(p),f=await Hc(p,u);i.push({name:u.startsWith("worktree-")?u.slice(9):Ds(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 Ae!==null},currentWorktree(){return Ae?{name:Ae.worktreeName,path:Ae.worktreePath,branch:Ae.worktreeBranch,isCurrent:!0,hasChanges:!1,unpushedCommits:0}:null}}}import{readFile as Cb,writeFile as Ab}from"node:fs/promises";import*as td from"node:path";var Ib={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 nd(r){let e=r.split(`
266
+ `),u="",p="";for(let y of l)y.startsWith("worktree ")&&(u=y.slice(9).trim()),y.startsWith("branch ")&&(p=y.slice(7).trim().replace("refs/heads/",""));if(!u)continue;let g=gd(u)===gd(a),f=await hd(u),m=await yd(u,p);i.push({name:p.startsWith("worktree-")?p.slice(9):ti(u),path:u,branch:p,isCurrent:g,hasChanges:f>0,unpushedCommits:m})}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 hk,writeFile as yk}from"node:fs/promises";import*as Ad from"node:path";var bk={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 Pd(r){let e=r.split(`
264
267
  `);return e.map((t,n)=>n<e.length-1?t+`
265
- `:t)}function od(r){return r.join("")}function Mb(r,e){let t=od(r.source).trim(),n=t.length>80?t.slice(0,80)+"...":t;return`Cell ${e+1} [${r.cell_type}]: ${n}`}function Pb(r,e){let t={cell_type:r,source:nd(e),metadata:{}};return r==="code"&&(t.execution_count=null,t.outputs=[]),t}function rd(){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:Ib,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=td.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 Cb(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=od(m.source);m.source=nd(e.new_source),m.cell_type==="code"&&(m.execution_count=null,m.outputs=[]),l=`Replaced cell ${n} [${m.cell_type}].
266
- Old: ${g.slice(0,120)}${g.length>120?"...":""}
267
- 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=Pb(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)+`
268
- `;await Ab(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)=>Mb(m,g)).join(`
269
- `),u=a.cells.length>10?`
268
+ `:t)}function Id(r){return r.join("")}function kk(r,e){let t=Id(r.source).trim(),n=t.length>80?t.slice(0,80)+"...":t;return`Cell ${e+1} [${r.cell_type}]: ${n}`}function wk(r,e){let t={cell_type:r,source:Pd(e),metadata:{}};return r==="code"&&(t.execution_count=null,t.outputs=[]),t}function Md(){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:bk,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=Ad.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 hk(t,"utf-8")}catch(g){return{content:[{type:"text",text:`Error reading notebook: ${g.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 g=a.cells[d],f=Id(g.source);g.source=Pd(e.new_source),g.cell_type==="code"&&(g.execution_count=null,g.outputs=[]),l=`Replaced cell ${n} [${g.cell_type}].
269
+ Old: ${f.slice(0,120)}${f.length>120?"...":""}
270
+ 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 g=e.cell_type??"code",f=wk(g,e.new_source);a.cells.splice(n,0,f),l=`Inserted new ${g} cell after position ${n}. Total cells: ${a.cells.length}.`;break}case"delete":{let g=a.cells.splice(d,1)[0];l=`Deleted cell ${n} [${g.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 g=JSON.stringify(a,null,1)+`
271
+ `;await yk(t,g,"utf-8")}catch(g){return{content:[{type:"text",text:`Error writing notebook: ${g.message}`}],details:{error:"write_failed"}}}let u=a.cells.slice(0,10).map((g,f)=>kk(g,f)).join(`
272
+ `),p=a.cells.length>10?`
270
273
  ... and ${a.cells.length-10} more cells`:"";return{content:[{type:"text",text:`${l}
271
274
 
272
275
  Current cells:
273
- ${p}${u}`}],details:{type:"notebook_edit",edit_mode:o,cell_number:n,total_cells:a.cells.length}}}}}import{readFile as Eb,readdir as Ob}from"node:fs/promises";import*as id from"node:path";import{existsSync as Db}from"node:fs";var Lb={type:"object",properties:{action:{type:"string",enum:["list","run","describe"],description:`list: Show available workflows.
276
+ ${u}${p}`}],details:{type:"notebook_edit",edit_mode:o,cell_number:n,total_cells:a.cells.length}}}}}import{readFile as Tk,readdir as vk}from"node:fs/promises";import*as Od from"node:path";import{existsSync as xk}from"node:fs";var Sk={type:"object",properties:{action:{type:"string",enum:["list","run","describe"],description:`list: Show available workflows.
274
277
  run: Execute a workflow by name.
275
- 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 $s(r){let e=new Map,t=Ua(r);await sd(t,e);let n=La();return await sd(n,e),e}async function sd(r,e){if(Db(r))try{let t=await Ob(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,id.join(r,n.name))}}catch{}}async function Us(r){let e=await Eb(r,"utf-8");return JSON.parse(e)}function $b(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 Ub(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 ad(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:Lb,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 $s(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 Us(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(`
276
- `)}],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 $s(o)).get(t.workflow);if(!i)return{content:[{type:"text",text:`Error: Workflow "${t.workflow}" not found.`}],details:{error:"not_found"}};let a=await Us(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(`
277
- `)}],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 $s(o)).get(t.workflow);if(!i)return{content:[{type:"text",text:`Error: Workflow "${t.workflow}" not found.`}],details:{error:"not_found"}};let a=await Us(i),c={...a.variables,...t.variables},d;try{d=$b(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=Ub(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(`
278
- `)}],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 Nb="sleep",jb={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 ld(r){return{name:Nb,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(`
279
- `),parameters:jb,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(`
280
- `)}],details:{...c,requestedSeconds:o}}}finally{n?.removeEventListener("abort",a)}}}}var Fb="tool_search",Bb={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"]},Wb=5;function dd(r){return{name:Fb,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:Bb,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??Wb;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 cd(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(`
281
- `)}],details:{type:"tool_search",activated:a,notFound:c,mode:"select"}}}let s=await r.searchTools(n,{maxResults:o});return cd(s)}}}function cd(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(`
282
- `)}],details:{type:"tool_search",query:r.query,matchCount:r.matches.length,totalDeferred:r.totalDeferred,matches:r.matches.map(t=>t.name)}}}var Ns="image_generate",Gb={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 ud(r){return{name:Ns,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:Gb,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 Hb={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 pd(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:Hb,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 js="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 md(r){return{name:js,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 Fs="music_generate",Vb={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 gd(r){return{name:Fs,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:Vb,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 qb="video_edit",Kb={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 fd(r){return{name:qb,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:Kb,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 Jb="video_merge",Yb={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 hd(r){return{name:Jb,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:Yb,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 Xb="video_upscale",Qb={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 yd(r){return{name:Xb,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:Qb,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 Zb="three_d_generate",ek={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 bd(r){return{name:Zb,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:ek,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 tk={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 kd(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:tk,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 nk="voice_clone",ok={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 Td(r){return{name:nk,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:ok,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 rk="media_cancel",sk={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 wd(r){return{name:rk,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:sk,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 ik="file_upload",ak={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 vd(r){return{name:ik,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:ak,execute:async(e,t)=>{let n=await r.uploadFile({filePath:t.file_path,purpose:t.purpose}),o=[`Uploaded "${n.filename}" (${Bs(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(`
283
- `)}],details:{type:"file_upload",fileId:n.fileId,url:n.url,filename:n.filename,bytes:n.bytes,provider:n.provider}}}}}var lk="file_query",ck={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 xd(r){return{name:lk,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:ck,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: ${Bs(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(`
278
+ 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 oi(r){let e=new Map,t=il(r);await Ed(t,e);let n=rl();return await Ed(n,e),e}async function Ed(r,e){if(xk(r))try{let t=await vk(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,Od.join(r,n.name))}}catch{}}async function ri(r){let e=await Tk(r,"utf-8");return JSON.parse(e)}function Rk(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 _k(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 Dd(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:Sk,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 oi(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 ri(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(`
279
+ `)}],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 oi(o)).get(t.workflow);if(!i)return{content:[{type:"text",text:`Error: Workflow "${t.workflow}" not found.`}],details:{error:"not_found"}};let a=await ri(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(`
280
+ `)}],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 oi(o)).get(t.workflow);if(!i)return{content:[{type:"text",text:`Error: Workflow "${t.workflow}" not found.`}],details:{error:"not_found"}};let a=await ri(i),c={...a.variables,...t.variables},d;try{d=Rk(a.steps)}catch(g){return{content:[{type:"text",text:`Error: ${g.message}`}],details:{error:"dag_error"}}}let l=new Map,u=[`Running workflow: ${a.name}`,""],p=!0;for(let g of d){if(n?.aborted){u.push(`\u26A1 Aborted at step: ${g.id}`),p=!1;break}let f=(g.dependsOn??[]).some(k=>!l.get(k)?.success),m=g.condition??"on_success";if(m==="on_success"&&f){u.push(`\u23ED Skipped ${g.id} (dependency failed)`),l.set(g.id,{stepId:g.id,success:!1,output:"",error:"dependency_failed"}),p=!1;continue}if(m==="on_failure"&&!f){u.push(`\u23ED Skipped ${g.id} (no failure to handle)`),l.set(g.id,{stepId:g.id,success:!0,output:""});continue}u.push(`\u25B6 ${g.id}: ${g.label??g.tool}`);let y=_k(g.args,c,l);try{let k=await r.invokeTool(g.tool,y,n),w=!k.error;if(l.set(g.id,{stepId:g.id,success:w,output:k.result,error:k.error}),w){let x=k.result.length>200?k.result.slice(0,200)+"...":k.result;u.push(` \u2705 ${x}`)}else u.push(` \u274C ${k.error}`),p=!1}catch(k){let w=k.message;l.set(g.id,{stepId:g.id,success:!1,output:"",error:w}),u.push(` \u274C ${w}`),p=!1}}return u.push("",p?"Workflow completed successfully.":"Workflow completed with errors."),{content:[{type:"text",text:u.join(`
281
+ `)}],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 Ck="sleep",Ak={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 Ld(r){return{name:Ck,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(`
282
+ `),parameters:Ak,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(`
283
+ `)}],details:{...c,requestedSeconds:o}}}finally{n?.removeEventListener("abort",a)}}}}var Pk="tool_search",Ik={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"]},Mk=5;function Ud(r){return{name:Pk,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:Ik,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??Mk;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 $d(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(`
284
+ `)}],details:{type:"tool_search",activated:a,notFound:c,mode:"select"}}}let s=await r.searchTools(n,{maxResults:o});return $d(s)}}}function $d(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(`
285
+ `)}],details:{type:"tool_search",query:r.query,matchCount:r.matches.length,totalDeferred:r.totalDeferred,matches:r.matches.map(t=>t.name)}}}var si="image_generate",Ek={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 Nd(r){return{name:si,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:Ek,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 Ok={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 jd(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:Ok,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 ii="video_generate",Dk={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 Fd(r){return{name:ii,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:Dk,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 ai="music_generate",Lk={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:ai,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:Lk,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 $k="video_edit",Uk={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 Gd(r){return{name:$k,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:Uk,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 Nk="video_merge",jk={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 Wd(r){return{name:Nk,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:jk,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 Fk="video_upscale",Bk={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 Hd(r){return{name:Fk,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:Bk,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 Gk="three_d_generate",Wk={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 zd(r){return{name:Gk,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:Wk,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 Hk={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 Vd(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:Hk,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 zk="voice_clone",Vk={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 qd(r){return{name:zk,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:Vk,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 qk="media_cancel",Kk={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 Kd(r){return{name:qk,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:Kk,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 Jk="file_upload",Yk={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 Jd(r){return{name:Jk,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:Yk,execute:async(e,t)=>{let n=await r.uploadFile({filePath:t.file_path,purpose:t.purpose}),o=[`Uploaded "${n.filename}" (${li(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(`
286
+ `)}],details:{type:"file_upload",fileId:n.fileId,url:n.url,filename:n.filename,bytes:n.bytes,provider:n.provider}}}}}var Xk="file_query",Qk={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 Yd(r){return{name:Xk,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:Qk,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: ${li(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(`
284
287
  `)}],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):
285
- `];for(let i of o)s.push(`- ${i.filename} | ID: ${i.id} | ${Bs(i.bytes)} | ${i.status}${i.url?` | ${i.url}`:""}`);return{content:[{type:"text",text:s.join(`
286
- `)}],details:{type:"file_query",count:o.length}}}}}var dk="file_delete",uk={type:"object",properties:{file_id:{type:"string",description:"ID of the uploaded file to delete."}},required:["file_id"]};function Sd(r){return{name:dk,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:uk,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 Bs(r){return r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`}var pk="ask_user",mk={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 Rd(r){return{name:pk,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:mk,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(`
287
- `)}],details:{type:"ask_user",answers:o,questionCount:t.questions.length}}}}}function _d(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={},Id,Hs,ot={},Md;function Pd(r){Md=r}var Ed=null;function Od(r){Ed=r}function Dd(r,e,t,n,o){oe=r,he=e??{},Id=t,Hs=o,ot=n??{},hk()}function zs(r){let e=ot[r];if(!(!e||!oe))return oe.resolveModelById(e.provider,e.model,r)}function hk(){yk(),bk(),kk(),Tk()}function yk(){let r=Ce(js);if(!r)return;let e=ot.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 bk(){let r=Ce(Ns);if(!r)return;let e=zs("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 kk(){let r=Ce("tts");if(!r)return;let e=zs("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 Tk(){let r=Ce(Fs);if(!r)return;let e=zs("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 Fe(r){if(!oe)throw new Error(`No media provider configured for ${r.mediaType}`);let e=ot[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};Hs&&!o.onProgress&&(o.onProgress=(c,d,l)=>{Hs(l??"pending",r.mediaType,c,d,t)});let s=await Cd(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 Cd(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}:
288
+ `];for(let i of o)s.push(`- ${i.filename} | ID: ${i.id} | ${li(i.bytes)} | ${i.status}${i.url?` | ${i.url}`:""}`);return{content:[{type:"text",text:s.join(`
289
+ `)}],details:{type:"file_query",count:o.length}}}}}var Zk="file_delete",ew={type:"object",properties:{file_id:{type:"string",description:"ID of the uploaded file to delete."}},required:["file_id"]};function Xd(r){return{name:Zk,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:ew,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 li(r){return r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`}var tw="ask_user",nw={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 Qd(r){return{name:tw,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:nw,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(`
290
+ `)}],details:{type:"ask_user",answers:o,questionCount:t.questions.length}}}}}function Zd(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 ow=[{pattern:"Bash",behavior:"ask",reason:"Group security: shell commands require approval in group chat",source:"group-policy"},{pattern:"computer",behavior:"deny",reason:"Group security: computer control blocked in group chat",source:"group-policy"}],rw=[/\.env($|\.)/i,/\.(key|pem|p12|pfx|jks)$/i,/id_rsa/i,/id_ed25519/i,/\.ssh\//i,/secret/i,/credential/i,/token/i,/password/i,/\.aws\//i,/\.gnupg\//i];function eu(){return[...ow]}function tu(r){return rw.some(e=>e.test(r))}var ru=!1;function mi(r){ru=r}var re,fe={},su,ui,dt={},iu;function au(r){iu=r}var lu=null,pi;function cu(r){pi=r}function du(r){lu=r}function uu(r,e,t,n,o){re=r,fe=e??{},su=t,ui=o,dt=n??{},aw()}function gi(r){let e=dt[r];if(!(!e||!re))return re.resolveModelById(e.provider,e.model,r)}function aw(){lw(),cw(),dw(),uw()}function lw(){let r=Pe(ii);if(!r)return;let e=dt.video;if(!e||!re)return;let t=re.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 cw(){let r=Pe(si);if(!r)return;let e=gi("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 dw(){let r=Pe("tts");if(!r)return;let e=gi("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 uw(){let r=Pe(ai);if(!r)return;let e=gi("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 Ve(r){if(!re)throw new Error(`No media provider configured for ${r.mediaType}`);let e=dt[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};ui&&!o.onProgress&&(o.onProgress=(c,d,l)=>{ui(l??"pending",r.mediaType,c,d,t)});let s=await nu(t,n||r.model,o);if(s.ok)return s.result;let i=re.listMediaModels(r.mediaType),a=[`${t}: ${s.error}`];for(let c of i){if(c.providerId===t||!fe[c.providerId])continue;let l=await nu(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}:
288
291
  `+a.map(c=>` - ${c}`).join(`
289
- `))}async function Cd(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 Id?.(a,c,d),{ok:!0,result:i}}catch(s){return{ok:!1,error:s instanceof Error?s.message:String(s)}}}function Be(r){if(!oe)return!1;let e=ot[r];if(!e)return!1;let t=oe.getTransport(e.provider),n=he[e.provider];return!!(t&&n)}function Ws(r,e){if(!Be(r))return!1;let t=ot[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 So(){if(!oe)return;for(let[,e]of Object.entries(ot)){if(!e)continue;let t=oe.getTransport(e.provider),n=he[e.provider];if(t instanceof Ee&&n)return{id:e.provider,type:"volcengine"}}if(he.google)return{id:"google",type:"gemini"}}var Gs;function Ro(){return Gs||(Gs=new rn({baseUrl:"https://generativelanguage.googleapis.com/v1beta"})),Gs}var yt=process.cwd();function ke(r){return q.isAbsolute(r)?q.normalize(r):q.resolve(yt,r)}var wk=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg",".ico"]),Ld=new Set([".exe",".dll",".so",".dylib",".zip",".tar",".gz",".7z",".rar",".wasm",".class"]),vk={".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 xk(){return{resolvePath:ke,async readFile(r){let e=ke(r),t=q.extname(e).toLowerCase();if(Ld.has(t))return{type:"binary",mimeType:"application/octet-stream"};if(wk.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 Sk(){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 Rk(){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 _k(){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 Ck(){return{resolvePath:ke,async glob(r,e){let t=e.cwd||yt,n=e.limit||1e3,o=[],s=!1,i=r.replace(/\\/g,"/").split("/"),a=i.some(l=>l==="**"),c=i[i.length-1]??"*",d=$d(c);try{await Vs(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||yt;try{return await Ik(r,t,e)}catch{return await Mk(r,t,e)}}}}function $d(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 Ak=new Set([".git",".svn",".hg","node_modules","__pycache__",".next","dist",".tox",".venv"]);async function Vs(r,e,t,n=0,o=""){if(n>t)return;let s;try{s=await 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(Ak.has(i.name))continue;await Vs(q.join(r,i.name),e,t,n+1,a)}else if(i.isFile()&&!await e(a))return}}function Ik(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("."),fk("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(`
290
- `))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 Mk(r,e,t){let n=new RegExp(r,t.caseInsensitive?"i":""),o=t.headLimit??250,s=t.offset??0,i=t.fileGlob?$d(t.fileGlob):null,a=[],c=!1;return await Vs(e,async d=>{if(a.length>=s+o+1)return c=!0,!1;if(i&&!i.test(q.basename(d)))return!0;let l=q.extname(d).toLowerCase();if(Ld.has(l))return!0;try{let u=(await B.promises.readFile(q.join(e,d),"utf8")).split(`
291
- `);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 Ad=!1;function Pk(){if(!Ad)if(Ad=!0,go()){let r=process.env.QLOGICAGENT_POWERSHELL_PATH??"powershell.exe";gn(As(r))}else if(process.platform==="win32"){let r=Ek();gn(xo(r))}else{let r=process.env.SHELL?.endsWith("bash")?process.env.SHELL:"/bin/bash";gn(xo(r))}}function Ek(){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 Ok(){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=Dk(s)),{content:s,title:Lk(s)}}finally{clearTimeout(t)}}}}function Dk(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 Lk(r){return r.match(/<title[^>]*>([^<]+)<\/title>/i)?.[1]?.trim()}function $k(){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)=>_d(Md,r)(e,t)}}function Uk(){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 Nk(r){r?.workdir&&(yt=r.workdir),Pk(),To(yt);let e=[];e.push(rc()),e.push(sc()),e.push(Rd({askUser:async l=>Ed?.(l)??null})),e.push(bc({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=xk(),n=Sk(),o=Rk(),s=_k();e.push(wc(t)),e.push(xc(n)),e.push(Sc(o)),e.push(Os(s)),e.push(Ac(s)),e.push(Cc(Ck())),e.push(Uc(Ok())),e.push(Nc($k()));let i=Uk();e.push(jc(i));let a=r?.log??{info:()=>{},warn:()=>{}};e.push(Fc(ed({log:a}))),e.push(rd());let c={invokeTool:async(l,p,u)=>{let m=Ce(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(`
292
- `),error:g.details?.error}}catch(g){return{result:"",error:g.message}}},getCwd:()=>yt};e.push(ad(c)),e.push(ld({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(dd({searchTools:async(l,p)=>{let u=p?.maxResults??5,m=tt(),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=Ce(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=>oc(l)})),e.push({...ud({generateImage:async l=>{let p=await Fe({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:()=>Be("image")}),e.push({...pd({textToSpeech:async l=>{let p=await Fe({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:()=>Be("tts")}),e.push({...md({generateVideo:async l=>{let p=await Fe({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:()=>Be("video")}),e.push({...gd({generateMusic:async l=>{let p=await Fe({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=ot.music;if(!p||!oe)return"";let u=oe.getTransport(p.provider);if(!(u instanceof pt))return"";let m=he[p.provider];return m?u.generateLyrics(l,m):""}}),isEnabled:()=>Be("music")}),e.push({...fd({editVideo:async l=>{let p=await Fe({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:()=>Ws("video","edit")}),e.push({...hd({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 Fe({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:()=>Ws("video","merge")}),e.push({...yd({upscaleVideo:async l=>{let p=["upscale"];l.sharpness&&p.push(`sharpness: ${l.sharpness}`);let u=await Fe({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:()=>Ws("video","upscale")}),e.push({...bd({generate3D:async l=>{let p=await Fe({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:()=>Be("3d")}),e.push({...kd({speechToText:async l=>{let p=await Fe({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:()=>Be("stt")}),e.push({...Td({cloneVoice:async l=>{let p=await Fe({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:()=>Be("voice_clone")}),e.push({...wd({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:()=>Be("video")||Be("3d")});let d=So();return e.push({...vd({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=Ro(),b=he.google,E=q.extname(p).toLowerCase(),P=vk[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 Ee))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:()=>!!So()}),e.push({...xd({queryFile:async l=>{if(!d)throw new Error("No file API provider available.");if(d.type==="gemini"){let g=Ro(),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 Ee))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=Ro(),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 Ee))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:()=>!!So()}),e.push({...Sd({deleteFile:async l=>{if(!d)throw new Error("No file API provider available.");if(d.type==="gemini"){let m=Ro(),g=he.google;await m.deleteFile(l.fileId,g);return}let p=oe.getTransport(d.id),u=he[d.id];if(!(p instanceof Ee))throw new Error("File delete only supported via Volcengine or Google provider.");await p.deleteFile(l.fileId,u)}}),shouldDefer:!0,isEnabled:()=>!!So()}),nc(e),r?.log?.info(`[tool-bootstrap] Registered ${e.length} local tools (${e.filter(l=>l.isEnabled?.()!==!1).length} enabled): ${tt().join(", ")}`),e}var Ud=Nk;function _o(r){yt=r,To(r)}import{spawn as jk}from"node:child_process";import{createInterface as Fk}from"node:readline";var Co=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=jk(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=Fk({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=Bk(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(`
293
- `)||"(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+`
294
- `)}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 Bk(r){return r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}import{randomUUID as Wk}from"node:crypto";var Ao=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=Wk(),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(`
295
- `);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__${Gk(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(`
296
- `)||"(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 Gk(r){return r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}var Io=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 Ao(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 Co(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();ps(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 tt())s.startsWith(n)&&mo(s);let o=t.toPortableTools();ps(o),this.log.info(`[mcp] re-injected ${o.length} tools from ${e}`)}};function qs(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 Hk={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:Hk,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(`
297
- `).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 jd(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} ---
292
+ `))}async function nu(r,e,t){let n=re.getTransport(r);if(!n)return{ok:!1,error:"transport not available"};let o=fe[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 su?.(a,c,d),{ok:!0,result:i}}catch(s){return{ok:!1,error:s instanceof Error?s.message:String(s)}}}function qe(r){if(!re)return!1;let e=dt[r];if(!e)return!1;let t=re.getTransport(e.provider),n=fe[e.provider];return!!(t&&n)}function ci(r,e){if(!qe(r))return!1;let t=dt[r],n=re.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 Bo(){if(!re)return;for(let[,e]of Object.entries(dt)){if(!e)continue;let t=re.getTransport(e.provider),n=fe[e.provider];if(t instanceof De&&n)return{id:e.provider,type:"volcengine"}}if(fe.google)return{id:"google",type:"gemini"}}var di;function Go(){return di||(di=new mn({baseUrl:"https://generativelanguage.googleapis.com/v1beta"})),di}var _t=process.cwd();function we(r){return J.isAbsolute(r)?J.normalize(r):J.resolve(_t,r)}var pw=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg",".ico"]),pu=new Set([".exe",".dll",".so",".dylib",".zip",".tar",".gz",".7z",".rar",".wasm",".class"]),mw={".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 gw(){return{resolvePath:we,async readFile(r){let e=we(r),t=J.extname(e).toLowerCase();return pu.has(t)?{type:"binary",mimeType:"application/octet-stream"}:pw.has(t)?{type:"image",localPath:e,mimeType:t===".png"?"image/png":t===".svg"?"image/svg+xml":t===".gif"?"image/gif":t===".webp"?"image/webp":"image/jpeg"}:{type:"text",text:await G.promises.readFile(e,"utf8")}},validatePath(r){let e=we(r);return e.startsWith("/dev/")||e.startsWith("/proc/")||e.startsWith("/sys/")?`Blocked: reading device/system path ${e}`:ru&&tu(e)?"Blocked: reading sensitive file in group chat mode":null}}}function fw(){return{resolvePath:we,async writeFile(r,e){let t=we(r);await G.promises.mkdir(J.dirname(t),{recursive:!0}),await G.promises.writeFile(t,e,"utf8")}}}function hw(){return{resolvePath:we,async readFile(r){let e=we(r);return G.promises.readFile(e,"utf8")},async writeFile(r,e){let t=we(r);await G.promises.mkdir(J.dirname(t),{recursive:!0}),await G.promises.writeFile(t,e,"utf8")}}}function yw(){return{resolvePath:we,async readFile(r){let e=we(r);return G.promises.readFile(e,"utf8")},async writeFile(r,e){let t=we(r);await G.promises.mkdir(J.dirname(t),{recursive:!0}),await G.promises.writeFile(t,e,"utf8")},async deleteFile(r){let e=we(r);await G.promises.unlink(e)},async fileExists(r){let e=we(r);try{return await G.promises.access(e),!0}catch{return!1}}}}function bw(){return{resolvePath:we,async glob(r,e){let t=e.cwd||_t,n=e.limit||1e3,o=[],s=!1,i=r.replace(/\\/g,"/").split("/"),a=i.some(l=>l==="**"),c=i[i.length-1]??"*",d=mu(c);try{await fi(t,async l=>{if(o.length>=n)return s=!0,!1;let u=J.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||_t;try{return await ww(r,t,e)}catch{return await Tw(r,t,e)}}}}function mu(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 kw=new Set([".git",".svn",".hg","node_modules","__pycache__",".next","dist",".tox",".venv"]);async function fi(r,e,t,n=0,o=""){if(n>t)return;let s;try{s=await G.promises.readdir(r,{withFileTypes:!0})}catch{return}for(let i of s){let a=o?`${o}/${i.name}`:i.name;if(i.isDirectory()){if(kw.has(i.name))continue;await fi(J.join(r,i.name),e,t,n+1,a)}else if(i.isFile()&&!await e(a))return}}function ww(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("."),iw("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(`
293
+ `))if(p.trim())try{let g=JSON.parse(p);g.type==="match"&&g.data&&c.push({path:g.data.path?.text??"",line:g.data.line_number??0,text:(g.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 Tw(r,e,t){let n=new RegExp(r,t.caseInsensitive?"i":""),o=t.headLimit??250,s=t.offset??0,i=t.fileGlob?mu(t.fileGlob):null,a=[],c=!1;return await fi(e,async d=>{if(a.length>=s+o+1)return c=!0,!1;if(i&&!i.test(J.basename(d)))return!0;let l=J.extname(d).toLowerCase();if(pu.has(l))return!0;try{let p=(await G.promises.readFile(J.join(e,d),"utf8")).split(`
294
+ `);for(let g=0;g<p.length;g++)if(n.test(p[g])&&(a.push({path:d,line:g+1,text:p[g].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 ou=!1;function vw(){if(!ou)if(ou=!0,Mo()){let r=process.env.QLOGICAGENT_POWERSHELL_PATH??"powershell.exe";xn(Js(r))}else if(process.platform==="win32"){let r=xw();xn(Fo(r))}else{let r=process.env.SHELL?.endsWith("bash")?process.env.SHELL:"/bin/bash";xn(Fo(r))}}function xw(){let r=process.env.QLOGICAGENT_BASH_PATH;if(r&&G.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?J.join(process.env.ProgramFiles,"Git","bin","bash.exe"):null;t&&!e.includes(t)&&e.unshift(t);for(let n of e)if(G.existsSync(n))return n;return"bash"}function Sw(){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=Rw(s)),{content:s,title:_w(s)}}finally{clearTimeout(t)}}}}function Rw(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 _w(r){return r.match(/<title[^>]*>([^<]+)<\/title>/i)?.[1]?.trim()}function Cw(){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)=>Zd(iu,r)(e,t)}}function Aw(){let r=J.join(process.env.HOME??process.env.USERPROFILE??".",".qlogicagent");function e(o){return J.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=J.resolve(i,s);if(!a.startsWith(i+J.sep)&&a!==i)throw new Error("Path traversal not allowed");return a}function n(o,s){if(!G.existsSync(o))return[];let i=[];for(let a of G.readdirSync(o,{withFileTypes:!0})){let c=J.join(o,a.name);if(a.isDirectory())i.push(...n(c,s));else if(a.isFile()&&a.name.endsWith(".md")){let d=G.statSync(c);i.push({filename:J.relative(s,c).replace(/\\/g,"/"),path:c,size:d.size,updatedAt:d.mtime.toISOString(),content:G.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(!G.existsSync(i))return null;let a=G.statSync(i),c=G.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);G.mkdirSync(J.dirname(a),{recursive:!0}),G.writeFileSync(a,i,"utf-8");let c=G.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 G.existsSync(i)?(G.unlinkSync(i),!0):!1}catch{return!1}}}}function Pw(r){r?.workdir&&(_t=r.workdir),vw(),Uo(_t);let e=[];e.push(Mc()),e.push(Ec(void 0,{onTaskCreated:l=>pi?.onTaskCreated?.(l),onTaskCompleted:l=>pi?.onTaskCompleted?.(l)})),e.push(Qd({askUser:async l=>lu?.(l)??null})),e.push(zc({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=gw(),n=fw(),o=hw(),s=yw();e.push(Kc(t)),e.push(Yc(n)),e.push(Xc(o)),e.push(ei(s)),e.push(td(s)),e.push(ed(bw())),e.push(dd(Sw())),e.push(ud(Cw()));let i=Aw();e.push(pd(i));let a=r?.log??{info:()=>{},warn:()=>{}};e.push(md(Cd({log:a}))),e.push(Md());let c={invokeTool:async(l,u,p)=>{let g=Pe(l);if(!g)return{result:"",error:`Unknown tool: ${l}`};try{let f=await g.execute(`wf_${Date.now()}`,u,p);return{result:f.content.map(y=>y.text??"").join(`
295
+ `),error:f.details?.error}}catch(f){return{result:"",error:f.message}}},getCwd:()=>_t};e.push(Dd(c)),e.push(Ld({sleep:(l,u)=>new Promise(p=>{let g=Date.now(),f=setTimeout(()=>{p({sleptSeconds:Math.round((Date.now()-g)/1e3),interrupted:!1})},l),m=()=>{clearTimeout(f),p({sleptSeconds:Math.round((Date.now()-g)/1e3),interrupted:!0,interruptReason:"aborted"})};u.addEventListener("abort",m,{once:!0}),u.aborted&&(clearTimeout(f),m())})})),e.push(Ud({searchTools:async(l,u)=>{let p=u?.maxResults??5,g=lt(),f=l.toLowerCase().split(/\s+/).filter(Boolean),m=[],y=[];for(let b of f)b.startsWith("+")&&b.length>1?m.push(b.slice(1)):y.push(b);let k=[...m,...y],w=b=>b.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/_/g," ").toLowerCase().split(/\s+/).filter(Boolean);return{matches:g.map(b=>{let I=Pe(b),O=w(b),U=(I?.description??"").toLowerCase(),v=(I?.searchHint??"").toLowerCase();if(m.length>0){let Y=`${O.join(" ")} ${U} ${v}`;if(!m.every(ee=>Y.includes(ee)))return null}let ie=0;for(let Y of k){let W=0;O.some(ee=>ee===Y)?W=10:O.some(ee=>ee.includes(Y))?W=5:b.toLowerCase().includes(Y)&&(W=3),v&&new RegExp(`\\b${Y}`,"i").test(v)&&(W+=4),new RegExp(`\\b${Y}`,"i").test(U)&&(W+=2),ie+=W}return{name:b,description:I?.description??"",searchHint:I?.searchHint,score:ie}}).filter(b=>b!==null&&b.score>0).sort((b,I)=>I.score-b.score).slice(0,p),query:l,totalDeferred:g.length}},activateTool:async l=>Ic(l)})),e.push({...Nd({generateImage:async l=>{let u=await Ve({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:()=>qe("image")}),e.push({...jd({textToSpeech:async l=>{let u=await Ve({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:()=>qe("tts")}),e.push({...Fd({generateVideo:async l=>{let u=await Ve({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:()=>qe("video")}),e.push({...Bd({generateMusic:async l=>{let u=await Ve({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=dt.music;if(!u||!re)return"";let p=re.getTransport(u.provider);if(!(p instanceof wt))return"";let g=fe[u.provider];return g?p.generateLyrics(l,g):""}}),isEnabled:()=>qe("music")}),e.push({...Gd({editVideo:async l=>{let u=await Ve({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:()=>ci("video","edit")}),e.push({...Wd({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 Ve({mediaType:"video",model:"",prompt:u.join("; "),operation:"merge",sourceVideos:l.clips.map(g=>g.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:()=>ci("video","merge")}),e.push({...Hd({upscaleVideo:async l=>{let u=["upscale"];l.sharpness&&u.push(`sharpness: ${l.sharpness}`);let p=await Ve({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:()=>ci("video","upscale")}),e.push({...zd({generate3D:async l=>{let u=await Ve({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:()=>qe("3d")}),e.push({...Vd({speechToText:async l=>{let u=await Ve({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:()=>qe("stt")}),e.push({...qd({cloneVoice:async l=>{let u=await Ve({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:()=>qe("voice_clone")}),e.push({...Kd({cancelTask:async l=>{let u=l.provider??"doubao";if(!re)return{ok:!1,message:"Media client not configured."};let p=re.getTransport(u);if(!p)return{ok:!1,message:`No transport for provider: ${u}`};let g=fe[u];if(!g)return{ok:!1,message:`No API key for provider: ${u}`};try{return"deleteVideoTask"in p&&typeof p.deleteVideoTask=="function"?(await p.deleteVideoTask(l.taskId,g),{ok:!0,message:"Task cancelled."}):{ok:!1,message:`Provider ${u} does not support task cancellation.`}}catch(f){return{ok:!1,message:f instanceof Error?f.message:String(f)}}}}),shouldDefer:!0,isEnabled:()=>qe("video")||qe("3d")});let d=Bo();return e.push({...Jd({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=we(l.filePath);if(!G.existsSync(u))throw new Error(`File not found: ${u}`);let p=G.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 g=await G.promises.readFile(u),f=J.basename(u);if(d.type==="gemini"){let S=Go(),b=fe.google,I=J.extname(u).toLowerCase(),O=mw[I]??"application/octet-stream",U=await S.uploadFile(Buffer.from(g),b,{mimeType:O,displayName:f});if(U.state==="PROCESSING"){let v=await S.waitForProcessing(U.name,b);return{fileId:v.name,url:v.uri,filename:f,bytes:p.size,provider:"google"}}return{fileId:U.name,url:U.uri,filename:f,bytes:p.size,provider:"google"}}let m=new Blob([g]),y=re.getTransport(d.id),k=fe[d.id];if(!(y instanceof De))throw new Error(`File upload only supported via Volcengine or Google provider. Current: ${d.id}`);let w=await y.uploadFile(m,k,{purpose:l.purpose??"media_reference",filename:f}),x;try{let S=await y.getFile(w.id,k);typeof S.url=="string"&&S.url&&(x=S.url)}catch{}return{fileId:w.id,url:x,filename:f,bytes:p.size,provider:d.id}}}),shouldDefer:!0,isEnabled:()=>!!Bo()}),e.push({...Yd({queryFile:async l=>{if(!d)throw new Error("No file API provider available.");if(d.type==="gemini"){let f=Go(),m=fe.google,y=await f.getFile(l.fileId,m);return{id:y.name,filename:y.displayName??"",bytes:Number(y.sizeBytes??0),status:y.state?.toLowerCase()??"unknown",createdAt:y.createTime,url:y.uri}}let u=re.getTransport(d.id),p=fe[d.id];if(!(u instanceof De))throw new Error("File query only supported via Volcengine or Google provider.");let g=await u.getFile(l.fileId,p);return{id:String(g.id??l.fileId),filename:String(g.filename??""),bytes:Number(g.bytes??0),status:String(g.status??"unknown"),createdAt:g.created_at?String(g.created_at):void 0,url:g.url?String(g.url):void 0}},listFiles:async l=>{if(!d)throw new Error("No file API provider available.");if(d.type==="gemini"){let m=Go(),y=fe.google;return(await m.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 u=re.getTransport(d.id),p=fe[d.id];if(!(u instanceof De))throw new Error("File list only supported via Volcengine or Google provider.");return((await u.listFiles(p,{limit:l.limit??10})).data??[]).map(m=>({id:String(m.id??""),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}))}}),shouldDefer:!0,isEnabled:()=>!!Bo()}),e.push({...Xd({deleteFile:async l=>{if(!d)throw new Error("No file API provider available.");if(d.type==="gemini"){let g=Go(),f=fe.google;await g.deleteFile(l.fileId,f);return}let u=re.getTransport(d.id),p=fe[d.id];if(!(u instanceof De))throw new Error("File delete only supported via Volcengine or Google provider.");await u.deleteFile(l.fileId,p)}}),shouldDefer:!0,isEnabled:()=>!!Bo()}),Pc(e),r?.log?.info(`[tool-bootstrap] Registered ${e.length} local tools (${e.filter(l=>l.isEnabled?.()!==!1).length} enabled): ${lt().join(", ")}`),e}var gu=Pw;function Ft(r){_t=r,Uo(r)}import{spawn as Iw}from"node:child_process";import{createInterface as Mw}from"node:readline";var Wo=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=Iw(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=Mw({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=Ew(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(`
296
+ `)||"(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+`
297
+ `)}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 Ew(r){return r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}import{randomUUID as Ow}from"node:crypto";var Ho=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=Ow(),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 g=await l.json();if(g.error)throw new Error(`MCP error ${g.error.code}: ${g.error.message}`);return g.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(`
298
+ `);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__${Dw(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(`
299
+ `)||"(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 Dw(r){return r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}var zo=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 Ho(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 Wo(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();Es(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 lt())s.startsWith(n)&&Io(s);let o=t.toPortableTools();Es(o),this.log.info(`[mcp] re-injected ${o.length} tools from ${e}`)}};function hi(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 Lw={type:"object",properties:{server:{type:"string",description:"MCP server name to list resources from. Omit to list from all connected servers."}}};function fu(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:Lw,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(`
300
+ `).trim()}],details:{type:"list_mcp_resources",count:o.length}}}}}var $w={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 hu(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:$w,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} ---
298
301
  ${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"}) ---
299
- [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 rt from"node:fs";import*as Mo from"node:path";import{pathToFileURL as Vk}from"node:url";var Fd={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(!rt.existsSync(e))continue;let t;try{t=rt.readdirSync(e,{withFileTypes:!0})}catch{continue}for(let n of t){if(!n.isDirectory()||n.name.startsWith(".")||n.name.startsWith("_"))continue;let o=Mo.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)mo(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=Mo.join(t,f);if(rt.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=Mo.join(t,"config.json");if(rt.existsSync(m))try{u=JSON.parse(rt.readFileSync(m,"utf8"))}catch{}let g={pluginName:e,registerTool:f=>{be(f),c.push(f),s++},registerHook:(f,y)=>{let k=Fd[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(Vk(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 Ks(){return Ea()}function Bd(){return yn.join(Ks(),"installed_plugins.json")}function Wd(){let r=Bd();if(!ce.existsSync(r))return{version:1,plugins:[]};try{return JSON.parse(ce.readFileSync(r,"utf-8"))}catch{return{version:1,plugins:[]}}}function qk(r){let e=Ks();ce.existsSync(e)||ce.mkdirSync(e,{recursive:!0}),ce.writeFileSync(Bd(),JSON.stringify(r,null,2),"utf-8")}function Kk(r,e){return!(e.blocklist?.includes(r)||e.allowlist&&!e.allowlist.includes(r))}async function Jk(r,e,t){let{execFile:n}=await import("node:child_process"),{promisify:o}=await import("node:util"),s=o(n),i=Ks(),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(`
300
- `).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 Yk(){return Wd().plugins.filter(e=>ce.existsSync(e.installPath)).map(e=>e.installPath)}async function Xk(r,e){let t=Wd(),n=[];for(let o of r.enabledPlugins){let s=o.specifier.split("/").pop()??o.specifier;if(!Kk(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 Jk(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 qk(t),n}function Qk(){let r=Da();if(!ce.existsSync(r))return null;try{return JSON.parse(ce.readFileSync(r,"utf-8"))}catch{return null}}async function Gd(r,e){let t=[...r],n=Yk();t.push(...n);let o=Qk();if(o&&o.enabledPlugins.length>0)try{let s=await Xk(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 Eo=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 eT(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:Zk(t.pattern)}))}};function Js(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"&&tT(n)?n:"default",s=e.default??e.defaultBehavior,i=typeof s=="string"&&nT(s)?s:"allow";return{mode:o,rules:t,defaultBehavior:i}}function Zk(r){let t=r.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*+/g,".*");return new RegExp(`^${t}$`,"i")}function eT(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 tT(r){return r==="default"||r==="bypassPermissions"||r==="acceptEdits"||r==="dontAsk"||r==="plan"}function nT(r){return r==="allow"||r==="deny"||r==="ask"}import{randomUUID as dT}from"node:crypto";var oT=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"]),Hd=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"]),rT=[/\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],zd=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 Vd(r,e,t){let n=r.trim();if(!n)return{decision:"allow",reason:"empty command"};let o=Is(n)??Ms(n)??void 0;for(let d of rT)if(d.test(n))return{decision:"deny",reason:`matches dangerous pattern: ${d.source}`,destructiveWarning:o};for(let d of oT)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 Hd.has(i)||Hd.has(a)?{decision:"allow",reason:`known safe command: ${i}`,destructiveWarning:o}:e&&t&&e.startsWith(t)&&(zd.has(i)||zd.has(a))?{decision:"allow",reason:`safe in project: ${a}`,destructiveWarning:o}:{decision:"defer",reason:"unknown command \u2014 needs LLM classification",destructiveWarning:o}}function sT(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 Ys(r,e){return`${r}::${sT(e)}`}var iT=500,Oo=class{cache=new Map;get(e,t){let n=Ys(e,t),o=this.cache.get(n);if(o)return o.hitCount++,o}set(e,t,n){if(this.cache.size>=iT){let s=this.cache.keys().next().value;s!==void 0&&this.cache.delete(s)}let o=Ys(e,t);this.cache.set(o,{shouldBlock:n.shouldBlock,reason:n.reason,classifiedAt:Date.now(),hitCount:0})}has(e,t){return this.cache.has(Ys(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 aT=new Set(["read","search","instructions","think","todo","memory","skill","tool_search","plan_mode","lsp","brief","web_search","checkpoint"]);function bn(r){return aT.has(r)}var qd=`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.
302
+ [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 Ke from"node:fs";import*as _n from"node:path";import{pathToFileURL as Uw}from"node:url";var yu={preToolUse:"tool.before_invoke",postToolUse:"tool.after_invoke",onTurnStart:"turn.submitted",onTurnEnd:"turn.completed",onSessionEnd:"session.ended"};var Vo=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(!Ke.existsSync(e))continue;let t;try{t=Ke.readdirSync(e,{withFileTypes:!0})}catch{continue}for(let n of t){if(!n.isDirectory()||n.name.startsWith(".")||n.name.startsWith("_"))continue;let o=_n.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 discoverNew(){let e=new Set(this.loaded.map(n=>n.name)),t=0;for(let n of this.config.pluginDirs){if(!Ke.existsSync(n))continue;let o;try{o=Ke.readdirSync(n,{withFileTypes:!0})}catch{continue}for(let s of o){if(!s.isDirectory()||s.name.startsWith(".")||s.name.startsWith("_")||e.has(s.name))continue;let i=_n.join(n,s.name);await this.loadPlugin(s.name,i),t++}}return t>0&&this.log.info(`[plugins] discovered ${t} new plugin(s)`),t}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)ke(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)Io(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 m of n){let y=_n.join(t,m);if(Ke.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,u=6e4,p={},g=_n.join(t,"config.json");if(Ke.existsSync(g))try{p=JSON.parse(Ke.readFileSync(g,"utf8"))}catch{}let f={pluginName:e,registerTool:m=>{ke(m),c.push(m),s++},registerHook:(m,y)=>{let k=yu[m];if(!k){this.log.warn(`[plugins] ${e}: unknown hook phase "${m}"`);return}let w=this.config.hookRegistry.register({point:k,handler:y,label:`plugin:${e}:${m}`,priority:200});d.push(w),i++},registerSkill:m=>{this.pluginSkills.push(m),a++},getConfig:()=>p,setActivationCheck:(m,y)=>{l=m,y!==void 0&&(u=y)}};try{let y=await import(Uw(o).href);if(typeof y.register!="function"){this.log.warn(`[plugins] ${e}: no register() export, skipping`);return}await y.register(f),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(m){this.log.warn(`[plugins] ${e}: load error: ${m instanceof Error?m.message:m}`)}}};import*as le from"node:fs";import*as Cn from"node:path";function yi(){return tl()}function bu(){return Cn.join(yi(),"installed_plugins.json")}function ku(){let r=bu();if(!le.existsSync(r))return{version:1,plugins:[]};try{return JSON.parse(le.readFileSync(r,"utf-8"))}catch{return{version:1,plugins:[]}}}function Nw(r){let e=yi();le.existsSync(e)||le.mkdirSync(e,{recursive:!0}),le.writeFileSync(bu(),JSON.stringify(r,null,2),"utf-8")}function jw(r,e){return!(e.blocklist?.includes(r)||e.allowlist&&!e.allowlist.includes(r))}async function Fw(r,e,t){let{execFile:n}=await import("node:child_process"),{promisify:o}=await import("node:util"),s=o(n),i=yi(),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(`
303
+ `).pop()?.trim();if(!d)return t.warn(`[marketplace] npm pack returned no output for ${a}`),null;let l=Cn.join(i,d),p=d.match(/^(.+)-(\d+\.\d+\.\d+.*)\.tgz$/)?.[2]??"0.0.0",g=Cn.join(i,`${r}@${p}`);le.existsSync(g)||le.mkdirSync(g,{recursive:!0}),await s("tar",["xzf",l,"-C",g,"--strip-components=1"],{timeout:3e4});try{le.unlinkSync(l)}catch{}let f=Cn.join(g,"package.json");if(le.existsSync(f))try{await s("npm",["install","--production","--no-save"],{cwd:g,timeout:12e4})}catch(m){t.warn(`[marketplace] npm install for ${r} failed: ${m.message}`)}return t.info(`[marketplace] installed ${r}@${p} from npm`),{name:r,version:p,installPath:g}}catch(c){return t.warn(`[marketplace] failed to install ${a} from npm: ${c.message}`),null}}function Bw(){return ku().plugins.filter(e=>le.existsSync(e.installPath)).map(e=>e.installPath)}async function Gw(r,e){let t=ku(),n=[];for(let o of r.enabledPlugins){let s=o.specifier.split("/").pop()??o.specifier;if(!jw(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&&le.existsSync(i.installPath)&&(!o.version||i.version===o.version)){n.push(i.installPath);continue}let a=null;switch(o.type){case"npm":a=await Fw(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 Nw(t),n}function Ww(){let r=ol();if(!le.existsSync(r))return null;try{return JSON.parse(le.readFileSync(r,"utf-8"))}catch{return null}}async function wu(r,e){let t=[...r],n=Bw();t.push(...n);let o=Ww();if(o&&o.enabledPlugins.length>0)try{let s=await Gw(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 qo=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 zw(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:Hw(t.pattern)}))}};function bi(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"&&Vw(n)?n:"default",s=e.default??e.defaultBehavior,i=typeof s=="string"&&qw(s)?s:"allow";return{mode:o,rules:t,defaultBehavior:i}}function Hw(r){let t=r.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*+/g,".*");return new RegExp(`^${t}$`,"i")}function zw(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 Vw(r){return r==="default"||r==="bypassPermissions"||r==="acceptEdits"||r==="dontAsk"||r==="plan"}function qw(r){return r==="allow"||r==="deny"||r==="ask"}import{randomUUID as tT}from"node:crypto";var Kw=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"]),Tu=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"]),Jw=[/\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],vu=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 xu(r,e,t){let n=r.trim();if(!n)return{decision:"allow",reason:"empty command"};let o=Ys(n)??Xs(n)??void 0;for(let d of Jw)if(d.test(n))return{decision:"deny",reason:`matches dangerous pattern: ${d.source}`,destructiveWarning:o};for(let d of Kw)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 Tu.has(i)||Tu.has(a)?{decision:"allow",reason:`known safe command: ${i}`,destructiveWarning:o}:e&&t&&e.startsWith(t)&&(vu.has(i)||vu.has(a))?{decision:"allow",reason:`safe in project: ${a}`,destructiveWarning:o}:{decision:"defer",reason:"unknown command \u2014 needs LLM classification",destructiveWarning:o}}function Yw(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 ki(r,e){return`${r}::${Yw(e)}`}var Xw=500,Ko=class{cache=new Map;get(e,t){let n=ki(e,t),o=this.cache.get(n);if(o)return o.hitCount++,o}set(e,t,n){if(this.cache.size>=Xw){let s=this.cache.keys().next().value;s!==void 0&&this.cache.delete(s)}let o=ki(e,t);this.cache.set(o,{shouldBlock:n.shouldBlock,reason:n.reason,classifiedAt:Date.now(),hitCount:0})}has(e,t){return this.cache.has(ki(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 Qw=new Set(["read","search","instructions","think","task","memory","skill","tool_search","plan_mode","lsp","brief","web_search","checkpoint"]);function An(r){return Qw.has(r)}var Su=`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.
301
304
 
302
305
  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).
303
306
 
@@ -319,7 +322,7 @@ DANGEROUS operations (SHOULD be blocked):
319
322
  - Running commands with sudo/admin privileges
320
323
  - Downloading and executing unknown scripts
321
324
 
322
- Respond ONLY with XML. No other text.`;async function Xs(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=lT(t),i=cT(r,e),a=`<transcript>
325
+ Respond ONLY with XML. No other text.`;async function wi(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=Zw(t),i=eT(r,e),a=`<transcript>
323
326
  ${s}
324
327
  </transcript>
325
328
 
@@ -327,7 +330,7 @@ ${s}
327
330
  ${i}
328
331
  </action>
329
332
 
330
- 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:qd,messages:[{role:"user",content:a}],maxTokens:64,temperature:0,stop:["</reason>"],cacheSystemPrompt:!0}),d=Yd(c.text);if(Kd(d)===!1)return{shouldBlock:!1,reason:"classifier: safe",stage:"fast",durationMs:Date.now()-o};let p=`<transcript>
333
+ 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:Su,messages:[{role:"user",content:a}],maxTokens:64,temperature:0,stop:["</reason>"],cacheSystemPrompt:!0}),d=Cu(c.text);if(Ru(d)===!1)return{shouldBlock:!1,reason:"classifier: safe",stage:"fast",durationMs:Date.now()-o};let u=`<transcript>
331
334
  ${s}
332
335
  </transcript>
333
336
 
@@ -335,57 +338,57 @@ ${s}
335
338
  ${i}
336
339
  </action>
337
340
 
338
- 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:qd,messages:[{role:"user",content:p}],maxTokens:4096,temperature:0,cacheSystemPrompt:!0}),m=Yd(u.text),g=Kd(m),f=Jd(m)??Jd(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 lT(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(`
339
- `)}function cT(r,e){let t=JSON.stringify(e,null,0),n=t.length>2e3?t.slice(0,2e3)+"...":t;return`Tool: ${r}
340
- Arguments: ${n}`}function Kd(r){let e=r.match(/<block>(yes|no)<\/block>/i);return e?e[1].toLowerCase()==="yes":null}function Jd(r){let e=r.match(/<reason>([\s\S]*?)(?:<\/reason>|$)/i);return e?e[1].trim():null}function Yd(r){return r.replace(/<thinking>[\s\S]*?<\/thinking>/gi,"").trim()}var Xd={maxConsecutive:3,maxTotal:20};function Qd(){return{consecutiveDenials:0,totalDenials:0}}function Qs(r){return{consecutiveDenials:r.consecutiveDenials+1,totalDenials:r.totalDenials+1}}function Zs(r){return r.consecutiveDenials===0?r:{...r,consecutiveDenials:0}}function Zd(r){return r.consecutiveDenials>=Xd.maxConsecutive||r.totalDenials>=Xd.maxTotal}var uT=12e4,Do=class{ruleEngine;hookRegistry;onRequestApproval;onPermissionUpdate;onDenied;classifierLLMCall;getRecentMessages;permissionRole;pendingApprovals=new Map;unregisterHook=null;toolMetaCache=new Map;classifierCache=new Oo;denialTracking=Qd();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=Vd(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=Zd(this.denialTracking);if(this.classifierLLMCall&&!d)try{let l=this.getRecentMessages?.()??[],p=await Xs(n,o??{},l,this.classifierLLMCall);if(o&&this.classifierCache.set(n,o,{shouldBlock:p.shouldBlock,reason:p.reason}),!p.shouldBlock)return this.denialTracking=Zs(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:"auto",reason:p.reason}}};this.denialTracking=Qs(this.denialTracking)}catch{}}let a=dT(),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 Xs(t,n??{},o,this.classifierLLMCall);return n&&this.classifierCache.set(t,n,{shouldBlock:s.shouldBlock,reason:s.reason}),s.shouldBlock?(this.denialTracking=Qs(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=Zs(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"))},uT);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 pT="skill",mT={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(`
341
- `)},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 eu(r){return{name:pT,label:"Skill",description:TT(r),parameters:mT,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 gT(r,t,n);case"list":return fT(r,t);case"view":return hT(r,t);case"create":case"edit":case"patch":case"delete":return yT(r,t);case"promote":return bT(r,t);case"install":return kT(r,t);default:return{content:[{type:"text",text:`Unknown action: ${o}. Use invoke, list, view, create, edit, patch, delete, promote, or install.`}]}}}}}async function gT(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}
341
+ 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:Su,messages:[{role:"user",content:u}],maxTokens:4096,temperature:0,cacheSystemPrompt:!0}),g=Cu(p.text),f=Ru(g),m=_u(g)??_u(d)??"classifier decision";return{shouldBlock:f!==!1,reason:m,stage:"thinking",durationMs:Date.now()-o}}catch{return{shouldBlock:!0,reason:"classifier unavailable",stage:"fast",durationMs:Date.now()-o}}}function Zw(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(`
342
+ `)}function eT(r,e){let t=JSON.stringify(e,null,0),n=t.length>2e3?t.slice(0,2e3)+"...":t;return`Tool: ${r}
343
+ Arguments: ${n}`}function Ru(r){let e=r.match(/<block>(yes|no)<\/block>/i);return e?e[1].toLowerCase()==="yes":null}function _u(r){let e=r.match(/<reason>([\s\S]*?)(?:<\/reason>|$)/i);return e?e[1].trim():null}function Cu(r){return r.replace(/<thinking>[\s\S]*?<\/thinking>/gi,"").trim()}var Au={maxConsecutive:3,maxTotal:20};function Pu(){return{consecutiveDenials:0,totalDenials:0}}function Ti(r){return{consecutiveDenials:r.consecutiveDenials+1,totalDenials:r.totalDenials+1}}function vi(r){return r.consecutiveDenials===0?r:{...r,consecutiveDenials:0}}function Iu(r){return r.consecutiveDenials>=Au.maxConsecutive||r.totalDenials>=Au.maxTotal}var nT=12e4,Jo=class{ruleEngine;hookRegistry;onRequestApproval;onPermissionUpdate;onDenied;classifierLLMCall;getRecentMessages;permissionRole;pendingApprovals=new Map;unregisterHook=null;toolMetaCache=new Map;classifierCache=new Ko;denialTracking=Pu();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=xu(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=Iu(this.denialTracking);if(this.classifierLLMCall&&!d)try{let l=this.getRecentMessages?.()??[],u=await wi(n,o??{},l,this.classifierLLMCall);if(o&&this.classifierCache.set(n,o,{shouldBlock:u.shouldBlock,reason:u.reason}),!u.shouldBlock)return this.denialTracking=vi(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:"auto",reason:u.reason}}};this.denialTracking=Ti(this.denialTracking)}catch{}}let a=tT(),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 wi(t,n??{},o,this.classifierLLMCall);return n&&this.classifierCache.set(t,n,{shouldBlock:s.shouldBlock,reason:s.reason}),s.shouldBlock?(this.denialTracking=Ti(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=vi(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"))},nT);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 oT="skill",rT={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(`
344
+ `)},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 Mu(r){return{name:oT,label:"Skill",description:uT(r),parameters:rT,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 sT(r,t,n);case"list":return iT(r,t);case"view":return aT(r,t);case"create":case"edit":case"patch":case"delete":return lT(r,t);case"promote":return cT(r,t);case"install":return dT(r,t);default:return{content:[{type:"text",text:`Unknown action: ${o}. Use invoke, list, view, create, edit, patch, delete, promote, or install.`}]}}}}}async function sT(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}
342
345
 
343
346
  `,a=o?`
344
347
 
345
348
  ### User Context
346
349
  ${o}`:"";return{content:[{type:"text",text:`${i}Follow these instructions:
347
350
 
348
- ${s}${a}`}],details:{skillName:n,action:"invoke",mode:"inline"}}}async function fT(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(`
349
- `)}],details:{action:"list",count:t.skills.length}}}async function hT(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}
351
+ ${s}${a}`}],details:{skillName:n,action:"invoke",mode:"inline"}}}async function iT(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(`
352
+ `)}],details:{action:"list",count:t.skills.length}}}async function aT(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}
350
353
  `,t.content];return t.referenceFiles&&t.referenceFiles.length>0&&n.push(`
351
354
  ### Reference Files
352
355
  ${t.referenceFiles.map(o=>`- ${o}`).join(`
353
356
  `)}`),{content:[{type:"text",text:n.join(`
354
- `)}],details:{action:"view",name:t.name}}}async function yT(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 bT(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 kT(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 TT(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.
357
+ `)}],details:{action:"view",name:t.name}}}async function lT(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 cT(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 dT(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 uT(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.
355
358
 
356
359
  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(`
357
360
  `);return`${t}
358
361
 
359
362
  Available skills:
360
- ${n}`}var wT="agent",tu=["general","explore","plan","code","research","verify"],vT={type:"object",properties:{agent:{type:"string",enum:["general","explore","plan","code","research","verify"],description:`Sub-agent type to fork:
363
+ ${n}`}var pT="agent",Eu=["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:
361
364
  - general: Full tool access, any task
362
365
  - explore: Read-only codebase exploration (search, read, analyze)
363
366
  - plan: Planning mode (explore + produce plan, no writes)
364
367
  - code: Coding agent with full tool access
365
368
  - research: Web research and information gathering
366
- - 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},nu=4;function ou(r){return{name:wT,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:vT,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(!tu.includes(t.agent))return{content:[{type:"text",text:`Error: unknown agent "${t.agent}". Available: ${tu.join(", ")}`}],details:{type:"agent",error:"invalid_agent_type"}};let n=r.currentForkDepth??0;if(n>=nu)return{content:[{type:"text",text:`Error: maximum fork depth (${nu}) 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.
369
+ - 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},Ou=4;function Du(r){return{name:pT,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(!Eu.includes(t.agent))return{content:[{type:"text",text:`Error: unknown agent "${t.agent}". Available: ${Eu.join(", ")}`}],details:{type:"agent",error:"invalid_agent_type"}};let n=r.currentForkDepth??0;if(n>=Ou)return{content:[{type:"text",text:`Error: maximum fork depth (${Ou}) 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
370
  Agent ID: ${o.agentId}
368
371
  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?`
369
372
 
370
- [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 xT="config",ST={type:"object",properties:{action:{type:"string",enum:["get","set","list","reset"],description:`Action:
373
+ [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 gT="config",fT={type:"object",properties:{action:{type:"string",enum:["get","set","list","reset"],description:`Action:
371
374
  - get: Read a config setting
372
375
  - set: Write a config setting
373
376
  - list: List all available settings
374
- - 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 ru(r){return{name:xT,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:ST,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(`
375
- `)}],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(`
376
- `)}],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 RT="cron",_T={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:
377
+ - 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"]},Pn=["permissions.securityPolicy","api.key","api.secret","auth.token","system.adminMode"];function Lu(r){return{name:gT,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:fT,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(`
378
+ `)}],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(Pn.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(`
379
+ `)}],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(Pn.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 hT="cron",yT={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:
377
380
  - Cron: '0 9 * * *' (every day at 9am)
378
381
  - Shorthand: '5m' (every 5 min), '1h' (hourly), '1d' (daily)
379
- 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"]},su=50;function iu(r){return{name:RT,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:_T,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>=su)return{content:[{type:"text",text:`Error: maximum ${su} 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:ei(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(`
380
- `)}],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:ei(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.
381
- ${ei(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 ei(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(`
382
- `)}var CT="monitor",AT={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 au(r){return{name:CT,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(`
383
- `),parameters:AT,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:
382
+ 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"]},$u=50;function Uu(r){return{name:hT,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:yT,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>=$u)return{content:[{type:"text",text:`Error: maximum ${$u} 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:xi(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(`
383
+ `)}],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:xi(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.
384
+ ${xi(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 xi(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(`
385
+ `)}var bT="monitor",kT={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 Nu(r){return{name:bT,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(`
386
+ `),parameters:kT,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:
384
387
  ${i.map(c=>`\u2022 ${c.monitorId} [${c.source}] \u2192 ${c.target} (events: ${c.eventCount}, timeout: ${c.timeoutSeconds}s)`).join(`
385
- `)}`}],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 IT="team",MT={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 lu(r){return{name:IT,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:MT,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(`
388
+ `)}`}],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 wT="team",TT={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 ju(r){return{name:wT,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:TT,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
389
  `)}],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(`
387
- `)}],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(`
388
- `)}],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 ET="mcp",OT={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:
390
+ `)}],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 g=l.mediaProgress;p.push(`${g.mediaType} ${g.percent}% [${g.status}] taskId=${g.taskId}${g.provider?` provider=${g.provider}`:""}`)}p.length&&(u=` (${p.join(", ")})`)}i.push(` - ${a.name} (${a.role})${c}${d}${u}`)}return{content:[{type:"text",text:i.join(`
391
+ `)}],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 xT="mcp",ST={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:
389
392
  - list_servers: List configured MCP servers, their status and capabilities
390
393
  - list_tools: List tools provided by a specific server
391
394
  - call_tool: Execute a tool on an MCP server
@@ -394,14 +397,14 @@ ${i.map(c=>`\u2022 ${c.monitorId} [${c.source}] \u2192 ${c.target} (events: ${c.
394
397
  - list_prompts: List prompts available from a server
395
398
  - get_prompt: Get a specific prompt with arguments
396
399
  - authenticate: Initiate OAuth authentication with a server
397
- - 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 cu(r){return{name:ET,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).
400
+ - 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 Fu(r){return{name:xT,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
401
 
399
- 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:OT,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=DT(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(`
400
- `)}],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=LT(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(`
401
- `)}],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(`
402
- `)}],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?` (${$T(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(`
403
- `)}],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(`
404
- `)||"(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}".
402
+ 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:ST,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=RT(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(`
403
+ `)}],details:{type:"mcp",action:"list_servers",count:o.length}}}case"list_tools":{if(!t.server)return se("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=_T(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(`
404
+ `)}],details:{type:"mcp",action:"list_tools",server:t.server,count:o.length}}}case"call_tool":{if(!t.server)return se("server is required for call_tool.");if(!t.toolName)return se("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(`
405
+ `)}],details:{type:"mcp",action:"list_resources",count:o.length,server:t.server}}}case"read_resource":{if(!t.server)return se("server is required for read_resource.");if(!t.uri)return se("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?` (${CT(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 se("server is required for list_prompts.");if(!r.listPrompts)return se("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(`
406
+ `)}],details:{type:"mcp",action:"list_prompts",server:t.server,count:o.length}}}case"get_prompt":{if(!t.server)return se("server is required for get_prompt.");if(!t.promptName)return se("promptName is required for get_prompt.");if(!r.getPrompt)return se("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(`
407
+ `)||"(empty prompt)"}],details:{type:"mcp",action:"get_prompt",server:t.server,promptName:t.promptName}}}case"authenticate":{if(!t.server)return se("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}".
405
408
 
406
409
  Please open this URL in your browser:
407
410
  ${o.authUrl}
@@ -409,28 +412,28 @@ ${o.authUrl}
409
412
  ${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.
410
413
  Required scopes: ${o.requiredScopes?.join(", ")||"unknown"}
411
414
 
412
- `+(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 DT(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 LT(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 $T(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(`
413
- `)}],details:{type:"mcp",action:"manage_server",manageAction:r,server:e,success:t.success}}}var UT="checkpoint",NT={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"]},du=/^[0-9a-fA-F]{4,64}$/;function uu(r){return{name:UT,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:NT,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}
415
+ `+(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 se("server is required for manage_server.");if(!t.manageAction)return se("manageAction is required for manage_server.");switch(t.manageAction){case"add":{if(!r.addServer)return se("Server addition not supported by the current MCP host.");if(!t.config)return se("config is required for manage_server add.");let o=await r.addServer(t.server,t.config);return In("add",t.server,o)}case"remove":{if(!r.removeServer)return se("Server removal not supported by the current MCP host.");let o=await r.removeServer(t.server);return In("remove",t.server,o)}case"restart":{if(!r.restartServer)return se("Server restart not supported by the current MCP host.");let o=await r.restartServer(t.server);return In("restart",t.server,o)}case"health_check":{if(!r.healthCheck)return se("Health check not supported by the current MCP host.");let o=await r.healthCheck(t.server);return In("health_check",t.server,o)}case"enable":case"disable":{if(!r.setServerEnabled)return se("Server enable/disable not supported by the current MCP host.");let o=await r.setServerEnabled(t.server,t.manageAction==="enable");return In(t.manageAction,t.server,o)}default:return se(`Unknown manageAction: ${t.manageAction}`)}}default:return se(`Unknown action: "${t.action}".`)}}}}function se(r){return{content:[{type:"text",text:`Error: ${r}`}],details:{type:"mcp",error:r}}}function RT(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 _T(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 CT(r){return r<1024?`${r}B`:r<1024*1024?`${(r/1024).toFixed(1)}KB`:`${(r/(1024*1024)).toFixed(1)}MB`}function In(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(`
416
+ `)}],details:{type:"mcp",action:"manage_server",manageAction:r,server:e,success:t.success}}}var AT="checkpoint",PT={type:"object",properties:{action:{type:"string",enum:["create","list","restore","diff"],description:"Action: create (snapshot current state), list (show checkpoints), restore (revert to checkpoint), diff (show changes since checkpoint)."},checkpointId:{type:"string",description:"Checkpoint ID. Required for restore and diff."},message:{type:"string",description:"Optional descriptive message for the checkpoint."},paths:{type:"array",items:{type:"string"},description:"File paths to restore (partial restore). Omit to restore everything."}},required:["action"]},Bu=/^[0-9a-fA-F]{4,64}$/;function Gu(r){return{name:AT,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:PT,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}
414
417
  Message: ${n.checkpoint.message}
415
418
  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(`
416
- `)}],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(!du.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(!du.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 Et from"node:path";function pu(r,e){let t=Pa(e);return{createCheckpoint:async n=>{try{xe.mkdirSync(t,{recursive:!0});let{execSync:o}=await import("node:child_process"),s=Et.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=Et.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(`
417
- `).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=Et.join(t,i),c=Et.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=Et.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 ni}from"node:child_process";import{createInterface as $o}from"node:readline";import{resolve as JT,join as vn}from"node:path";import{createServer as YT}from"node:net";import{createWriteStream as XT,mkdirSync as QT}from"node:fs";import{tmpdir as ZT}from"node:os";import{createInterface as jT}from"node:readline";var FT=1,BT=1,De={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"},WT=1e4,bt=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=jT({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)}
418
- `)}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=FT++,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)}
419
- `)}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:BT,clientInfo:{name:"qlogicagent",version:"1.0.0"},clientCapabilities:{fs:{readTextFile:!0,writeTextFile:!0},terminal:!0,auth:{terminal:!1}}},WT),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 De.AGENT_MESSAGE_CHUNK:{let a=o.content;return{method:"turn.delta",params:{text:a?.text??a?.content??"",sessionId:i,messageId:o.messageId}}}case De.AGENT_THOUGHT_CHUNK:return{method:"turn.thought_delta",params:{text:o.content?.text??"",sessionId:i}};case De.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 De.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 De.USAGE_UPDATE:return{method:"turn.usage_update",params:o??{}};case De.PLAN:return{method:"turn.plan",params:{steps:o.steps,sessionId:i}};case De.AVAILABLE_COMMANDS_UPDATE:case De.CURRENT_MODE_UPDATE:case De.CONFIG_OPTION_UPDATE:case De.SESSION_INFO_UPDATE:return{method:"turn.session_info",params:{type:s,...o,sessionId:i}};case De.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 gu}from"node:child_process";import{platform as GT}from"node:os";var ti={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"}},HT=["general","explore","plan","code","research","verify"];function zT(){return HT.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 VT=GT()==="win32";function mu(r){try{let e=VT?`where ${r}`:`which ${r}`;return gu(e,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim().split(/\r?\n/)[0]?.trim()||null}catch{return null}}function qT(r){try{return gu(`"${r}" --version`,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim().match(/(\d+\.\d+[\w.-]*)/)?.[1]??null}catch{return null}}var KT=6e4,Lo=class{cache=null;configStore=null;setConfigStore(e){this.configStore=e}scan(e=!1){if(!e&&this.cache&&Date.now()-this.cache.timestamp<KT)return this.cache.agents;let t=[];t.push(...zT());for(let n of Object.values(ti))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=mu(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=qT(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=mu(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=ti[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 ew=1;function tw(r,e){return{jsonrpc:"2.0",id:ew++,method:r,params:e}}var nw=["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 ow(r){let e={};for(let t of nw)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 oi=2,rw=3e3,Ot=3,fu=5e3;function sw(r){return new Promise(e=>setTimeout(e,r))}var Dt=class r{processes=new Map;callbacks;cliBinaryPath;mcpBridgeScriptPath;constructor(e={}){this.callbacks=e;let t=JT(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=ow(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=ni(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=tw(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)}
420
- `)}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()}})+`
421
- `;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<=oi;s++)try{if(s>0){this.processes.delete(e.memberId),t.state="starting",t.error=void 0,t.endedAt=void 0;let i=rw*s;this.slog("info",e.memberId,"spawn",`retry ${s}/${oi} after ${i}ms`),await sw(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 ${oi+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=ni(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 bt,l=new wn,{server:p,pipePath:u}=this.createMcpIpcServer(e.memberId);n.QLOGICAGENT_PARENT_RPC=u;let m;if(this.callbacks.sessionDir)try{QT(this.callbacks.sessionDir,{recursive:!0}),m=XT(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=bt.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}
422
- `)}),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<Ot){let C=fu*2**w;this.slog("warn",e.memberId,"crash",`crashed (code=${g}), restarting ${w+1}/${Ot} after ${C}ms`),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Process crashed (code=${g}, signal=${f}), restarting`,retriesLeft:Ot-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(ZT(),`qlogicagent-mcp-${t}-${Date.now()}.sock`),o=YT(s=>{let i="";s.on("data",a=>{i+=a.toString();let c;for(;(c=i.indexOf(`
419
+ `)}],details:{type:"checkpoint",action:"list",count:n.checkpoints.length}}}case"restore":{if(!t.checkpointId)return{content:[{type:"text",text:"Error: checkpointId required for restore."}],details:{type:"checkpoint",error:"missing_id"}};if(!Bu.test(t.checkpointId))return{content:[{type:"text",text:"Error: invalid checkpoint ID format."}],details:{type:"checkpoint",error:"invalid_id"}};let n=await r.restoreCheckpoint(t.checkpointId,t.paths);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"checkpoint",error:n.error}};let o=t.paths?`(${t.paths.length} files)`:"(full workspace)";return{content:[{type:"text",text:`Restored to checkpoint ${t.checkpointId.slice(0,8)} ${o}`}],details:{type:"checkpoint",action:"restore",checkpointId:t.checkpointId}}}case"diff":{if(!t.checkpointId)return{content:[{type:"text",text:"Error: checkpointId required for diff."}],details:{type:"checkpoint",error:"missing_id"}};if(!Bu.test(t.checkpointId))return{content:[{type:"text",text:"Error: invalid checkpoint ID format."}],details:{type:"checkpoint",error:"invalid_id"}};let n=await r.diffCheckpoint(t.checkpointId);return n.success?{content:[{type:"text",text:n.diff||"(no changes since checkpoint)"}],details:{type:"checkpoint",action:"diff",checkpointId:t.checkpointId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"checkpoint",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"checkpoint",error:"unknown_action"}}}}}}import*as Se from"node:fs";import*as Bt from"node:path";function Wu(r,e){let t=el(e);return{createCheckpoint:async n=>{try{Se.mkdirSync(t,{recursive:!0});let{execSync:o}=await import("node:child_process"),s=Bt.join(t,".git");Se.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"})),Se.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=Bt.join(t,".git");if(!Se.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(`
420
+ `).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=Bt.join(t,i),c=Bt.join(r,i);Se.existsSync(a)&&Se.cpSync(a,c,{recursive:!0})}}else{s(`git checkout ${n} -- .`,{cwd:t,stdio:"pipe"});let i=Se.readdirSync(r);for(let a of i){if(a===".git"||a==="node_modules")continue;let c=Bt.join(r,a);Se.rmSync(c,{recursive:!0,force:!0})}Se.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 Xo}from"node:readline";import{resolve as FT,join as En}from"node:path";import{createServer as BT}from"node:net";import{createWriteStream as GT,mkdirSync as WT}from"node:fs";import{tmpdir as HT}from"node:os";import{createInterface as IT}from"node:readline";var MT=1,ET=1,Ne={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"},OT=1e4,Ct=class{pendingRpcs=new Map;rl=null;child=null;onNotification=null;hostHandler=null;attach(e,t,n){this.onNotification=t??null,this.hostHandler=n??null,this.child=e,this.rl=IT({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)}
421
+ `)}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=MT++,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)}
422
+ `)}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:ET,clientInfo:{name:"qlogicagent",version:"1.0.0"},clientCapabilities:{fs:{readTextFile:!0,writeTextFile:!0},terminal:!0,auth:{terminal:!1}}},OT),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 Ne.AGENT_MESSAGE_CHUNK:{let a=o.content;return{method:"turn.delta",params:{text:a?.text??a?.content??"",sessionId:i,messageId:o.messageId}}}case Ne.AGENT_THOUGHT_CHUNK:return{method:"turn.thought_delta",params:{text:o.content?.text??"",sessionId:i}};case Ne.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 Ne.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 Ne.USAGE_UPDATE:return{method:"turn.usage_update",params:o??{}};case Ne.PLAN:return{method:"turn.plan",params:{steps:o.steps,sessionId:i}};case Ne.AVAILABLE_COMMANDS_UPDATE:case Ne.CURRENT_MODE_UPDATE:case Ne.CONFIG_OPTION_UPDATE:case Ne.SESSION_INFO_UPDATE:return{method:"turn.session_info",params:{type:s,...o,sessionId:i}};case Ne.USER_MESSAGE_CHUNK:return null;default:return{method:`turn.${s??"unknown"}`,params:{...o,sessionId:i}}}}return null}};var Mn=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 zu}from"node:child_process";import{platform as DT}from"node:os";var Si={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"}},LT=["general","explore","plan","code","research","verify"];function $T(){return LT.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 UT=DT()==="win32";function Hu(r){try{let e=UT?`where ${r}`:`which ${r}`;return zu(e,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim().split(/\r?\n/)[0]?.trim()||null}catch{return null}}function NT(r){try{return zu(`"${r}" --version`,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim().match(/(\d+\.\d+[\w.-]*)/)?.[1]??null}catch{return null}}var jT=6e4,Yo=class{cache=null;configStore=null;setConfigStore(e){this.configStore=e}scan(e=!1){if(!e&&this.cache&&Date.now()-this.cache.timestamp<jT)return this.cache.agents;let t=[];t.push(...$T());for(let n of Object.values(Si))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=Hu(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=NT(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=Hu(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=Si[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 zT=1;function VT(r,e){return{jsonrpc:"2.0",id:zT++,method:r,params:e}}var qT=["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 KT(r){let e={};for(let t of qT)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 _i=2,JT=3e3,Gt=3,Vu=5e3;function YT(r){return new Promise(e=>setTimeout(e,r))}var Wt=class r{processes=new Map;callbacks;cliBinaryPath;mcpBridgeScriptPath;constructor(e={}){this.callbacks=e;let t=FT(En(import.meta.url.startsWith("file://")?new URL(import.meta.url).pathname.replace(/^\/([A-Z]:)/,"$1"):process.cwd(),"..",".."));this.cliBinaryPath=En(t,"dist","cli.js"),this.mcpBridgeScriptPath=En(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=KT(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}),Xo({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 g=u;g.error?p.reject(new Error(g.error.message)):p.resolve(g.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&&Xo({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,g]of a)clearTimeout(g.timer),g.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=VT(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)}
423
+ `)}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 g=await u;clearInterval(p),o.handle.state="completed",o.handle.endedAt=Date.now();let f=g;return f&&typeof f.content=="string"&&(o.handle.resultText=f.content),this.callbacks.onStateChange?.(e,"completed"),g}catch(g){throw clearInterval(p),o.handle.state="failed",o.handle.error=g instanceof Error?g.message:String(g),o.handle.endedAt=Date.now(),this.callbacks.onStateChange?.(e,"failed"),g}}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()}})+`
424
+ `;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<=_i;s++)try{if(s>0){this.processes.delete(e.memberId),t.state="starting",t.error=void 0,t.endedAt=void 0;let i=JT*s;this.slog("info",e.memberId,"spawn",`retry ${s}/${_i} after ${i}ms`),await YT(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 ${_i+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 Ct,l=new Mn,{server:u,pipePath:p}=this.createMcpIpcServer(e.memberId);n.QLOGICAGENT_PARENT_RPC=p;let g;if(this.callbacks.sessionDir)try{WT(this.callbacks.sessionDir,{recursive:!0}),g=GT(En(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:g}),d.attach(a,(f,m)=>{f==="usage_update"&&l.onUsageUpdate(m);let y=Ct.translateNotification(f,m);y?(this.captureChildProgress(e.memberId,y.method,y.params),this.callbacks.onNotification?.(e.memberId,y.method,y.params)):(this.captureChildProgress(e.memberId,f,m),this.callbacks.onNotification?.(e.memberId,f,m))}),a.stderr&&Xo({input:a.stderr,crlfDelay:Number.POSITIVE_INFINITY}).on("line",m=>{this.callbacks.log?.debug?.(`[${new Date().toISOString()}] [debug] [agent:${e.memberId}] [stderr] ${m}`),g?.write(`${new Date().toISOString()} ${m}
425
+ `)}),a.on("exit",(f,m)=>{d.detach();let y=t.state;if(y!=="killed"&&y!=="completed"&&f!==0){let w=this.processes.get(e.memberId)?.runtimeRestartCount??0;if(w<Gt){let x=Vu*2**w;this.slog("warn",e.memberId,"crash",`crashed (code=${f}), restarting ${w+1}/${Gt} after ${x}ms`),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Process crashed (code=${f}, signal=${m}), restarting`,retriesLeft:Gt-w-1}),setTimeout(()=>{this.attemptRuntimeRestart(e,n,w+1).catch(S=>{this.slog("warn",e.memberId,"restart",`failed: ${S instanceof Error?S.message:String(S)}`)})},x);return}}y!=="killed"&&(t.state=f===0?"completed":"failed"),t.endedAt=Date.now(),f!==0&&!t.error&&(t.error=`ACP process exited with code ${f} (signal: ${m})`),this.callbacks.onStateChange?.(e.memberId,t.state),this.callbacks.onExit?.(e.memberId,f,m),this.slog("info",e.memberId,"exit",`ACP exited (code=${f}, signal=${m})`)}),a.on("error",f=>{d.detach(),t.state="failed",t.error=f.message,t.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed"),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"spawn",error:f.message,retriesLeft:0}),this.slog("warn",e.memberId,"error",f.message)}),this.callbacks.onStateChange?.(e.memberId,"starting");try{let f=await d.initialize(a);t.state="ready",t.supportsResume=f.agentCapabilities.loadSession===!0,this.callbacks.onStateChange?.(e.memberId,"ready"),this.slog("info",e.memberId,"handshake",`ACP initialized (protocol=${f.protocolVersion}, loadSession=${t.supportsResume}, pid=${t.pid})`);try{let m={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&&(m.mcpServers=y),e.systemPrompt&&(m.systemPrompt=e.systemPrompt);let w=await d.createSession(a,m);t.sessionId=w.sessionId,this.slog("info",e.memberId,"session",`session created (id=${w.sessionId})`)}catch(m){this.slog("warn",e.memberId,"session",`session creation failed: ${m instanceof Error?m.message:String(m)}`)}this.startHeartbeat(e.memberId,m=>{this.slog("warn",m,"heartbeat","hang detected \u2014 force-killing"),this.callbacks.onNotification?.(m,"agents.error",{agentId:m,phase:"heartbeat",error:`Agent ${e.name} stopped responding (${r.MAX_MISSED_BEATS} missed heartbeats)`,retriesLeft:0}),this.kill(m)})}catch(f){throw t.state="failed",t.error=`ACP handshake failed: ${f instanceof Error?f.message:String(f)}`,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()}`:En(HT(),`qlogicagent-mcp-${t}-${Date.now()}.sock`),o=BT(s=>{let i="";s.on("data",a=>{i+=a.toString();let c;for(;(c=i.indexOf(`
423
426
  `))!==-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"}})+`
424
427
  `;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})+`
425
428
  `;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)}})+`
426
429
  `;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}`}})+`
427
- `;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=ni(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 bt,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=bt.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}
428
- `)}),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<Ot){let P=fu*2**E;this.slog("warn",e.memberId,"crash",`crashed again (code=${w}), restart ${E+1}/${Ot}`),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Process crashed (code=${w}), restarting`,retriesLeft:Ot-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 yu}from"node:path";import{chmod as gw}from"node:fs/promises";import{readFile as iw,writeFile as aw,mkdir as lw,rename as cw,unlink as dw}from"node:fs/promises";import{dirname as uw,join as pw}from"node:path";import{randomUUID as mw}from"node:crypto";async function xn(r,e){let t=uw(r);await lw(t,{recursive:!0});let n=pw(t,`.tmp-${mw()}`);try{await aw(n,e,"utf-8");let o;for(let s=0;s<3;s++)try{await cw(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 dw(n).catch(()=>{}),o}}async function Sn(r){try{let e=await iw(r,"utf-8");return JSON.parse(e)}catch(e){if(e.code==="ENOENT")return;throw e}}async function Uo(r,e){await xn(r,JSON.stringify(e,null,2)+`
429
- `)}var bu="agent-configs.json";function hu(){return yu(Z(),bu)}function fw(r){return yu(He(r),bu)}function hw(){return{agents:{}}}var No=class{data=hw();cwd;constructor(e){this.cwd=e}async load(){let e=await Sn(hu()),t=this.cwd?await Sn(fw(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=hu();await Uo(e,this.data);try{await gw(e,384)}catch{}}};import{randomUUID as ww}from"node:crypto";import{execFile as yw}from"node:child_process";import{promisify as bw}from"node:util";import{join as ku}from"node:path";import{mkdir as kw,rm as Tw}from"node:fs/promises";var Lt=bw(yw);async function Rn(r){try{let{stdout:e}=await Lt("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8"});return e.trim()}catch{return null}}async function jo(r,e,t){let n=ku(r,".worktrees");await kw(n,{recursive:!0});let o=ku(n,e),i=["worktree","add","-B",`solo/${e}`,o];return t?i.push(t):i.push("HEAD"),await Lt("git",i,{cwd:r,encoding:"utf8"}),o}async function Tu(r){try{await Lt("git",["add","-A"],{cwd:r});let{stdout:e}=await Lt("git",["diff","--cached","--stat"],{cwd:r,encoding:"utf8"});return e.trim()}catch{return""}}async function wu(r,e){try{await Lt("git",["worktree","remove","--force",e],{cwd:r,encoding:"utf8"})}catch{try{await Tw(e,{recursive:!0,force:!0})}catch{}}}async function vu(r,e){let{stdout:t}=await Lt("git",["merge","--no-ff",e,"-m",`solo: merge ${e}`],{cwd:r,encoding:"utf8"});return t.trim()}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 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-${ww().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 jo(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 Tu(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 vu(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(`
430
- `),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 wu(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 Sw}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 ri}from"node:path";import{mkdir as vw,readdir as xw}from"node:fs/promises";function xu(r){return ri(He(r),"products")}function Su(r,e){return ri(xu(e),r)}function Ru(r,e){return ri(Su(r,e),"product-state.json")}async function _u(r,e){let t=Su(r.productId,e);await vw(t,{recursive:!0}),await Uo(Ru(r.productId,e),r)}async function si(r,e){return Sn(Ru(r,e))}async function Cu(r){let e=xu(r),t;try{t=await xw(e)}catch{return[]}let n=[];for(let o of t){let s=await si(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 _u(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 Bo=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-${Sw().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 si(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 Cu(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 jo(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 Au="memory",Iu="Memory",Rw=["add","replace","remove","create_file","write_file","read_file","delete_file","list_files","search"],Mu={type:"object",properties:{action:{type:"string",enum:Rw,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(`
430
+ `;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=Ri(l.cliPath,u,{cwd:e.cwd,env:t,stdio:["pipe","pipe","pipe"],detached:!1});d.pid=p.pid??-1;let g=new Map,f=new Ct,m=new Mn;this.processes.set(e.memberId,{handle:d,child:p,pendingRpc:g,acpAdapter:f,usageTracker:m,ipcServer:i,ipcPath:a,stderrStream:c,runtimeRestartCount:n}),f.attach(p,(w,x)=>{w==="usage_update"&&m.onUsageUpdate(x);let S=Ct.translateNotification(w,x);S?(this.captureChildProgress(e.memberId,S.method,S.params),this.callbacks.onNotification?.(e.memberId,S.method,S.params)):(this.captureChildProgress(e.memberId,w,x),this.callbacks.onNotification?.(e.memberId,w,x))}),p.stderr&&Xo({input:p.stderr,crlfDelay:Number.POSITIVE_INFINITY}).on("line",x=>{this.callbacks.log?.debug?.(`[${new Date().toISOString()}] [debug] [agent:${e.memberId}] [stderr] ${x}`),c?.write(`${new Date().toISOString()} ${x}
431
+ `)}),p.on("exit",(w,x)=>{f.detach();let S=d.state;if(S!=="killed"&&S!=="completed"&&w!==0){let I=this.processes.get(e.memberId)?.runtimeRestartCount??n;if(I<Gt){let O=Vu*2**I;this.slog("warn",e.memberId,"crash",`crashed again (code=${w}), restart ${I+1}/${Gt}`),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Process crashed (code=${w}), restarting`,retriesLeft:Gt-I-1}),setTimeout(()=>{this.attemptRuntimeRestart(e,t,I+1).catch(U=>{this.slog("warn",e.memberId,"restart",`failed: ${U instanceof Error?U.message:String(U)}`)})},O);return}}S!=="killed"&&(d.state=w===0?"completed":"failed"),d.endedAt=Date.now(),w!==0&&!d.error&&(d.error=`ACP process exited with code ${w} (signal: ${x})`),this.callbacks.onStateChange?.(e.memberId,d.state),this.callbacks.onExit?.(e.memberId,w,x)}),p.on("error",w=>{f.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 f.initialize(p);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 f.resumeSession(p,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 x=await f.createSession(p,w);d.sessionId=x.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 Ku}from"node:path";import{chmod as sv}from"node:fs/promises";import{readFile as XT,writeFile as QT,mkdir as ZT,rename as ev,unlink as tv}from"node:fs/promises";import{dirname as nv,join as ov}from"node:path";import{randomUUID as rv}from"node:crypto";async function Ht(r,e){let t=nv(r);await ZT(t,{recursive:!0});let n=ov(t,`.tmp-${rv()}`);try{await QT(n,e,"utf-8");let o;for(let s=0;s<3;s++)try{await ev(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 tv(n).catch(()=>{}),o}}async function On(r){try{let e=await XT(r,"utf-8");return JSON.parse(e)}catch(e){if(e.code==="ENOENT")return;throw e}}async function Qo(r,e){await Ht(r,JSON.stringify(e,null,2)+`
432
+ `)}var Ju="agent-configs.json";function qu(){return Ku(K(),Ju)}function iv(r){return Ku($e(r),Ju)}function av(){return{agents:{}}}var Zo=class{data=av();cwd;constructor(e){this.cwd=e}async load(){let e=await On(qu()),t=this.cwd?await On(iv(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=qu();await Qo(e,this.data);try{await sv(e,384)}catch{}}};import{randomUUID as pv}from"node:crypto";import{execFile as lv}from"node:child_process";import{promisify as cv}from"node:util";import{join as Yu}from"node:path";import{mkdir as dv,rm as uv}from"node:fs/promises";var zt=cv(lv);async function Dn(r){try{let{stdout:e}=await zt("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8"});return e.trim()}catch{return null}}async function er(r,e,t){let n=Yu(r,".worktrees");await dv(n,{recursive:!0});let o=Yu(n,e),i=["worktree","add","-B",`solo/${e}`,o];return t?i.push(t):i.push("HEAD"),await zt("git",i,{cwd:r,encoding:"utf8"}),o}async function Xu(r){try{await zt("git",["add","-A"],{cwd:r});let{stdout:e}=await zt("git",["diff","--cached","--stat"],{cwd:r,encoding:"utf8"});return e.trim()}catch{return""}}async function Qu(r,e){try{await zt("git",["worktree","remove","--force",e],{cwd:r,encoding:"utf8"})}catch{try{await uv(e,{recursive:!0,force:!0})}catch{}}}async function Zu(r,e){let{stdout:t}=await zt("git",["merge","--no-ff",e,"-m",`solo: merge ${e}`],{cwd:r,encoding:"utf8"});return t.trim()}var tr=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 Dn(o);if(!s)throw new Error("Solo Mode requires a git repository");let i=`solo-${pv().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}`,g=`solo/${p}`,f=`${i}:${l}:${u}`,m;try{m=await er(s,p)}catch(k){this.callbacks.log?.warn(`[solo] worktree creation failed for ${l}: ${k instanceof Error?k.message:String(k)}`);let w={agentId:l,memberId:f,worktreePath:"",worktreeBranch:g,state:"failed",error:`Worktree creation failed: ${k instanceof Error?k.message:String(k)}`};a.agents.push(w);return}let y={agentId:l,memberId:f,worktreePath:m,worktreeBranch:g,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:f,name:`solo-${l}`,cwd:m,prompt:t,external:k});let w=this.processManager.getHandle(f);if(!w||w.state!=="ready")throw new Error(`Agent ${l} spawn did not reach ready state`);let x=await this.processManager.sendTask(f,t);y.state="completed",y.resultText=typeof x=="string"?x:JSON.stringify(x),y.diff=await Xu(m);let S=this.processManager.getUsageTracker(f);if(S?.hasData()){let b=S.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 Zu(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(`
433
+ `),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 Qu(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 fv}from"node:crypto";var Ln=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 $n=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 Ci}from"node:path";import{mkdir as mv,readdir as gv}from"node:fs/promises";function ep(r){return Ci($e(r),"products")}function tp(r,e){return Ci(ep(e),r)}function np(r,e){return Ci(tp(r,e),"product-state.json")}async function op(r,e){let t=tp(r.productId,e);await mv(t,{recursive:!0}),await Qo(np(r.productId,e),r)}async function Ai(r,e){return On(np(r,e))}async function rp(r){let e=ep(r),t;try{t=await gv(e)}catch{return[]}let n=[];for(let o of t){let s=await Ai(o,r);s&&n.push(s)}return n}var Un=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 op(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 nr=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(m=>m.name));for(let m of s)if(!a.has(m.assignee))throw new Error(`Task "${m.taskId}" references unknown instance "${m.assignee}"`);let c=`product-${fv().slice(0,8)}`,d=new Ln(s),l=new $n(i),u=new Un({onCheckpoint:(m,y)=>this.callbacks.onCheckpointed?.(m,y),getState:()=>{let m=this.sessions.get(c);return m?this.buildPersistedState(m):null},log:this.callbacks.log}),p=await Dn(n),g=o.map((m,y)=>({instanceId:`${c}:${m.name}:${y}`,name:m.name,agentId:m.agentId,state:"idle"})),f={productId:c,name:t,cwd:n,phase:"active",instances:g,dag:d,budget:l,checkpoint:u,createdAt:new Date().toISOString(),gitRoot:p};return this.sessions.set(c,f),u.start(n),this.callbacks.log?.info(`[product] created ${c} "${t}" with ${o.length} instances, ${s.length} tasks`),this.scheduleNext(f),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 Ln(n.tasks);o.restore(n.tasks);let s=new $n({maxTotalTokens:n.budget.maxTotalTokens,maxDuration:n.budget.maxDuration});s.restore(n.budget);let i=new Un({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 Dn(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 rp(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 er(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 sp="memory",ip="Memory",hv=["add","replace","remove","create_file","write_file","read_file","delete_file","list_files","search"],ap={type:"object",properties:{action:{type:"string",enum:hv,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(`
431
434
  `)},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(`
432
- `)},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"]},Pu=["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(`
433
- `);async function Eu(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
+ `)},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"]},lp=["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(`
436
+ `);async function cp(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(`
434
437
  `);return{ok:!0,message:`Memory files (${o.length}):
435
438
  ${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
436
439
  `+a.map(c=>`\u2022 [${c.file}] ${c.snippet}`).join(`
@@ -438,52 +441,66 @@ ${s}`,action:t}}if(t==="search"){let o=r.query?.trim();if(!o)return{ok:!1,messag
438
441
  `+a.map((c,d)=>`${d+1}. ${c.text}`).join(`
439
442
  `))}catch{}return s.length===0?{ok:!0,message:"No matching memories found.",action:t,results:[]}:{ok:!0,message:s.join(`
440
443
 
441
- `),action:t,results:i}}return{ok:!1,message:`Unknown action: "${t}".`,action:t}}import{readFile as ii,readdir as Ou,unlink as _w,stat as Cw,mkdir as Aw}from"node:fs/promises";import{existsSync as Le,readFileSync as Du,mkdirSync as Lu}from"node:fs";import{join as Pe}from"node:path";var Te=12288,ai=200,Wo=8192,Iw="memory",st="INDEX.md";function li(){return Pe(Z(),Iw)}var Mw=[/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 Go(r){return!Mw.some(e=>e.test(r))}var Pw=/^[a-z0-9][a-z0-9\-_.]*\.md$/i;function Ho(r){return!(!Pw.test(r)||r===st||r.includes("..")||r.includes("/")||r.includes("\\"))}var zo=class{root;indexCache=null;constructor(e){this.root=e??li()}getRootPath(){return this.root}ensureInitialized(){Le(this.root)||Lu(this.root,{recursive:!0});let e=Pe(this.root,st);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(`
442
- `);Ew(e,t)}}getIndexForPrompt(){let e=Pe(this.root,st);if(!Le(e))return"";let t;try{t=Du(e,"utf-8")}catch{return""}this.indexCache=t;let n=t.split(`
443
- `);return n.length>ai&&(t=n.slice(0,ai).join(`
444
+ `),action:t,results:i}}return{ok:!1,message:`Unknown action: "${t}".`,action:t}}import{readFile as Pi,readdir as dp,unlink as yv,stat as bv,mkdir as kv}from"node:fs/promises";import{existsSync as je,readFileSync as up,mkdirSync as pp,writeFileSync as wv}from"node:fs";import{join as Me}from"node:path";var Te=12288,Ii=200,or=8192,Tv="memory",ut="INDEX.md";function Mi(){return Me(K(),Tv)}var vv=[/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 rr(r){return!vv.some(e=>e.test(r))}var xv=/^[a-z0-9][a-z0-9\-_.]*\.md$/i;function sr(r){return!(!xv.test(r)||r===ut||r.includes("..")||r.includes("/")||r.includes("\\"))}var ir=class{root;indexCache=null;constructor(e){this.root=e??Mi()}getRootPath(){return this.root}ensureInitialized(){je(this.root)||pp(this.root,{recursive:!0});let e=Me(this.root,ut);if(!je(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(`
445
+ `);Sv(e,t)}}getIndexForPrompt(){let e=Me(this.root,ut);if(!je(e))return"";let t;try{t=up(e,"utf-8")}catch{return""}this.indexCache=t;let n=t.split(`
446
+ `);return n.length>Ii&&(t=n.slice(0,Ii).join(`
444
447
  `)+`
445
448
 
446
- <!-- INDEX.md truncated: ${n.length} lines total, showing first ${ai} -->`),t.length>Te&&(t=t.slice(0,Te)+`
449
+ <!-- INDEX.md truncated: ${n.length} lines total, showing first ${Ii} -->`),t.length>Te&&(t=t.slice(0,Te)+`
447
450
 
448
- <!-- INDEX.md truncated at ${Te} chars -->`),t}getIndexRaw(){let e=Pe(this.root,st);if(!Le(e))return"";try{return Du(e,"utf-8")}catch{return""}}getIndexUsage(){let e=this.getIndexRaw(),t=e.length,n=e.split(`
449
- `).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(!Go(e))return{ok:!1,message:"Content rejected: potential injection detected."};let t=this.getIndexRaw(),n=t.endsWith(`
451
+ <!-- INDEX.md truncated at ${Te} chars -->`),t}getIndexRaw(){let e=Me(this.root,ut);if(!je(e))return"";try{return up(e,"utf-8")}catch{return""}}getIndexUsage(){let e=this.getIndexRaw(),t=e.length,n=e.split(`
452
+ `).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(!rr(e))return{ok:!1,message:"Content rejected: potential injection detected."};let t=this.getIndexRaw(),n=t.endsWith(`
450
453
  `)?t+e.trim()+`
451
454
  `:t+`
452
455
  `+e.trim()+`
453
- `;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(!Go(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,`
456
+ `;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(!rr(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,`
454
457
 
455
- `),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 Ou(this.root),t=[];for(let n of e){if(n===st||!n.endsWith(".md"))continue;let o=Pe(this.root,n);try{let s=await Cw(o);if(!s.isFile())continue;let a=(await ii(o,"utf-8")).split(`
456
- `).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(!Ho(e))return{ok:!1,message:`Invalid filename: "${e}". Use kebab-case .md files (e.g. "project-notes.md").`};if(!Go(t))return{ok:!1,message:"Content rejected: potential injection detected."};if(t.length>Wo)return{ok:!1,message:`Content too long (${t.length} chars, max ${Wo}).`};let n=Pe(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(!Ho(e))return{ok:!1,message:`Invalid filename: "${e}". Use kebab-case .md files.`};if(!Go(t))return{ok:!1,message:"Content rejected: potential injection detected."};if(t.length>Wo)return{ok:!1,message:`Content too long (${t.length} chars, max ${Wo}).`};let n=Pe(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(!Ho(e)&&e!==st)return{ok:!1,message:`Invalid filename: "${e}".`};let t=Pe(this.root,e);try{let n=await ii(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===st)return{ok:!1,message:"Cannot delete INDEX.md. Use 'remove' to clear entries."};if(!Ho(e))return{ok:!1,message:`Invalid filename: "${e}".`};let t=Pe(this.root,e);if(!Le(t))return{ok:!1,message:`File not found: "${e}".`};await _w(t);let n=this.getIndexRaw(),o=new RegExp(`^.*\\[${Ow(e)}\\].*$\\n?`,"m");if(o.test(n)){let s=n.replace(o,"").replace(/\n{3,}/g,`
458
+ `),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(!je(this.root))return[];let e=await dp(this.root),t=[];for(let n of e){if(n===ut||!n.endsWith(".md"))continue;let o=Me(this.root,n);try{let s=await bv(o);if(!s.isFile())continue;let a=(await Pi(o,"utf-8")).split(`
459
+ `).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(!sr(e))return{ok:!1,message:`Invalid filename: "${e}". Use kebab-case .md files (e.g. "project-notes.md").`};if(!rr(t))return{ok:!1,message:"Content rejected: potential injection detected."};if(t.length>or)return{ok:!1,message:`Content too long (${t.length} chars, max ${or}).`};let n=Me(this.root,e);if(je(n))return{ok:!1,message:`File already exists: "${e}". Use write_file to update.`};await this.ensureDir(),await Ht(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(!sr(e))return{ok:!1,message:`Invalid filename: "${e}". Use kebab-case .md files.`};if(!rr(t))return{ok:!1,message:"Content rejected: potential injection detected."};if(t.length>or)return this.writeFileSplit(e,t);let n=Me(this.root,e),o=!je(n);if(await this.ensureDir(),await Ht(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 writeFileSplit(e,t){let n=e.replace(/\.md$/,""),o=t.split(/\n{2,}/),s=[],i="";for(let d of o)i.length+d.length+2>or*.9&&i.length>0?(s.push(i),i=d):i=i?i+`
457
460
 
458
- `);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 Ou(this.root),o=[];for(let s of n){if(!s.endsWith(".md"))continue;let i=Pe(this.root,s);try{let a=await ii(i,"utf-8"),c=a.toLowerCase(),d=t.filter(m=>c.includes(m)).length;if(d===0)continue;let l=a.split(`
459
- `),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(Pe(this.root,st),e),this.indexCache=e}async ensureDir(){Le(this.root)||await Aw(this.root,{recursive:!0})}async appendIndexEntry(e){let t=this.getIndexRaw();if(t.includes(e))return;let n=t.endsWith(`
461
+ `+d:d;i&&s.push(i);let a=[];for(let d=0;d<s.length;d++){let l=`${n}-${d+1}.md`,u=Me(this.root,l);await this.ensureDir(),await Ht(u,s[d]),a.push(l)}let c=this.getIndexRaw();for(let d of a)if(!c.includes(`[${d}]`)){let l=`- [${d}] \u2014 auto-split ${new Date().toISOString().slice(0,10)}`;await this.appendIndexEntry(l)}return{ok:!0,message:`Auto-split "${e}" into ${s.length} parts (${t.length} chars total): ${a.join(", ")}`,file:a[0]}}async readFile(e){if(!sr(e)&&e!==ut)return{ok:!1,message:`Invalid filename: "${e}".`};let t=Me(this.root,e);try{let n=await Pi(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===ut)return{ok:!1,message:"Cannot delete INDEX.md. Use 'remove' to clear entries."};if(!sr(e))return{ok:!1,message:`Invalid filename: "${e}".`};let t=Me(this.root,e);if(!je(t))return{ok:!1,message:`File not found: "${e}".`};await yv(t);let n=this.getIndexRaw(),o=new RegExp(`^.*\\[${Rv(e)}\\].*$\\n?`,"m");if(o.test(n)){let s=n.replace(o,"").replace(/\n{3,}/g,`
462
+
463
+ `);await this.writeIndex(s)}return{ok:!0,message:`Deleted "${e}" and removed INDEX.md entry.`,file:e}}async searchLocal(e){if(!je(this.root))return[];let t=e.toLowerCase().split(/\s+/).filter(s=>s.length>1);if(t.length===0)return[];let n=await dp(this.root),o=[];for(let s of n){if(!s.endsWith(".md"))continue;let i=Me(this.root,s);try{let a=await Pi(i,"utf-8"),c=a.toLowerCase(),d=t.filter(g=>c.includes(g)).length;if(d===0)continue;let l=a.split(`
464
+ `),u="",p=0;for(let g of l){let f=g.toLowerCase(),m=t.filter(y=>f.includes(y)).length;m>p&&(p=m,u=g.trim())}o.push({file:s,snippet:u.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 Ht(Me(this.root,ut),e),this.indexCache=e}async ensureDir(){je(this.root)||await kv(this.root,{recursive:!0})}async appendIndexEntry(e){let t=this.getIndexRaw();if(t.includes(e))return;let n=t.endsWith(`
460
465
  `)?t+e+`
461
466
  `:t+`
462
467
  `+e+`
463
- `;n.length<=Te&&await this.writeIndex(n)}};function Ew(r,e){let t=Pe(r,"..");Le(t)||Lu(t,{recursive:!0}),Ju("node:fs").writeFileSync(r,e,"utf-8")}function Ow(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var Dw={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":[]},$u=[/^(ok|好的|好|明白|收到|understood|got it|sure|done|完成|已完成)[.!!。]*$/i,/^(yes|no|是|否|对|不对|嗯)[.!!。]*$/i,/(?:还有什么|anything else|need help|还需要)/i,/^(?:谢谢|thanks|thank you)[.!!。]*$/i],ci=30,di=500;function Uu(r,e){if(!e||e.length<ci)return[];let t=e.trim();if($u.some(i=>i.test(t)))return[];let n=[],o=new Set,s=Lw(e);for(let i of s)if(!(i.length<ci)&&!$u.some(a=>a.test(i)))for(let[a,c]of Object.entries(Dw)){if(a==="skill-learning"||!c.some(u=>u.test(i)))continue;let l=$w(r,i);if(l.length>di)continue;let p=l.slice(0,80).toLowerCase();if(!o.has(p)){o.add(p),n.push({text:l,category:a,importance:Uw(i,a),tags:Nw(i)});break}}return n}function Nu(r,e=.4){return r.filter(t=>t.importance>=e)}async function ju(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 Lw(r){let e=r.split(/\n{2,}/),t=[];for(let n of e)if(n.length<=di)t.push(n.trim());else{let o=n.split(/(?<=[.!?。!?])\s+/),s="";for(let i of o)s.length+i.length>di?(s&&t.push(s.trim()),s=i):s+=(s?" ":"")+i;s&&t.push(s.trim())}return t.filter(n=>n.length>=ci)}function $w(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 Uw(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 Nw(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 ui={MIN_IMPORTANCE:.4,MAX_PER_TURN:3,COOLDOWN_MS:5e3};function Fu(){return{lastWriteAt:0,sessionWrites:0,recentTexts:new Set}}async function Bu(r,e,t,n){if(!r||!e||Date.now()-n.lastWriteAt<ui.COOLDOWN_MS)return;let s=Uu(r,e);if(s.length===0)return;let i=Nu(s,ui.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,ui.MAX_PER_TURN),d=await ju(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)}...")`)}vr();wr();import{readFile as jw}from"node:fs/promises";import{watch as Fw}from"node:fs";import{join as Bw}from"node:path";var Ww=ye,Gw="settings.json";function Hw(r){return Bw(r,Ww,Gw)}async function zw(r){try{let e=await jw(r,"utf-8");return JSON.parse(e)}catch{return null}}function Vw(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 Wu(r){let e=Hw(r.projectRoot),t=null,n=null,o=async()=>{let s=await zw(e);s&&Vw(s,r.ruleEngine,r.hooks,r.log)};o().catch(()=>{});try{t=Fw(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 pi=new Set;function kt(r){return pi.add(r),()=>{pi.delete(r)}}async function Gu(){await Promise.all(Array.from(pi).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 Ko,isAgentRpcRequest as Zw,isAcpJsonRpcRequest as ev,isAcpJsonRpcNotification as tv,isAcpJsonRpcResponse as nv,ACP_PROTOCOL_VERSION as ov}from"qlogicagent-runtime-contracts";import{randomUUID as qw}from"node:crypto";import{ACP_METHODS as Xe,ACP_EXTENDED_METHODS as Qe,isAcpJsonRpcRequest as Kw,isAcpJsonRpcNotification as Jw}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},Vo=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(Kw(e)){let t=e;return process.stderr.write(`[acp-server] \u2192 recv id=${String(t.id)} method=${t.method}
464
- `),this.handleRequest(t),!0}return Jw(e)?(this.handleNotification(e),!0):!1}emitSessionUpdate(e,t,n){if(t.startsWith("x_")&&!this.hostSupportsExtendedEvents)return;let o={jsonrpc:"2.0",method:Xe.SESSION_UPDATE,params:{sessionId:e,update:{sessionUpdate:t,...n}}};this.transport.send(o)}async requestPermission(e){let t=`perm-${qw().slice(0,8)}`,n={jsonrpc:"2.0",method:Xe.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 Xe.INITIALIZE:await this.onInitialize(o,s);break;case Xe.SESSION_NEW:await this.onSessionNew(o,s);break;case Xe.SESSION_PROMPT:await this.onSessionPrompt(o,s);break;case Xe.SESSION_END:await this.onSessionEnd(o,s);break;case Xe.SESSION_SET_CONFIG:await this.onSessionSetConfig(o,s);break;case Xe.SESSION_SET_MODEL:await this.handler.handleAcpSessionSetModel(s.sessionId??this.activeSessionId??"",s.modelId??s.model??""),this.sendResult(o,{});break;case Xe.SESSION_SET_MODE:await this.handler.handleAcpSessionSetMode(s.sessionId??this.activeSessionId??"",s.modeId??s.mode??""),this.sendResult(o,{});break;case Qe.ABORT:await this.onAbort(o,s);break;case Qe.DREAM:await this.onDream(o,s);break;case Qe.SOLO_START:{let i=await this.handler.handleAcpSoloStart(s);this.sendResult(o,i);break}case Qe.SOLO_STATUS:{let i=await this.handler.handleAcpSoloStatus(s);this.sendResult(o,i);break}case Qe.SOLO_SELECT:{let i=await this.handler.handleAcpSoloSelect(s);this.sendResult(o,i);break}case Qe.PRODUCT_CREATE:{let i=await this.handler.handleAcpProductCreate(s);this.sendResult(o,i);break}case Qe.PRODUCT_RESUME:{let i=await this.handler.handleAcpProductResume(s);this.sendResult(o,i);break}case Qe.PRODUCT_STATUS:{let i=await this.handler.handleAcpProductStatus(s);this.sendResult(o,i);break}case Qe.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
468
+ `;n.length<=Te&&await this.writeIndex(n)}};function Sv(r,e){let t=Me(r,"..");je(t)||pp(t,{recursive:!0}),wv(r,e,"utf-8")}function Rv(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var ar=Os;Br();Fr();import{readFile as _v}from"node:fs/promises";import{watch as Cv}from"node:fs";import{join as Av}from"node:path";var Pv=be,Iv="settings.json";function Mv(r){return Av(r,Pv,Iv)}async function Ev(r){try{let e=await _v(r,"utf-8");return JSON.parse(e)}catch{return null}}function Ov(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 mp(r){let e=Mv(r.projectRoot),t=null,n=null,o=async()=>{let s=await Ev(e);s&&Ov(s,r.ruleEngine,r.hooks,r.log)};o().catch(()=>{});try{t=Cv(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 Ei=new Set;function At(r){return Ei.add(r),()=>{Ei.delete(r)}}async function gp(){await Promise.all(Array.from(Ei).map(r=>r()))}import{join as Nn}from"node:path";import{mkdirSync as Dv,existsSync as Lv,createWriteStream as $v}from"node:fs";import{pipeline as Uv}from"node:stream/promises";import{Readable as Nv}from"node:stream";var jv=500*1024*1024,Fv=3e5,fp={"image/png":".png","image/jpeg":".jpg","image/gif":".gif","image/webp":".webp","image/svg+xml":".svg","image/avif":".avif","video/mp4":".mp4","video/webm":".webm","video/quicktime":".mov","audio/mpeg":".mp3","audio/wav":".wav","audio/ogg":".ogg","audio/aac":".aac","audio/mp4":".m4a","audio/flac":".flac","application/pdf":".pdf","model/gltf-binary":".glb","model/gltf+json":".gltf"},lr=class{mediaDir;maxFileSize;timeoutMs;constructor(e){this.mediaDir=e?.projectDir?Nn(e.projectDir,"media"):e?.mediaDir??Nn(K(),"media"),this.maxFileSize=e?.maxFileSize??jv,this.timeoutMs=e?.timeoutMs??Fv}setProjectDir(e){this.mediaDir=Nn(e,"media")}async download(e,t){let n=t?.sessionId??Bv(),o=Nn(this.mediaDir,n);Lv(o)||Dv(o,{recursive:!0});let s=new AbortController,i=setTimeout(()=>s.abort(),this.timeoutMs);try{let a=await fetch(e,{signal:s.signal});if(!a.ok)throw new Error(`Download failed: ${a.status} ${a.statusText}`);let c=parseInt(a.headers.get("content-length")??"0",10);if(c>this.maxFileSize)throw new Error(`File too large: ${c} bytes (max: ${this.maxFileSize})`);let d=a.headers.get("content-type")?.split(";")[0].trim()||"application/octet-stream",l=Wv(e,d),u=Gv(t?.type??Hv(d),l),p=Nn(o,u),g=a.body;if(!g)throw new Error("No response body");let f=$v(p);await Uv(Nv.fromWeb(g),f);let{size:m}=await import("node:fs/promises").then(y=>y.stat(p));return{remoteUrl:e,localPath:p,bytes:m,mimeType:d}}finally{clearTimeout(i)}}async downloadAll(e,t,n){let o=[];for(let s of e)try{let i=await this.download(s,t);o.push(i)}catch(i){n?.warn(`media-persistence: failed to download ${s}: ${i.message}`)}return o}getMediaDir(){return this.mediaDir}};function Bv(){let r=new Date;return`${r.getFullYear()}${String(r.getMonth()+1).padStart(2,"0")}${String(r.getDate()).padStart(2,"0")}`}function Gv(r,e){let t=new Date,n=`${t.getFullYear()}${String(t.getMonth()+1).padStart(2,"0")}${String(t.getDate()).padStart(2,"0")}_${String(t.getHours()).padStart(2,"0")}${String(t.getMinutes()).padStart(2,"0")}${String(t.getSeconds()).padStart(2,"0")}`,o=Math.random().toString(36).slice(2,6);return`${r}_${n}_${o}${e}`}function Wv(r,e){if(fp[e])return fp[e];try{let t=new URL(r).pathname,n=t.lastIndexOf(".");if(n>0){let o=t.slice(n).toLowerCase().split("?")[0];if(o.length<=5)return o}}catch{}return".bin"}function Hv(r){return r.startsWith("image/")?"image":r.startsWith("video/")?"video":r.startsWith("audio/")?"audio":r.startsWith("model/")?"3d":"file"}import{existsSync as hp,mkdirSync as zv,readFileSync as Vv,writeFileSync as qv}from"node:fs";import{join as Kv}from"node:path";import{randomUUID as yp}from"node:crypto";function bp(){return Kv(K(),"projects.json")}function nt(){let r=bp();if(!hp(r))return{activeProjectId:null,projects:[]};try{let e=Vv(r,"utf-8");return JSON.parse(e)}catch{return{activeProjectId:null,projects:[]}}}function jn(r){let e=bp(),t=K();hp(t)||zv(t,{recursive:!0}),qv(e,JSON.stringify(r,null,2),"utf-8")}function Oi(r){let e=nt(),t=new Date().toISOString(),n={id:yp(),name:r.name,workspaceDir:r.workspaceDir,type:r.type??"personal",status:"active",groupId:r.groupId,createdAt:t,updatedAt:t};return e.projects.push(n),e.activeProjectId=n.id,jn(e),n}function cr(){return nt().projects.filter(e=>e.status==="active")}function Fn(){let r=nt();if(!r.activeProjectId)return null;let e=r.projects.find(t=>t.id===r.activeProjectId)??null;return e&&e.status!=="active"?null:e}function kp(r){return nt().projects.find(t=>t.id===r)??null}function dr(r){let e=nt(),t=e.projects.find(n=>n.id===r&&n.status==="active");return t?(e.activeProjectId=t.id,jn(e),t):null}function wp(r){let e=nt(),t=e.projects.findIndex(s=>s.id===r);if(t===-1)return{deleted:!1};let n=e.projects[t];if(n.type==="default")return{deleted:!1};n.status="archived",n.updatedAt=new Date().toISOString();let o;if(e.activeProjectId===r){let s=e.projects.find(i=>i.type==="default"&&i.status==="active");if(s)e.activeProjectId=s.id,o=s;else{let i=e.projects.find(a=>a.status==="active"&&a.id!==r);e.activeProjectId=i?.id??null,o=i}}return jn(e),{deleted:!0,switchedTo:o}}function Tp(r){let e=nt(),t=e.projects.find(s=>s.type==="default"&&s.status==="active");if(t)return t;let n=new Date().toISOString(),o={id:yp(),name:"\u9ED8\u8BA4\u9879\u76EE",workspaceDir:r,type:"default",status:"active",createdAt:n,updatedAt:n};return e.projects.push(o),e.activeProjectId||(e.activeProjectId=o.id),jn(e),o}function Di(r){return nt().projects.find(t=>t.groupId===r&&t.status==="active")??null}function vp(r){let e=nt(),t=e.projects.find(o=>o.groupId===r&&o.status==="active");if(!t)return{archived:!1};t.status="archived",t.updatedAt=new Date().toISOString();let n;if(e.activeProjectId===t.id){let o=e.projects.find(s=>s.type==="default"&&s.status==="active");if(o)e.activeProjectId=o.id,n=o;else{let s=e.projects.find(i=>i.status==="active"&&i.id!==t.id);e.activeProjectId=s?.id??null,n=s}}return jn(e),{archived:!0,projectId:t.id,switchedTo:n}}import Re from"node:fs";import Bn from"node:path";var xp=50*1024,Sp=500*1024,Gn=class{dir;constructor(e){this.dir=ll(e)}list(){if(!Re.existsSync(this.dir))return[];let e=[];for(let t of Re.readdirSync(this.dir)){if(!t.endsWith(".md"))continue;let n=Bn.join(this.dir,t);try{let o=Re.statSync(n);if(!o.isFile())continue;let s=Re.readFileSync(n,"utf8");e.push({filename:t,content:s,sizeBytes:o.size})}catch{}}return e}read(e){if(!this.isValidFilename(e))return null;let t=Bn.join(this.dir,e);if(!Re.existsSync(t))return null;try{let n=Re.readFileSync(t,"utf8"),o=Re.statSync(t);return{filename:e,content:n,sizeBytes:o.size}}catch{return null}}write(e,t){if(!this.isValidFilename(e))throw new Error("Invalid filename: must end with .md and contain no path separators");let n=Buffer.byteLength(t,"utf8");if(n>xp)throw new Error(`File too large: ${n} bytes exceeds ${xp} limit`);if(this.getDirSize(e)+n>Sp)throw new Error(`Total instructions size would exceed ${Sp} byte limit`);Re.mkdirSync(this.dir,{recursive:!0});let s=Bn.join(this.dir,e);return Re.writeFileSync(s,t,"utf8"),{filename:e,content:t,sizeBytes:n}}remove(e){if(!this.isValidFilename(e))return!1;let t=Bn.join(this.dir,e);return Re.existsSync(t)?(Re.unlinkSync(t),!0):!1}loadAll(){let e=this.list();return e.length===0?"":`<project-instructions>
469
+ ${e.map(n=>`<!-- file: ${n.filename} -->
470
+ ${n.content}`).join(`
471
+
472
+ `)}
473
+ </project-instructions>`}isValidFilename(e){return!(!e.endsWith(".md")||e.includes("/")||e.includes("\\")||e.includes("..")||e.startsWith("."))}getDirSize(e){if(!Re.existsSync(this.dir))return 0;let t=0;for(let n of Re.readdirSync(this.dir)){if(n===e)continue;let o=Bn.join(this.dir,n);try{let s=Re.statSync(o);s.isFile()&&(t+=s.size)}catch{}}return t}};import pt from"node:fs";import Li from"node:path";var Wn=class{dir;constructor(e){this.dir=cl(e)}list(){if(!pt.existsSync(this.dir))return[];let e=[];for(let t of pt.readdirSync(this.dir)){if(!t.endsWith(".md"))continue;let n=this.load(t.replace(".md",""));n&&e.push(n)}return e}loadActive(){return this.list().filter(e=>e.status==="active")}load(e){let t=e.replace(/[^a-zA-Z0-9_-]/g,""),n=Li.join(this.dir,`${t}.md`);if(!pt.existsSync(n))return null;try{let o=pt.readFileSync(n,"utf8"),{frontmatter:s,body:i}=Yv(o);return{slug:s.slug??t,status:s.status??"active",content:o,createdAt:s.created_at??"",updatedAt:s.updated_at??""}}catch{return null}}save(e,t){let n=e.replace(/[^a-zA-Z0-9_-]/g,"");pt.mkdirSync(this.dir,{recursive:!0});let o=Li.join(this.dir,`${n}.md`);pt.writeFileSync(o,t,"utf8")}remove(e){let t=e.replace(/[^a-zA-Z0-9_-]/g,""),n=Li.join(this.dir,`${t}.md`);return pt.existsSync(n)?(pt.unlinkSync(n),!0):!1}};function Yv(r){let e=r.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);if(!e)return{frontmatter:{},body:r};let t={};for(let n of e[1].split(`
474
+ `)){let o=n.indexOf(":");if(o>0){let s=n.slice(0,o).trim(),i=n.slice(o+1).trim();t[s]=i}}return{frontmatter:t,body:e[2]}}import*as E from"node:fs";import*as B from"node:path";import{homedir as ox}from"node:os";import{AGENT_RPC_ERROR_CODES as A,AGENT_RPC_PROTOCOL_VERSION as mr,isAgentRpcRequest as rx,isAcpJsonRpcRequest as sx,isAcpJsonRpcNotification as ix,isAcpJsonRpcResponse as ax,ACP_PROTOCOL_VERSION as lx}from"qlogicagent-runtime-contracts";import{randomUUID as Xv}from"node:crypto";import{ACP_METHODS as ot,ACP_EXTENDED_METHODS as rt,isAcpJsonRpcRequest as Qv,isAcpJsonRpcNotification as Zv}from"qlogicagent-runtime-contracts";var Hn={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},ur=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(Qv(e)){let t=e;return process.stderr.write(`[acp-server] \u2192 recv id=${String(t.id)} method=${t.method}
475
+ `),this.handleRequest(t),!0}return Zv(e)?(this.handleNotification(e),!0):!1}emitSessionUpdate(e,t,n){if(t.startsWith("x_")&&!this.hostSupportsExtendedEvents)return;let o={jsonrpc:"2.0",method:ot.SESSION_UPDATE,params:{sessionId:e,update:{sessionUpdate:t,...n}}};this.transport.send(o)}async requestPermission(e){let t=`perm-${Xv().slice(0,8)}`,n={jsonrpc:"2.0",method:ot.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 ot.INITIALIZE:await this.onInitialize(o,s);break;case ot.SESSION_NEW:await this.onSessionNew(o,s);break;case ot.SESSION_PROMPT:await this.onSessionPrompt(o,s);break;case ot.SESSION_END:await this.onSessionEnd(o,s);break;case ot.SESSION_SET_CONFIG:await this.onSessionSetConfig(o,s);break;case ot.SESSION_SET_MODEL:await this.handler.handleAcpSessionSetModel(s.sessionId??this.activeSessionId??"",s.modelId??s.model??""),this.sendResult(o,{});break;case ot.SESSION_SET_MODE:await this.handler.handleAcpSessionSetMode(s.sessionId??this.activeSessionId??"",s.modeId??s.mode??""),this.sendResult(o,{});break;case rt.ABORT:await this.onAbort(o,s);break;case rt.DREAM:await this.onDream(o,s);break;case rt.SOLO_START:{let i=await this.handler.handleAcpSoloStart(s);this.sendResult(o,i);break}case rt.SOLO_STATUS:{let i=await this.handler.handleAcpSoloStatus(s);this.sendResult(o,i);break}case rt.SOLO_SELECT:{let i=await this.handler.handleAcpSoloSelect(s);this.sendResult(o,i);break}case rt.PRODUCT_CREATE:{let i=await this.handler.handleAcpProductCreate(s);this.sendResult(o,i);break}case rt.PRODUCT_RESUME:{let i=await this.handler.handleAcpProductResume(s);this.sendResult(o,i);break}case rt.PRODUCT_STATUS:{let i=await this.handler.handleAcpProductStatus(s);this.sendResult(o,i);break}case rt.TEAM_DELEGATE:{let i=await this.handler.handleAcpTeamDelegate(s);this.sendResult(o,i);break}default:this.sendError(o,Hn.METHOD_NOT_FOUND,`Unknown method: ${t}`)}}catch(i){this.sendError(o,Hn.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,Hn.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,Hn.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,Hn.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
465
476
  `);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}
466
477
  `);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}
467
- `)}};import{ACP_SESSION_UPDATE_TYPES as Ze,ACP_EXTENDED_SESSION_UPDATE_TYPES as de}from"qlogicagent-runtime-contracts";function Hu(r,e,t,n){let o=Yw(t,n);o&&r.emitSessionUpdate(e,o.type,o.payload)}function Yw(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:Xw(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: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??Qw(),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 Xw(r){if(r)try{return JSON.parse(r)}catch{return{raw:r}}}function Qw(){return Math.random().toString(36).slice(2,10)}var zu=["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 qo=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 rv=new Set(["zhipu","zhipu-openai","zhipu-coding"]),sv="https://open.bigmodel.cn/api/paas/v4";function iv(r,e){if(!(!r||!e)&&rv.has(r))return new qo({baseUrl:sv,apiKey:e})}function av(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 mi=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 io;memoryPrefetchState=mt();qmemoryAdapter=null;qmemoryUserId="";memdir=null;memoryWriteState=Fu();fileWatcher=null;pendingAskUser=new Map;sessionTaskDomain;acpDetector=new Lo;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 Ct,this.mediaClient=new Zt({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 Jt({verbose:e.verbose}),this.taskStore.onTaskChange((s,i)=>{i&&this.sendNotification("task.updated",{taskId:s,type:i.type,lifecycle:i.lifecycle,label:i.label})}),Ud({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 zo;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(nv(e)||tv(e)){this.acpServer.dispatchMessage(e);return}if(ev(e)){let t=e.method;if(t==="initialize"||t.startsWith("session/")||t.startsWith("x/")||t.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!Zw(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{Gu().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=Ko.split(".")[0];if(i!==a){this.log(`[initialize] protocol mismatch: host=${n} agent=${Ko}`),e.id!==void 0&&this.sendResponse(e.id,void 0,{code:I.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${n}, agent=${Ko}`});return}this.log(`[initialize] host=${o} v${s}`),e.id!==void 0&&this.sendResponse(e.id,{protocolVersion:Ko,agent:{name:"qlogicagent",version:"0.1.0"},capabilities:{tools:Je().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:[...zu]}})}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"&&(_o(t.cwd),this.currentProjectRoot=t.cwd),this.currentSessionId=n,this.sessionState=new Mt(n),this.sessionTaskDomain=void 0,this.memoryPrefetchState=mt(),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 Ll(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 Dl(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"&&(_o(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,Dd(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}:{}})}),Pd(iv(l,p))}Od(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(()=>{}),Hl()),this.currentSessionId=o,this.sessionState=new Mt(o),this.sessionTaskDomain=void 0,this.memoryPrefetchState=mt(),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=Js(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 Wl(u,this.currentHooks??void 0);b.length>0&&(p=Bl(b))}catch{}let m=s.filter(b=>b.role==="user").map(b=>typeof b.content=="string"?b.content:"").join(" "),{domain:g,source:f}=Ql({cwd:u,hostOverride:a?.taskDomain,sessionDomain:this.sessionTaskDomain,userText:m});this.sessionTaskDomain=g,f==="auto-detect"&&ec(m,g)&&Zl(u,g);let y=this.memdir,k=await zl({basePrompt:a?.systemPrompt,instructionBlock:p,customSystemPrompt:a?.customSystemPrompt,appendSystemPrompt:a?.appendSystemPrompt,sections:[Vl(u),ql(g),Kl(),co("memory",()=>y&&y.getIndexForPrompt()||null,"memory INDEX.md may change between turns")]});for(let b of s)b.role==="user"&&ns(o,b,this.currentProjectRoot,n).catch(()=>{});await this.mcpReady;let w=Je(),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&&ns(o,{role:"assistant",content:b.content},this.currentProjectRoot,n).catch(()=>{}),b.content&&this.qmemoryAdapter&&this.qmemoryUserId&&Bu(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){Ol(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&&$l(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]
478
+ `)}};import{ACP_SESSION_UPDATE_TYPES as st,ACP_EXTENDED_SESSION_UPDATE_TYPES as ce}from"qlogicagent-runtime-contracts";function Rp(r,e,t,n){let o=ex(t,n);o&&r.emitSessionUpdate(e,o.type,o.payload)}function ex(r,e){switch(r){case"turn.delta":return{type:st.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:e.text}}};case"turn.reasoning_delta":return{type:st.AGENT_THOUGHT_CHUNK,payload:{content:{type:"text",text:e.text}}};case"turn.tool_call":return{type:st.TOOL_CALL,payload:{toolCallId:e.callId,status:"in_progress",title:e.name,kind:"execute",rawInput:tx(e.arguments)}};case"turn.tool_result":return{type:st.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:st.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:st.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:st.USAGE_UPDATE,payload:{used:n+o,size:t?.contextWindow??2e5}}}case"turn.end":return null;case"turn.error":return{type:st.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:`[Error] ${e.error??"Unknown error"}`}}};case"turn.suggestions":return{type:st.AVAILABLE_COMMANDS_UPDATE,payload:{availableCommands:(e.items??[]).map(t=>({name:t.text,description:t.description??""}))}};case"turn.subagent_started":return{type:ce.X_SUBAGENT_STARTED,payload:{agentId:e.subagentId,agentName:e.agentType,task:e.prompt}};case"turn.subagent_delta":return{type:ce.X_SUBAGENT_DELTA,payload:{agentId:e.subagentId??e.agentType,text:e.text}};case"turn.subagent_ended":return{type:ce.X_SUBAGENT_ENDED,payload:{agentId:e.subagentId,result:e.outputPreview}};case"turn.media_result":return{type:ce.X_MEDIA_RESULT,payload:{mediaId:e.taskId??nx(),type:e.mediaType,url:e.url,metadata:{model:e.model,provider:e.provider}}};case"turn.media_progress":return{type:ce.X_MEDIA_PROGRESS,payload:{mediaId:e.taskId,progress:e.percent,stage:e.status}};case"turn.skill_instruction":return{type:ce.X_SKILL_INSTRUCTION,payload:{skillId:"unknown",instruction:String(e.instruction??"")}};case"turn.recovery":return{type:ce.X_RECOVERY,payload:{errorType:e.action,message:e.detail??"",action:"retry"}};case"turn.ask_user":return{type:ce.X_ASK_USER,payload:{question:(e.questions??[])[0]?.question??"",options:(e.questions??[])[0]?.options?.map(t=>t.label)}};case"session.info":return{type:ce.X_SESSION_INFO,payload:{sessionId:e.sessionId,model:e.model,metadata:{cwd:e.cwd,turnCount:e.turnCount}}};case"memory.updated":return{type:ce.X_MEMORY_UPDATED,payload:{memoryId:e.source,action:"updated",summary:e.summary}};case"team.member.notification":return{type:ce.X_TEAM_MEMBER_UPDATE,payload:{memberId:e.memberId,type:e.method,payload:e.params??{}}};case"solo.progress":return{type:ce.X_SOLO_STARTED,payload:{evaluationId:e.soloId,agents:[e.agentId],task:e.progress??""}};case"solo.agentDelta":return{type:ce.X_SUBAGENT_DELTA,payload:{agentId:e.agentId,text:e.text}};case"solo.evaluation":return{type:ce.X_SOLO_SELECTED,payload:{evaluationId:e.soloId,winnerId:e.winnerId,reason:e.reasoning}};case"product.taskStarted":return{type:ce.X_PRODUCT_TASK_STARTED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:e.assignee}};case"product.taskCompleted":return{type:ce.X_PRODUCT_TASK_COMPLETED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:"",result:e.result,status:"completed"}};case"product.taskFailed":return{type:ce.X_PRODUCT_TASK_COMPLETED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:"",status:"failed"}};case"product.checkpointed":return{type:ce.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 tx(r){if(r)try{return JSON.parse(r)}catch{return{raw:r}}}function nx(){return Math.random().toString(36).slice(2,10)}var _p=["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","project.create","project.list","project.delete","session.switchProject","session.getState"];var pr=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 cx=new Set(["zhipu","zhipu-openai","zhipu-coding"]),dx="https://open.bigmodel.cn/api/paas/v4";function ux(r,e){if(!(!r||!e)&&cx.has(r))return new pr({baseUrl:dx,apiKey:e})}function px(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 $i=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 Ro;mediaPersistence=new lr;memoryPrefetchState=vt();qmemoryAdapter=null;qmemoryUserId="";memdir=null;fileWatcher=null;pendingAskUser=new Map;sessionTaskDomain;acpDetector=new Yo;agentConfigStore=null;soloEvaluator=null;productOrchestrator=null;soloProcessManager=null;productProcessManager=null;acpServer=null;idleDreamTimer=null;idleDreamMinutes=30;idleDreamEnabled=!1;lastDreamAt=0;dreamCooldownMs=14400*1e3;dreamMaxDurationMs=300*1e3;constructor(e){this.verbose=e.verbose,this.registry=new $t,this.mediaClient=new ln({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 on({verbose:e.verbose}),this.taskStore.onTaskChange((s,i)=>{i&&this.sendNotification("task.updated",{taskId:s,type:i.type,lifecycle:i.lifecycle,label:i.label})}),gu({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 ir;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(ax(e)||ix(e)){this.acpServer.dispatchMessage(e);return}if(sx(e)){let t=e.method;if(t==="initialize"||t.startsWith("session/")||t.startsWith("x/")||t.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!rx(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{gp().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;case"project.create":this.handleProjectCreate(e);break;case"project.list":this.handleProjectList(e);break;case"project.delete":this.handleProjectDelete(e);break;case"project.archiveByGroup":this.handleProjectArchiveByGroup(e);break;case"session.switchProject":this.handleSessionSwitchProject(e);break;case"session.getState":this.handleSessionGetState(e);break;case"instructions.list":this.handleInstructionsList(e);break;case"instructions.read":this.handleInstructionsRead(e);break;case"instructions.write":this.handleInstructionsWrite(e);break;case"instructions.delete":this.handleInstructionsDelete(e);break;case"skills.list":this.handleSkillsList(e);break;case"skills.activate":this.handleSkillsActivate(e);break;case"skills.deactivate":this.handleSkillsDeactivate(e);break;case"plans.list":this.handlePlansList(e);break;case"plans.get":this.handlePlansGet(e);break;default:e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.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=mr.split(".")[0];if(i!==a){this.log(`[initialize] protocol mismatch: host=${n} agent=${mr}`),e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${n}, agent=${mr}`});return}if(this.log(`[initialize] host=${o} v${s}`),e.id!==void 0&&this.sendResponse(e.id,{protocolVersion:mr,agent:{name:"qlogicagent",version:"0.1.0"},capabilities:{tools:et().map(d=>d.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:[..._p]}}),!Fn()){let d=B.join(process.env.HOME||process.env.USERPROFILE||ox(),"XiaozhiClaw");E.existsSync(d)||E.mkdirSync(d,{recursive:!0});let l=Tp(d);this.sendNotification("project.created",{id:l.id,name:l.name,workspaceDir:l.workspaceDir,type:l.type})}}handleThreadCreate(e){let t=e.params,n=t?.id??de();this.log(`[thread.create] id=${n} title=${t?.title??"(none)"}`),t?.cwd&&typeof t.cwd=="string"&&(Ft(t.cwd),this.currentProjectRoot=t.cwd,this.mediaPersistence.setProjectDir(t.cwd)),this.currentSessionId=n,this.sessionState=new jt(n),this.sessionTaskDomain=void 0,this.memoryPrefetchState=vt(),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 lc(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:A.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:A.INVALID_PARAMS,message:"sessionId is required"});return}try{let o=await ac(n,this.currentProjectRoot);if(!o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.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:A.INTERNAL_ERROR,message:`Failed to resume session: ${o.message}`})}}async handleTurn(e){let t=e.params??{},n=t.turnId??de(),o=t.sessionId,s=t.messages??[],i=t.tools??[],a=t.config;if(a?.workdir&&typeof a.workdir=="string"&&(Ft(a.workdir),this.currentProjectRoot=a.workdir,this.mediaPersistence.setProjectDir(a.workdir)),a?.sessionType==="group"&&typeof a?.groupKey=="string"){let d=a.groupKey,l=d.split(":"),u=l.length>=3?l.slice(1).join(":"):d,p=Di(u);if(p)Ft(p.workspaceDir),this.currentProjectRoot=p.workspaceDir,this.mediaPersistence.setProjectDir(p.workspaceDir),Fn()?.id!==p.id&&dr(p.id);else{let g=a.groupName||u,f=l[1]??"unknown",m=l.slice(2).join(":")||u,y=process.env.HOME??process.env.USERPROFILE??".",k=g.replace(/[<>:"/\\|?*\x00-\x1f]/g,"_").trim()||"group",w=B.join(y,"XiaozhiClaw","groups",k),x=Oi({name:g,workspaceDir:w,type:"group",groupId:u});x&&(Ft(x.workspaceDir),this.currentProjectRoot=x.workspaceDir,this.mediaPersistence.setProjectDir(x.workspaceDir),dr(x.id),this.sendNotification("project.created",{id:x.id,name:x.name,type:"group",groupId:u,workspaceDir:x.workspaceDir}))}}{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,uu(this.mediaClient,d,(g,f,m)=>{this.sessionState?.addMediaUsage(g,f,m)},a?.mediaProviders,(g,f,m,y,k)=>{this.sendNotification("turn.media_progress",{turnId:n,taskId:g,mediaType:f,percent:m,status:y,...k?{provider:k}:{}})}),au(ux(l,u))}du(async d=>{let l=`ask-${de().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(()=>{}),yc()),this.currentSessionId=o,this.sessionState=new jt(o),this.sessionTaskDomain=void 0,this.memoryPrefetchState=vt(),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??"",I=d.model??"";b&&I&&this.registry.getModelInfo(b,I)?.streamRequired&&(d.streamRequired=!0)}let l=this.resolveAgent(d);if(this.permissionChecker&&a?.permissions){let b=a.permissions,I=bi(b);this.permissionChecker.ruleEngineRef.setMode(I.mode),I.rules.length>0&&this.permissionChecker.ruleEngineRef.replaceRules(I.rules),I.defaultBehavior&&this.permissionChecker.ruleEngineRef.setDefaultBehavior(I.defaultBehavior)}if(!l){this.sendNotification("turn.error",{turnId:n,error:"No LLM provider configured. Provide provider/model/apiKey in agent.turn config, or set DEEPSEEK_API_KEY / OPENAI_API_KEY / ANTHROPIC_API_KEY environment variable.",code:"NO_PROVIDER"});return}let u,p=a?.workdir??process.cwd();try{let b=await fc(p,this.currentHooks??void 0);b.length>0&&(u=gc(b))}catch{}try{let I=new Gn(p).loadAll();I&&(u=u?`${u}
479
+
480
+ ${I}`:I)}catch{}let g=s.filter(b=>b.role==="user").map(b=>typeof b.content=="string"?b.content:"").join(" "),{domain:f,source:m}=Rc({cwd:p,hostOverride:a?.taskDomain,sessionDomain:this.sessionTaskDomain,userText:g});this.sessionTaskDomain=f,m==="auto-detect"&&Cc(g,f)&&_c(p,f);let y=this.memdir,k=await bc({basePrompt:a?.systemPrompt,instructionBlock:u,customSystemPrompt:a?.customSystemPrompt,appendSystemPrompt:a?.appendSystemPrompt,sections:[kc(p),wc(f),Tc(),kn("memory",()=>y&&y.getIndexForPrompt()||null,"memory INDEX.md may change between turns"),kn("plans",()=>{try{let I=new Wn(p).loadActive();return I.length===0?null:`## Active Plans
481
+
482
+ `+I.map(O=>O.content).join(`
483
+ ---
484
+ `)}catch{return null}},"plans may change between turns")]});for(let b of s)b.role==="user"&&vs(o,b,this.currentProjectRoot,n).catch(()=>{});await this.mcpReady;let w=et(),x=new Set(w.map(b=>b.function.name)),S=[...w,...i.filter(b=>!x.has(b.function.name))];for await(let b of l.run({turnId:n,sessionId:o,messages:s,tools:S,systemPrompt:k,config:d},c.signal)){let I=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:I}});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:I}}),b.usage&&this.sessionState){this.sessionState.addUsage(b.usage,b.model??this.currentModel);let O=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:b.turnId,usage:b.usage,model:b.model??this.currentModel,sessionCostUSD:O.totalInputTokens*3e-6+O.totalOutputTokens*15e-6})}b.content&&vs(o,{role:"assistant",content:b.content},this.currentProjectRoot,n).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 O=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:b.turnId,usage:b.usage,model:this.currentModel,sessionCostUSD:O.totalInputTokens*3e-6+O.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:I}}),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:I}});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:I}});break;case"recovery":this.sendNotification("turn.recovery",{turnId:b.turnId,action:b.action,...b.detail?{detail:b.detail}:{},item:{id:`${n}-recovery-${de().slice(0,8)}`,type:"recovery",role:"system",strategy:b.action,text:b.detail,createdAt:I}});break;case"plan_update":this.sendNotification("turn.plan_update",{turnId:b.turnId,slug:b.slug,content:b.content,item:{id:`${n}-plan-${de().slice(0,8)}`,type:"plan_update",role:"assistant",text:b.content,createdAt:I}});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){ic(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&&cc(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]
468
485
  Based on the conversation, suggest 1-3 short follow-up actions the user might naturally do next.
469
486
  Be specific: "run the tests" beats "continue".
470
487
  Stay silent if the next step isn't obvious.
471
- 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=Ce(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(`
472
- `),error:b.details?.error}}catch(R){return{result:"",error:R instanceof Error?R.message:String(R)}}}},tools:Je(),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 Cl(u);m.ok?(this.qmemoryAdapter&&this.qmemoryUserId&&Ml({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=Xn({provider:n,model:o,apiKey:s,baseUrl:i},this.registry);qr()&&(a.transport=Kr(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=Ce(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(`
473
- `),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??[],Ie=se;for(let Mn of me)this.sendNotification("turn.media_result",{turnId:h,mediaType:Ie,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=Yr(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=al({baseUrl:p,apiKey:(process.env.QMEMORY_API_KEY??"").trim()||void 0,timeoutMs:5e3});this.qmemoryAdapter=h,this.qmemoryUserId=this.currentSessionId??"default",ol(l,{memoryProvider:h,userId:this.currentSessionId??"default",log:{debug:T=>c.debug(T),warn:T=>c.warn(T)}},this.memoryPrefetchState)}sl(l,{currentCwd:this.currentProjectRoot??void 0,log:{debug:h=>c.debug(h),warn:h=>c.warn(h)}}),ga(l,c,{transport:a.transport,apiKey:a.apiKey});let u=e?.mcpServers,m=qs(u??{}),g=Oa();try{if(W.existsSync(g)){let h=JSON.parse(W.readFileSync(g,"utf8")),T=qs(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 Io({servers:m,log:c}),kt(async()=>{await this.mcpManager?.disconnectAll()});let h=()=>this.mcpManager;be(Nd(h)),be(jd(h)),be(cu({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 tt().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=Ce(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(`
474
- `)}}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=Ia();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);Gd(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 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=Js(w),R=new Eo(C);this.permissionUnregister&&this.permissionUnregister(),this.permissionChecker=new Do({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=Je();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(eu({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(`---
475
- `)?F.indexOf("---",4):-1,Pn=(me>=0?F.slice(me+3).trimStart():F).split(`
476
- `).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=Je(),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(`
477
- `).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??av(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(ou({abortSignal:void 0,currentForkDepth:0,forkAgent:async h=>{let T=Un(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=tt(),A=Tr(x,T),O=Je().filter(z=>A.includes(z.function.name)),N=ds(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(ru({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)},Se=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?Se(h):(h.state="paused",h.enabled=!1)},A),h.nextRunAt=new Date(x+A).toISOString()};kt(async()=>{for(let h of D.values())h.timerId&&clearTimeout(h.timerId)}),be(iu({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),Se(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?Se(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,Se(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;kt(async()=>{for(let h of ae.values())h.cleanup();ae.clear()}),be(au({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 Dt({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")});kt(async()=>{te.dispose()}),be(lu({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 Qc(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 Zc(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:Au,label:Iu,description:Pu,parameters:Mu,execute:async(T,x)=>{let A=await Eu(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}}}})}rl(l,{getMemdir:()=>this.memdir,log:{debug:h=>c.debug(h),warn:h=>c.warn(h)}},this.memoryPrefetchState);{let h=e?.workdir??process.cwd(),T=pu(h,this.currentSessionId||"default");be(uu(T))}let We=e?.workdir??process.cwd(),we=Wu({projectRoot:We,ruleEngine:R,hooks:l,log:h=>c.info(`[settings] ${h}`)});kt(async()=>{we()}),this.currentSessionId&&l.invoke("session.created",{sessionId:this.currentSessionId}).catch(()=>{}),this.fileWatcher&&this.fileWatcher.stop();let Ge=e?.workdir??process.cwd();return Nl({projectRoot:Ge,sessionId:this.currentSessionId,hooks:l,log:h=>c.debug(h),onInstructionCacheReset:Gl}).then(h=>{this.fileWatcher=h,kt(async()=>{this.fileWatcher?.stop()})}).catch(h=>{c.warn(`[file-watcher] init error: ${h instanceof Error?h.message:h}`)}),this.agent=new St({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:Aa(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:li()}),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=Je(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(!Jr(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(!Jr(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=Ce("todo");if(!t){e.id!==void 0&&this.sendResponse(e.id,{items:[],summary:Pt([])});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:Pt(i)})}catch{e.id!==void 0&&this.sendResponse(e.id,{items:[],summary:Pt([])})}}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=Ce(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(`
478
- `)||"OK"}catch(i){return`Error: ${i instanceof Error?i.message:String(i)}`}}async ensureAgentConfigStore(){return this.agentConfigStore||(this.agentConfigStore=new No(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 Dt({log:{info:n=>process.stderr.write(`[solo:pm] ${n}
488
+ 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(g=>typeof g.text=="string"&&g.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??de(),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??"",g=l.model??"";p&&g&&this.registry.getModelInfo(p,g)?.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(f,m,y,k)=>{if(m.startsWith("$"))return{result:y};let w=Pe(m);if(!w)return{result:"",error:`Unknown tool: ${m}`};let x=`tc_${de().slice(0,8)}`;try{let S=JSON.parse(y),b=await w.execute(x,S,k);return{result:b.content.map(O=>O.text??"").join(`
489
+ `),error:b.details?.error}}catch(S){return{result:"",error:S instanceof Error?S.message:String(S)}}}},tools:et(),apiKey:this.currentApiKey,model:l.model??this.currentModel,log:{info:f=>this.log(f),warn:f=>this.log(`[warn] ${f}`),error:f=>this.log(`[error] ${f}`),debug:f=>{this.verbose&&this.log(`[debug] ${f}`)}},hooks:this.currentHooks??void 0,parentSignal:d.signal,qmemoryAdapter:this.qmemoryAdapter??void 0,qmemoryUserId:this.qmemoryUserId||void 0},g=await ec(p);if(g.ok){if(this.qmemoryAdapter&&this.qmemoryUserId)try{let f=await oc({adapter:this.qmemoryAdapter,userId:this.qmemoryUserId,memoryRoot:i,log:{info:m=>this.log(m),debug:m=>{this.verbose&&this.log(m)}}});f.ran&&this.sendNotification("memory.decay.completed",{decayed:f.decayed,archived:f.archived,durationMs:f.durationMs})}catch(f){this.log(`[decay] post-dream decay error: ${f instanceof Error?f.message:String(f)}`)}this.sendNotification("turn.end",{turnId:n,content:`Dream consolidation completed. ${g.sessionsReviewed} sessions reviewed, ${g.filesTouched.length} files touched. Duration: ${g.durationMs}ms.`,usage:{prompt:0,completion:0}})}else this.sendNotification("turn.error",{turnId:n,error:g.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 g=p instanceof Error?p.message:String(p);this.sendNotification("turn.error",{turnId:n,error:g,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=ho({provider:n,model:o,apiKey:s,baseUrl:i},this.registry);ms()&&(a.transport=gs(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,R,P)=>{if(T.startsWith("$"))return{result:R};let _=Pe(T);if(!_)return{result:"",error:`Unknown tool: ${T}`};let $=`tc_${de().slice(0,8)}`;try{let j=JSON.parse(R),L=await _.execute($,j,P),D=[],ae=L.content.map(oe=>{if(oe.type==="image"&&oe.data){let it=oe.mimeType||"image/png";return D.push(`data:${it};base64,${oe.data}`),"[Image]"}return oe.text??""}).join(`
490
+ `);D.length>0&&(L.imageUrls=[...D,...L.imageUrls??[]]);let z=L.details?.error,te=L.details?.type,Fe=te?.split("_")[0];if(te==="three_d_generate"&&(Fe="3d"),Fe&&["image","tts","video","music","3d"].includes(Fe)){let oe=L.details?.mediaUrls??[],it=Fe;for(let Be of oe)this.sendNotification("turn.media_result",{turnId:h,mediaType:it,url:Be,model:L.details?.model,provider:L.details?.provider,...L.details?.durationMs?{durationSeconds:L.details.durationMs/1e3}:{},...L.details?.taskId?{taskId:L.details.taskId}:{}});if(oe.length>0)try{let Be=await this.mediaPersistence.downloadAll(oe,{type:Fe,sessionId:this.currentSessionId||void 0},{warn:ye=>this.log(ye)});if(Be.length>0){for(let ye of Be)ae=ae.replaceAll(ye.remoteUrl,ye.localPath);this.sendNotification("turn.media_persisted",{turnId:h,files:Be.map(ye=>({remoteUrl:ye.remoteUrl,localPath:ye.localPath,bytes:ye.bytes,mimeType:ye.mimeType}))})}}catch{}}if(te==="task"&&!z&&L.details?.taskList)try{let oe=L.details;oe?.taskList&&this.sendNotification("turn.todos_updated",{turnId:h,items:oe.taskList,summary:{total:oe.total??oe.taskList.length,completed:oe.completed??0,inProgress:oe.inProgress??0,notStarted:oe.notStarted??0}})}catch{}let xe=Array.isArray(L.details?.matches)?L.details.matches:void 0,zn=L.imageUrls;return{result:ae,error:z,toolReferences:xe,imageUrls:zn}}catch(j){return{result:"",error:j instanceof Error?j.message:String(j)}}}},l=hs(c);this.currentHooks=l,this.taskStore.setHooks(l,this.currentSessionId??""),cu({onTaskCreated:h=>{l.invoke("task.created",{sessionId:this.currentSessionId??"",taskId:String(h.id),taskType:"planning",label:h.title}).catch(()=>{})},onTaskCompleted:h=>{l.invoke("task.completed",{sessionId:this.currentSessionId??"",taskId:String(h.id),taskType:"planning",label:h.title}).catch(()=>{})}});let u=(process.env.QMEMORY_BASE_URL??process.env.QLOGICAGENT_QMEMORY_BASE_URL??"").trim().replace(/\/+$/,"");if(u){let h=Dl({baseUrl:u,apiKey:(process.env.QMEMORY_API_KEY??"").trim()||void 0,timeoutMs:5e3});this.qmemoryAdapter=h,this.qmemoryUserId=this.currentSessionId??"default",Il(l,{memoryProvider:h,userId:this.currentSessionId??"default",log:{debug:T=>c.debug(T),warn:T=>c.warn(T)}},this.memoryPrefetchState)}El(l,{currentCwd:this.currentProjectRoot??void 0,log:{debug:h=>c.debug(h),warn:h=>c.warn(h)}}),Ua(l,c,{transport:a.transport,apiKey:a.apiKey});let p=e?.mcpServers,g=hi(p??{}),f=nl();try{if(E.existsSync(f)){let h=JSON.parse(E.readFileSync(f,"utf8")),T=hi(h),R=new Set(g.map(P=>P.name));g=[...g,...T.filter(P=>!R.has(P.name))]}}catch{}if(g.length>0){this.mcpManager&&this.mcpManager.disconnectAll().catch(()=>{}),this.mcpManager=new zo({servers:g,log:c}),At(async()=>{await this.mcpManager?.disconnectAll()});let h=()=>this.mcpManager;ke(fu(h)),ke(hu(h)),ke(Fu({listServers:async()=>{let T=this.mcpManager;return T?T.getConnectedServers().map(P=>({name:P,status:"connected",transport:"stdio",toolCount:0,resourceCount:0,promptCount:0})):[]},listTools:async T=>{if(!this.mcpManager)return[];let P=`mcp__${T.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`;return lt().filter(_=>_.startsWith(P)).map(_=>({name:_.slice(P.length),prefixedName:_}))},callTool:async(T,R,P,_)=>{let j=`mcp__${T.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`+R,L=Pe(j);if(!L)return{success:!1,error:`Tool not found: ${j}`};try{return{success:!0,content:(await L.execute(`mcp_${Date.now()}`,P??{},_)).content.map(z=>z.text??"").join(`
491
+ `)}}catch(D){return{success:!1,error:D.message}}},listResources:async T=>{let R=this.mcpManager;return R?(await R.listResources(T)).map(_=>({uri:_.uri,name:_.name,mimeType:_.mimeType,description:_.description,server:_.server})):[]},readResource:async(T,R)=>{let P=this.mcpManager;if(!P)throw new Error("MCP not initialized");return(await P.readResource(T,R)).map($=>({uri:$.uri,mimeType:$.mimeType,text:$.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 m=[],y=Qa();E.existsSync(y)&&m.push(y);let k=e?.pluginPaths;if(Array.isArray(k))for(let h of k)typeof h=="string"&&E.existsSync(h)&&m.push(h);wu(m,c).then(h=>{if(h.length===0)return;this.pluginLoader=new Vo({pluginDirs:h,hookRegistry:l,log:c}),this.pluginLoader.loadAll().then(R=>{c.info(`[plugins] ${R.length} loaded, ${this.pluginLoader?.getPluginSkills().length??0} skills`)}).catch(R=>{c.warn(`[plugins] load error: ${R instanceof Error?R.message:R}`)});let T=this.pluginLoader;l.register({point:"turn.submitted",handler:async()=>(await T.discoverNew(),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,x=bi(w),S=new qo(x);if(Fn()?.type==="group"){let h=eu();for(let T of h)S.addRule(T);mi(!0),c.info(`[permissions] group security mode active: ${h.length} rules injected`)}else mi(!1);this.permissionUnregister&&this.permissionUnregister(),this.permissionChecker=new Jo({ruleEngine:S,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 I=et();this.permissionChecker.setToolMeta(I),this.permissionUnregister=this.permissionChecker.register();let O=this.currentProjectRoot?kt(this.currentProjectRoot):void 0,U=[Dt(),...O?[O]:[],...Array.isArray(e?.skillPaths)?e.skillPaths:[]];ke(Mu({listSkills:()=>{let h=[];this.pluginLoader&&h.push(...this.pluginLoader.getPluginSkills());let T=e?.skillPaths;if(Array.isArray(T)){for(let R of T)if(typeof R=="string"){let P=B.basename(R);h.some(_=>_.name===P)||h.push({name:P,source:"gateway",filePath:B.join(R,"SKILL.md"),baseDir:R})}}return h},listSkillsFull:async h=>{let T=[],R=new Set,P=Dt();for(let _ of U)try{let $=await E.promises.readdir(_,{withFileTypes:!0});for(let j of $){if(!j.isDirectory())continue;let L=B.join(_,j.name,"SKILL.md");try{let D=await E.promises.readFile(L,"utf8"),ae=B.basename(_);if(h&&ae!==h)continue;R.add(ae);let z=_===P?"global":_===O?"project":"config",Fe=D.match(/^---\n[\s\S]*?^version:\s*(\S+)/m)?.[1],xe=D.startsWith(`---
492
+ `)?D.indexOf("---",4):-1,it=(xe>=0?D.slice(xe+3).trimStart():D).split(`
493
+ `).find(Be=>Be.trim()&&!Be.startsWith("#"))?.trim()??`Skill from ${ae}`;T.push({name:j.name,description:it,category:ae,scope:z,version:Fe})}catch{}}}catch{}if(this.pluginLoader)for(let _ of this.pluginLoader.getPluginSkills())h&&_.source!==h||(R.add(_.source??"plugin"),T.push({name:_.name,description:`Plugin skill (${_.source})`,category:_.source,scope:"plugin"}));return{skills:T,categories:[...R]}},readSkillContent:async h=>{for(let T of U){let R=B.join(T,h,"SKILL.md");try{return await E.promises.readFile(R,"utf8")}catch{}}return null},viewSkill:async(h,T)=>{for(let R of U){let P=T?B.join(R,h,T):B.join(R,h,"SKILL.md");try{let _=await E.promises.readFile(P,"utf8");return{name:h,content:_}}catch{}}return null},executeSkillSubturn:async(h,T,R,P)=>{let _=`skill_${h}_${de().slice(0,8)}`,$=this.agent;if(!$)return"[skill] Cannot execute: no LLM provider configured";let j=this.currentSessionId??"skill";this.currentHooks?.invoke("subagent.started",{sessionId:j,turnId:_,subagentId:_,agentType:`skill:${h}`}).catch(()=>{});let L=et(),D=R??`Execute skill "${h}" instructions.`,ae=[],z;for await(let te of $.run({turnId:_,sessionId:j,messages:[{role:"user",content:D}],tools:L,systemPrompt:T,config:{parentDepth:1}},P)){if(te.type==="end"&&te.content)return this.currentHooks?.invoke("subagent.stopped",{sessionId:j,turnId:_,subagentId:_,agentType:`skill:${h}`,reason:"normal"}).catch(()=>{}),te.content;if(te.type==="delta"&&te.text&&ae.push(te.text),te.type==="error"){z=te.error;break}}return this.currentHooks?.invoke("subagent.stopped",{sessionId:j,turnId:_,subagentId:_,agentType:`skill:${h}`,reason:z?"error":"normal",error:z}).catch(()=>{}),z?`[skill "${h}"] error: ${z}`:ae.join("")||`[skill "${h}"] completed (no output)`},manageSkill:async h=>{let T=this.currentProjectRoot,R=T?kt(T):U[0]??Dt(),P=B.join(R,h.name),_=B.join(P,"SKILL.md");switch(h.action){case"create":{if(await E.promises.mkdir(P,{recursive:!0}),await E.promises.writeFile(_,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"}}),fn(),this.qmemoryAdapter&&this.qmemoryUserId){let j=(h.content??"").split(`
494
+ `).slice(0,3).join(" ").slice(0,200),L=T?B.basename(T):"unknown";this.qmemoryAdapter.ingestExtracted([{text:`Learned skill "${h.name}" in project "${L}": ${j}`,category:"skill-learning"}],this.qmemoryUserId).catch(()=>{})}let $=T?` (project-scoped). To make it available across all projects, use: skill promote name:"${h.name}"`:"";return{success:!0,message:`Skill "${h.name}" created${$}`,path:P}}case"edit":return await E.promises.writeFile(_,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:_};case"patch":{let $=await E.promises.readFile(_,"utf8");if(!h.oldString||!$.includes(h.oldString))return{success:!1,message:"oldString not found in SKILL.md"};let j=$.replace(h.oldString,h.newString??"");return await E.promises.writeFile(_,j,"utf8"),this.sendNotification("turn.skill_instruction",{turnId:`skill-patch-${Date.now()}`,instruction:{name:h.name,category:h.category??"learned",content:j,scope:"project"}}),{success:!0,message:`Skill "${h.name}" patched`,path:_}}case"delete":return await E.promises.rm(P,{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"}}),fn(),{success:!0,message:`Skill "${h.name}" deleted`};default:return{success:!1,message:`Unknown action: ${h.action}`}}},promoteSkill:async h=>{let T=kt(this.currentProjectRoot??void 0),R=B.join(T,h,"SKILL.md");try{await E.promises.access(R)}catch{return{success:!1,message:`Skill "${h}" not found in project skills. Cannot promote.`}}let P=Dt(),_=B.join(P,h);await E.promises.mkdir(_,{recursive:!0});let $=B.join(T,h),j=await E.promises.readdir($);for(let L of j){let D=await E.promises.readFile(B.join($,L));await E.promises.writeFile(B.join(_,L),D)}return this.sendNotification("turn.skill_instruction",{turnId:`skill-promote-${Date.now()}`,instruction:{name:h,category:"promoted",content:await E.promises.readFile(R,"utf8"),scope:"global"}}),await E.promises.rm($,{recursive:!0,force:!0}),this.sendNotification("turn.skill_instruction",{turnId:`skill-promote-cleanup-${Date.now()}`,instruction:{name:h,category:"learned",action:"delete",scope:"project"}}),fn(),{success:!0,message:`Skill "${h}" promoted to global (user-level) and removed from project scope. It will now be available across all projects.`,path:_}},installSkill:async(h,T)=>{let R;try{if(R=new URL(h),!["http:","https:"].includes(R.protocol))return{success:!1,message:`Invalid URL scheme: ${R.protocol}. Only http/https allowed.`}}catch{return{success:!1,message:`Invalid URL: ${h}`}}let P=T??px(R);if(!P)return{success:!1,message:"Cannot derive skill name from URL. Please provide 'name' parameter."};try{let _=await fetch(h,{signal:AbortSignal.timeout(3e4)});if(!_.ok)return{success:!1,message:`Download failed: HTTP ${_.status} ${_.statusText}`};let $=_.headers.get("content-length");if($&&parseInt($,10)>512e3)return{success:!1,message:"Content too large (>512KB). Skill files should be small markdown documents."};let j=await _.text();if(!j.trim())return{success:!1,message:"Downloaded content is empty."};if(j.length>512e3)return{success:!1,message:"Content too large (>512KB). Skill files should be small markdown documents."};if(j.trimStart().startsWith("<!DOCTYPE")||j.trimStart().startsWith("<html"))return{success:!1,message:"URL returned an HTML page, not a raw markdown file. Use a raw/direct download link."};let L=Dt(),D=B.join(L,P);return await E.promises.mkdir(D,{recursive:!0}),await E.promises.writeFile(B.join(D,"SKILL.md"),j,"utf8"),this.sendNotification("turn.skill_instruction",{turnId:`skill-install-${Date.now()}`,instruction:{name:P,category:"installed",content:j,scope:"global"}}),fn(),{success:!0,message:`Skill "${P}" installed from ${R.host}. Available globally across all projects.`,path:D}}catch(_){return{success:!1,message:`Install failed: ${_ instanceof Error?_.message:String(_)}`}}}})),ke(Du({abortSignal:void 0,currentForkDepth:0,forkAgent:async h=>{let T=Xn(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 R=lt(),P=jr(R,T),$=et().filter(z=>P.includes(z.function.name)),j=Is($,!0),L=h.maxTurns??T.maxTurns??200,D=await hn({promptMessages:[{role:"user",content:h.prompt}],tools:j,transport:this.currentTransport,toolInvoker:d,apiKey:this.currentApiKey,model:this.currentModel,log:c,hooks:l,forkLabel:`agent-${h.agent}`,maxTurns:L,parentSignal:h.abortSignal,parentDepth:0,onEvent:z=>{z.type==="delta"&&z.text&&this.sendNotification("turn.subagent_delta",{agentType:h.agent,text:z.text})}}),ae=D.events.filter(z=>z.type==="end"&&"content"in z).map(z=>z.content??"").join("")||D.events.filter(z=>z.type==="delta"&&"text"in z).map(z=>z.text).join("");return{agentId:`fork-${h.agent}-${de().slice(0,8)}`,status:D.ok?"completed":"failed",output:ae||void 0,error:D.error,tokensUsed:D.totalUsage.prompt+D.totalUsage.completion}}}));let v=Lt(),ie=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"]}]]),Y=async()=>{try{return JSON.parse(await E.promises.readFile(v,"utf8"))}catch{return{}}},W=async h=>{await E.promises.mkdir(B.dirname(v),{recursive:!0}),await E.promises.writeFile(v,JSON.stringify(h,null,2),"utf8")};ke(Lu({getConfig:async h=>{let T=ie.get(h);if(!T)return{success:!1,error:`Unknown key: ${h}`};let R=await Y(),P=h in R?R[h]:T.value;return{success:!0,setting:{...T,value:P,readOnly:Pn.includes(h)}}},setConfig:async(h,T)=>{let R=ie.get(h);if(!R)return{success:!1,error:`Unknown key: ${h}`};let P=await Y(),_=h in P?P[h]:R.value;return P[h]=T,await W(P),{success:!0,previousValue:_,setting:{...R,value:T}}},listConfig:async()=>{let h=await Y();return{success:!0,settings:[...ie.values()].map(R=>({...R,value:R.key in h?h[R.key]:R.value,readOnly:Pn.includes(R.key)}))}},resetConfig:async h=>{let T=ie.get(h);if(!T)return{success:!1,error:`Unknown key: ${h}`};let R=await Y();return delete R[h],await W(R),{success:!0,setting:T}},isValidKey:h=>ie.has(h)}));let ee=new Map,Oe=h=>{let T=/^(\d+)([smhd])$/.exec(h.trim());if(!T)return null;let R=parseInt(T[1],10),P=T[2];return R*({s:1e3,m:6e4,h:36e5,d:864e5}[P]??6e4)},_e=h=>{h.timerId&&clearTimeout(h.timerId);let T=Oe(h.schedule);if(!T)return;let R=Date.now(),P=T-R%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?_e(h):(h.state="paused",h.enabled=!1)},P),h.nextRunAt=new Date(R+P).toISOString()};At(async()=>{for(let h of ee.values())h.timerId&&clearTimeout(h.timerId)}),ke(Uu({createJob:async h=>{let T=`cron_${de().slice(0,8)}`,R={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 ee.set(T,R),_e(R),{success:!0,job:{...R,timerId:void 0}}},listJobs:async()=>({success:!0,jobs:[...ee.values()].map(T=>({...T,timerId:void 0}))}),getJob:async h=>{let T=ee.get(h);return T?{success:!0,job:{...T,timerId:void 0}}:{success:!1,error:`Job not found: ${h}`}},updateJob:async(h,T)=>{let R=ee.get(h);return R?(T.prompt!==void 0&&(R.prompt=T.prompt),T.schedule!==void 0&&(R.schedule=T.schedule,R.scheduleDisplay=T.schedule),T.name!==void 0&&(R.name=T.name),T.enabled!==void 0&&(R.enabled=T.enabled,R.state=T.enabled?"scheduled":"paused"),T.repeat!==void 0&&(R.repeat.times=T.repeat),T.allowedTools!==void 0&&(R.allowedTools=T.allowedTools),R.enabled?_e(R):R.timerId&&(clearTimeout(R.timerId),R.timerId=void 0),{success:!0,job:{...R,timerId:void 0}}):{success:!1,error:`Job not found: ${h}`}},deleteJob:async h=>{let T=ee.get(h);return T?(T.timerId&&clearTimeout(T.timerId),ee.delete(h),{success:!0}):{success:!1,error:`Job not found: ${h}`}},pauseJob:async h=>{let T=ee.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=ee.get(h);return T?(T.state="scheduled",T.enabled=!0,_e(T),{success:!0,job:{...T,timerId:void 0}}):{success:!1,error:`Job not found: ${h}`}},triggerJob:async h=>{let T=ee.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=>Oe(h)!==null||/^\d{1,2}\s/.test(h)?null:`Invalid schedule: ${h}. Use shorthand (5m, 1h, 1d) or cron expression.`}));let H=new Map;At(async()=>{for(let h of H.values())h.cleanup();H.clear()}),ke(Nu({startMonitor:async h=>{if(H.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},R=()=>{};if(h.source==="file")try{let P=E.watch(h.target,{persistent:!1},()=>{T.eventCount++,c.info(`[monitor] file change detected: ${h.target}`)});R=()=>P.close()}catch{return{action:"start",success:!1,error:`Cannot watch: ${h.target}`}}if(h.timeoutSeconds>0){let P=setTimeout(()=>{let $=H.get(h.monitorId);$&&($.cleanup(),H.delete(h.monitorId))},h.timeoutSeconds*1e3),_=R;R=()=>{clearTimeout(P),_()}}return H.set(h.monitorId,{info:T,cleanup:R}),{action:"start",success:!0,monitorId:h.monitorId}},stopMonitor:async h=>{let T=H.get(h);return T?(T.cleanup(),H.delete(h),{action:"stop",success:!0,monitorId:h}):{action:"stop",success:!1,error:`Monitor "${h}" not found.`}},listMonitors:async()=>[...H.values()].map(h=>h.info)}));let V=new Map,he={info:h=>c.info(h),warn:h=>c.warn(h)},ue=new Wt({onNotification:(h,T,R)=>{this.sendNotification("team.member.notification",{memberId:h,method:T,params:R})},onStateChange:(h,T)=>{this.sendNotification("team.member.state",{memberId:h,state:T});let R=ue.getHandle(h),_=ue.getUsageTracker(h)?.getUsage();this.emitAgentStatus(h,T,{missedBeats:ue.getMissedBeats(h),lastActivityAt:R?.lastActivityAt,usage:_&&_.totalTokens>0?{inputTokens:_.inputTokens,outputTokens:_.outputTokens,totalTokens:_.totalTokens}:void 0})},onExit:(h,T,R)=>{for(let P of V.values()){let _=P.members.find($=>$.cwd&&`team-${P.name}-${$.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase()===h.replace(/^team-/,""));_&&(_.isActive=!1)}c.info(`[team] member ${h} exited (code=${T}, signal=${R})`)},onMcpToolCall:(h,T,R)=>this.handleMcpToolCall(h,T,R),log:{info:h=>c.info(h),warn:h=>c.warn(h),debug:h=>c.debug(h)},sessionDir:B.join(K(),"agent-logs")});At(async()=>{ue.dispose()}),ke(ju({createTeam:async h=>{if(V.has(h.teamName))return{success:!1,error:`Team "${h.teamName}" already exists.`};let T=await Sn(),R=[];for(let _ of h.members??[]){let $={..._,isActive:!0};if(T){let j=`team-${h.teamName}-${_.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),L=await Rd(T,j,he);L?($.worktreePath=L.worktreePath,$.worktreeBranch=L.branch,$.cwd=L.worktreePath,c.info(`[team] provisioned worktree for ${_.name}: ${L.worktreePath}`)):($.cwd=process.cwd(),c.warn(`[team] worktree provision failed for ${_.name}, using shared cwd`))}else $.cwd=process.cwd();R.push($)}let P={name:h.teamName,description:h.description,leadId:this.currentSessionId??"default",members:R,createdAt:new Date().toISOString()};V.set(h.teamName,P);for(let _ of R){if(!_.cwd)continue;let $=`team-${h.teamName}-${_.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase();try{await ue.spawn({memberId:$,name:_.name,cwd:_.cwd,prompt:`You are the "${_.name}" team member. Role: ${_.role}.`,agentType:_.role,verbose:this.verbose}),c.info(`[team] spawned child process for ${_.name} in ${_.cwd}`)}catch(j){c.warn(`[team] failed to spawn child process for ${_.name}: ${j instanceof Error?j.message:String(j)}`),_.isActive=!1}}return this.sendNotification("team.updated",{teamName:h.teamName,action:"created",members:P.members.map(_=>({agentName:_.name,role:_.role,worktreePath:_.worktreePath,pid:ue.getHandle(`team-${h.teamName}-${_.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase())?.pid}))}),{success:!0,team:P}},deleteTeam:async h=>{let T=V.get(h);if(!T)return{success:!1,error:`Team "${h}" not found.`};for(let P of T.members){let _=`team-${h}-${P.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase();ue.kill(_),ue.remove(_)}let R=await Sn();if(R)for(let P of T.members)P.worktreePath&&P.worktreeBranch&&(await _d(R,P.worktreePath,P.worktreeBranch,he),c.info(`[team] cleaned up worktree for ${P.name}: ${P.worktreePath}`));return V.delete(h),this.sendNotification("team.updated",{teamName:h,action:"destroyed",members:[]}),{success:!0}},listTeams:async()=>({success:!0,teams:[...V.values()]}),getTeamStatus:async h=>{let T=V.get(h);if(!T)return{success:!1,error:`Team "${h}" not found.`};let R={};for(let P of T.members){let _=`team-${h}-${P.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),$=ue.getStatus(_);$&&(P.isActive=$.alive,R[P.name]={mediaProgress:$.mediaProgress,lastToolCall:$.lastToolCall,idleFor:$.idleFor,runningFor:$.runningFor})}return{success:!0,team:T,memberProgress:R}}}));{let h=this.memdir;ke({name:sp,label:ip,description:lp,parameters:ap,execute:async(T,R)=>{let P=await cp(R,{memdir:h,provider:this.qmemoryAdapter??void 0,userId:this.qmemoryUserId||this.currentSessionId||"default"});return{content:[{type:"text",text:P.message}],details:{type:"memory",action:P.action,ok:P.ok}}}})}Ml(l,{getMemdir:()=>this.memdir,log:{debug:h=>c.debug(h),warn:h=>c.warn(h)}},this.memoryPrefetchState);{let h=e?.workdir??process.cwd(),T=Wu(h,this.currentSessionId||"default");ke(Gu(T))}let ve=e?.workdir??process.cwd(),Je=mp({projectRoot:ve,ruleEngine:S,hooks:l,log:h=>c.info(`[settings] ${h}`)});At(async()=>{Je()}),this.currentSessionId&&l.invoke("session.created",{sessionId:this.currentSessionId}).catch(()=>{}),this.fileWatcher&&this.fileWatcher.stop();let pe=e?.workdir??process.cwd();return uc({projectRoot:pe,sessionId:this.currentSessionId,hooks:l,log:h=>c.debug(h),onInstructionCacheReset:hc}).then(h=>{this.fileWatcher=h,At(async()=>{this.fileWatcher?.stop()})}).catch(h=>{c.warn(`[file-watcher] init error: ${h instanceof Error?h.message:h}`)}),this.agent=new Ot({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=Lt();if(!E.existsSync(e))return;let t=E.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:Xa(t),agentHome:K(),settings:Lt()},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:Mi()}),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:A.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:A.INVALID_PARAMS,message:"content is required."});return}if(!this.memdir){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.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:A.INTERNAL_ERROR,message:s instanceof Error?s.message:String(s)})}}handleToolsList(e){let t=e.params,o=et(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:A.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(!fs(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:A.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(!fs(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=Lt(),n={};if(E.existsSync(t)){let o=E.readFileSync(t,"utf-8");n=JSON.parse(o)}e.id!==void 0&&this.sendResponse(e.id,{config:n,paths:{userSettings:t,agentHome:K()}})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.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:A.INVALID_PARAMS,message:"updates (object) is required."});return}try{let n=Lt(),o={};try{let s=await E.promises.readFile(n,"utf-8");o=JSON.parse(s)}catch{}Object.assign(o,t.updates),await E.promises.mkdir(B.dirname(n),{recursive:!0}),await E.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:A.INTERNAL_ERROR,message:n instanceof Error?n.message:String(n)})}}async handleTodosList(e){let t=Pe("task");if(!t){e.id!==void 0&&this.sendResponse(e.id,{items:[],summary:ar([])});return}try{let s=(await t.execute("rpc-todos-list",{action:"list"},void 0)).details?.taskList??[];e.id!==void 0&&this.sendResponse(e.id,{items:s,summary:ar(s)})}catch{e.id!==void 0&&this.sendResponse(e.id,{items:[],summary:ar([])})}}async handleMemorySearch(e){let t=e.params;if(!t?.query){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.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:A.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:A.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:A.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:A.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:A.INTERNAL_ERROR,message:o instanceof Error?o.message:String(o)})}else e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.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:A.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=Pe(t);if(!o)return`Error: Unknown tool "${t}"`;let s=`mcp_${e}_${de().slice(0,8)}`;try{return(await o.execute(s,n)).content.map(a=>a.text??"").join(`
495
+ `)||"OK"}catch(i){return`Error: ${i instanceof Error?i.message:String(i)}`}}async ensureAgentConfigStore(){return this.agentConfigStore||(this.agentConfigStore=new Zo(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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}ensureSoloEvaluator(){if(!this.soloEvaluator){let e=new Wt({log:{info:n=>process.stderr.write(`[solo:pm] ${n}
479
496
  `),warn:n=>process.stderr.write(`[solo:pm] WARN ${n}
480
- `)},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}
497
+ `)},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:B.join(K(),"agent-logs")}),t={log:{info:n=>process.stderr.write(`${n}
481
498
  `),warn:n=>process.stderr.write(`${n}
482
- `)},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 Fo(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 Dt({log:{info:n=>process.stderr.write(`[product:pm] ${n}
499
+ `)},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 tr(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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.INTERNAL_ERROR,message:t instanceof Error?t.message:String(t)})}}ensureProductOrchestrator(){if(!this.productOrchestrator){let e=new Wt({log:{info:n=>process.stderr.write(`[product:pm] ${n}
483
500
  `),warn:n=>process.stderr.write(`[product:pm] WARN ${n}
484
- `)},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}
501
+ `)},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:B.join(K(),"agent-logs")}),t={log:{info:n=>process.stderr.write(`${n}
485
502
  `),warn:n=>process.stderr.write(`${n}
486
- `)},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 Bo(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(`
503
+ `)},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 nr(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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.INVALID_PARAMS,message:"agentId is required."});return}let n=B.join(K(),"agent-logs"),o=B.join(n,`${t.agentId}.stderr.log`),s="";try{s=E.readFileSync(o,"utf-8")}catch{}t.tail&&t.tail>0&&s&&(s=s.split(`
487
504
  `).slice(-t.tail).join(`
488
- `)),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)Hu(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}
489
- `)}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 Vo(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:ov,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 Mt(t),this.sessionTaskDomain=void 0,this.memoryPrefetchState=mt(),e.cwd&&typeof e.cwd=="string"&&(_o(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=Je(),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=Un(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}}};xt();export{St as Agent,Ct as ProviderRegistry,mi as StdioServer,Jt as StdioTransport,zt as buildSkillInstruction,Yr as createHookRegistry,Xn as createLLMClient,Gm as parseCliArgs};
505
+ `)),e.id!==void 0&&this.sendResponse(e.id,{log:s})}catch(t){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.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:A.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:A.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:A.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:A.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:A.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:A.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:A.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)Rp(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}
506
+ `)}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=K(),n={jsonrpc:"2.0",id:void 0,method:"memory.dream",params:{turnId:`idle-dream-${de().slice(0,8)}`,sessionId:this.currentSessionId,config:{memoryRoot:t,transcriptDir:B.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 ur(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:lx,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??de();return this.log(`[acp] session/new: id=${t}`),this.currentSessionId=t,this.sessionState=new jt(t),this.sessionTaskDomain=void 0,this.memoryPrefetchState=vt(),e.cwd&&typeof e.cwd=="string"&&(Ft(e.cwd),this.currentProjectRoot=e.cwd,this.mediaPersistence.setProjectDir(e.cwd)),this.enableIdleDream(),{sessionId:t}}async acpHandleSessionPrompt(e){let t=de(),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=et(),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-${de().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=K(),n={jsonrpc:"2.0",id:`acp-dream-${de().slice(0,8)}`,method:"memory.dream",params:{turnId:`dream-${de().slice(0,8)}`,sessionId:e.sessionId||this.currentSessionId,config:{memoryRoot:e.config?.memoryRoot||t,transcriptDir:e.config?.transcriptDir||B.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=Xn(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 hn({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}}handleProjectCreate(e){let t=e.params;if(!t?.name||!t?.workspaceDir){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INVALID_PARAMS,message:"Missing required params: name, workspaceDir"});return}if(t.groupId){let o=Di(t.groupId);if(o){e.id!==void 0&&this.sendResponse(e.id,{ok:!0,project:o,deduplicated:!0});return}}if(!E.existsSync(t.workspaceDir))try{E.mkdirSync(t.workspaceDir,{recursive:!0})}catch{e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:`Cannot create workspace directory: ${t.workspaceDir}`});return}let n=Oi({name:t.name,workspaceDir:t.workspaceDir,type:t.type??"personal",groupId:t.groupId});this.sendNotification("project.created",{id:n.id,name:n.name,workspaceDir:n.workspaceDir,type:n.type}),this.sendNotification("project.switched",{id:n.id,name:n.name,workspaceDir:n.workspaceDir}),e.id!==void 0&&this.sendResponse(e.id,{ok:!0,project:n})}handleProjectList(e){let t=cr();e.id!==void 0&&this.sendResponse(e.id,{projects:t})}handleProjectDelete(e){let t=e.params;if(!t?.projectId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INVALID_PARAMS,message:"Missing required param: projectId"});return}let n=wp(t.projectId);if(!n.deleted){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:"Cannot delete project (not found or is default project)"});return}this.sendNotification("project.deleted",{id:t.projectId}),n.switchedTo&&this.sendNotification("project.switched",{id:n.switchedTo.id,name:n.switchedTo.name,workspaceDir:n.switchedTo.workspaceDir}),e.id!==void 0&&this.sendResponse(e.id,{ok:!0,switchedTo:n.switchedTo})}handleProjectArchiveByGroup(e){let t=e.params;if(!t?.groupId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INVALID_PARAMS,message:"Missing required param: groupId"});return}let n=vp(t.groupId);if(!n.archived){e.id!==void 0&&this.sendResponse(e.id,{ok:!1,error:"No active project with this groupId"});return}this.sendNotification("project.deleted",{id:n.projectId}),n.switchedTo&&this.sendNotification("project.switched",{id:n.switchedTo.id,name:n.switchedTo.name,workspaceDir:n.switchedTo.workspaceDir}),e.id!==void 0&&this.sendResponse(e.id,{ok:!0,projectId:n.projectId})}handleSessionSwitchProject(e){let t=e.params,n=null;if(t?.projectId)n=kp(t.projectId);else if(t?.projectName){let i=cr(),a=t.projectName.toLowerCase();if(n=i.find(c=>c.name.toLowerCase()===a)??null,n||(n=i.find(c=>c.name.toLowerCase().includes(a))??null),!n){let c=i.map(d=>d.name).slice(0,10);e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:`No project matching "${t.projectName}". Available: ${c.join(", ")||"(none)"}`});return}}else{e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INVALID_PARAMS,message:"Missing required param: projectId or projectName"});return}if(!n||n.status!=="active"){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:`Project not found or archived: ${t.projectId??t.projectName}`});return}let o=t.workspaceDir??n.workspaceDir;if(!E.existsSync(o)){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:`Workspace directory does not exist: ${o}`});return}let s=dr(n.id);if(!s){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:"Switch failed"});return}this.sendNotification("project.switched",{id:s.id,name:s.name,workspaceDir:s.workspaceDir}),e.id!==void 0&&this.sendResponse(e.id,{ok:!0,project:s})}handleSessionGetState(e){let t=Fn(),n=cr();e.id!==void 0&&this.sendResponse(e.id,{sessionId:this.currentSessionId,activeProject:t,projects:n})}getProjectInstructionsStore(){let e=this.currentProjectRoot;return e?new Gn(e):null}handleInstructionsList(e){let t=this.getProjectInstructionsStore();if(!t){e.id!==void 0&&this.sendResponse(e.id,{instructions:[]});return}let n=t.list();e.id!==void 0&&this.sendResponse(e.id,{instructions:n})}handleInstructionsRead(e){let t=e.params;if(!t?.path){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INVALID_PARAMS,message:"Missing required param: path"});return}let n=this.getProjectInstructionsStore();if(!n){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:"No active project workspace"});return}let o=n.read(t.path);if(!o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:"Instruction file not found"});return}e.id!==void 0&&this.sendResponse(e.id,{content:o.content,metadata:{filename:o.filename,sizeBytes:o.sizeBytes}})}handleInstructionsWrite(e){let t=e.params;if(!t?.path||typeof t?.content!="string"){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INVALID_PARAMS,message:"Missing required params: path, content"});return}let n=this.getProjectInstructionsStore();if(!n){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:"No active project workspace"});return}try{n.write(t.path,t.content),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:o instanceof Error?o.message:String(o)})}}handleInstructionsDelete(e){let t=e.params;if(!t?.path){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INVALID_PARAMS,message:"Missing required param: path"});return}let n=this.getProjectInstructionsStore();if(!n){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:"No active project workspace"});return}if(!n.remove(t.path)){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:"Instruction file not found"});return}e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}handleSkillsList(e){let t=this.currentProjectRoot,n=t?kt(t):void 0,o=[];if(n&&E.existsSync(n))for(let s of E.readdirSync(n)){let i=B.join(n,s);if(!E.statSync(i).isDirectory())continue;let a=B.join(i,"SKILL.md"),c=B.join(i,"SKILL.md.disabled");E.existsSync(a)?o.push({name:s,path:i,active:!0}):E.existsSync(c)&&o.push({name:s,path:i,active:!1})}e.id!==void 0&&this.sendResponse(e.id,{skills:o})}handleSkillsActivate(e){let n=e.params?.name;if(!n){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INVALID_PARAMS,message:"Missing required param: name"});return}let o=this.currentProjectRoot,s=o?kt(o):void 0;if(!s){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:"No active project workspace"});return}let i=B.join(s,n),a=B.join(i,"SKILL.md.disabled"),c=B.join(i,"SKILL.md");if(E.existsSync(c)){e.id!==void 0&&this.sendResponse(e.id,{ok:!0,already:!0});return}if(E.existsSync(a))try{E.renameSync(a,c),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(d){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:`Failed to activate skill: ${d instanceof Error?d.message:d}`})}else e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:`Skill "${n}" not found`})}handleSkillsDeactivate(e){let n=e.params?.name;if(!n){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INVALID_PARAMS,message:"Missing required param: name"});return}let o=this.currentProjectRoot,s=o?kt(o):void 0;if(!s){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:"No active project workspace"});return}let i=B.join(s,n),a=B.join(i,"SKILL.md"),c=B.join(i,"SKILL.md.disabled");if(!E.existsSync(a)){e.id!==void 0&&this.sendResponse(e.id,{ok:!0,already:!0});return}try{E.renameSync(a,c),e.id!==void 0&&this.sendResponse(e.id,{ok:!0})}catch(d){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:`Failed to deactivate skill: ${d instanceof Error?d.message:d}`})}}getProjectPlanStore(){let e=this.currentProjectRoot;return e?new Wn(e):null}handlePlansList(e){let n=this.getProjectPlanStore()?.list()??[];e.id!==void 0&&this.sendResponse(e.id,{plans:n})}handlePlansGet(e){let t=e.params;if(!t?.planId){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INVALID_PARAMS,message:"Missing required param: planId"});return}let o=this.getProjectPlanStore()?.load(t.planId)??null;if(!o){e.id!==void 0&&this.sendResponse(e.id,void 0,{code:A.INTERNAL_ERROR,message:"Plan not found"});return}e.id!==void 0&&this.sendResponse(e.id,{plan:o})}};Et();export{Ot as Agent,$t as ProviderRegistry,$i as StdioServer,on as StdioTransport,Zt as buildSkillInstruction,hs as createHookRegistry,ho as createLLMClient,vg as parseCliArgs};