qlogicagent 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.js +1 -0
- package/dist/cli.js +9 -0
- package/dist/contracts.js +1 -0
- package/dist/index.js +5 -15
- package/dist/orchestration.js +118 -0
- package/package.json +56 -42
- package/dist/agent/agent.js +0 -113
- package/dist/agent/tool-loop.js +0 -575
- package/dist/agent/types.js +0 -14
- package/dist/cli/main.js +0 -23
- package/dist/cli/stdio-server.js +0 -463
- package/dist/config/config.js +0 -21
- package/dist/contracts/hooks.js +0 -7
- package/dist/contracts/index.js +0 -10
- package/dist/contracts/planner.js +0 -2
- package/dist/contracts/skill-candidate.js +0 -195
- package/dist/contracts/todo.js +0 -9
- package/dist/llm/builtin-providers.js +0 -531
- package/dist/llm/index.js +0 -14
- package/dist/llm/llm-client.js +0 -67
- package/dist/llm/model-catalog.js +0 -191
- package/dist/llm/provider-def.js +0 -12
- package/dist/llm/provider-registry.js +0 -147
- package/dist/llm/transport.js +0 -27
- package/dist/llm/transports/anthropic-messages.js +0 -293
- package/dist/llm/transports/openai-chat.js +0 -165
- package/dist/orchestration/agent-registry.js +0 -116
- package/dist/orchestration/approval-aware-tool-plan.js +0 -87
- package/dist/orchestration/context-compression.js +0 -583
- package/dist/orchestration/conversation-repair.js +0 -429
- package/dist/orchestration/curator-scheduler.js +0 -135
- package/dist/orchestration/embedded-failover-policy.js +0 -168
- package/dist/orchestration/error-classification.js +0 -77
- package/dist/orchestration/failover-classification.js +0 -381
- package/dist/orchestration/failover-error.js +0 -198
- package/dist/orchestration/fork-subagent.js +0 -98
- package/dist/orchestration/index.js +0 -267
- package/dist/orchestration/memory-flush-policy.js +0 -85
- package/dist/orchestration/memory-provider.js +0 -2
- package/dist/orchestration/parallel-tool-calls.js +0 -59
- package/dist/orchestration/prompt-cache-strategy.js +0 -228
- package/dist/orchestration/reactive-compact.js +0 -78
- package/dist/orchestration/retry-loop.js +0 -24
- package/dist/orchestration/skill-candidate.js +0 -141
- package/dist/orchestration/skill-consolidation.js +0 -220
- package/dist/orchestration/skill-improvement.js +0 -66
- package/dist/orchestration/skill-similarity.js +0 -131
- package/dist/orchestration/streaming-tool-executor.js +0 -96
- package/dist/orchestration/team-orchestration.js +0 -369
- package/dist/orchestration/team-tool-loop-wiring.js +0 -147
- package/dist/orchestration/tool-choice-policy.js +0 -164
- package/dist/orchestration/tool-loop-state.js +0 -133
- package/dist/orchestration/tool-schema.js +0 -297
- package/dist/orchestration/transcript-repair.js +0 -426
- package/dist/orchestration/turn-loop-guard.js +0 -92
- package/dist/orchestration/web-browser-policy.js +0 -39
- package/dist/runtime/context-compression.js +0 -274
- package/dist/runtime/hook-registry.js +0 -53
- package/dist/runtime/memory-hooks.js +0 -65
- package/dist/runtime/tool-eligibility.js +0 -111
- package/dist/skills/index.js +0 -82
- package/dist/skills/memory-extractor.js +0 -173
- package/dist/skills/memory-query-tool.js +0 -127
- package/dist/skills/memory-store.js +0 -228
- package/dist/skills/memory-tool.js +0 -192
- package/dist/skills/portable-tool.js +0 -14
- package/dist/skills/qmemory-adapter.js +0 -165
- package/dist/skills/skill-frontmatter.js +0 -344
- package/dist/skills/skill-guard.js +0 -229
- package/dist/skills/skill-loader.js +0 -303
- package/dist/skills/skill-source.js +0 -126
- package/dist/skills/skill-types.js +0 -6
- package/dist/skills/think-tool.js +0 -59
- package/dist/skills/todo-tool.js +0 -114
- package/dist/skills/tools/agent-tool.js +0 -142
- package/dist/skills/tools/apply-patch-tool.js +0 -184
- package/dist/skills/tools/ask-user-tool.js +0 -121
- package/dist/skills/tools/brief-tool.js +0 -95
- package/dist/skills/tools/browser-tool.js +0 -155
- package/dist/skills/tools/checkpoint-tool.js +0 -102
- package/dist/skills/tools/config-tool.js +0 -143
- package/dist/skills/tools/cron-tool.js +0 -175
- package/dist/skills/tools/edit-tool.js +0 -70
- package/dist/skills/tools/exec-tool.js +0 -133
- package/dist/skills/tools/image-generate-tool.js +0 -67
- package/dist/skills/tools/instructions-tool.js +0 -187
- package/dist/skills/tools/lsp-tool.js +0 -227
- package/dist/skills/tools/mcp-client-types.js +0 -53
- package/dist/skills/tools/mcp-tool.js +0 -503
- package/dist/skills/tools/memory-tool.js +0 -88
- package/dist/skills/tools/monitor-tool.js +0 -131
- package/dist/skills/tools/music-generate-tool.js +0 -62
- package/dist/skills/tools/notify-tool.js +0 -62
- package/dist/skills/tools/patch-tool.js +0 -505
- package/dist/skills/tools/pdf-tool.js +0 -88
- package/dist/skills/tools/plan-mode-tool.js +0 -122
- package/dist/skills/tools/read-tool.js +0 -84
- package/dist/skills/tools/repl-tool.js +0 -69
- package/dist/skills/tools/search-tool.js +0 -225
- package/dist/skills/tools/send-message-tool.js +0 -76
- package/dist/skills/tools/skill-list-tool.js +0 -54
- package/dist/skills/tools/skill-manage-tool.js +0 -153
- package/dist/skills/tools/skill-view-tool.js +0 -72
- package/dist/skills/tools/sleep-tool.js +0 -81
- package/dist/skills/tools/structured-output-tool.js +0 -176
- package/dist/skills/tools/task-tool.js +0 -161
- package/dist/skills/tools/team-tool.js +0 -105
- package/dist/skills/tools/tool-search-tool.js +0 -110
- package/dist/skills/tools/tts-tool.js +0 -45
- package/dist/skills/tools/video-edit-tool.js +0 -74
- package/dist/skills/tools/video-generate-tool.js +0 -66
- package/dist/skills/tools/video-merge-tool.js +0 -92
- package/dist/skills/tools/video-upscale-tool.js +0 -52
- package/dist/skills/tools/web-fetch-tool.js +0 -92
- package/dist/skills/tools/web-search-tool.js +0 -86
- package/dist/skills/tools/worktree-tool.js +0 -147
- package/dist/skills/tools/write-tool.js +0 -81
- /package/dist/{agent → types/agent}/agent.d.ts +0 -0
- /package/dist/{agent → types/agent}/tool-loop.d.ts +0 -0
- /package/dist/{agent → types/agent}/types.d.ts +0 -0
- /package/dist/{cli → types/cli}/main.d.ts +0 -0
- /package/dist/{cli → types/cli}/stdio-server.d.ts +0 -0
- /package/dist/{config → types/config}/config.d.ts +0 -0
- /package/dist/{contracts → types/contracts}/hooks.d.ts +0 -0
- /package/dist/{contracts → types/contracts}/index.d.ts +0 -0
- /package/dist/{contracts → types/contracts}/planner.d.ts +0 -0
- /package/dist/{contracts → types/contracts}/skill-candidate.d.ts +0 -0
- /package/dist/{contracts → types/contracts}/todo.d.ts +0 -0
- /package/dist/{index.d.ts → types/index.d.ts} +0 -0
- /package/dist/{llm → types/llm}/builtin-providers.d.ts +0 -0
- /package/dist/{llm → types/llm}/index.d.ts +0 -0
- /package/dist/{llm → types/llm}/llm-client.d.ts +0 -0
- /package/dist/{llm → types/llm}/model-catalog.d.ts +0 -0
- /package/dist/{llm → types/llm}/provider-def.d.ts +0 -0
- /package/dist/{llm → types/llm}/provider-registry.d.ts +0 -0
- /package/dist/{llm → types/llm}/transport.d.ts +0 -0
- /package/dist/{llm → types/llm}/transports/anthropic-messages.d.ts +0 -0
- /package/dist/{llm → types/llm}/transports/openai-chat.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/agent-registry.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/approval-aware-tool-plan.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/context-compression.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/conversation-repair.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/curator-scheduler.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/embedded-failover-policy.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/error-classification.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/failover-classification.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/failover-error.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/fork-subagent.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/index.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/memory-flush-policy.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/memory-provider.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/parallel-tool-calls.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/prompt-cache-strategy.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/reactive-compact.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/retry-loop.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/skill-candidate.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/skill-consolidation.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/skill-improvement.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/skill-similarity.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/streaming-tool-executor.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/team-orchestration.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/team-tool-loop-wiring.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/tool-choice-policy.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/tool-loop-state.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/tool-schema.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/transcript-repair.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/turn-loop-guard.d.ts +0 -0
- /package/dist/{orchestration → types/orchestration}/web-browser-policy.d.ts +0 -0
- /package/dist/{runtime → types/runtime}/context-compression.d.ts +0 -0
- /package/dist/{runtime → types/runtime}/hook-registry.d.ts +0 -0
- /package/dist/{runtime → types/runtime}/memory-hooks.d.ts +0 -0
- /package/dist/{runtime → types/runtime}/tool-eligibility.d.ts +0 -0
- /package/dist/{skills → types/skills}/index.d.ts +0 -0
- /package/dist/{skills → types/skills}/memory-extractor.d.ts +0 -0
- /package/dist/{skills → types/skills}/memory-query-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/memory-store.d.ts +0 -0
- /package/dist/{skills → types/skills}/memory-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/portable-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/qmemory-adapter.d.ts +0 -0
- /package/dist/{skills → types/skills}/skill-frontmatter.d.ts +0 -0
- /package/dist/{skills → types/skills}/skill-guard.d.ts +0 -0
- /package/dist/{skills → types/skills}/skill-loader.d.ts +0 -0
- /package/dist/{skills → types/skills}/skill-source.d.ts +0 -0
- /package/dist/{skills → types/skills}/skill-types.d.ts +0 -0
- /package/dist/{skills → types/skills}/think-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/todo-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/agent-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/apply-patch-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/ask-user-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/brief-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/browser-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/checkpoint-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/config-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/cron-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/edit-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/exec-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/image-generate-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/instructions-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/lsp-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/mcp-client-types.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/mcp-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/memory-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/monitor-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/music-generate-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/notify-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/patch-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/pdf-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/plan-mode-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/read-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/repl-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/search-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/send-message-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/skill-list-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/skill-manage-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/skill-view-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/sleep-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/structured-output-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/task-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/team-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/tool-search-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/tts-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/video-edit-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/video-generate-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/video-merge-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/video-upscale-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/web-fetch-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/web-search-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/worktree-tool.d.ts +0 -0
- /package/dist/{skills → types/skills}/tools/write-tool.d.ts +0 -0
package/dist/agent.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var et=Object.defineProperty;var tt=(e,t)=>()=>(e&&(t=e(e=0)),t);var nt=(e,t)=>{for(var n in t)et(e,n,{get:t[n],enumerable:!0})};var Ge={};nt(Ge,{resolveToolEligibility:()=>Jt});function Kt(e,t){if(Yt.some(n=>n.test(e)))return!0;if(t)for(let n of t)try{if(new RegExp(n,"i").test(e))return!0}catch{}return!1}function Vt(e,t){let n=e.function.name,r=e.meta,o=[];return t.blockedToolNames?.includes(n)?(o.push("policy_blocked"),{level:5,reasons:o}):r?.isReadOnly?(o.push("always_allowed"),{level:1,reasons:o}):r?.requiresApproval?(o.push("approval_required"),{level:4,reasons:o}):r?.isDangerous||Kt(n,t.dangerousPatterns)?(o.push("dangerous_tool"),{level:3,reasons:o}):{level:2,reasons:o}}function Xt(e){switch(e){case 1:return"eligible";case 2:return"eligible";case 3:return"dangerous-notify";case 4:return"approval-required";case 5:return"blocked-by-policy"}}function Jt(e,t={}){let n=new Map,r=[],o=[],c=[];for(let s of e){let i=s.function.name,{level:a,reasons:u}=Vt(s,t),d=Xt(a),h={toolName:i,status:d,permissionLevel:a,approvalRequired:a===4,reasonCodes:u};n.set(i,h),a===5?o.push(h):(r.push(s),a===4&&c.push(h))}return{eligibleTools:r,blockedTools:o,approvalRequiredTools:c,eligibilityByName:n}}var Yt,Ye=tt(()=>{"use strict";Yt=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:write_file|delete_file|move_file|create_directory)$/i,/^(?:git_push|git_reset|git_force)$/i]});function se(e){return{role:"assistant",content:"",tool_calls:e}}function G(e,t){return{role:"tool",tool_call_id:e,content:JSON.stringify(t.ok?{ok:!0,payload:t.payload}:{ok:!1,error:t.error??"Tool invoke failed"})}}var ot=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,F={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]},rt=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,it=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,st=512,at=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i;var lt=new Set([500,502,503,504,521,522,523,524,529]),ct=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],ut=["upgrade your plan","upgrade plan","current plan","subscription"],dt=["daily","weekly","monthly"],pt=["try again","retry","temporary","cooldown"],mt=["usage limit","rate limit","organization usage"],ft=["organization","workspace"],gt=["billing period","exceeded","reached","exhausted"],yt=/["']?(?: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,ht=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i;function O(e,t){if(!e)return!1;let n=e.toLowerCase();return t.some(r=>r instanceof RegExp?r.test(n):n.includes(r))}function Tt(e){return O(e,F.format)}function Ae(e){return O(e,F.rateLimit)}function le(e){return O(e,F.timeout)}function Ct(e){return ot.test(e)}function ae(e){let t=e.toLowerCase();return t?e.length>st?it.test(t):O(t,F.billing)?!0:rt.test(e)?t.includes("upgrade")||t.includes("credits")||t.includes("payment")||t.includes("plan"):!1:!1}function Me(e){return O(e,F.authPermanent)}function bt(e){return O(e,F.auth)}function Ee(e){return O(e,F.overloaded)}function L(e,t){return t.some(n=>e.includes(n))}function kt(e){return L(e,ct)||L(e,ut)&&e.includes("limit")||e.includes("billing hard limit")||e.includes("hard limit reached")||e.includes("maximum allowed")&&e.includes("limit")}function xt(e){let t=L(e,dt),n=e.includes("spend limit")||e.includes("spending limit"),r=L(e,ft);return L(e,pt)&&L(e,mt)||t&&(e.includes("usage limit")||n)||t&&e.includes("limit")&&e.includes("reset")||r&&e.includes("limit")&&(n||L(e,gt))}function Rt(e){return e.trim().toLowerCase().replace(ht,"").trim()}function _e(e){let t=Rt(e);return!t||kt(t)?"billing":Ae(t)||xt(t)?"rate_limit":"billing"}function vt(e){return yt.test(e)?_e(e):null}function we(e){let t=e.match(at);if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?{code:n,rest:(t[2]??"").trim()}:null}function St(e){if(!e)return!1;let t=e.toLowerCase();return t.includes('"type":"api_error"')&&t.includes("internal server error")}function Ie(e){let t=e.trim();if(!t)return!1;let n=we(t);return n?lt.has(n.code):!1}function Y(e,t){return typeof e!="number"||!Number.isFinite(e)?null:e===402?t?_e(t):"billing":e===429?"rate_limit":e===401||e===403?t&&Me(t)?"auth_permanent":"auth":e===408?"timeout":e===503?t&&Ee(t)?"overloaded":"timeout":e===502||e===504?"timeout":e===529?"overloaded":e===400?t&&ae(t)?"billing":"format":null}function Pe(e){if(!e)return!1;let t=e.toLowerCase();return!!(t.includes("unknown model")||t.includes("model not found")||t.includes("model_not_found")||t.includes("not_found_error")||t.includes("does not exist")&&t.includes("model")||t.includes("invalid model")&&!t.includes("invalid model reference")||/models\/[^\s]+ is not found/i.test(e)||/\b404\b/.test(e)&&/not[-_ ]?found/i.test(e))}function At(e){if(!e)return!1;let t=e.toLowerCase();return t.includes("session not found")||t.includes("session does not exist")||t.includes("session expired")||t.includes("session invalid")||t.includes("conversation not found")||t.includes("conversation does not exist")||t.includes("conversation expired")||t.includes("conversation invalid")||t.includes("no such session")||t.includes("invalid session")||t.includes("session id not found")||t.includes("conversation id not found")}function K(e){if(At(e))return"session_expired";if(Pe(e))return"model_not_found";let t=vt(e);return t||(Ct(e)?ae(e)?"billing":"rate_limit":Ae(e)?"rate_limit":Ee(e)?"overloaded":Ie(e)?we(e.trim())?.code===529?"overloaded":"timeout":St(e)?"timeout":Tt(e)?"format":ae(e)?"billing":le(e)?"timeout":Me(e)?"auth_permanent":bt(e)?"auth":null)}var Mt={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"},Et={RETRYABLE_TRANSIENT:{retryable:!0,maxRetries:3,baseDelayMs:1e3,backoffMultiplier:2,switchProvider:!0},RETRYABLE_DEGRADED:{retryable:!0,maxRetries:2,baseDelayMs:5e3,backoffMultiplier:3,switchProvider:!0},NON_RETRYABLE_AUTH:{retryable:!1,maxRetries:0,baseDelayMs:0,backoffMultiplier:1,switchProvider:!0},NON_RETRYABLE_CONTENT:{retryable:!1,maxRetries:0,baseDelayMs:0,backoffMultiplier:1,switchProvider:!1},NON_RETRYABLE_QUOTA:{retryable:!1,maxRetries:0,baseDelayMs:0,backoffMultiplier:1,switchProvider:!0},TOOL_EXECUTION_FAILED:{retryable:!0,maxRetries:1,baseDelayMs:500,backoffMultiplier:1,switchProvider:!1}};function j(e,t){let n=Y(e,t)??(t?K(t):null);return n?Mt[n]:typeof e=="number"&&e>=400&&e<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function ce(e){return Et[e]}function Le(e){return!(!e.ok||e.existingSkillName||!e.multiStep||e.toolCallCount<3||e.distinctToolCount<2)}function Fe(e){return e.existingSkillName?e.feedback==="negative":!1}function V(e,t){return Fe(e)?{type:"skill.improve",skillName:e.existingSkillName,reason:"negative user feedback on existing skill execution"}:Le(e)?{type:"skill.create",suggestedName:t.suggestedName??`auto-skill-${t.tools.slice(0,3).join("-")}`,description:`Multi-step orchestration using ${t.tools.join(", ")}`,tools:t.tools,stepCount:e.toolCallCount}:null}function Oe(e){return e.function&&typeof e.function=="object"&&typeof e.function.name=="string"?e.function.name.trim():typeof e.name=="string"?e.name.trim():""}function _t(e){return e==="enabled-eligible"||e==="installed-awaiting-approval"}function wt(e){return new Map((e??[]).map(t=>[t.toolName,t]))}function Ne(e){if(!e.eligibility?.length)return[...e.tools];let t=wt(e.eligibility);return e.tools.filter(n=>{let r=Oe(n);if(!r)return!1;let o=t.get(r);return!o||_t(o.status)})}function De(e){let t=[],n=e.compatibility??{},r=e.toolChoice;if(e.thinkingEnabled&&n.requireAutoWhenThinking){let o=typeof r=="object"&&r&&!Array.isArray(r)?String(r.type??""):r;o&&o!=="auto"&&o!=="none"&&(t.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),r="auto")}if(r==="required"&&n.allowRequiredToolChoice===!1){let o=n.requiredFallback??"auto";t.push(`tool_choice=required is not supported by this provider; downgraded to ${o}.`),r=o}if(r&&typeof r=="object"&&!Array.isArray(r)&&r.type==="function"&&n.allowNamedToolChoice===!1){let o=n.namedFallback??"required";t.push(`named tool_choice is not supported by this provider; downgraded to ${o}.`),r=o}return{normalizedToolChoice:r,warnings:t}}function ue(e){let t=De({toolChoice:e.toolChoice,thinkingEnabled:e.thinkingEnabled,compatibility:e.compatibility}),n=t.normalizedToolChoice,r=[...t.warnings],o=Ne({tools:e.tools,eligibility:e.eligibility});if(!n||n==="auto")return{tools:o,normalizedToolChoice:n,warnings:r};if(n==="none")return{tools:[],normalizedToolChoice:"none",warnings:r};if(n==="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:r}}if(typeof n=="object"&&!Array.isArray(n)&&n.type==="function"){let c=n.function??void 0,s=typeof c?.name=="string"?c.name.trim():"";if(!s)throw new Error("tool_choice.function.name is required");let i=o.filter(a=>Oe(a)===s);if(i.length===0)throw new Error(`tool_choice requested unknown tool: ${s}`);return{tools:i,normalizedToolChoice:{type:"function",function:{name:s}},extraSystemPrompt:`You must call the ${s} tool before responding.`,warnings:r}}return{tools:o,normalizedToolChoice:n,warnings:r}}var It=["stop","aborted","timeout","cancelled","interrupted","error"],Pt=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function Be(e){return e==null?[]:typeof e=="string"?e.length>0?[{type:"text",text:e}]:[]:Array.isArray(e)?e:[{type:"text",text:String(e)}]}function Lt(e,t){return{...e,content:[...Be(e.content),...Be(t.content)]}}function Ft(e){if(!e||typeof e!="object")return!1;if(e.function&&typeof e.function=="object"){let t=e.function.name;if(typeof t=="string"&&t.length>0)return!0}return typeof e.name=="string"&&e.name.length>0}function Ot(e){return new Set((e??It).map(t=>t.trim().toLowerCase()))}function Nt(e,t){return e?Ot(t).has(e.trim().toLowerCase()):!1}function X(e){if(!Array.isArray(e)||e.length===0)return[...e];let t=e.map(i=>{if(i.role==="assistant"&&Array.isArray(i.tool_calls)){let a=i.tool_calls.filter(u=>Ft(u));return{...i,...a.length>0?{tool_calls:a}:{tool_calls:void 0}}}return{...i}}),n=new Set;for(let i of t)if(!(i.role!=="assistant"||!Array.isArray(i.tool_calls)))for(let a of i.tool_calls)typeof a.id=="string"&&a.id&&n.add(a.id);let r=t.filter(i=>i.role!=="tool"?!0:!!(i.tool_call_id&&n.has(i.tool_call_id))),o=new Set;for(let i of r)i.role==="tool"&&typeof i.tool_call_id=="string"&&i.tool_call_id&&o.add(i.tool_call_id);let c=[];for(let i of r){if(i.role==="assistant"&&Array.isArray(i.tool_calls)&&i.tool_calls.length>0){let a=i.tool_calls.filter(u=>typeof u.id=="string"&&o.has(u.id));if(a.length===0){let{tool_calls:u,...d}=i;d.content!=null&&d.content!==""&&c.push(d);continue}if(a.length<i.tool_calls.length){c.push({...i,tool_calls:a});continue}}c.push(i)}let s=[];for(let i of c){let a=s.length>0?s[s.length-1]:void 0;if(i.role==="user"&&a?.role==="user"){s[s.length-1]=Lt(a,i);continue}s.push(i)}return s}function J(e,t){return Nt(t?.stopReason,t?.forcedStopReasons)?e.map(n=>{if(n.role!=="assistant")return{...n};let r={...n};for(let o of Pt)delete r[o];return r}):[...e]}function Q(e,t){let n=t?.placeholderToolResult??JSON.stringify({ok:!1,error:"Tool loop interrupted before the tool result was replayed."}),r=new Set;for(let c of e)c.role==="tool"&&typeof c.tool_call_id=="string"&&c.tool_call_id&&r.add(c.tool_call_id);let o=[];for(let c of e)if(o.push({...c}),!(c.role!=="assistant"||!Array.isArray(c.tool_calls)||c.tool_calls.length===0))for(let s of c.tool_calls)typeof s.id!="string"||!s.id||r.has(s.id)||(r.add(s.id),o.push({role:"tool",tool_call_id:s.id,content:n}));return o}function de(e,t){let n=X(e),r=J(n,t);return Q(r,t)}function $e(e){if(e!==void 0)return typeof e=="boolean"?{kind:"enabled",enabled:e}:e===null?{kind:"suppressed"}:{kind:"invalid",summary:typeof e=="string"?e:typeof e}}function pe(e){let t=[],n=$e(e.requestedPreference),r=new Map((e.toolCapabilities??[]).map(a=>[a.name,a])),o=e.providerSupportsParallel!==!1;n?.kind==="enabled"?o=n.enabled&&e.providerSupportsParallel!==!1:n?.kind==="suppressed"?o=!1:n?.kind==="invalid"&&t.push(`ignoring invalid parallel_tool_calls param: ${n.summary}`),o&&e.providerSupportsParallel===!1&&t.push("provider does not support parallel tool calls; downgraded to serial execution.");let c=[],s=[],i=()=>{s.length!==0&&(c.push({mode:"parallel",calls:s}),s=[])};for(let a of e.toolCalls){let u=r.get(a.function.name);if(!o||u?.requiresApproval===!0||u?.serialOnly===!0||u?.parallelSafe===!1||u?.approvalMode==="user-confirm"){i(),c.push({mode:"serial",calls:[a]});continue}s.push(a)}return i(),{enabled:o,mode:c.some(a=>a.mode==="parallel"&&a.calls.length>1)?"parallel":"serial",batches:c,warnings:t}}function Bt(e){let t=new Set,n=new Set;for(let r of e){if(r.role==="assistant"&&Array.isArray(r.tool_calls))for(let o of r.tool_calls)typeof o.id=="string"&&o.id&&t.add(o.id);r.role==="tool"&&typeof r.tool_call_id=="string"&&r.tool_call_id&&n.add(r.tool_call_id)}return[...t].filter(r=>!n.has(r))}function $t(e){let t=new Set;for(let n of e)n.role==="tool"&&typeof n.tool_call_id=="string"&&n.tool_call_id&&t.add(n.tool_call_id);return[...t]}function je(e){return{round:e.round??0,maxRounds:e.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??[]],completedToolCallIds:[...e.completedToolCallIds??[]],lastStopReason:e.lastStopReason,replayMessages:[...e.replayMessages??[]]}}function me(e,t){return{round:e.round+1,maxRounds:e.maxRounds,pendingToolCallIds:[...t.pendingToolCallIds??e.pendingToolCallIds],completedToolCallIds:[...t.completedToolCallIds??e.completedToolCallIds],lastStopReason:t.lastStopReason??e.lastStopReason,replayMessages:[...t.replayMessages??e.replayMessages]}}function Z(e,t){return{round:e.round,maxRounds:e.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...t.completedToolCallIds??e.completedToolCallIds],lastStopReason:t.lastStopReason??e.lastStopReason,replayMessages:[...t.replayMessages??e.replayMessages]}}function ee(e){let t=[],n=X(e.replayMessages);n.length!==e.replayMessages.length&&t.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let r=J(n,e.options);r.some((c,s)=>c!==n[s])&&t.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let o=Q(r,e.options);return o.length>r.length&&t.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:je({maxRounds:e.maxRounds,round:e.round,lastStopReason:e.lastStopReason,replayMessages:o,pendingToolCallIds:Bt(o),completedToolCallIds:$t(o)}),recoveryActions:t}}import{MEMORY_OBSERVATION_HOOK_VALUES as jt,MEMORY_OBSERVATION_SOURCE_VALUES as zt,MEMORY_WRITE_ACCESS_VALUES as Ht}from"qlogicagent-runtime-contracts";function fe(e){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:e.maxOutputTokens,consecutiveTruncations:0,aborted:e.abortSignal?.aborted??!1}}function ge(e,t){if(e.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let n=t.contextWindowTokens-t.responseBufferTokens-e.currentMaxOutputTokens,r=n>0?e.promptTokens/n*100:100;return e.promptTokens>=n?e.hasAttemptedReactiveCompact||!t.reactiveCompactEnabled?{level:"blocking",usagePercent:r,reason:"prompt_too_long"}:{level:"blocking",usagePercent:r,reason:"prompt_too_long"}:r>=85?{level:"warning",usagePercent:r,remainingTokens:n-e.promptTokens}:{level:"ok"}}function ye(e,t,n){let r=e.message?.toLowerCase()??"",o=e.status??0;return o===413||r.includes("prompt_too_long")||r.includes("context_length_exceeded")?!t.hasAttemptedReactiveCompact&&n.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"}:{action:"abort",reason:r||"unknown_error"}}function he(e,t,n){if(!t.outputEscalationEnabled)return{shouldEscalate:!1,newMax:e.currentMaxOutputTokens};if(e.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:e.currentMaxOutputTokens};let r=Math.min(e.currentMaxOutputTokens*2,n);return r<=e.currentMaxOutputTokens?{shouldEscalate:!1,newMax:e.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:r}}function Te(e,t){return e.aborted?!0:t.abortSignal?.aborted?(e.aborted=!0,!0):!1}var ze={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function Ce(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function te(e,t=ze){return!(e.attemptedThisTurn||e.consecutiveFailures>=t.maxConsecutiveFailures)}var Ut={research:{type:"research",label:"Research",description:"Independent retrieval or evidence gathering branches.",mergePolicy:"summary-only",budgetTier:"medium",budgetWeight:2,preferFullContext:!1,preserveConversationHistory:!0,toolAccessMode:"read-only"},planner:{type:"planner",label:"Planner",description:"Planning and tool orchestration branches that may return structured context.",mergePolicy:"append-messages",budgetTier:"high",budgetWeight:3,preferFullContext:!0,preserveConversationHistory:!0,toolAccessMode:"none"},"plan-repair":{type:"plan-repair",label:"Plan Repair",description:"Failure repair or fallback branches that re-plan tool choice, ordering, or approval strategy.",mergePolicy:"replace-context",budgetTier:"medium",budgetWeight:2,preferFullContext:!0,preserveConversationHistory:!1,toolAccessMode:"none"},"code-repair":{type:"code-repair",label:"Code Repair",description:"Recovery branches focused on file edits, patch validation, or workspace mutation repair.",mergePolicy:"replace-context",budgetTier:"high",budgetWeight:3,preferFullContext:!0,preserveConversationHistory:!1,toolAccessMode:"full"},"media-prep":{type:"media-prep",label:"Media Prep",description:"Preparation branches for media generation, normalization, or staging.",mergePolicy:"summary-only",budgetTier:"low",budgetWeight:1,preferFullContext:!1,preserveConversationHistory:!1,toolAccessMode:"read-only"}},be=["gateway","agents_list","whatsapp_login","session_status","cron","memory_query","sessions_send"],qt=["sessions_list","sessions_history","sessions_spawn"],He=["file_edit","create_file","replace_string_in_file","multi_replace_string_in_file","create_directory","run_in_terminal","run_command","delete_file","rename_file","move_file","git_commit","git_push","manage_todo_list"];function Wt(e={}){let t=Math.max(1,Math.floor(e.maxDepth??2)),n=typeof e.depth=="number"&&Number.isFinite(e.depth)?Math.max(0,Math.floor(e.depth)):t,r=e.role?e.role==="leaf":n>=t,o=r?[...be,...qt]:[...be],c=new Set(o),s=Array.isArray(e.toolNames)?e.toolNames:e.toolNames?Array.from(e.toolNames):[],i=Array.from(new Set(s.map(a=>a.trim()).filter(Boolean))).map(a=>{let u=c.has(a);return{toolName:a,decision:u?"denied":"allowed",inheritance:u?"shrink":"inherit",reason:u?be.includes(a)?"always-deny":"leaf-deny":"default-allow"}});return{deniedTools:o,canSpawnChildren:!r,defaultDecision:"allowed",defaultInheritance:"inherit",tools:i}}function Ue(e){let t=Gt(e.type),n=Wt({depth:e.depth,maxDepth:e.maxDepth,role:e.role,toolNames:e.toolNames});if(t.toolAccessMode==="full")return n;if(t.toolAccessMode==="none"){let c=Array.isArray(e.toolNames)?e.toolNames:e.toolNames?Array.from(e.toolNames):[],s=[...new Set(c.map(i=>i.trim()).filter(Boolean))];return{deniedTools:s,canSpawnChildren:!1,defaultDecision:"allowed",defaultInheritance:"inherit",tools:s.map(i=>({toolName:i,decision:"denied",inheritance:"shrink",reason:"always-deny"}))}}let r=new Set(He),o=[...new Set([...n.deniedTools,...He])];return{...n,deniedTools:o,tools:n.tools.map(c=>c.decision==="denied"?c:r.has(c.toolName)?{...c,decision:"denied",inheritance:"shrink",reason:"always-deny"}:c)}}function qe(e,t){let n=new Set(t.deniedTools),r=new Map(t.tools.map(s=>[s.toolName,s])),o=[],c=[];for(let s of e){let i=s.function.name,a=r.get(i);a?.decision==="denied"?c.push({toolCall:s,reason:`tool "${i}" denied by sidechain policy: ${a.reason}`}):n.has(i)?c.push({toolCall:s,reason:`tool "${i}" is in sidechain deny list`}):o.push(s)}return{allowed:o,denied:c}}function Gt(e){return Ut[e]}function We(e,t){let n=e.get(t.index);n||(n={id:"",name:"",arguments:""},e.set(t.index,n)),t.id&&(n.id=t.id),t.name&&(n.name+=t.name),n.arguments+=t.arguments}var Ve=100,Qt=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),Ve),Zt=3,z=2;function en(e){return typeof e=="number"&&Number.isFinite(e)&&e>=1?Math.min(Math.round(e),Ve):Qt}async function*Xe(e,t,n,r){let{turnId:o,sessionId:c,messages:s,tools:i,model:a,apiKey:u,temperature:d,hooks:h,signal:f}=e,m={sessionId:c,turnId:o},{resolveToolEligibility:g}=await Promise.resolve().then(()=>(Ye(),Ge)),I=g(i,e.toolEligibilityContext),E=I.eligibleTools;for(let S of I.blockedTools)yield{type:"tool_blocked",turnId:o,callId:"",name:S.toolName,reason:"blocked-by-policy"};if(!E.length){yield*nn(o,a,s,u,d,f,t,r);return}let _=en(e.maxRounds),v=[...s],k=ee({maxRounds:_,replayMessages:v}).state,$={contextWindowTokens:e.contextWindowTokens??128e3,responseBufferTokens:13e3,maxOutputTokens:e.maxOutputTokens??16384,abortSignal:f,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},C=fe($),H=Ce(),N=!1,ne=null,w=(e.parentDepth??0)+1,Ze,D="",U=0,P={prompt:0,completion:0},B=new Set,x=0;for(let S=0;S<_;S++){if(Te(C,$)){r.info(`turn aborted by guard at round ${S}`);break}let R=ge(C,$);if(R.level==="blocking"){R.reason==="prompt_too_long"&&te(H)&&(H.attemptedThisTurn=!0,C.hasAttemptedReactiveCompact=!0,r.info(`token budget blocking (${R.reason}), reactive compact needed`)),r.info(`token budget blocking (${R.reason}), breaking tool loop`);break}R.level==="warning"&&r.info(`token budget warning: ${R.usagePercent}% used, ${R.remainingTokens} remaining`);let q=ue({tools:E,toolChoice:e.toolChoice??"auto"}),W=ee({maxRounds:_,replayMessages:v,lastStopReason:k.lastStopReason,options:{stopReason:k.lastStopReason}}),ke=q.extraSystemPrompt?[{role:"system",content:q.extraSystemPrompt},...W.state.replayMessages]:W.state.replayMessages;W.recoveryActions.length>0&&r.debug(`tool loop recovery: ${W.recoveryActions.map(l=>l.detail??l.kind).join("; ")}`),r.debug(`round ${S+1}/${_}, messages: ${ke.length}`),h?.invoke("turn.before_inference",{...m,model:a}).catch(()=>{});let oe=!1,xe=[],Re=new Map,re="stop",A,b=null;try{for await(let l of t.stream({model:a,messages:ke,tools:q.tools,toolChoice:q.normalizedToolChoice??"auto",temperature:d,maxTokens:C.currentMaxOutputTokens||void 0},u,f))switch(l.type){case"delta":xe.push(l.text),oe||(yield{type:"delta",turnId:o,text:l.text});break;case"tool_call_delta":oe=!0,We(Re,l);break;case"reasoning_delta":break;case"usage":A={prompt:l.promptTokens,completion:l.completionTokens,reasoning:l.reasoningTokens};break;case"done":re=l.finishReason;break}oe||h?.invoke("turn.after_inference",{...m,model:a}).catch(()=>{})}catch(l){let p=l instanceof Error?l.message:String(l);b={status:typeof l?.status=="number"?l.status:void 0,message:p}}if(b&&h?.invoke("turn.after_inference",{...m,model:a,response:{error:b.message}}).catch(()=>{}),b){let l=ye({status:b.status??500,message:b.message},C,$);if(l.action==="reactive_compact"&&te(H)&&(H.attemptedThisTurn=!0,C.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:o,action:"reactive_compact",detail:`API ${b.status??500}: ${b.message}`}),l.action==="retry"){yield{type:"recovery",turnId:o,action:"retry",detail:l.reason};continue}let p=j(b.status,b.message);yield{type:"error",turnId:o,error:b.message,code:p};return}if(A&&(P.prompt+=A.prompt,P.completion+=A.completion,A.reasoning&&(P.reasoning=(P.reasoning??0)+A.reasoning)),A?.prompt&&(C.promptTokens=A.prompt),re==="length"||re==="max_tokens"){C.consecutiveTruncations+=1;let l=e.modelMaxOutputTokens??65536,p=he(C,$,l);p.shouldEscalate&&(C.currentMaxOutputTokens=p.newMax,yield{type:"recovery",turnId:o,action:"output_escalation",detail:`${p.newMax} tokens`})}else C.consecutiveTruncations=0;Ze=A,D=xe.join("");let M=[...Re.values()].map(l=>({id:l.id||`tc_${o}_${S}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:l.name,arguments:l.arguments}}));if(ne&&M.length>0){let l=qe(M,ne);l.denied.length>0&&r.info(`sidechain policy denied: ${l.denied.map(p=>`${p.toolCall.function.name} (${p.reason})`).join(", ")}`),M=l.allowed}if(M.length===0){if(k=Z(k,{replayMessages:v,lastStopReason:"completed"}),N&&(yield{type:"sidechain_completed",turnId:o,depth:w,toolCallCount:x}),x>0){let l={ok:!0,toolCallCount:x,distinctToolCount:B.size,multiStep:x>=2,hasSidechain:N,feedback:null,existingSkillName:null},p=V(l,{tools:[...B]});p&&(yield{type:"skill_instruction",turnId:o,instruction:p})}yield{type:"end",turnId:o,content:D,usage:P,model:a};return}for(let l of M)yield{type:"tool_call",turnId:o,callId:l.id,name:l.function.name,arguments:l.function.arguments};if(v.push(se(M)),!N){if(w>z){yield{type:"error",turnId:o,error:`sidechain depth ${w} exceeds max ${z}`,code:"SIDECHAIN_DEPTH_LIMIT"};return}N=!0;let l=w>=z?"leaf":"orchestrator";yield{type:"sidechain_started",turnId:o,depth:w,role:l},ne=Ue({type:"planner",depth:w,maxDepth:z,role:w>=z?"leaf":"orchestrator",toolNames:i.map(p=>p.function.name)})}k=me(k,{replayMessages:v,pendingToolCallIds:M.map(l=>l.id),completedToolCallIds:k.completedToolCallIds,lastStopReason:"tool_calls"});let ve=pe({requestedPreference:void 0,providerSupportsParallel:!0,toolCalls:M,toolCapabilities:E.map(l=>({name:l.function.name,requiresApproval:l.meta?.requiresApproval??!1,approvalMode:l.meta?.requiresApproval?"user-confirm":"pre-authorized",parallelSafe:l.meta?.parallelSafe??!0,serialOnly:l.meta?.serialOnly??!1}))}),ie=[];try{for(let l of ve.batches)if(l.mode==="parallel"){let p={hooks:h,sessionId:c},y=await Promise.all(l.calls.map(T=>Ke(T,o,n,f,r,p)));for(let T of y)T.blocked&&(yield{type:"tool_blocked",turnId:o,callId:T.callId,name:T.toolName,reason:T.blockReason??"blocked"}),v.push(T.message),ie.push(T.callId),B.add(T.toolName),x++,yield{type:"tool_result",turnId:o,callId:T.callId,name:T.toolName,ok:T.ok,error:T.error}}else for(let p of l.calls){if(f?.aborted){yield{type:"error",turnId:o,error:"Turn aborted",code:"ABORTED"};return}let y=await Ke(p,o,n,f,r,{hooks:h,sessionId:c});y.blocked&&(yield{type:"tool_blocked",turnId:o,callId:y.callId,name:y.toolName,reason:y.blockReason??"blocked"}),v.push(y.message),ie.push(y.callId),B.add(y.toolName),x++,yield{type:"tool_result",turnId:o,callId:y.callId,name:y.toolName,ok:y.ok,error:y.error}}}catch(l){let p=l instanceof Error?l.message:String(l);yield{type:"error",turnId:o,error:p,code:"TOOL_EXECUTION_ERROR"};return}k=Z(k,{replayMessages:v,completedToolCallIds:[...k.completedToolCallIds,...ie],lastStopReason:ve.mode});let Se=v.slice(-M.length);if(Se.length>0&&Se.every(l=>{let p=l?.content;if(typeof p!="string")return!1;try{return JSON.parse(p)?.ok===!1}catch{return!1}})){if(U+=1,U>=Zt&&D){r.info(`early exit: ${U} consecutive failed rounds, returning partial response`),yield{type:"end",turnId:o,content:D,usage:P};return}}else U=0}if(D){if(r.info(`tool loop budget exhausted (${_} rounds), returning partial response`),N&&(yield{type:"sidechain_completed",turnId:o,depth:w,toolCallCount:x}),x>0){let S={ok:!0,toolCallCount:x,distinctToolCount:B.size,multiStep:x>=2,hasSidechain:N,feedback:null,existingSkillName:null},R=V(S,{tools:[...B]});R&&(yield{type:"skill_instruction",turnId:o,instruction:R})}yield{type:"end",turnId:o,content:D,usage:P,model:a};return}yield{type:"error",turnId:o,error:`Tool loop exceeded budget (${_} rounds)`,code:"TOOL_LOOP_LIMIT"}}async function Ke(e,t,n,r,o,c){let s=e.function.name;o.debug(`tool_call: ${s}`);let i=c?.hooks,a=e.function.arguments;if(i)try{let f=await i.invoke("tool.before_invoke",{sessionId:c?.sessionId??"",turnId:t,callId:e.id,toolName:s,arguments:tn(e.function.arguments)});if(f.action==="abort"){let m=f.reason??"blocked by policy";o.info(`tool ${s} blocked: ${m}`),i.invoke("approval.requested",{sessionId:c?.sessionId??"",turnId:t,approvalId:e.id,callId:e.id,toolName:s}).catch(()=>{});let g=G(e.id,{ok:!1,error:m});return{callId:e.id,toolName:s,ok:!1,error:m,blocked:!0,blockReason:m,message:g}}f.action==="continue"&&f.context?.arguments&&(a=JSON.stringify(f.context.arguments),o.debug(`tool ${s}: input mutated by hook`))}catch{}let u=await n.invoke(t,s,a,r),d=!u.error,h=G(e.id,{ok:d,payload:u.result,error:u.error});return i?.invoke(d?"tool.after_invoke":"tool.invoke_failed",{sessionId:c?.sessionId??"",turnId:t,callId:e.id,toolName:s,ok:d,...u.error?{error:u.error}:{}}).catch(()=>{}),{callId:e.id,toolName:s,ok:d,error:u.error,message:h}}function tn(e){try{return JSON.parse(e)}catch{return}}async function*nn(e,t,n,r,o,c,s,i){let a=[],u;i.debug(`single LLM round, messages: ${n.length}`);for await(let d of s.stream({model:t,messages:n,temperature:o},r,c))switch(d.type){case"delta":a.push(d.text),yield{type:"delta",turnId:e,text:d.text};break;case"usage":u={prompt:d.promptTokens,completion:d.completionTokens,reasoning:d.reasoningTokens};break;case"done":break}yield{type:"end",turnId:e,content:a.join(""),usage:u??{prompt:0,completion:0},model:t}}var Je=100,Qe=class{transport;apiKey;toolInvoker;log;hooks;maxRounds;constructor(t){this.transport=t.llmTransport,this.apiKey=t.apiKey,this.toolInvoker=t.toolInvoker,this.log=t.log,this.hooks=t.hooks,this.maxRounds=Math.min(t.maxRounds??25,Je)}async*run(t,n){let{turnId:r,messages:o,tools:c,systemPrompt:s,config:i}=t,a={sessionId:t.sessionId,turnId:r};yield{type:"start",turnId:r},this.hooks?.invoke("turn.submitted",{...a,prompt:o[o.length-1]?.content??void 0}).catch(()=>{});let u=de(o),d=[];s&&d.push({role:"system",content:s}),d.push(...u);let h=i?.model??"",f=Math.min(i?.maxRounds??this.maxRounds,Je);try{let m={turnId:r,sessionId:t.sessionId,messages:d,tools:c,model:h,apiKey:i?.apiKey??this.apiKey,temperature:i?.temperature,maxRounds:f,contextWindowTokens:i?.contextWindowTokens,maxOutputTokens:i?.maxOutputTokens,modelMaxOutputTokens:i?.modelMaxOutputTokens,toolChoice:i?.toolChoice,parentDepth:i?.parentDepth,hooks:this.hooks,signal:n},g;for await(let I of Xe(m,this.transport,this.toolInvoker,this.log))g=I,yield I;g?.type==="end"?this.hooks?.invoke("turn.completed",{...a}).catch(()=>{}):g?.type==="error"&&this.hooks?.invoke("turn.failed",{...a,code:g.code,error:g.error}).catch(()=>{})}catch(m){if(n?.aborted)this.hooks?.invoke("turn.failed",{...a,code:"ABORTED",error:"Turn aborted"}).catch(()=>{}),yield{type:"error",turnId:r,error:"Turn aborted",code:"ABORTED"};else{let g=m instanceof Error?m.message:String(m),I=typeof m?.status=="number"?m.status:void 0,E=j(I,g),_=ce(E);this.log.error(`turn ${r} error [${E}, retryable=${_.retryable}]: ${g}`),this.hooks?.invoke("turn.failed",{...a,code:E,error:g}).catch(()=>{}),yield{type:"error",turnId:r,error:g,code:E}}}}};export{Qe as Agent};
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
#!/usr/bin/env node
|
|
3
|
+
var Ct=Object.defineProperty;var vt=(e,t)=>()=>(e&&(t=e(e=0)),t);var xt=(e,t)=>{for(var n in t)Ct(e,n,{get:t[n],enumerable:!0})};var nt={};xt(nt,{resolveToolEligibility:()=>bn});function hn(e,t){if(fn.some(n=>n.test(e)))return!0;if(t)for(let n of t)try{if(new RegExp(n,"i").test(e))return!0}catch{}return!1}function yn(e,t){let n=e.function.name,o=e.meta,r=[];return t.blockedToolNames?.includes(n)?(r.push("policy_blocked"),{level:5,reasons:r}):o?.isReadOnly?(r.push("always_allowed"),{level:1,reasons:r}):o?.requiresApproval?(r.push("approval_required"),{level:4,reasons:r}):o?.isDangerous||hn(n,t.dangerousPatterns)?(r.push("dangerous_tool"),{level:3,reasons:r}):{level:2,reasons:r}}function Tn(e){switch(e){case 1:return"eligible";case 2:return"eligible";case 3:return"dangerous-notify";case 4:return"approval-required";case 5:return"blocked-by-policy"}}function bn(e,t={}){let n=new Map,o=[],r=[],i=[];for(let s of e){let a=s.function.name,{level:l,reasons:u}=yn(s,t),d=Tn(l),m={toolName:a,status:d,permissionLevel:l,approvalRequired:l===4,reasonCodes:u};n.set(a,m),l===5?r.push(m):(o.push(s),l===4&&i.push(m))}return{eligibleTools:o,blockedTools:r,approvalRequiredTools:i,eligibilityByName:n}}var fn,ot=vt(()=>{"use strict";fn=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:write_file|delete_file|move_file|create_directory)$/i,/^(?:git_push|git_reset|git_force)$/i]});import{createInterface as Un}from"node:readline";import{randomUUID as ft}from"node:crypto";function me(e){return{role:"assistant",content:"",tool_calls:e}}function J(e,t){return{role:"tool",tool_call_id:e,content:JSON.stringify(t.ok?{ok:!0,payload:t.payload}:{ok:!1,error:t.error??"Tool invoke failed"})}}var Rt=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,O={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]},St=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,At=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,Mt=512,_t=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i;var wt=new Set([500,502,503,504,521,522,523,524,529]),Et=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],It=["upgrade your plan","upgrade plan","current plan","subscription"],Pt=["daily","weekly","monthly"],Lt=["try again","retry","temporary","cooldown"],Ot=["usage limit","rate limit","organization usage"],Ft=["organization","workspace"],Nt=["billing period","exceeded","reached","exhausted"],Dt=/["']?(?: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,Bt=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i;function F(e,t){if(!e)return!1;let n=e.toLowerCase();return t.some(o=>o instanceof RegExp?o.test(n):n.includes(o))}function $t(e){return F(e,O.format)}function De(e){return F(e,O.rateLimit)}function fe(e){return F(e,O.timeout)}function Ut(e){return Rt.test(e)}function ge(e){let t=e.toLowerCase();return t?e.length>Mt?At.test(t):F(t,O.billing)?!0:St.test(e)?t.includes("upgrade")||t.includes("credits")||t.includes("payment")||t.includes("plan"):!1:!1}function Be(e){return F(e,O.authPermanent)}function Ht(e){return F(e,O.auth)}function $e(e){return F(e,O.overloaded)}function L(e,t){return t.some(n=>e.includes(n))}function jt(e){return L(e,Et)||L(e,It)&&e.includes("limit")||e.includes("billing hard limit")||e.includes("hard limit reached")||e.includes("maximum allowed")&&e.includes("limit")}function qt(e){let t=L(e,Pt),n=e.includes("spend limit")||e.includes("spending limit"),o=L(e,Ft);return L(e,Lt)&&L(e,Ot)||t&&(e.includes("usage limit")||n)||t&&e.includes("limit")&&e.includes("reset")||o&&e.includes("limit")&&(n||L(e,Nt))}function zt(e){return e.trim().toLowerCase().replace(Bt,"").trim()}function Ue(e){let t=zt(e);return!t||jt(t)?"billing":De(t)||qt(t)?"rate_limit":"billing"}function Kt(e){return Dt.test(e)?Ue(e):null}function He(e){let t=e.match(_t);if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?{code:n,rest:(t[2]??"").trim()}:null}function Wt(e){if(!e)return!1;let t=e.toLowerCase();return t.includes('"type":"api_error"')&&t.includes("internal server error")}function je(e){let t=e.trim();if(!t)return!1;let n=He(t);return n?wt.has(n.code):!1}function X(e,t){return typeof e!="number"||!Number.isFinite(e)?null:e===402?t?Ue(t):"billing":e===429?"rate_limit":e===401||e===403?t&&Be(t)?"auth_permanent":"auth":e===408?"timeout":e===503?t&&$e(t)?"overloaded":"timeout":e===502||e===504?"timeout":e===529?"overloaded":e===400?t&&ge(t)?"billing":"format":null}function qe(e){if(!e)return!1;let t=e.toLowerCase();return!!(t.includes("unknown model")||t.includes("model not found")||t.includes("model_not_found")||t.includes("not_found_error")||t.includes("does not exist")&&t.includes("model")||t.includes("invalid model")&&!t.includes("invalid model reference")||/models\/[^\s]+ is not found/i.test(e)||/\b404\b/.test(e)&&/not[-_ ]?found/i.test(e))}function Gt(e){if(!e)return!1;let t=e.toLowerCase();return t.includes("session not found")||t.includes("session does not exist")||t.includes("session expired")||t.includes("session invalid")||t.includes("conversation not found")||t.includes("conversation does not exist")||t.includes("conversation expired")||t.includes("conversation invalid")||t.includes("no such session")||t.includes("invalid session")||t.includes("session id not found")||t.includes("conversation id not found")}function Q(e){if(Gt(e))return"session_expired";if(qe(e))return"model_not_found";let t=Kt(e);return t||(Ut(e)?ge(e)?"billing":"rate_limit":De(e)?"rate_limit":$e(e)?"overloaded":je(e)?He(e.trim())?.code===529?"overloaded":"timeout":Wt(e)?"timeout":$t(e)?"format":ge(e)?"billing":fe(e)?"timeout":Be(e)?"auth_permanent":Ht(e)?"auth":null)}var Yt={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"},Vt={RETRYABLE_TRANSIENT:{retryable:!0,maxRetries:3,baseDelayMs:1e3,backoffMultiplier:2,switchProvider:!0},RETRYABLE_DEGRADED:{retryable:!0,maxRetries:2,baseDelayMs:5e3,backoffMultiplier:3,switchProvider:!0},NON_RETRYABLE_AUTH:{retryable:!1,maxRetries:0,baseDelayMs:0,backoffMultiplier:1,switchProvider:!0},NON_RETRYABLE_CONTENT:{retryable:!1,maxRetries:0,baseDelayMs:0,backoffMultiplier:1,switchProvider:!1},NON_RETRYABLE_QUOTA:{retryable:!1,maxRetries:0,baseDelayMs:0,backoffMultiplier:1,switchProvider:!0},TOOL_EXECUTION_FAILED:{retryable:!0,maxRetries:1,baseDelayMs:500,backoffMultiplier:1,switchProvider:!1}};function U(e,t){let n=X(e,t)??(t?Q(t):null);return n?Yt[n]:typeof e=="number"&&e>=400&&e<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function he(e){return Vt[e]}function ze(e){return!(!e.ok||e.existingSkillName||!e.multiStep||e.toolCallCount<3||e.distinctToolCount<2)}function Ke(e){return e.existingSkillName?e.feedback==="negative":!1}function Z(e,t){return Ke(e)?{type:"skill.improve",skillName:e.existingSkillName,reason:"negative user feedback on existing skill execution"}:ze(e)?{type:"skill.create",suggestedName:t.suggestedName??`auto-skill-${t.tools.slice(0,3).join("-")}`,description:`Multi-step orchestration using ${t.tools.join(", ")}`,tools:t.tools,stepCount:e.toolCallCount}:null}function We(e){return e.function&&typeof e.function=="object"&&typeof e.function.name=="string"?e.function.name.trim():typeof e.name=="string"?e.name.trim():""}function Jt(e){return e==="enabled-eligible"||e==="installed-awaiting-approval"}function Xt(e){return new Map((e??[]).map(t=>[t.toolName,t]))}function Ge(e){if(!e.eligibility?.length)return[...e.tools];let t=Xt(e.eligibility);return e.tools.filter(n=>{let o=We(n);if(!o)return!1;let r=t.get(o);return!r||Jt(r.status)})}function Ye(e){let t=[],n=e.compatibility??{},o=e.toolChoice;if(e.thinkingEnabled&&n.requireAutoWhenThinking){let r=typeof o=="object"&&o&&!Array.isArray(o)?String(o.type??""):o;r&&r!=="auto"&&r!=="none"&&(t.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),o="auto")}if(o==="required"&&n.allowRequiredToolChoice===!1){let r=n.requiredFallback??"auto";t.push(`tool_choice=required is not supported by this provider; downgraded to ${r}.`),o=r}if(o&&typeof o=="object"&&!Array.isArray(o)&&o.type==="function"&&n.allowNamedToolChoice===!1){let r=n.namedFallback??"required";t.push(`named tool_choice is not supported by this provider; downgraded to ${r}.`),o=r}return{normalizedToolChoice:o,warnings:t}}function ye(e){let t=Ye({toolChoice:e.toolChoice,thinkingEnabled:e.thinkingEnabled,compatibility:e.compatibility}),n=t.normalizedToolChoice,o=[...t.warnings],r=Ge({tools:e.tools,eligibility:e.eligibility});if(!n||n==="auto")return{tools:r,normalizedToolChoice:n,warnings:o};if(n==="none")return{tools:[],normalizedToolChoice:"none",warnings:o};if(n==="required"){if(r.length===0)throw new Error("tool_choice=required but no tools were provided");return{tools:r,normalizedToolChoice:"required",extraSystemPrompt:"You must call one of the available tools before responding.",warnings:o}}if(typeof n=="object"&&!Array.isArray(n)&&n.type==="function"){let i=n.function??void 0,s=typeof i?.name=="string"?i.name.trim():"";if(!s)throw new Error("tool_choice.function.name is required");let a=r.filter(l=>We(l)===s);if(a.length===0)throw new Error(`tool_choice requested unknown tool: ${s}`);return{tools:a,normalizedToolChoice:{type:"function",function:{name:s}},extraSystemPrompt:`You must call the ${s} tool before responding.`,warnings:o}}return{tools:r,normalizedToolChoice:n,warnings:o}}var Qt=["stop","aborted","timeout","cancelled","interrupted","error"],Zt=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function Ve(e){return e==null?[]:typeof e=="string"?e.length>0?[{type:"text",text:e}]:[]:Array.isArray(e)?e:[{type:"text",text:String(e)}]}function en(e,t){return{...e,content:[...Ve(e.content),...Ve(t.content)]}}function tn(e){if(!e||typeof e!="object")return!1;if(e.function&&typeof e.function=="object"){let t=e.function.name;if(typeof t=="string"&&t.length>0)return!0}return typeof e.name=="string"&&e.name.length>0}function nn(e){return new Set((e??Qt).map(t=>t.trim().toLowerCase()))}function on(e,t){return e?nn(t).has(e.trim().toLowerCase()):!1}function ee(e){if(!Array.isArray(e)||e.length===0)return[...e];let t=e.map(a=>{if(a.role==="assistant"&&Array.isArray(a.tool_calls)){let l=a.tool_calls.filter(u=>tn(u));return{...a,...l.length>0?{tool_calls:l}:{tool_calls:void 0}}}return{...a}}),n=new Set;for(let a of t)if(!(a.role!=="assistant"||!Array.isArray(a.tool_calls)))for(let l of a.tool_calls)typeof l.id=="string"&&l.id&&n.add(l.id);let o=t.filter(a=>a.role!=="tool"?!0:!!(a.tool_call_id&&n.has(a.tool_call_id))),r=new Set;for(let a of o)a.role==="tool"&&typeof a.tool_call_id=="string"&&a.tool_call_id&&r.add(a.tool_call_id);let i=[];for(let a of o){if(a.role==="assistant"&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0){let l=a.tool_calls.filter(u=>typeof u.id=="string"&&r.has(u.id));if(l.length===0){let{tool_calls:u,...d}=a;d.content!=null&&d.content!==""&&i.push(d);continue}if(l.length<a.tool_calls.length){i.push({...a,tool_calls:l});continue}}i.push(a)}let s=[];for(let a of i){let l=s.length>0?s[s.length-1]:void 0;if(a.role==="user"&&l?.role==="user"){s[s.length-1]=en(l,a);continue}s.push(a)}return s}function te(e,t){return on(t?.stopReason,t?.forcedStopReasons)?e.map(n=>{if(n.role!=="assistant")return{...n};let o={...n};for(let r of Zt)delete o[r];return o}):[...e]}function ne(e,t){let n=t?.placeholderToolResult??JSON.stringify({ok:!1,error:"Tool loop interrupted before the tool result was replayed."}),o=new Set;for(let i of e)i.role==="tool"&&typeof i.tool_call_id=="string"&&i.tool_call_id&&o.add(i.tool_call_id);let r=[];for(let i of e)if(r.push({...i}),!(i.role!=="assistant"||!Array.isArray(i.tool_calls)||i.tool_calls.length===0))for(let s of i.tool_calls)typeof s.id!="string"||!s.id||o.has(s.id)||(o.add(s.id),r.push({role:"tool",tool_call_id:s.id,content:n}));return r}function Te(e,t){let n=ee(e),o=te(n,t);return ne(o,t)}function Je(e){if(e!==void 0)return typeof e=="boolean"?{kind:"enabled",enabled:e}:e===null?{kind:"suppressed"}:{kind:"invalid",summary:typeof e=="string"?e:typeof e}}function be(e){let t=[],n=Je(e.requestedPreference),o=new Map((e.toolCapabilities??[]).map(l=>[l.name,l])),r=e.providerSupportsParallel!==!1;n?.kind==="enabled"?r=n.enabled&&e.providerSupportsParallel!==!1:n?.kind==="suppressed"?r=!1:n?.kind==="invalid"&&t.push(`ignoring invalid parallel_tool_calls param: ${n.summary}`),r&&e.providerSupportsParallel===!1&&t.push("provider does not support parallel tool calls; downgraded to serial execution.");let i=[],s=[],a=()=>{s.length!==0&&(i.push({mode:"parallel",calls:s}),s=[])};for(let l of e.toolCalls){let u=o.get(l.function.name);if(!r||u?.requiresApproval===!0||u?.serialOnly===!0||u?.parallelSafe===!1||u?.approvalMode==="user-confirm"){a(),i.push({mode:"serial",calls:[l]});continue}s.push(l)}return a(),{enabled:r,mode:i.some(l=>l.mode==="parallel"&&l.calls.length>1)?"parallel":"serial",batches:i,warnings:t}}function sn(e){let t=new Set,n=new Set;for(let o of e){if(o.role==="assistant"&&Array.isArray(o.tool_calls))for(let r of o.tool_calls)typeof r.id=="string"&&r.id&&t.add(r.id);o.role==="tool"&&typeof o.tool_call_id=="string"&&o.tool_call_id&&n.add(o.tool_call_id)}return[...t].filter(o=>!n.has(o))}function an(e){let t=new Set;for(let n of e)n.role==="tool"&&typeof n.tool_call_id=="string"&&n.tool_call_id&&t.add(n.tool_call_id);return[...t]}function Xe(e){return{round:e.round??0,maxRounds:e.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??[]],completedToolCallIds:[...e.completedToolCallIds??[]],lastStopReason:e.lastStopReason,replayMessages:[...e.replayMessages??[]]}}function ke(e,t){return{round:e.round+1,maxRounds:e.maxRounds,pendingToolCallIds:[...t.pendingToolCallIds??e.pendingToolCallIds],completedToolCallIds:[...t.completedToolCallIds??e.completedToolCallIds],lastStopReason:t.lastStopReason??e.lastStopReason,replayMessages:[...t.replayMessages??e.replayMessages]}}function oe(e,t){return{round:e.round,maxRounds:e.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...t.completedToolCallIds??e.completedToolCallIds],lastStopReason:t.lastStopReason??e.lastStopReason,replayMessages:[...t.replayMessages??e.replayMessages]}}function re(e){let t=[],n=ee(e.replayMessages);n.length!==e.replayMessages.length&&t.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let o=te(n,e.options);o.some((i,s)=>i!==n[s])&&t.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let r=ne(o,e.options);return r.length>o.length&&t.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:Xe({maxRounds:e.maxRounds,round:e.round,lastStopReason:e.lastStopReason,replayMessages:r,pendingToolCallIds:sn(r),completedToolCallIds:an(r)}),recoveryActions:t}}import{MEMORY_OBSERVATION_HOOK_VALUES as ln,MEMORY_OBSERVATION_SOURCE_VALUES as cn,MEMORY_WRITE_ACCESS_VALUES as un}from"qlogicagent-runtime-contracts";function Ce(e){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:e.maxOutputTokens,consecutiveTruncations:0,aborted:e.abortSignal?.aborted??!1}}function ve(e,t){if(e.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let n=t.contextWindowTokens-t.responseBufferTokens-e.currentMaxOutputTokens,o=n>0?e.promptTokens/n*100:100;return e.promptTokens>=n?e.hasAttemptedReactiveCompact||!t.reactiveCompactEnabled?{level:"blocking",usagePercent:o,reason:"prompt_too_long"}:{level:"blocking",usagePercent:o,reason:"prompt_too_long"}:o>=85?{level:"warning",usagePercent:o,remainingTokens:n-e.promptTokens}:{level:"ok"}}function xe(e,t,n){let o=e.message?.toLowerCase()??"",r=e.status??0;return r===413||o.includes("prompt_too_long")||o.includes("context_length_exceeded")?!t.hasAttemptedReactiveCompact&&n.reactiveCompactEnabled?{action:"reactive_compact"}:{action:"abort",reason:"prompt_too_long_unrecoverable"}:r>=500&&r<600?{action:"retry",reason:`server_error_${r}`}:r===429?{action:"retry",reason:"rate_limited"}:{action:"abort",reason:o||"unknown_error"}}function Re(e,t,n){if(!t.outputEscalationEnabled)return{shouldEscalate:!1,newMax:e.currentMaxOutputTokens};if(e.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:e.currentMaxOutputTokens};let o=Math.min(e.currentMaxOutputTokens*2,n);return o<=e.currentMaxOutputTokens?{shouldEscalate:!1,newMax:e.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:o}}function Se(e,t){return e.aborted?!0:t.abortSignal?.aborted?(e.aborted=!0,!0):!1}var Qe={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function Ae(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function ie(e,t=Qe){return!(e.attemptedThisTurn||e.consecutiveFailures>=t.maxConsecutiveFailures)}var dn={research:{type:"research",label:"Research",description:"Independent retrieval or evidence gathering branches.",mergePolicy:"summary-only",budgetTier:"medium",budgetWeight:2,preferFullContext:!1,preserveConversationHistory:!0,toolAccessMode:"read-only"},planner:{type:"planner",label:"Planner",description:"Planning and tool orchestration branches that may return structured context.",mergePolicy:"append-messages",budgetTier:"high",budgetWeight:3,preferFullContext:!0,preserveConversationHistory:!0,toolAccessMode:"none"},"plan-repair":{type:"plan-repair",label:"Plan Repair",description:"Failure repair or fallback branches that re-plan tool choice, ordering, or approval strategy.",mergePolicy:"replace-context",budgetTier:"medium",budgetWeight:2,preferFullContext:!0,preserveConversationHistory:!1,toolAccessMode:"none"},"code-repair":{type:"code-repair",label:"Code Repair",description:"Recovery branches focused on file edits, patch validation, or workspace mutation repair.",mergePolicy:"replace-context",budgetTier:"high",budgetWeight:3,preferFullContext:!0,preserveConversationHistory:!1,toolAccessMode:"full"},"media-prep":{type:"media-prep",label:"Media Prep",description:"Preparation branches for media generation, normalization, or staging.",mergePolicy:"summary-only",budgetTier:"low",budgetWeight:1,preferFullContext:!1,preserveConversationHistory:!1,toolAccessMode:"read-only"}},Me=["gateway","agents_list","whatsapp_login","session_status","cron","memory_query","sessions_send"],pn=["sessions_list","sessions_history","sessions_spawn"],Ze=["file_edit","create_file","replace_string_in_file","multi_replace_string_in_file","create_directory","run_in_terminal","run_command","delete_file","rename_file","move_file","git_commit","git_push","manage_todo_list"];function mn(e={}){let t=Math.max(1,Math.floor(e.maxDepth??2)),n=typeof e.depth=="number"&&Number.isFinite(e.depth)?Math.max(0,Math.floor(e.depth)):t,o=e.role?e.role==="leaf":n>=t,r=o?[...Me,...pn]:[...Me],i=new Set(r),s=Array.isArray(e.toolNames)?e.toolNames:e.toolNames?Array.from(e.toolNames):[],a=Array.from(new Set(s.map(l=>l.trim()).filter(Boolean))).map(l=>{let u=i.has(l);return{toolName:l,decision:u?"denied":"allowed",inheritance:u?"shrink":"inherit",reason:u?Me.includes(l)?"always-deny":"leaf-deny":"default-allow"}});return{deniedTools:r,canSpawnChildren:!o,defaultDecision:"allowed",defaultInheritance:"inherit",tools:a}}function et(e){let t=gn(e.type),n=mn({depth:e.depth,maxDepth:e.maxDepth,role:e.role,toolNames:e.toolNames});if(t.toolAccessMode==="full")return n;if(t.toolAccessMode==="none"){let i=Array.isArray(e.toolNames)?e.toolNames:e.toolNames?Array.from(e.toolNames):[],s=[...new Set(i.map(a=>a.trim()).filter(Boolean))];return{deniedTools:s,canSpawnChildren:!1,defaultDecision:"allowed",defaultInheritance:"inherit",tools:s.map(a=>({toolName:a,decision:"denied",inheritance:"shrink",reason:"always-deny"}))}}let o=new Set(Ze),r=[...new Set([...n.deniedTools,...Ze])];return{...n,deniedTools:r,tools:n.tools.map(i=>i.decision==="denied"?i:o.has(i.toolName)?{...i,decision:"denied",inheritance:"shrink",reason:"always-deny"}:i)}}function tt(e,t){let n=new Set(t.deniedTools),o=new Map(t.tools.map(s=>[s.toolName,s])),r=[],i=[];for(let s of e){let a=s.function.name,l=o.get(a);l?.decision==="denied"?i.push({toolCall:s,reason:`tool "${a}" denied by sidechain policy: ${l.reason}`}):n.has(a)?i.push({toolCall:s,reason:`tool "${a}" is in sidechain deny list`}):r.push(s)}return{allowed:r,denied:i}}function gn(e){return dn[e]}function _e(e,t){let n=e.get(t.index);n||(n={id:"",name:"",arguments:""},e.set(t.index,n)),t.id&&(n.id=t.id),t.name&&(n.name+=t.name),n.arguments+=t.arguments}var it=100,kn=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),it),Cn=3,H=2;function vn(e){return typeof e=="number"&&Number.isFinite(e)&&e>=1?Math.min(Math.round(e),it):kn}async function*st(e,t,n,o){let{turnId:r,sessionId:i,messages:s,tools:a,model:l,apiKey:u,temperature:d,hooks:m,signal:c}=e,g={sessionId:i,turnId:r},{resolveToolEligibility:h}=await Promise.resolve().then(()=>(ot(),nt)),R=h(a,e.toolEligibilityContext),w=R.eligibleTools;for(let A of R.blockedTools)yield{type:"tool_blocked",turnId:r,callId:"",name:A.toolName,reason:"blocked-by-policy"};if(!w.length){yield*Rn(r,l,s,u,d,c,t,o);return}let E=vn(e.maxRounds),S=[...s],C=re({maxRounds:E,replayMessages:S}).state,$={contextWindowTokens:e.contextWindowTokens??128e3,responseBufferTokens:13e3,maxOutputTokens:e.maxOutputTokens??16384,abortSignal:c,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},b=Ce($),W=Ae(),N=!1,ce=null,I=(e.parentDepth??0)+1,kt,D="",G=0,P={prompt:0,completion:0},B=new Set,v=0;for(let A=0;A<E;A++){if(Se(b,$)){o.info(`turn aborted by guard at round ${A}`);break}let x=ve(b,$);if(x.level==="blocking"){x.reason==="prompt_too_long"&&ie(W)&&(W.attemptedThisTurn=!0,b.hasAttemptedReactiveCompact=!0,o.info(`token budget blocking (${x.reason}), reactive compact needed`)),o.info(`token budget blocking (${x.reason}), breaking tool loop`);break}x.level==="warning"&&o.info(`token budget warning: ${x.usagePercent}% used, ${x.remainingTokens} remaining`);let Y=ye({tools:w,toolChoice:e.toolChoice??"auto"}),V=re({maxRounds:E,replayMessages:S,lastStopReason:C.lastStopReason,options:{stopReason:C.lastStopReason}}),Pe=Y.extraSystemPrompt?[{role:"system",content:Y.extraSystemPrompt},...V.state.replayMessages]:V.state.replayMessages;V.recoveryActions.length>0&&o.debug(`tool loop recovery: ${V.recoveryActions.map(p=>p.detail??p.kind).join("; ")}`),o.debug(`round ${A+1}/${E}, messages: ${Pe.length}`),m?.invoke("turn.before_inference",{...g,model:l}).catch(()=>{});let ue=!1,Le=[],Oe=new Map,de="stop",M,k=null;try{for await(let p of t.stream({model:l,messages:Pe,tools:Y.tools,toolChoice:Y.normalizedToolChoice??"auto",temperature:d,maxTokens:b.currentMaxOutputTokens||void 0},u,c))switch(p.type){case"delta":Le.push(p.text),ue||(yield{type:"delta",turnId:r,text:p.text});break;case"tool_call_delta":ue=!0,_e(Oe,p);break;case"reasoning_delta":break;case"usage":M={prompt:p.promptTokens,completion:p.completionTokens,reasoning:p.reasoningTokens};break;case"done":de=p.finishReason;break}ue||m?.invoke("turn.after_inference",{...g,model:l}).catch(()=>{})}catch(p){let f=p instanceof Error?p.message:String(p);k={status:typeof p?.status=="number"?p.status:void 0,message:f}}if(k&&m?.invoke("turn.after_inference",{...g,model:l,response:{error:k.message}}).catch(()=>{}),k){let p=xe({status:k.status??500,message:k.message},b,$);if(p.action==="reactive_compact"&&ie(W)&&(W.attemptedThisTurn=!0,b.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:r,action:"reactive_compact",detail:`API ${k.status??500}: ${k.message}`}),p.action==="retry"){yield{type:"recovery",turnId:r,action:"retry",detail:p.reason};continue}let f=U(k.status,k.message);yield{type:"error",turnId:r,error:k.message,code:f};return}if(M&&(P.prompt+=M.prompt,P.completion+=M.completion,M.reasoning&&(P.reasoning=(P.reasoning??0)+M.reasoning)),M?.prompt&&(b.promptTokens=M.prompt),de==="length"||de==="max_tokens"){b.consecutiveTruncations+=1;let p=e.modelMaxOutputTokens??65536,f=Re(b,$,p);f.shouldEscalate&&(b.currentMaxOutputTokens=f.newMax,yield{type:"recovery",turnId:r,action:"output_escalation",detail:`${f.newMax} tokens`})}else b.consecutiveTruncations=0;kt=M,D=Le.join("");let _=[...Oe.values()].map(p=>({id:p.id||`tc_${r}_${A}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:p.name,arguments:p.arguments}}));if(ce&&_.length>0){let p=tt(_,ce);p.denied.length>0&&o.info(`sidechain policy denied: ${p.denied.map(f=>`${f.toolCall.function.name} (${f.reason})`).join(", ")}`),_=p.allowed}if(_.length===0){if(C=oe(C,{replayMessages:S,lastStopReason:"completed"}),N&&(yield{type:"sidechain_completed",turnId:r,depth:I,toolCallCount:v}),v>0){let p={ok:!0,toolCallCount:v,distinctToolCount:B.size,multiStep:v>=2,hasSidechain:N,feedback:null,existingSkillName:null},f=Z(p,{tools:[...B]});f&&(yield{type:"skill_instruction",turnId:r,instruction:f})}yield{type:"end",turnId:r,content:D,usage:P,model:l};return}for(let p of _)yield{type:"tool_call",turnId:r,callId:p.id,name:p.function.name,arguments:p.function.arguments};if(S.push(me(_)),!N){if(I>H){yield{type:"error",turnId:r,error:`sidechain depth ${I} exceeds max ${H}`,code:"SIDECHAIN_DEPTH_LIMIT"};return}N=!0;let p=I>=H?"leaf":"orchestrator";yield{type:"sidechain_started",turnId:r,depth:I,role:p},ce=et({type:"planner",depth:I,maxDepth:H,role:I>=H?"leaf":"orchestrator",toolNames:a.map(f=>f.function.name)})}C=ke(C,{replayMessages:S,pendingToolCallIds:_.map(p=>p.id),completedToolCallIds:C.completedToolCallIds,lastStopReason:"tool_calls"});let Fe=be({requestedPreference:void 0,providerSupportsParallel:!0,toolCalls:_,toolCapabilities:w.map(p=>({name:p.function.name,requiresApproval:p.meta?.requiresApproval??!1,approvalMode:p.meta?.requiresApproval?"user-confirm":"pre-authorized",parallelSafe:p.meta?.parallelSafe??!0,serialOnly:p.meta?.serialOnly??!1}))}),pe=[];try{for(let p of Fe.batches)if(p.mode==="parallel"){let f={hooks:m,sessionId:i},y=await Promise.all(p.calls.map(T=>rt(T,r,n,c,o,f)));for(let T of y)T.blocked&&(yield{type:"tool_blocked",turnId:r,callId:T.callId,name:T.toolName,reason:T.blockReason??"blocked"}),S.push(T.message),pe.push(T.callId),B.add(T.toolName),v++,yield{type:"tool_result",turnId:r,callId:T.callId,name:T.toolName,ok:T.ok,error:T.error}}else for(let f of p.calls){if(c?.aborted){yield{type:"error",turnId:r,error:"Turn aborted",code:"ABORTED"};return}let y=await rt(f,r,n,c,o,{hooks:m,sessionId:i});y.blocked&&(yield{type:"tool_blocked",turnId:r,callId:y.callId,name:y.toolName,reason:y.blockReason??"blocked"}),S.push(y.message),pe.push(y.callId),B.add(y.toolName),v++,yield{type:"tool_result",turnId:r,callId:y.callId,name:y.toolName,ok:y.ok,error:y.error}}}catch(p){let f=p instanceof Error?p.message:String(p);yield{type:"error",turnId:r,error:f,code:"TOOL_EXECUTION_ERROR"};return}C=oe(C,{replayMessages:S,completedToolCallIds:[...C.completedToolCallIds,...pe],lastStopReason:Fe.mode});let Ne=S.slice(-_.length);if(Ne.length>0&&Ne.every(p=>{let f=p?.content;if(typeof f!="string")return!1;try{return JSON.parse(f)?.ok===!1}catch{return!1}})){if(G+=1,G>=Cn&&D){o.info(`early exit: ${G} consecutive failed rounds, returning partial response`),yield{type:"end",turnId:r,content:D,usage:P};return}}else G=0}if(D){if(o.info(`tool loop budget exhausted (${E} rounds), returning partial response`),N&&(yield{type:"sidechain_completed",turnId:r,depth:I,toolCallCount:v}),v>0){let A={ok:!0,toolCallCount:v,distinctToolCount:B.size,multiStep:v>=2,hasSidechain:N,feedback:null,existingSkillName:null},x=Z(A,{tools:[...B]});x&&(yield{type:"skill_instruction",turnId:r,instruction:x})}yield{type:"end",turnId:r,content:D,usage:P,model:l};return}yield{type:"error",turnId:r,error:`Tool loop exceeded budget (${E} rounds)`,code:"TOOL_LOOP_LIMIT"}}async function rt(e,t,n,o,r,i){let s=e.function.name;r.debug(`tool_call: ${s}`);let a=i?.hooks,l=e.function.arguments;if(a)try{let c=await a.invoke("tool.before_invoke",{sessionId:i?.sessionId??"",turnId:t,callId:e.id,toolName:s,arguments:xn(e.function.arguments)});if(c.action==="abort"){let g=c.reason??"blocked by policy";r.info(`tool ${s} blocked: ${g}`),a.invoke("approval.requested",{sessionId:i?.sessionId??"",turnId:t,approvalId:e.id,callId:e.id,toolName:s}).catch(()=>{});let h=J(e.id,{ok:!1,error:g});return{callId:e.id,toolName:s,ok:!1,error:g,blocked:!0,blockReason:g,message:h}}c.action==="continue"&&c.context?.arguments&&(l=JSON.stringify(c.context.arguments),r.debug(`tool ${s}: input mutated by hook`))}catch{}let u=await n.invoke(t,s,l,o),d=!u.error,m=J(e.id,{ok:d,payload:u.result,error:u.error});return a?.invoke(d?"tool.after_invoke":"tool.invoke_failed",{sessionId:i?.sessionId??"",turnId:t,callId:e.id,toolName:s,ok:d,...u.error?{error:u.error}:{}}).catch(()=>{}),{callId:e.id,toolName:s,ok:d,error:u.error,message:m}}function xn(e){try{return JSON.parse(e)}catch{return}}async function*Rn(e,t,n,o,r,i,s,a){let l=[],u;a.debug(`single LLM round, messages: ${n.length}`);for await(let d of s.stream({model:t,messages:n,temperature:r},o,i))switch(d.type){case"delta":l.push(d.text),yield{type:"delta",turnId:e,text:d.text};break;case"usage":u={prompt:d.promptTokens,completion:d.completionTokens,reasoning:d.reasoningTokens};break;case"done":break}yield{type:"end",turnId:e,content:l.join(""),usage:u??{prompt:0,completion:0},model:t}}var at=100,se=class{transport;apiKey;toolInvoker;log;hooks;maxRounds;constructor(t){this.transport=t.llmTransport,this.apiKey=t.apiKey,this.toolInvoker=t.toolInvoker,this.log=t.log,this.hooks=t.hooks,this.maxRounds=Math.min(t.maxRounds??25,at)}async*run(t,n){let{turnId:o,messages:r,tools:i,systemPrompt:s,config:a}=t,l={sessionId:t.sessionId,turnId:o};yield{type:"start",turnId:o},this.hooks?.invoke("turn.submitted",{...l,prompt:r[r.length-1]?.content??void 0}).catch(()=>{});let u=Te(r),d=[];s&&d.push({role:"system",content:s}),d.push(...u);let m=a?.model??"",c=Math.min(a?.maxRounds??this.maxRounds,at);try{let g={turnId:o,sessionId:t.sessionId,messages:d,tools:i,model:m,apiKey:a?.apiKey??this.apiKey,temperature:a?.temperature,maxRounds:c,contextWindowTokens:a?.contextWindowTokens,maxOutputTokens:a?.maxOutputTokens,modelMaxOutputTokens:a?.modelMaxOutputTokens,toolChoice:a?.toolChoice,parentDepth:a?.parentDepth,hooks:this.hooks,signal:n},h;for await(let R of st(g,this.transport,this.toolInvoker,this.log))h=R,yield R;h?.type==="end"?this.hooks?.invoke("turn.completed",{...l}).catch(()=>{}):h?.type==="error"&&this.hooks?.invoke("turn.failed",{...l,code:h.code,error:h.error}).catch(()=>{})}catch(g){if(n?.aborted)this.hooks?.invoke("turn.failed",{...l,code:"ABORTED",error:"Turn aborted"}).catch(()=>{}),yield{type:"error",turnId:o,error:"Turn aborted",code:"ABORTED"};else{let h=g instanceof Error?g.message:String(g),R=typeof g?.status=="number"?g.status:void 0,w=U(R,h),E=he(w);this.log.error(`turn ${o} error [${w}, retryable=${E.retryable}]: ${h}`),this.hooks?.invoke("turn.failed",{...l,code:w,error:h}).catch(()=>{}),yield{type:"error",turnId:o,error:h,code:w}}}}};var we=[{id:"deepseek",name:"DeepSeek",transport:"openai-chat",baseUrl:"https://api.deepseek.com",apiKeyEnvVars:["DEEPSEEK_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"deepseek-chat",models:[{id:"deepseek-chat",name:"DeepSeek Chat V3",contextWindow:64e3,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.27,costOutput:1.1},{id:"deepseek-reasoner",name:"DeepSeek R1",contextWindow:64e3,maxOutput:8192,toolCall:!0,reasoning:!0,vision:!1,costInput:.55,costOutput:2.19}]},{id:"qwen",name:"Alibaba Qwen (DashScope)",transport:"openai-chat",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode",apiKeyEnvVars:["DASHSCOPE_API_KEY","QWEN_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"qwen-plus",models:[{id:"qwen-plus",name:"Qwen Plus",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.8,costOutput:2},{id:"qwen-max",name:"Qwen Max",contextWindow:32768,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:2,costOutput:6},{id:"qwen-turbo",name:"Qwen Turbo",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.3,costOutput:.6},{id:"qwq-plus",name:"QwQ Plus (Reasoning)",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!0,vision:!1,costInput:.8,costOutput:2}]},{id:"zhipu",name:"\u667A\u8C31 GLM (Zhipu)",transport:"openai-chat",baseUrl:"https://open.bigmodel.cn/api/paas",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"glm-4-plus",models:[{id:"glm-4-plus",name:"GLM-4 Plus",contextWindow:128e3,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.5,costOutput:.5}]},{id:"minimax",name:"MiniMax",transport:"openai-chat",baseUrl:"https://api.minimax.chat",apiKeyEnvVars:["MINIMAX_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"MiniMax-Text-01",models:[{id:"MiniMax-Text-01",name:"MiniMax Text 01",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!1,vision:!1,costInput:1,costOutput:8}]},{id:"moonshot",name:"Moonshot (Kimi)",transport:"openai-chat",baseUrl:"https://api.moonshot.cn",apiKeyEnvVars:["MOONSHOT_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"moonshot-v1-128k",omitZeroTemperature:!0,models:[{id:"moonshot-v1-128k",name:"Moonshot V1 128K",contextWindow:128e3,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.6,costOutput:.6}]},{id:"doubao",name:"\u8C46\u5305 (Doubao/Volcengine)",transport:"openai-chat",baseUrl:"https://ark.cn-beijing.volces.com/api",apiKeyEnvVars:["ARK_API_KEY","DOUBAO_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"doubao-1.5-pro-32k",models:[{id:"doubao-1.5-pro-32k",name:"Doubao 1.5 Pro 32K",contextWindow:32768,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.8,costOutput:2}]},{id:"baichuan",name:"\u767E\u5DDD (Baichuan)",transport:"openai-chat",baseUrl:"https://api.baichuan-ai.com",apiKeyEnvVars:["BAICHUAN_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"Baichuan4",models:[{id:"Baichuan4",name:"Baichuan 4",contextWindow:32768,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:1,costOutput:1}]},{id:"stepfun",name:"\u9636\u8DC3\u661F\u8FB0 (StepFun)",transport:"openai-chat",baseUrl:"https://api.stepfun.com",apiKeyEnvVars:["STEPFUN_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"step-2-16k",models:[{id:"step-2-16k",name:"Step 2 16K",contextWindow:16384,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.38,costOutput:.12}]},{id:"openai",name:"OpenAI",transport:"openai-chat",baseUrl:"https://api.openai.com",apiKeyEnvVars:["OPENAI_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"gpt-4o",models:[{id:"gpt-4o",name:"GPT-4o",contextWindow:128e3,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:2.5,costOutput:10},{id:"gpt-4o-mini",name:"GPT-4o Mini",contextWindow:128e3,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:.15,costOutput:.6},{id:"o3-mini",name:"o3-mini",contextWindow:2e5,maxOutput:1e5,toolCall:!0,reasoning:!0,vision:!1,costInput:1.1,costOutput:4.4}]},{id:"anthropic",name:"Anthropic",transport:"anthropic-messages",baseUrl:"https://api.anthropic.com",apiKeyEnvVars:["ANTHROPIC_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"claude-sonnet-4-20250514",models:[{id:"claude-sonnet-4-20250514",name:"Claude Sonnet 4",contextWindow:2e5,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:3,costOutput:15},{id:"claude-opus-4-20250514",name:"Claude Opus 4",contextWindow:2e5,maxOutput:32768,toolCall:!0,reasoning:!0,vision:!0,costInput:15,costOutput:75},{id:"claude-3-5-haiku-20241022",name:"Claude 3.5 Haiku",contextWindow:2e5,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!0,costInput:.8,costOutput:4}]},{id:"google",name:"Google Gemini",transport:"openai-chat",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai",apiKeyEnvVars:["GOOGLE_API_KEY","GEMINI_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"gemini-2.5-flash",models:[{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.15,costOutput:.6},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:1.25,costOutput:10}]},{id:"mistral",name:"Mistral AI",transport:"openai-chat",baseUrl:"https://api.mistral.ai",apiKeyEnvVars:["MISTRAL_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"mistral-large-latest",models:[{id:"mistral-large-latest",name:"Mistral Large",contextWindow:128e3,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:2,costOutput:6}]},{id:"xai",name:"xAI (Grok)",transport:"openai-chat",baseUrl:"https://api.x.ai",apiKeyEnvVars:["XAI_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"grok-3-mini-fast",models:[{id:"grok-3-mini-fast",name:"Grok 3 Mini Fast",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:.5}]},{id:"siliconflow",name:"\u7845\u57FA\u6D41\u52A8 (SiliconFlow)",transport:"openai-chat",baseUrl:"https://api.siliconflow.cn",apiKeyEnvVars:["SILICONFLOW_API_KEY","SF_API_KEY"],authType:"bearer",isAggregator:!0,defaultModel:"deepseek-ai/DeepSeek-V3",models:[{id:"deepseek-ai/DeepSeek-V3",name:"DeepSeek V3 (via SiliconFlow)",contextWindow:64e3,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.5,costOutput:2},{id:"Qwen/Qwen3-235B-A22B",name:"Qwen3 235B (via SiliconFlow)",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:4}]},{id:"openrouter",name:"OpenRouter",transport:"openai-chat",baseUrl:"https://openrouter.ai/api",apiKeyEnvVars:["OPENROUTER_API_KEY"],authType:"bearer",isAggregator:!0,defaultModel:"anthropic/claude-sonnet-4",extraHeaders:{"HTTP-Referer":"https://claw.bot","X-Title":"XiaozhiClaw"},models:[{id:"anthropic/claude-sonnet-4",name:"Claude Sonnet 4 (via OpenRouter)",contextWindow:2e5,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:3,costOutput:15},{id:"deepseek/deepseek-chat",name:"DeepSeek V3 (via OpenRouter)",contextWindow:64e3,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.27,costOutput:1.1}]},{id:"groq",name:"Groq",transport:"openai-chat",baseUrl:"https://api.groq.com/openai",apiKeyEnvVars:["GROQ_API_KEY"],authType:"bearer",isAggregator:!0,defaultModel:"llama-3.3-70b-versatile",models:[{id:"llama-3.3-70b-versatile",name:"Llama 3.3 70B (via Groq)",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.59,costOutput:.79}]},{id:"together",name:"Together AI",transport:"openai-chat",baseUrl:"https://api.together.xyz",apiKeyEnvVars:["TOGETHER_API_KEY"],authType:"bearer",isAggregator:!0,defaultModel:"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",models:[{id:"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",name:"Llama 3.1 70B Turbo (via Together)",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.88,costOutput:.88}]}];import{existsSync as Sn,mkdirSync as An,readFileSync as Mn,writeFileSync as _n}from"node:fs";import{join as lt}from"node:path";import{homedir as wn}from"node:os";var En="https://models.dev/api.json",In=15e3,Pn=1440*60*1e3,Ln=300*1e3,j=class{cache=null;cacheDir;cacheFile;ttlMs;fetching=!1;lastFetchAttempt=0;constructor(t){this.cacheDir=t?.cacheDir??lt(wn(),".openclaw","cache"),this.cacheFile=lt(this.cacheDir,"model_catalog.json"),this.ttlMs=t?.ttlMs??Pn}getModels(t){this.ensureLoaded();let n=this.cache?.providers.get(t);return n?[...n.models.values()]:[]}getModel(t,n){return this.ensureLoaded(),this.cache?.providers.get(t)?.models.get(n)}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(!Sn(this.cacheFile))return;let t=Mn(this.cacheFile,"utf8"),n=JSON.parse(t);if(!n.fetchedAt||!n.data)return;this.cache={fetchedAt:n.fetchedAt,providers:ct(n.data)}}catch{}}saveToDisk(t){try{An(this.cacheDir,{recursive:!0});let n=JSON.stringify({fetchedAt:Date.now(),data:t},null,0);_n(this.cacheFile,n,"utf8")}catch{}}backgroundFetch(){this.fetching||Date.now()-this.lastFetchAttempt<Ln||(this.fetching=!0,this.fetchRemote().finally(()=>{this.fetching=!1}))}async fetchRemote(){this.lastFetchAttempt=Date.now();try{let t=await fetch(En,{signal:AbortSignal.timeout(In),headers:{Accept:"application/json"}});if(!t.ok)return!1;let n=await t.json(),o=ct(n);return o.size===0?!1:(this.cache={fetchedAt:Date.now(),providers:o},this.saveToDisk(n),!0)}catch{return!1}}};function ct(e){let t=new Map;if(!e||typeof e!="object")return t;for(let[n,o]of Object.entries(e)){if(!o||typeof o!="object")continue;let r=o.models;if(!r||typeof r!="object")continue;let i=new Map;for(let[s,a]of Object.entries(r)){if(!a||typeof a!="object")continue;let l=a,u=l.limit??{},d=l.modalities??{},m=Array.isArray(d.input)?d.input:[];i.set(s,{id:s,name:typeof l.name=="string"?l.name:s,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||m.includes("image"),costInput:typeof l.cost_input=="number"?l.cost_input:void 0,costOutput:typeof l.cost_output=="number"?l.cost_output:void 0})}i.size>0&&t.set(n,{models:i})}return t}var On={claude:"anthropic",gemini:"google","x-ai":"xai","z-ai":"xai",silicon:"siliconflow","silicon-flow":"siliconflow"},q=class{builtins=new Map;catalog;overrides=new Map;constructor(t){for(let n of we)this.builtins.set(n.id,n);this.catalog=t?.catalog??new j}applyOverride(t,n){this.overrides.set(t,{...this.overrides.get(t),...n})}getProvider(t){let n=On[t]??t,o=this.builtins.get(n),r=this.overrides.get(n);if(!(!o&&!r))return!o&&r?!r.id||!r.transport||!r.baseUrl?void 0:{id:r.id,name:r.name??r.id,transport:r.transport,baseUrl:r.baseUrl,apiKeyEnvVars:r.apiKeyEnvVars??[],authType:r.authType??"bearer",isAggregator:r.isAggregator??!1,defaultModel:r.defaultModel,models:r.models}:o&&!r?o:{...o,...r,models:r.models??o.models}}listProviders(){let t=new Map;for(let[n,o]of this.builtins)t.set(n,o);for(let[n]of this.overrides){let o=this.getProvider(n);o&&t.set(n,o)}return[...t.values()]}listModels(t){let o=this.getProvider(t)?.models??[],r=this.catalog.getModels(t);if(r.length===0)return o;let i=new Map;for(let s of r)i.set(s.id,s);for(let s of o)i.set(s.id,s);return[...i.values()]}async refreshCatalog(){return this.catalog.refreshCatalog()}resolveApiKey(t,n){if(n)return n;let o=this.getProvider(t);if(o)for(let r of o.apiKeyEnvVars){let i=process.env[r];if(i?.trim())return i.trim()}}};var z=class{baseUrl;extraHeaders;timeoutMs;supportsStreamOptions;omitZeroTemperature;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.extraHeaders=t.extraHeaders??{},this.timeoutMs=t.timeoutMs??18e4,this.supportsStreamOptions=t.supportsStreamOptions??!0,this.omitZeroTemperature=t.omitZeroTemperature??!1}async*stream(t,n,o){let r=`${this.baseUrl}/v1/chat/completions`,i={model:t.model,messages:t.messages,stream:!0};this.supportsStreamOptions&&(i.stream_options={include_usage:!0}),t.tools&&t.tools.length>0&&(i.tools=t.tools,t.toolChoice&&(i.tool_choice=t.toolChoice)),t.temperature!==void 0&&(this.omitZeroTemperature&&t.temperature===0||(i.temperature=t.temperature)),t.maxTokens!==void 0&&(i.max_tokens=t.maxTokens),t.reasoning&&(i.reasoning=t.reasoning);let s=AbortSignal.timeout(this.timeoutMs),a=o?AbortSignal.any([o,s]):s,l=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`,...this.extraHeaders},body:JSON.stringify(i),signal:a});if(!l.ok){let u=await l.text().catch(()=>"");throw new Error(`LLM API error ${l.status}: ${u.slice(0,500)}`)}if(!l.body)throw new Error("LLM API returned no response body");yield*this.parseSSEStream(l.body)}async*parseSSEStream(t){let n=new TextDecoder,o="";for await(let r of t){o+=n.decode(r,{stream:!0});let i;for(;(i=o.indexOf(`
|
|
4
|
+
`))!==-1;){let s=o.slice(0,i).trim();if(o=o.slice(i+1),!s||s.startsWith(":")||!s.startsWith("data: "))continue;let a=s.slice(6);if(a==="[DONE]")return;let l;try{l=JSON.parse(a)}catch{continue}yield*this.mapChunk(l)}}if(o.trim()){let r=o.trim();if(r.startsWith("data: ")&&r.slice(6)!=="[DONE]")try{let i=JSON.parse(r.slice(6));yield*this.mapChunk(i)}catch{}}}*mapChunk(t){if(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}),!(!t.choices||t.choices.length===0))for(let n of t.choices){let o=n.delta;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 r of o.tool_calls)yield{type:"tool_call_delta",index:r.index,id:r.id,name:r.function?.name,arguments:r.function?.arguments??""};n.finish_reason&&(yield{type:"done",finishReason:n.finish_reason})}}}};var K=class{baseUrl;apiVersion;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiVersion=t.apiVersion??"2023-06-01",this.timeoutMs=t.timeoutMs??18e4}async*stream(t,n,o){let r=`${this.baseUrl}/v1/messages`,{system:i,messages:s}=Dn(t.messages),a={model:t.model,messages:s,max_tokens:t.maxTokens??8192,stream:!0};i&&(a.system=i),t.tools&&t.tools.length>0&&(a.tools=t.tools.map(Bn),t.toolChoice&&(a.tool_choice=t.toolChoice==="auto"?{type:"auto"}:t.toolChoice==="required"?{type:"any"}:{type:"none"})),t.temperature!==void 0&&(a.temperature=t.temperature),t.reasoning&&(a.thinking={type:"enabled",budget_tokens:Nn(t.reasoning.effort)});let l=AbortSignal.timeout(this.timeoutMs),u=o?AbortSignal.any([o,l]):l,d=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":n,"anthropic-version":this.apiVersion},body:JSON.stringify(a),signal:u});if(!d.ok){let m=await d.text().catch(()=>"");throw new Error(`Anthropic API error ${d.status}: ${m.slice(0,500)}`)}if(!d.body)throw new Error("Anthropic API returned no response body");yield*this.parseSSEStream(d.body)}async*parseSSEStream(t){let n=new TextDecoder,o="",r="",i=new Map;for await(let s of t){o+=n.decode(s,{stream:!0});let a;for(;(a=o.indexOf(`
|
|
5
|
+
`))!==-1;){let l=o.slice(0,a).trim();if(o=o.slice(a+1),!l){r="";continue}if(l.startsWith("event: ")){r=l.slice(7).trim();continue}if(!l.startsWith("data: "))continue;let u=l.slice(6),d;try{d=JSON.parse(u)}catch{continue}yield*this.mapEvent(r,d,i)}}}*mapEvent(t,n,o){switch(t){case"message_start":{let i=n.message?.usage;i?.input_tokens&&(yield{type:"usage",promptTokens:i.input_tokens??0,completionTokens:i.output_tokens??0});break}case"content_block_start":{let r=n.index,i=n.content_block;if(!i)break;let s=i.type;o.set(r,{type:s,id:i.id,name:i.name}),s==="tool_use"&&(yield{type:"tool_call_delta",index:r,id:i.id,name:i.name,arguments:""});break}case"content_block_delta":{let r=n.index,i=n.delta;if(!i)break;let s=i.type;s==="text_delta"?yield{type:"delta",text:i.text}:s==="input_json_delta"?yield{type:"tool_call_delta",index:r,arguments:i.partial_json}:s==="thinking_delta"&&(yield{type:"reasoning_delta",text:i.thinking});break}case"content_block_stop":{let r=n.index;o.delete(r);break}case"message_delta":{let r=n.delta,i=n.usage;i&&(yield{type:"usage",promptTokens:0,completionTokens:i.output_tokens??0}),r?.stop_reason&&(yield{type:"done",finishReason:Fn(r.stop_reason)});break}case"message_stop":break;case"error":{let r=n.error;throw new Error(`Anthropic stream error: ${r?.message??JSON.stringify(n)}`)}}}};function Fn(e){switch(e){case"end_turn":case"stop_sequence":return"stop";case"tool_use":return"tool_calls";case"max_tokens":return"length";default:return e}}var ut={xhigh:32e3,high:16e3,medium:8e3,low:4e3};function Nn(e){return ut[e]??ut.high}function Dn(e){let t,n=[];for(let o of e){if(o.role==="system"){t=t?`${t}
|
|
6
|
+
|
|
7
|
+
${o.content??""}`:o.content??"";continue}if(o.role==="user")n.push({role:"user",content:o.content??""});else if(o.role==="assistant")if(o.tool_calls&&o.tool_calls.length>0){let r=[];o.content&&r.push({type:"text",text:o.content});for(let i of o.tool_calls){let s;try{s=JSON.parse(i.function.arguments)}catch{s={}}r.push({type:"tool_use",id:i.id,name:i.function.name,input:s})}n.push({role:"assistant",content:r})}else n.push({role:"assistant",content:o.content??""});else o.role==="tool"&&n.push({role:"user",content:[{type:"tool_result",tool_use_id:o.tool_call_id??"",content:o.content??""}]})}return{system:t,messages:n}}function Bn(e){return{name:e.function.name,description:e.function.description,input_schema:e.function.parameters??{type:"object",properties:{}}}}function Ee(e,t){e.baseUrl&&t.applyOverride(e.provider,{baseUrl:e.baseUrl});let n=t.getProvider(e.provider);if(!n)throw new Error(`Unknown LLM provider: "${e.provider}". Available: ${t.listProviders().map(i=>i.id).join(", ")}`);let o=e.baseUrl??n.baseUrl;return{transport:$n(n,o),apiKey:e.apiKey,resolvedModel:e.model,providerDef:n}}function Ie(e){for(let t of e.listProviders()){let n=e.resolveApiKey(t.id);if(n)return{providerId:t.id,apiKey:n,defaultModel:t.defaultModel??t.models?.[0]?.id??""}}}function $n(e,t){switch(e.transport){case"openai-chat":return new z({baseUrl:t,extraHeaders:e.extraHeaders,supportsStreamOptions:e.supportsStreamOptions,omitZeroTemperature:e.omitZeroTemperature});case"anthropic-messages":return new K({baseUrl:t});default:throw new Error(`Unsupported transport type: "${e.transport}" for provider "${e.id}"`)}}function dt(e){let t=new Map;return{register(n){let o=t.get(n.point)??[],r={handler:n.handler,priority:n.priority??100,label:n.label};return o.push(r),o.sort((i,s)=>i.priority-s.priority),t.set(n.point,o),()=>{let i=o.indexOf(r);i>=0&&o.splice(i,1)}},async invoke(n,o){let r=t.get(n);if(!r||r.length===0)return{action:"continue",context:o};let i=o;for(let s of r)try{let a=await s.handler(n,i);if(!a||a.action==="continue"){a?.context&&(i=a.context);continue}if(a.action==="abort"||a.action==="skip")return e.info({hook:n,label:s.label,action:a.action,reason:a.reason},"hook intercepted"),a}catch(a){e.warn({hook:n,label:s.label,err:a.message},"hook handler failed (non-blocking)")}return{action:"continue",context:i}}}}function pt(e,t){let n=[],o,r=[];return n.push(e.register({point:"memory.before_recall",priority:50,label:"qmemory-prefetch",handler:async(i,s)=>{if(!t.memoryProvider||!s.query)return{action:"continue",context:s};try{let a=await t.memoryProvider.search(s.query,t.userId,{limit:10});o=s.turnId,r=a,t.log.debug(`memory.before_recall: prefetched ${a.length} memories for query="${s.query?.slice(0,60)}"`)}catch(a){t.log.warn(`memory.before_recall: qmemory prefetch failed: ${a instanceof Error?a.message:String(a)}`),r=[]}return{action:"continue",context:s}}})),n.push(e.register({point:"memory.after_recall",priority:50,label:"qmemory-recall-log",handler:(i,s)=>{let a=o===s.turnId?r.length:0;return t.log.debug(`memory.after_recall: ${s.blockCount??0} blocks assembled, ${a} qmemory results`),{action:"continue",context:s}}})),()=>{for(let i of n)i();r=[]}}var mt="qmemory";function gt(e){let t=e.baseUrl.replace(/\/+$/,""),n=e.timeoutMs??5e3;function o(s){return e.userIdPrefix?`${e.userIdPrefix}:${s}`:s}function r(){let s={Accept:"application/json"};return e.apiKey&&(s.Authorization=`Bearer ${e.apiKey}`),s}async function i(s,a){let l=`${t}${s}`,u=new AbortController,d=setTimeout(()=>u.abort(),n);try{let m=await fetch(l,{...a,headers:{...r(),...a?.headers},signal:u.signal});if(!m.ok){let c=await m.text().catch(()=>"");throw new Error(`QMemory ${a?.method??"GET"} ${s} returned ${m.status}: ${c.slice(0,200)}`)}return await m.json()}finally{clearTimeout(d)}}return{providerId:mt,async search(s,a,l){let u=o(a),d=l?.limit??10,m=new URLSearchParams({q:s,user_id:u,limit:String(d)});return((await i(`/v1/memories/search/?${m.toString()}`)).memories??[]).filter(g=>g.id&&g.text).map(g=>({blockId:g.id,text:g.text,score:typeof g.importance=="number"?g.importance:0,source:mt,metadata:g.metadata}))},async ingest(s,a,l){let u=o(a);await i("/v1/memories/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({user_id:u,messages:s.map(d=>({role:d.role,content:d.content,...d.timestamp?{timestamp:d.timestamp}:{}})),extraction_mode:"none",...l?.sessionId?{session_id:l.sessionId}:{},...l?.source?{metadata:{source:l.source}}:{},run_async:!0})})},async health(){let s=await i("/v1/health/");return{status:s.status??"unknown",version:s.version??"",memoryCount:s.memory_count??0,dbSizeBytes:s.db_size_bytes??0,embeddingModel:s.embedding_model??"",uptimeSeconds:s.uptime_seconds??0}},async addText(s,a,l){let u=o(a);return{memoriesAdded:(await i("/v1/memories/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({user_id:u,text:s,extraction_mode:"none",...l?.sessionId?{session_id:l.sessionId}:{},...l?.source?{metadata:{source:l.source}}:{}})})).memories_added??0}},async ingestExtracted(s,a,l){if(s.length===0)return{memoriesAdded:0};let u=o(a),d=await Promise.allSettled(s.map(c=>i("/v1/memories/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({user_id:u,text:c.text,extraction_mode:"none",...l?.sessionId?{session_id:l.sessionId}:{},metadata:{...l?.source?{source:l.source}:{},...c.category?{category:c.category}:{},...typeof c.importance=="number"?{importance:c.importance}:{},...c.speaker?{speaker:c.speaker}:{},...c.event_date?{event_date:c.event_date}:{},...c.tags?.length?{tags:c.tags}:{}}})}))),m=0;for(let c of d)c.status==="fulfilled"&&(m+=c.value.memories_added??1);return{memoriesAdded:m}},async remove(s){try{return await i(`/v1/memories/${encodeURIComponent(s)}/`,{method:"DELETE"}),!0}catch{return!1}}}}import{AGENT_RPC_ERROR_CODES as ht,AGENT_RPC_PROTOCOL_VERSION as ae,isAgentRpcRequest as Hn}from"qlogicagent-runtime-contracts";var le=class{running=!1;activeTurn=null;pendingToolResults=new Map;verbose;registry;agent=null;lastLlmConfigKey="";currentSessionId="";currentHooks=null;constructor(t){this.verbose=t.verbose,this.registry=new q}start(){this.running=!0,this.log("qlogicagent CLI started, waiting for JSON-RPC on stdin...");let t=Un({input:process.stdin,crlfDelay:Number.POSITIVE_INFINITY});t.on("line",n=>{let o=n.trim();if(o)try{let r=JSON.parse(o);if(!Hn(r)){this.log(`[warn] ignoring non-request message: ${o.slice(0,200)}`);return}this.handleMessage(r)}catch{this.log(`[warn] invalid JSON on stdin: ${o.slice(0,200)}`)}}),t.on("close",()=>{this.log("stdin closed, shutting down"),this.stop()})}stop(){if(this.running){this.running=!1,this.currentSessionId&&this.currentHooks&&this.currentHooks.invoke("session.ended",{sessionId:this.currentSessionId}).catch(()=>{}),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null);for(let[t,n]of this.pendingToolResults)n.resolve({result:"",error:"Agent process shutting down"});this.pendingToolResults.clear(),this.log("stopped")}}handleMessage(t){switch(t.method){case"agent.hello":this.handleHello(t);break;case"agent.ping":this.handlePing(t);break;case"agent.turn":this.handleTurn(t);break;case"memory.dream":this.handleTurn(t);break;case"agent.abort":this.handleAbort(t);break;case"tool.result":this.handleToolResult(t);break;default:t.id!==void 0&&this.sendResponse(t.id,void 0,{code:ht.METHOD_NOT_FOUND,message:`Unknown method: ${t.method}`})}}handleHello(t){let n=t.params,o=n?.protocolVersion??"unknown",r=o.split(".")[0],i=ae.split(".")[0];if(r!==i){this.log(`protocol mismatch: host=${o} agent=${ae}`),t.id!==void 0&&this.sendResponse(t.id,void 0,{code:ht.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${o}, agent=${ae}`});return}this.log(`hello from ${n?.hostName??"unknown"} v${n?.hostVersion??"?"} (protocol ${o})`),t.id!==void 0&&this.sendResponse(t.id,{protocolVersion:ae,agentName:"qlogicagent",agentVersion:"0.1.0",capabilities:["turn","tool-invoke","streaming"]})}handlePing(t){t.id!==void 0&&this.sendResponse(t.id,{status:"ok"}),this.sendNotification("pong",{})}handleAbort(t){let n=t.params?.turnId??"";this.log(`abort requested for turn ${n}`),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null),t.id!==void 0&&this.sendResponse(t.id,{aborted:!0})}handleToolResult(t){let n=t.params?.callId,o=t.params?.result??"",r=t.params?.error;if(!n){this.log("[warn] tool.result missing callId");return}let i=this.pendingToolResults.get(n);i?(i.resolve({result:o,error:r}),this.pendingToolResults.delete(n)):this.log(`[warn] no pending tool call for callId ${n}`)}async handleTurn(t){let n=t.params??{},o=n.turnId??ft(),r=n.sessionId,i=n.messages??[],s=n.tools??[],a=n.config;t.id!==void 0&&this.sendResponse(t.id,{accepted:!0,turnId:o}),r&&r!==this.currentSessionId&&(this.currentSessionId&&this.currentHooks&&this.currentHooks.invoke("session.ended",{sessionId:this.currentSessionId}).catch(()=>{}),this.currentSessionId=r);let l=new AbortController;this.activeTurn=l,this.log(`turn ${o} starting (session: ${r})`);try{let u={provider:a?.provider,model:a?.model,apiKey:a?.apiKey,baseUrl:a?.baseUrl,maxRounds:a?.maxRounds,temperature:a?.temperature,contextWindowTokens:a?.contextWindowTokens,maxOutputTokens:a?.maxOutputTokens,modelMaxOutputTokens:a?.modelMaxOutputTokens},d=this.resolveAgent(u);if(!d){this.sendNotification("turn.start",{turnId:o}),this.sendNotification("turn.error",{turnId:o,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 m=a?.systemPrompt;for await(let c of d.run({turnId:o,sessionId:r,messages:i,tools:s,systemPrompt:m,config:u},l.signal))switch(c.type){case"start":this.sendNotification("turn.start",{turnId:c.turnId});break;case"delta":this.sendNotification("turn.delta",{turnId:c.turnId,text:c.text});break;case"end":this.sendNotification("turn.end",{turnId:c.turnId,content:c.content,usage:c.usage,model:c.model,provider:c.provider});break;case"error":this.sendNotification("turn.error",{turnId:c.turnId,error:c.error,code:c.code});break;case"skill_instruction":this.sendNotification("turn.skill_instruction",{turnId:c.turnId,instruction:c.instruction});break;case"tool_call":break;case"tool_result":this.sendNotification("turn.tool_result",{turnId:c.turnId,callId:c.callId,name:c.name,ok:c.ok,...c.error?{error:c.error}:{}});break;case"sidechain_started":this.sendNotification("turn.sidechain_started",{turnId:c.turnId,depth:c.depth,role:c.role});break;case"sidechain_completed":this.sendNotification("turn.sidechain_completed",{turnId:c.turnId,depth:c.depth,toolCallCount:c.toolCallCount});break;case"tool_blocked":this.sendNotification("turn.tool_blocked",{turnId:c.turnId,callId:c.callId,name:c.name,reason:c.reason});break;case"recovery":this.sendNotification("turn.recovery",{turnId:c.turnId,action:c.action,...c.detail?{detail:c.detail}:{}});break;case"plan_update":this.sendNotification("turn.plan_update",{turnId:c.turnId,slug:c.slug,content:c.content});break}this.log(`turn ${o} completed`)}catch(u){if(l.signal.aborted)this.sendNotification("turn.error",{turnId:o,error:"Turn aborted",code:"ABORTED"});else{let d=u instanceof Error?u.message:String(u);this.sendNotification("turn.error",{turnId:o,error:d,code:"INTERNAL_ERROR"})}}finally{this.activeTurn===l&&(this.activeTurn=null)}}resolveAgent(t){let n=`${t.provider??""}:${t.model??""}:${t.apiKey?.slice(0,8)??""}:${t.baseUrl??""}`;if(this.agent&&this.lastLlmConfigKey===n)return this.agent;let o=t.provider,r=t.model,i=t.apiKey,s=t.baseUrl;if(!o||!i){let c=Ie(this.registry);c&&(o=o??c.providerId,i=i??c.apiKey,r=r??c.defaultModel,this.log(`auto-detected provider: ${o}, model: ${r}`))}if(!o||!i)return null;r=r??this.registry.getProvider(o)?.defaultModel??"";let a=Ee({provider:o,model:r,apiKey:i,baseUrl:s},this.registry),l={info:c=>this.log(c),warn:c=>this.log(`[warn] ${c}`),error:c=>this.log(`[error] ${c}`),debug:c=>{this.verbose&&this.log(`[debug] ${c}`)}},u={invoke:(c,g,h,R)=>this.requestToolExecution(c,g,h,R)},d=dt(l);this.currentHooks=d;let m=(process.env.QMEMORY_BASE_URL??process.env.QLOGICAGENT_QMEMORY_BASE_URL??"").trim().replace(/\/+$/,"");if(m){let c=gt({baseUrl:m,apiKey:(process.env.QMEMORY_API_KEY??"").trim()||void 0,timeoutMs:5e3});pt(d,{memoryProvider:c,userId:this.currentSessionId??"default",log:{debug:g=>l.debug(g),warn:g=>l.warn(g)}})}return this.currentSessionId&&d.invoke("session.created",{sessionId:this.currentSessionId}).catch(()=>{}),this.agent=new se({llmTransport:a.transport,apiKey:a.apiKey,toolInvoker:u,log:l,hooks:d,maxRounds:t.maxRounds,verbose:this.verbose}),this.lastLlmConfigKey=n,this.log(`created Agent (provider: ${o}, model: ${r})`),this.agent}async requestToolExecution(t,n,o,r){let i=`tc_${ft().slice(0,8)}`;return new Promise((s,a)=>{if(r?.aborted){a(new Error("Aborted"));return}this.pendingToolResults.set(i,{resolve:s});let l=()=>{this.pendingToolResults.delete(i),a(new Error("Aborted"))};r?.addEventListener("abort",l,{once:!0}),this.sendNotification("turn.tool_call",{turnId:t,callId:i,name:n,arguments:o})})}sendResponse(t,n,o){let r={jsonrpc:"2.0",id:t};o?r.error=o:r.result=n,this.writeStdout(r)}sendNotification(t,n){let o={jsonrpc:"2.0",method:t,params:n};this.writeStdout(o)}writeStdout(t){process.stdout.write(`${JSON.stringify(t)}
|
|
8
|
+
`)}log(t){this.verbose&&process.stderr.write(`[qlogicagent] ${t}
|
|
9
|
+
`)}};function yt(e){let t={verbose:!1};for(let n of e.slice(2))(n==="--verbose"||n==="-v")&&(t.verbose=!0);return t}var jn=yt(process.argv),Tt=new le({verbose:jn.verbose}),bt=()=>{Tt.stop(),process.exit(0)};process.on("SIGTERM",bt);process.on("SIGINT",bt);Tt.start();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var U=["pending","in-progress","completed","skipped"],D=["active","completed","abandoned"];var R=["not-started","in-progress","completed"];function z(n){return{total:n.length,completed:n.filter(t=>t.status==="completed").length,inProgress:n.filter(t=>t.status==="in-progress").length,notStarted:n.filter(t=>t.status==="not-started").length}}var I=["draft","in_review","approved","rejected","canary","published","stale","superseded","rolled_back"],b=["submit-review","approve","reject","start-canary","record-effectiveness","promote","publish","mark-stale","mark-superseded","rollback"],_=["canary","published"];function e(n){if(typeof n!="string")return;let t=n.trim();return t||void 0}function c(n){if(typeof n=="number"&&Number.isFinite(n))return n;if(typeof n!="string")return;let t=n.trim();if(!t)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function S(n,t=0){let r=c(n);return r===void 0?Math.max(0,Math.floor(t)):Math.max(0,Math.floor(r))}function d(n){return n&&typeof n=="object"&&!Array.isArray(n)?{...n}:{}}function h(n){return typeof n=="string"&&I.includes(n)}function L(n){return typeof n=="string"&&b.includes(n)}function v(n){return typeof n=="string"&&_.includes(n)}function O(n,t="draft"){let r=e(n);return r&&h(r)?r:t}function w(n){let t=e(n);return t&&L(t)?t:null}function P(n){let t=e(n);return t&&v(t)?t:null}function K(n){let t=d(n),r=e(t.uri);if(!r)return null;let o=e(t.sha256),i=e(t.workspaceDir),s=e(t.relativePath),a=e(t.sourceWorkspaceDir),u=e(t.stagedAt);return{uri:r,...o?{sha256:o}:{},...i?{workspaceDir:i}:{},...s?{relativePath:s}:{},...a?{sourceWorkspaceDir:a}:{},...u?{stagedAt:u}:{}}}function M(n){let t=d(n),r=e(t.executionId),o=e(t.rootExecutionId),i=e(t.parentExecutionId),s=e(t.sidechainId),a=e(t.attemptId),u=e(t.outcomeId),l=e(t.sessionId),p=e(t.turnId);return!r&&!o&&!i&&!s&&!a&&!u&&!l&&!p?null:{...r?{executionId:r}:{},...o?{rootExecutionId:o}:{},...i?{parentExecutionId:i}:{},...s?{sidechainId:s}:{},...a?{attemptId:a}:{},...u?{outcomeId:u}:{},...l?{sessionId:l}:{},...p?{turnId:p}:{}}}function F(n){let t=d(n),r=w(t.action);if(!r)return null;let o=e(t.actor)??null,i=e(t.notes)??null,s=d(t.payload),a=e(t.createdAt);return{action:r,actor:o,notes:i,payload:s,...a?{createdAt:a}:{}}}function j(n){let t=d(n),r=P(t.phase);if(!r)return null;let o=S(t.successCount),i=c(t.failureCount),s=S(t.sampleCount,i!==void 0?o+i:o),a=S(t.failureCount,Math.max(s-o,0)),u=S(t.regressionCount),l=c(t.successRate)??(s>0?o/s:0),p=c(t.regressionRate)??(s>0?u/s:0),f=c(t.avgLatencyMs),m=c(t.avgCostUsd),g=c(t.score),A=e(t.staleReason)??null,k=e(t.notes)??null,C=d(t.summary),x=e(t.lastObservedAt),T=e(t.updatedAt),y=e(t.lastActivityAt),E=c(t.activityCount);return{phase:r,sampleCount:s,successCount:o,failureCount:a,regressionCount:u,successRate:l,regressionRate:p,...f!==void 0?{avgLatencyMs:f}:{},...m!==void 0?{avgCostUsd:m}:{},...g!==void 0?{score:g}:{},...A?{staleReason:A}:{},...k?{notes:k}:{},...Object.keys(C).length>0?{summary:C}:{},...x?{lastObservedAt:x}:{},...T?{updatedAt:T}:{},...y?{lastActivityAt:y}:{},...E!==void 0?{activityCount:E}:{}}}export{b as SKILL_CANDIDATE_ACTION_VALUES,_ as SKILL_CANDIDATE_EFFECTIVENESS_PHASE_VALUES,I as SKILL_CANDIDATE_STATUS_VALUES,D as TASK_PLAN_STATUS_VALUES,U as TASK_STEP_STATUS_VALUES,R as TODO_ITEM_STATUS_VALUES,d as coerceSkillCandidateJsonObject,L as isSkillCandidateAction,v as isSkillCandidateEffectivenessPhase,h as isSkillCandidateStatus,w as normalizeSkillCandidateAction,K as normalizeSkillCandidateArtifact,j as normalizeSkillCandidateEffectiveness,P as normalizeSkillCandidateEffectivenessPhase,F as normalizeSkillCandidateReview,M as normalizeSkillCandidateSourceExecution,O as normalizeSkillCandidateStatus,z as summarizeTodoList};
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
// ── Agent ──────────────────────────────────────────────────
|
|
7
|
-
export { Agent } from "./agent/agent.js";
|
|
8
|
-
// ── Config ─────────────────────────────────────────────────
|
|
9
|
-
export { parseCliArgs } from "./config/config.js";
|
|
10
|
-
// ── LLM layer ──────────────────────────────────────────────
|
|
11
|
-
export { ProviderRegistry, createLLMClient, autoDetectProvider, } from "./llm/index.js";
|
|
12
|
-
// ── Runtime ────────────────────────────────────────────────
|
|
13
|
-
export { createHookRegistry } from "./runtime/hook-registry.js";
|
|
14
|
-
// ── Orchestration ──────────────────────────────────────────
|
|
15
|
-
export { buildSkillInstruction, shouldCreateSkill, shouldImproveSkill, } from "./orchestration/index.js";
|
|
1
|
+
var ut=Object.defineProperty;var dt=(e,t)=>()=>(e&&(t=e(e=0)),t);var pt=(e,t)=>{for(var n in t)ut(e,n,{get:t[n],enumerable:!0})};var Qe={};pt(Qe,{resolveToolEligibility:()=>ln});function rn(e,t){if(on.some(n=>n.test(e)))return!0;if(t)for(let n of t)try{if(new RegExp(n,"i").test(e))return!0}catch{}return!1}function sn(e,t){let n=e.function.name,o=e.meta,r=[];return t.blockedToolNames?.includes(n)?(r.push("policy_blocked"),{level:5,reasons:r}):o?.isReadOnly?(r.push("always_allowed"),{level:1,reasons:r}):o?.requiresApproval?(r.push("approval_required"),{level:4,reasons:r}):o?.isDangerous||rn(n,t.dangerousPatterns)?(r.push("dangerous_tool"),{level:3,reasons:r}):{level:2,reasons:r}}function an(e){switch(e){case 1:return"eligible";case 2:return"eligible";case 3:return"dangerous-notify";case 4:return"approval-required";case 5:return"blocked-by-policy"}}function ln(e,t={}){let n=new Map,o=[],r=[],i=[];for(let a of e){let s=a.function.name,{level:l,reasons:u}=sn(a,t),d=an(l),m={toolName:s,status:d,permissionLevel:l,approvalRequired:l===4,reasonCodes:u};n.set(s,m),l===5?r.push(m):(o.push(a),l===4&&i.push(m))}return{eligibleTools:o,blockedTools:r,approvalRequiredTools:i,eligibilityByName:n}}var on,Ze=dt(()=>{"use strict";on=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:write_file|delete_file|move_file|create_directory)$/i,/^(?:git_push|git_reset|git_force)$/i]});function ue(e){return{role:"assistant",content:"",tool_calls:e}}function X(e,t){return{role:"tool",tool_call_id:e,content:JSON.stringify(t.ok?{ok:!0,payload:t.payload}:{ok:!1,error:t.error??"Tool invoke failed"})}}var mt=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,O={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]},gt=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,ft=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,ht=512,yt=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i;var Tt=new Set([500,502,503,504,521,522,523,524,529]),bt=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],Ct=["upgrade your plan","upgrade plan","current plan","subscription"],kt=["daily","weekly","monthly"],vt=["try again","retry","temporary","cooldown"],xt=["usage limit","rate limit","organization usage"],Rt=["organization","workspace"],St=["billing period","exceeded","reached","exhausted"],At=/["']?(?: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,Mt=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i;function F(e,t){if(!e)return!1;let n=e.toLowerCase();return t.some(o=>o instanceof RegExp?o.test(n):n.includes(o))}function _t(e){return F(e,O.format)}function Fe(e){return F(e,O.rateLimit)}function pe(e){return F(e,O.timeout)}function wt(e){return mt.test(e)}function de(e){let t=e.toLowerCase();return t?e.length>ht?ft.test(t):F(t,O.billing)?!0:gt.test(e)?t.includes("upgrade")||t.includes("credits")||t.includes("payment")||t.includes("plan"):!1:!1}function De(e){return F(e,O.authPermanent)}function Et(e){return F(e,O.auth)}function Ne(e){return F(e,O.overloaded)}function P(e,t){return t.some(n=>e.includes(n))}function It(e){return P(e,bt)||P(e,Ct)&&e.includes("limit")||e.includes("billing hard limit")||e.includes("hard limit reached")||e.includes("maximum allowed")&&e.includes("limit")}function Lt(e){let t=P(e,kt),n=e.includes("spend limit")||e.includes("spending limit"),o=P(e,Rt);return P(e,vt)&&P(e,xt)||t&&(e.includes("usage limit")||n)||t&&e.includes("limit")&&e.includes("reset")||o&&e.includes("limit")&&(n||P(e,St))}function Pt(e){return e.trim().toLowerCase().replace(Mt,"").trim()}function Be(e){let t=Pt(e);return!t||It(t)?"billing":Fe(t)||Lt(t)?"rate_limit":"billing"}function Ot(e){return At.test(e)?Be(e):null}function $e(e){let t=e.match(yt);if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?{code:n,rest:(t[2]??"").trim()}:null}function Ft(e){if(!e)return!1;let t=e.toLowerCase();return t.includes('"type":"api_error"')&&t.includes("internal server error")}function Ue(e){let t=e.trim();if(!t)return!1;let n=$e(t);return n?Tt.has(n.code):!1}function J(e,t){return typeof e!="number"||!Number.isFinite(e)?null:e===402?t?Be(t):"billing":e===429?"rate_limit":e===401||e===403?t&&De(t)?"auth_permanent":"auth":e===408?"timeout":e===503?t&&Ne(t)?"overloaded":"timeout":e===502||e===504?"timeout":e===529?"overloaded":e===400?t&&de(t)?"billing":"format":null}function He(e){if(!e)return!1;let t=e.toLowerCase();return!!(t.includes("unknown model")||t.includes("model not found")||t.includes("model_not_found")||t.includes("not_found_error")||t.includes("does not exist")&&t.includes("model")||t.includes("invalid model")&&!t.includes("invalid model reference")||/models\/[^\s]+ is not found/i.test(e)||/\b404\b/.test(e)&&/not[-_ ]?found/i.test(e))}function Dt(e){if(!e)return!1;let t=e.toLowerCase();return t.includes("session not found")||t.includes("session does not exist")||t.includes("session expired")||t.includes("session invalid")||t.includes("conversation not found")||t.includes("conversation does not exist")||t.includes("conversation expired")||t.includes("conversation invalid")||t.includes("no such session")||t.includes("invalid session")||t.includes("session id not found")||t.includes("conversation id not found")}function Q(e){if(Dt(e))return"session_expired";if(He(e))return"model_not_found";let t=Ot(e);return t||(wt(e)?de(e)?"billing":"rate_limit":Fe(e)?"rate_limit":Ne(e)?"overloaded":Ue(e)?$e(e.trim())?.code===529?"overloaded":"timeout":Ft(e)?"timeout":_t(e)?"format":de(e)?"billing":pe(e)?"timeout":De(e)?"auth_permanent":Et(e)?"auth":null)}var Nt={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"},Bt={RETRYABLE_TRANSIENT:{retryable:!0,maxRetries:3,baseDelayMs:1e3,backoffMultiplier:2,switchProvider:!0},RETRYABLE_DEGRADED:{retryable:!0,maxRetries:2,baseDelayMs:5e3,backoffMultiplier:3,switchProvider:!0},NON_RETRYABLE_AUTH:{retryable:!1,maxRetries:0,baseDelayMs:0,backoffMultiplier:1,switchProvider:!0},NON_RETRYABLE_CONTENT:{retryable:!1,maxRetries:0,baseDelayMs:0,backoffMultiplier:1,switchProvider:!1},NON_RETRYABLE_QUOTA:{retryable:!1,maxRetries:0,baseDelayMs:0,backoffMultiplier:1,switchProvider:!0},TOOL_EXECUTION_FAILED:{retryable:!0,maxRetries:1,baseDelayMs:500,backoffMultiplier:1,switchProvider:!1}};function U(e,t){let n=J(e,t)??(t?Q(t):null);return n?Nt[n]:typeof e=="number"&&e>=400&&e<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function me(e){return Bt[e]}function ge(e){return!(!e.ok||e.existingSkillName||!e.multiStep||e.toolCallCount<3||e.distinctToolCount<2)}function fe(e){return e.existingSkillName?e.feedback==="negative":!1}function H(e,t){return fe(e)?{type:"skill.improve",skillName:e.existingSkillName,reason:"negative user feedback on existing skill execution"}:ge(e)?{type:"skill.create",suggestedName:t.suggestedName??`auto-skill-${t.tools.slice(0,3).join("-")}`,description:`Multi-step orchestration using ${t.tools.join(", ")}`,tools:t.tools,stepCount:e.toolCallCount}:null}function je(e){return e.function&&typeof e.function=="object"&&typeof e.function.name=="string"?e.function.name.trim():typeof e.name=="string"?e.name.trim():""}function $t(e){return e==="enabled-eligible"||e==="installed-awaiting-approval"}function Ut(e){return new Map((e??[]).map(t=>[t.toolName,t]))}function ze(e){if(!e.eligibility?.length)return[...e.tools];let t=Ut(e.eligibility);return e.tools.filter(n=>{let o=je(n);if(!o)return!1;let r=t.get(o);return!r||$t(r.status)})}function qe(e){let t=[],n=e.compatibility??{},o=e.toolChoice;if(e.thinkingEnabled&&n.requireAutoWhenThinking){let r=typeof o=="object"&&o&&!Array.isArray(o)?String(o.type??""):o;r&&r!=="auto"&&r!=="none"&&(t.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),o="auto")}if(o==="required"&&n.allowRequiredToolChoice===!1){let r=n.requiredFallback??"auto";t.push(`tool_choice=required is not supported by this provider; downgraded to ${r}.`),o=r}if(o&&typeof o=="object"&&!Array.isArray(o)&&o.type==="function"&&n.allowNamedToolChoice===!1){let r=n.namedFallback??"required";t.push(`named tool_choice is not supported by this provider; downgraded to ${r}.`),o=r}return{normalizedToolChoice:o,warnings:t}}function he(e){let t=qe({toolChoice:e.toolChoice,thinkingEnabled:e.thinkingEnabled,compatibility:e.compatibility}),n=t.normalizedToolChoice,o=[...t.warnings],r=ze({tools:e.tools,eligibility:e.eligibility});if(!n||n==="auto")return{tools:r,normalizedToolChoice:n,warnings:o};if(n==="none")return{tools:[],normalizedToolChoice:"none",warnings:o};if(n==="required"){if(r.length===0)throw new Error("tool_choice=required but no tools were provided");return{tools:r,normalizedToolChoice:"required",extraSystemPrompt:"You must call one of the available tools before responding.",warnings:o}}if(typeof n=="object"&&!Array.isArray(n)&&n.type==="function"){let i=n.function??void 0,a=typeof i?.name=="string"?i.name.trim():"";if(!a)throw new Error("tool_choice.function.name is required");let s=r.filter(l=>je(l)===a);if(s.length===0)throw new Error(`tool_choice requested unknown tool: ${a}`);return{tools:s,normalizedToolChoice:{type:"function",function:{name:a}},extraSystemPrompt:`You must call the ${a} tool before responding.`,warnings:o}}return{tools:r,normalizedToolChoice:n,warnings:o}}var Ht=["stop","aborted","timeout","cancelled","interrupted","error"],jt=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function We(e){return e==null?[]:typeof e=="string"?e.length>0?[{type:"text",text:e}]:[]:Array.isArray(e)?e:[{type:"text",text:String(e)}]}function zt(e,t){return{...e,content:[...We(e.content),...We(t.content)]}}function qt(e){if(!e||typeof e!="object")return!1;if(e.function&&typeof e.function=="object"){let t=e.function.name;if(typeof t=="string"&&t.length>0)return!0}return typeof e.name=="string"&&e.name.length>0}function Wt(e){return new Set((e??Ht).map(t=>t.trim().toLowerCase()))}function Kt(e,t){return e?Wt(t).has(e.trim().toLowerCase()):!1}function Z(e){if(!Array.isArray(e)||e.length===0)return[...e];let t=e.map(s=>{if(s.role==="assistant"&&Array.isArray(s.tool_calls)){let l=s.tool_calls.filter(u=>qt(u));return{...s,...l.length>0?{tool_calls:l}:{tool_calls:void 0}}}return{...s}}),n=new Set;for(let s of t)if(!(s.role!=="assistant"||!Array.isArray(s.tool_calls)))for(let l of s.tool_calls)typeof l.id=="string"&&l.id&&n.add(l.id);let o=t.filter(s=>s.role!=="tool"?!0:!!(s.tool_call_id&&n.has(s.tool_call_id))),r=new Set;for(let s of o)s.role==="tool"&&typeof s.tool_call_id=="string"&&s.tool_call_id&&r.add(s.tool_call_id);let i=[];for(let s of o){if(s.role==="assistant"&&Array.isArray(s.tool_calls)&&s.tool_calls.length>0){let l=s.tool_calls.filter(u=>typeof u.id=="string"&&r.has(u.id));if(l.length===0){let{tool_calls:u,...d}=s;d.content!=null&&d.content!==""&&i.push(d);continue}if(l.length<s.tool_calls.length){i.push({...s,tool_calls:l});continue}}i.push(s)}let a=[];for(let s of i){let l=a.length>0?a[a.length-1]:void 0;if(s.role==="user"&&l?.role==="user"){a[a.length-1]=zt(l,s);continue}a.push(s)}return a}function ee(e,t){return Kt(t?.stopReason,t?.forcedStopReasons)?e.map(n=>{if(n.role!=="assistant")return{...n};let o={...n};for(let r of jt)delete o[r];return o}):[...e]}function te(e,t){let n=t?.placeholderToolResult??JSON.stringify({ok:!1,error:"Tool loop interrupted before the tool result was replayed."}),o=new Set;for(let i of e)i.role==="tool"&&typeof i.tool_call_id=="string"&&i.tool_call_id&&o.add(i.tool_call_id);let r=[];for(let i of e)if(r.push({...i}),!(i.role!=="assistant"||!Array.isArray(i.tool_calls)||i.tool_calls.length===0))for(let a of i.tool_calls)typeof a.id!="string"||!a.id||o.has(a.id)||(o.add(a.id),r.push({role:"tool",tool_call_id:a.id,content:n}));return r}function ye(e,t){let n=Z(e),o=ee(n,t);return te(o,t)}function Ke(e){if(e!==void 0)return typeof e=="boolean"?{kind:"enabled",enabled:e}:e===null?{kind:"suppressed"}:{kind:"invalid",summary:typeof e=="string"?e:typeof e}}function Te(e){let t=[],n=Ke(e.requestedPreference),o=new Map((e.toolCapabilities??[]).map(l=>[l.name,l])),r=e.providerSupportsParallel!==!1;n?.kind==="enabled"?r=n.enabled&&e.providerSupportsParallel!==!1:n?.kind==="suppressed"?r=!1:n?.kind==="invalid"&&t.push(`ignoring invalid parallel_tool_calls param: ${n.summary}`),r&&e.providerSupportsParallel===!1&&t.push("provider does not support parallel tool calls; downgraded to serial execution.");let i=[],a=[],s=()=>{a.length!==0&&(i.push({mode:"parallel",calls:a}),a=[])};for(let l of e.toolCalls){let u=o.get(l.function.name);if(!r||u?.requiresApproval===!0||u?.serialOnly===!0||u?.parallelSafe===!1||u?.approvalMode==="user-confirm"){s(),i.push({mode:"serial",calls:[l]});continue}a.push(l)}return s(),{enabled:r,mode:i.some(l=>l.mode==="parallel"&&l.calls.length>1)?"parallel":"serial",batches:i,warnings:t}}function Yt(e){let t=new Set,n=new Set;for(let o of e){if(o.role==="assistant"&&Array.isArray(o.tool_calls))for(let r of o.tool_calls)typeof r.id=="string"&&r.id&&t.add(r.id);o.role==="tool"&&typeof o.tool_call_id=="string"&&o.tool_call_id&&n.add(o.tool_call_id)}return[...t].filter(o=>!n.has(o))}function Vt(e){let t=new Set;for(let n of e)n.role==="tool"&&typeof n.tool_call_id=="string"&&n.tool_call_id&&t.add(n.tool_call_id);return[...t]}function Ge(e){return{round:e.round??0,maxRounds:e.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??[]],completedToolCallIds:[...e.completedToolCallIds??[]],lastStopReason:e.lastStopReason,replayMessages:[...e.replayMessages??[]]}}function be(e,t){return{round:e.round+1,maxRounds:e.maxRounds,pendingToolCallIds:[...t.pendingToolCallIds??e.pendingToolCallIds],completedToolCallIds:[...t.completedToolCallIds??e.completedToolCallIds],lastStopReason:t.lastStopReason??e.lastStopReason,replayMessages:[...t.replayMessages??e.replayMessages]}}function ne(e,t){return{round:e.round,maxRounds:e.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...t.completedToolCallIds??e.completedToolCallIds],lastStopReason:t.lastStopReason??e.lastStopReason,replayMessages:[...t.replayMessages??e.replayMessages]}}function oe(e){let t=[],n=Z(e.replayMessages);n.length!==e.replayMessages.length&&t.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let o=ee(n,e.options);o.some((i,a)=>i!==n[a])&&t.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let r=te(o,e.options);return r.length>o.length&&t.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:Ge({maxRounds:e.maxRounds,round:e.round,lastStopReason:e.lastStopReason,replayMessages:r,pendingToolCallIds:Yt(r),completedToolCallIds:Vt(r)}),recoveryActions:t}}import{MEMORY_OBSERVATION_HOOK_VALUES as Xt,MEMORY_OBSERVATION_SOURCE_VALUES as Jt,MEMORY_WRITE_ACCESS_VALUES as Qt}from"qlogicagent-runtime-contracts";function Ce(e){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:e.maxOutputTokens,consecutiveTruncations:0,aborted:e.abortSignal?.aborted??!1}}function ke(e,t){if(e.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let n=t.contextWindowTokens-t.responseBufferTokens-e.currentMaxOutputTokens,o=n>0?e.promptTokens/n*100:100;return e.promptTokens>=n?e.hasAttemptedReactiveCompact||!t.reactiveCompactEnabled?{level:"blocking",usagePercent:o,reason:"prompt_too_long"}:{level:"blocking",usagePercent:o,reason:"prompt_too_long"}:o>=85?{level:"warning",usagePercent:o,remainingTokens:n-e.promptTokens}:{level:"ok"}}function ve(e,t,n){let o=e.message?.toLowerCase()??"",r=e.status??0;return r===413||o.includes("prompt_too_long")||o.includes("context_length_exceeded")?!t.hasAttemptedReactiveCompact&&n.reactiveCompactEnabled?{action:"reactive_compact"}:{action:"abort",reason:"prompt_too_long_unrecoverable"}:r>=500&&r<600?{action:"retry",reason:`server_error_${r}`}:r===429?{action:"retry",reason:"rate_limited"}:{action:"abort",reason:o||"unknown_error"}}function xe(e,t,n){if(!t.outputEscalationEnabled)return{shouldEscalate:!1,newMax:e.currentMaxOutputTokens};if(e.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:e.currentMaxOutputTokens};let o=Math.min(e.currentMaxOutputTokens*2,n);return o<=e.currentMaxOutputTokens?{shouldEscalate:!1,newMax:e.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:o}}function Re(e,t){return e.aborted?!0:t.abortSignal?.aborted?(e.aborted=!0,!0):!1}var Ye={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function Se(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function re(e,t=Ye){return!(e.attemptedThisTurn||e.consecutiveFailures>=t.maxConsecutiveFailures)}var Zt={research:{type:"research",label:"Research",description:"Independent retrieval or evidence gathering branches.",mergePolicy:"summary-only",budgetTier:"medium",budgetWeight:2,preferFullContext:!1,preserveConversationHistory:!0,toolAccessMode:"read-only"},planner:{type:"planner",label:"Planner",description:"Planning and tool orchestration branches that may return structured context.",mergePolicy:"append-messages",budgetTier:"high",budgetWeight:3,preferFullContext:!0,preserveConversationHistory:!0,toolAccessMode:"none"},"plan-repair":{type:"plan-repair",label:"Plan Repair",description:"Failure repair or fallback branches that re-plan tool choice, ordering, or approval strategy.",mergePolicy:"replace-context",budgetTier:"medium",budgetWeight:2,preferFullContext:!0,preserveConversationHistory:!1,toolAccessMode:"none"},"code-repair":{type:"code-repair",label:"Code Repair",description:"Recovery branches focused on file edits, patch validation, or workspace mutation repair.",mergePolicy:"replace-context",budgetTier:"high",budgetWeight:3,preferFullContext:!0,preserveConversationHistory:!1,toolAccessMode:"full"},"media-prep":{type:"media-prep",label:"Media Prep",description:"Preparation branches for media generation, normalization, or staging.",mergePolicy:"summary-only",budgetTier:"low",budgetWeight:1,preferFullContext:!1,preserveConversationHistory:!1,toolAccessMode:"read-only"}},Ae=["gateway","agents_list","whatsapp_login","session_status","cron","memory_query","sessions_send"],en=["sessions_list","sessions_history","sessions_spawn"],Ve=["file_edit","create_file","replace_string_in_file","multi_replace_string_in_file","create_directory","run_in_terminal","run_command","delete_file","rename_file","move_file","git_commit","git_push","manage_todo_list"];function tn(e={}){let t=Math.max(1,Math.floor(e.maxDepth??2)),n=typeof e.depth=="number"&&Number.isFinite(e.depth)?Math.max(0,Math.floor(e.depth)):t,o=e.role?e.role==="leaf":n>=t,r=o?[...Ae,...en]:[...Ae],i=new Set(r),a=Array.isArray(e.toolNames)?e.toolNames:e.toolNames?Array.from(e.toolNames):[],s=Array.from(new Set(a.map(l=>l.trim()).filter(Boolean))).map(l=>{let u=i.has(l);return{toolName:l,decision:u?"denied":"allowed",inheritance:u?"shrink":"inherit",reason:u?Ae.includes(l)?"always-deny":"leaf-deny":"default-allow"}});return{deniedTools:r,canSpawnChildren:!o,defaultDecision:"allowed",defaultInheritance:"inherit",tools:s}}function Xe(e){let t=nn(e.type),n=tn({depth:e.depth,maxDepth:e.maxDepth,role:e.role,toolNames:e.toolNames});if(t.toolAccessMode==="full")return n;if(t.toolAccessMode==="none"){let i=Array.isArray(e.toolNames)?e.toolNames:e.toolNames?Array.from(e.toolNames):[],a=[...new Set(i.map(s=>s.trim()).filter(Boolean))];return{deniedTools:a,canSpawnChildren:!1,defaultDecision:"allowed",defaultInheritance:"inherit",tools:a.map(s=>({toolName:s,decision:"denied",inheritance:"shrink",reason:"always-deny"}))}}let o=new Set(Ve),r=[...new Set([...n.deniedTools,...Ve])];return{...n,deniedTools:r,tools:n.tools.map(i=>i.decision==="denied"?i:o.has(i.toolName)?{...i,decision:"denied",inheritance:"shrink",reason:"always-deny"}:i)}}function Je(e,t){let n=new Set(t.deniedTools),o=new Map(t.tools.map(a=>[a.toolName,a])),r=[],i=[];for(let a of e){let s=a.function.name,l=o.get(s);l?.decision==="denied"?i.push({toolCall:a,reason:`tool "${s}" denied by sidechain policy: ${l.reason}`}):n.has(s)?i.push({toolCall:a,reason:`tool "${s}" is in sidechain deny list`}):r.push(a)}return{allowed:r,denied:i}}function nn(e){return Zt[e]}function Me(e,t){let n=e.get(t.index);n||(n={id:"",name:"",arguments:""},e.set(t.index,n)),t.id&&(n.id=t.id),t.name&&(n.name+=t.name),n.arguments+=t.arguments}var tt=100,cn=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),tt),un=3,j=2;function dn(e){return typeof e=="number"&&Number.isFinite(e)&&e>=1?Math.min(Math.round(e),tt):cn}async function*nt(e,t,n,o){let{turnId:r,sessionId:i,messages:a,tools:s,model:l,apiKey:u,temperature:d,hooks:m,signal:f}=e,g={sessionId:i,turnId:r},{resolveToolEligibility:h}=await Promise.resolve().then(()=>(Ze(),Qe)),I=h(s,e.toolEligibilityContext),_=I.eligibleTools;for(let S of I.blockedTools)yield{type:"tool_blocked",turnId:r,callId:"",name:S.toolName,reason:"blocked-by-policy"};if(!_.length){yield*mn(r,l,a,u,d,f,t,o);return}let w=dn(e.maxRounds),R=[...a],k=oe({maxRounds:w,replayMessages:R}).state,$={contextWindowTokens:e.contextWindowTokens??128e3,responseBufferTokens:13e3,maxOutputTokens:e.maxOutputTokens??16384,abortSignal:f,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},b=Ce($),K=Se(),D=!1,se=null,E=(e.parentDepth??0)+1,ct,N="",G=0,L={prompt:0,completion:0},B=new Set,v=0;for(let S=0;S<w;S++){if(Re(b,$)){o.info(`turn aborted by guard at round ${S}`);break}let x=ke(b,$);if(x.level==="blocking"){x.reason==="prompt_too_long"&&re(K)&&(K.attemptedThisTurn=!0,b.hasAttemptedReactiveCompact=!0,o.info(`token budget blocking (${x.reason}), reactive compact needed`)),o.info(`token budget blocking (${x.reason}), breaking tool loop`);break}x.level==="warning"&&o.info(`token budget warning: ${x.usagePercent}% used, ${x.remainingTokens} remaining`);let Y=he({tools:_,toolChoice:e.toolChoice??"auto"}),V=oe({maxRounds:w,replayMessages:R,lastStopReason:k.lastStopReason,options:{stopReason:k.lastStopReason}}),Ee=Y.extraSystemPrompt?[{role:"system",content:Y.extraSystemPrompt},...V.state.replayMessages]:V.state.replayMessages;V.recoveryActions.length>0&&o.debug(`tool loop recovery: ${V.recoveryActions.map(c=>c.detail??c.kind).join("; ")}`),o.debug(`round ${S+1}/${w}, messages: ${Ee.length}`),m?.invoke("turn.before_inference",{...g,model:l}).catch(()=>{});let ae=!1,Ie=[],Le=new Map,le="stop",A,C=null;try{for await(let c of t.stream({model:l,messages:Ee,tools:Y.tools,toolChoice:Y.normalizedToolChoice??"auto",temperature:d,maxTokens:b.currentMaxOutputTokens||void 0},u,f))switch(c.type){case"delta":Ie.push(c.text),ae||(yield{type:"delta",turnId:r,text:c.text});break;case"tool_call_delta":ae=!0,Me(Le,c);break;case"reasoning_delta":break;case"usage":A={prompt:c.promptTokens,completion:c.completionTokens,reasoning:c.reasoningTokens};break;case"done":le=c.finishReason;break}ae||m?.invoke("turn.after_inference",{...g,model:l}).catch(()=>{})}catch(c){let p=c instanceof Error?c.message:String(c);C={status:typeof c?.status=="number"?c.status:void 0,message:p}}if(C&&m?.invoke("turn.after_inference",{...g,model:l,response:{error:C.message}}).catch(()=>{}),C){let c=ve({status:C.status??500,message:C.message},b,$);if(c.action==="reactive_compact"&&re(K)&&(K.attemptedThisTurn=!0,b.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:r,action:"reactive_compact",detail:`API ${C.status??500}: ${C.message}`}),c.action==="retry"){yield{type:"recovery",turnId:r,action:"retry",detail:c.reason};continue}let p=U(C.status,C.message);yield{type:"error",turnId:r,error:C.message,code:p};return}if(A&&(L.prompt+=A.prompt,L.completion+=A.completion,A.reasoning&&(L.reasoning=(L.reasoning??0)+A.reasoning)),A?.prompt&&(b.promptTokens=A.prompt),le==="length"||le==="max_tokens"){b.consecutiveTruncations+=1;let c=e.modelMaxOutputTokens??65536,p=xe(b,$,c);p.shouldEscalate&&(b.currentMaxOutputTokens=p.newMax,yield{type:"recovery",turnId:r,action:"output_escalation",detail:`${p.newMax} tokens`})}else b.consecutiveTruncations=0;ct=A,N=Ie.join("");let M=[...Le.values()].map(c=>({id:c.id||`tc_${r}_${S}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:c.name,arguments:c.arguments}}));if(se&&M.length>0){let c=Je(M,se);c.denied.length>0&&o.info(`sidechain policy denied: ${c.denied.map(p=>`${p.toolCall.function.name} (${p.reason})`).join(", ")}`),M=c.allowed}if(M.length===0){if(k=ne(k,{replayMessages:R,lastStopReason:"completed"}),D&&(yield{type:"sidechain_completed",turnId:r,depth:E,toolCallCount:v}),v>0){let c={ok:!0,toolCallCount:v,distinctToolCount:B.size,multiStep:v>=2,hasSidechain:D,feedback:null,existingSkillName:null},p=H(c,{tools:[...B]});p&&(yield{type:"skill_instruction",turnId:r,instruction:p})}yield{type:"end",turnId:r,content:N,usage:L,model:l};return}for(let c of M)yield{type:"tool_call",turnId:r,callId:c.id,name:c.function.name,arguments:c.function.arguments};if(R.push(ue(M)),!D){if(E>j){yield{type:"error",turnId:r,error:`sidechain depth ${E} exceeds max ${j}`,code:"SIDECHAIN_DEPTH_LIMIT"};return}D=!0;let c=E>=j?"leaf":"orchestrator";yield{type:"sidechain_started",turnId:r,depth:E,role:c},se=Xe({type:"planner",depth:E,maxDepth:j,role:E>=j?"leaf":"orchestrator",toolNames:s.map(p=>p.function.name)})}k=be(k,{replayMessages:R,pendingToolCallIds:M.map(c=>c.id),completedToolCallIds:k.completedToolCallIds,lastStopReason:"tool_calls"});let Pe=Te({requestedPreference:void 0,providerSupportsParallel:!0,toolCalls:M,toolCapabilities:_.map(c=>({name:c.function.name,requiresApproval:c.meta?.requiresApproval??!1,approvalMode:c.meta?.requiresApproval?"user-confirm":"pre-authorized",parallelSafe:c.meta?.parallelSafe??!0,serialOnly:c.meta?.serialOnly??!1}))}),ce=[];try{for(let c of Pe.batches)if(c.mode==="parallel"){let p={hooks:m,sessionId:i},y=await Promise.all(c.calls.map(T=>et(T,r,n,f,o,p)));for(let T of y)T.blocked&&(yield{type:"tool_blocked",turnId:r,callId:T.callId,name:T.toolName,reason:T.blockReason??"blocked"}),R.push(T.message),ce.push(T.callId),B.add(T.toolName),v++,yield{type:"tool_result",turnId:r,callId:T.callId,name:T.toolName,ok:T.ok,error:T.error}}else for(let p of c.calls){if(f?.aborted){yield{type:"error",turnId:r,error:"Turn aborted",code:"ABORTED"};return}let y=await et(p,r,n,f,o,{hooks:m,sessionId:i});y.blocked&&(yield{type:"tool_blocked",turnId:r,callId:y.callId,name:y.toolName,reason:y.blockReason??"blocked"}),R.push(y.message),ce.push(y.callId),B.add(y.toolName),v++,yield{type:"tool_result",turnId:r,callId:y.callId,name:y.toolName,ok:y.ok,error:y.error}}}catch(c){let p=c instanceof Error?c.message:String(c);yield{type:"error",turnId:r,error:p,code:"TOOL_EXECUTION_ERROR"};return}k=ne(k,{replayMessages:R,completedToolCallIds:[...k.completedToolCallIds,...ce],lastStopReason:Pe.mode});let Oe=R.slice(-M.length);if(Oe.length>0&&Oe.every(c=>{let p=c?.content;if(typeof p!="string")return!1;try{return JSON.parse(p)?.ok===!1}catch{return!1}})){if(G+=1,G>=un&&N){o.info(`early exit: ${G} consecutive failed rounds, returning partial response`),yield{type:"end",turnId:r,content:N,usage:L};return}}else G=0}if(N){if(o.info(`tool loop budget exhausted (${w} rounds), returning partial response`),D&&(yield{type:"sidechain_completed",turnId:r,depth:E,toolCallCount:v}),v>0){let S={ok:!0,toolCallCount:v,distinctToolCount:B.size,multiStep:v>=2,hasSidechain:D,feedback:null,existingSkillName:null},x=H(S,{tools:[...B]});x&&(yield{type:"skill_instruction",turnId:r,instruction:x})}yield{type:"end",turnId:r,content:N,usage:L,model:l};return}yield{type:"error",turnId:r,error:`Tool loop exceeded budget (${w} rounds)`,code:"TOOL_LOOP_LIMIT"}}async function et(e,t,n,o,r,i){let a=e.function.name;r.debug(`tool_call: ${a}`);let s=i?.hooks,l=e.function.arguments;if(s)try{let f=await s.invoke("tool.before_invoke",{sessionId:i?.sessionId??"",turnId:t,callId:e.id,toolName:a,arguments:pn(e.function.arguments)});if(f.action==="abort"){let g=f.reason??"blocked by policy";r.info(`tool ${a} blocked: ${g}`),s.invoke("approval.requested",{sessionId:i?.sessionId??"",turnId:t,approvalId:e.id,callId:e.id,toolName:a}).catch(()=>{});let h=X(e.id,{ok:!1,error:g});return{callId:e.id,toolName:a,ok:!1,error:g,blocked:!0,blockReason:g,message:h}}f.action==="continue"&&f.context?.arguments&&(l=JSON.stringify(f.context.arguments),r.debug(`tool ${a}: input mutated by hook`))}catch{}let u=await n.invoke(t,a,l,o),d=!u.error,m=X(e.id,{ok:d,payload:u.result,error:u.error});return s?.invoke(d?"tool.after_invoke":"tool.invoke_failed",{sessionId:i?.sessionId??"",turnId:t,callId:e.id,toolName:a,ok:d,...u.error?{error:u.error}:{}}).catch(()=>{}),{callId:e.id,toolName:a,ok:d,error:u.error,message:m}}function pn(e){try{return JSON.parse(e)}catch{return}}async function*mn(e,t,n,o,r,i,a,s){let l=[],u;s.debug(`single LLM round, messages: ${n.length}`);for await(let d of a.stream({model:t,messages:n,temperature:r},o,i))switch(d.type){case"delta":l.push(d.text),yield{type:"delta",turnId:e,text:d.text};break;case"usage":u={prompt:d.promptTokens,completion:d.completionTokens,reasoning:d.reasoningTokens};break;case"done":break}yield{type:"end",turnId:e,content:l.join(""),usage:u??{prompt:0,completion:0},model:t}}var ot=100,_e=class{transport;apiKey;toolInvoker;log;hooks;maxRounds;constructor(t){this.transport=t.llmTransport,this.apiKey=t.apiKey,this.toolInvoker=t.toolInvoker,this.log=t.log,this.hooks=t.hooks,this.maxRounds=Math.min(t.maxRounds??25,ot)}async*run(t,n){let{turnId:o,messages:r,tools:i,systemPrompt:a,config:s}=t,l={sessionId:t.sessionId,turnId:o};yield{type:"start",turnId:o},this.hooks?.invoke("turn.submitted",{...l,prompt:r[r.length-1]?.content??void 0}).catch(()=>{});let u=ye(r),d=[];a&&d.push({role:"system",content:a}),d.push(...u);let m=s?.model??"",f=Math.min(s?.maxRounds??this.maxRounds,ot);try{let g={turnId:o,sessionId:t.sessionId,messages:d,tools:i,model:m,apiKey:s?.apiKey??this.apiKey,temperature:s?.temperature,maxRounds:f,contextWindowTokens:s?.contextWindowTokens,maxOutputTokens:s?.maxOutputTokens,modelMaxOutputTokens:s?.modelMaxOutputTokens,toolChoice:s?.toolChoice,parentDepth:s?.parentDepth,hooks:this.hooks,signal:n},h;for await(let I of nt(g,this.transport,this.toolInvoker,this.log))h=I,yield I;h?.type==="end"?this.hooks?.invoke("turn.completed",{...l}).catch(()=>{}):h?.type==="error"&&this.hooks?.invoke("turn.failed",{...l,code:h.code,error:h.error}).catch(()=>{})}catch(g){if(n?.aborted)this.hooks?.invoke("turn.failed",{...l,code:"ABORTED",error:"Turn aborted"}).catch(()=>{}),yield{type:"error",turnId:o,error:"Turn aborted",code:"ABORTED"};else{let h=g instanceof Error?g.message:String(g),I=typeof g?.status=="number"?g.status:void 0,_=U(I,h),w=me(_);this.log.error(`turn ${o} error [${_}, retryable=${w.retryable}]: ${h}`),this.hooks?.invoke("turn.failed",{...l,code:_,error:h}).catch(()=>{}),yield{type:"error",turnId:o,error:h,code:_}}}}};function gn(e){let t={verbose:!1};for(let n of e.slice(2))(n==="--verbose"||n==="-v")&&(t.verbose=!0);return t}var we=[{id:"deepseek",name:"DeepSeek",transport:"openai-chat",baseUrl:"https://api.deepseek.com",apiKeyEnvVars:["DEEPSEEK_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"deepseek-chat",models:[{id:"deepseek-chat",name:"DeepSeek Chat V3",contextWindow:64e3,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.27,costOutput:1.1},{id:"deepseek-reasoner",name:"DeepSeek R1",contextWindow:64e3,maxOutput:8192,toolCall:!0,reasoning:!0,vision:!1,costInput:.55,costOutput:2.19}]},{id:"qwen",name:"Alibaba Qwen (DashScope)",transport:"openai-chat",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode",apiKeyEnvVars:["DASHSCOPE_API_KEY","QWEN_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"qwen-plus",models:[{id:"qwen-plus",name:"Qwen Plus",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.8,costOutput:2},{id:"qwen-max",name:"Qwen Max",contextWindow:32768,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:2,costOutput:6},{id:"qwen-turbo",name:"Qwen Turbo",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.3,costOutput:.6},{id:"qwq-plus",name:"QwQ Plus (Reasoning)",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!0,vision:!1,costInput:.8,costOutput:2}]},{id:"zhipu",name:"\u667A\u8C31 GLM (Zhipu)",transport:"openai-chat",baseUrl:"https://open.bigmodel.cn/api/paas",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"glm-4-plus",models:[{id:"glm-4-plus",name:"GLM-4 Plus",contextWindow:128e3,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.5,costOutput:.5}]},{id:"minimax",name:"MiniMax",transport:"openai-chat",baseUrl:"https://api.minimax.chat",apiKeyEnvVars:["MINIMAX_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"MiniMax-Text-01",models:[{id:"MiniMax-Text-01",name:"MiniMax Text 01",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!1,vision:!1,costInput:1,costOutput:8}]},{id:"moonshot",name:"Moonshot (Kimi)",transport:"openai-chat",baseUrl:"https://api.moonshot.cn",apiKeyEnvVars:["MOONSHOT_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"moonshot-v1-128k",omitZeroTemperature:!0,models:[{id:"moonshot-v1-128k",name:"Moonshot V1 128K",contextWindow:128e3,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.6,costOutput:.6}]},{id:"doubao",name:"\u8C46\u5305 (Doubao/Volcengine)",transport:"openai-chat",baseUrl:"https://ark.cn-beijing.volces.com/api",apiKeyEnvVars:["ARK_API_KEY","DOUBAO_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"doubao-1.5-pro-32k",models:[{id:"doubao-1.5-pro-32k",name:"Doubao 1.5 Pro 32K",contextWindow:32768,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.8,costOutput:2}]},{id:"baichuan",name:"\u767E\u5DDD (Baichuan)",transport:"openai-chat",baseUrl:"https://api.baichuan-ai.com",apiKeyEnvVars:["BAICHUAN_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"Baichuan4",models:[{id:"Baichuan4",name:"Baichuan 4",contextWindow:32768,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:1,costOutput:1}]},{id:"stepfun",name:"\u9636\u8DC3\u661F\u8FB0 (StepFun)",transport:"openai-chat",baseUrl:"https://api.stepfun.com",apiKeyEnvVars:["STEPFUN_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"step-2-16k",models:[{id:"step-2-16k",name:"Step 2 16K",contextWindow:16384,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.38,costOutput:.12}]},{id:"openai",name:"OpenAI",transport:"openai-chat",baseUrl:"https://api.openai.com",apiKeyEnvVars:["OPENAI_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"gpt-4o",models:[{id:"gpt-4o",name:"GPT-4o",contextWindow:128e3,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:2.5,costOutput:10},{id:"gpt-4o-mini",name:"GPT-4o Mini",contextWindow:128e3,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:.15,costOutput:.6},{id:"o3-mini",name:"o3-mini",contextWindow:2e5,maxOutput:1e5,toolCall:!0,reasoning:!0,vision:!1,costInput:1.1,costOutput:4.4}]},{id:"anthropic",name:"Anthropic",transport:"anthropic-messages",baseUrl:"https://api.anthropic.com",apiKeyEnvVars:["ANTHROPIC_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"claude-sonnet-4-20250514",models:[{id:"claude-sonnet-4-20250514",name:"Claude Sonnet 4",contextWindow:2e5,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:3,costOutput:15},{id:"claude-opus-4-20250514",name:"Claude Opus 4",contextWindow:2e5,maxOutput:32768,toolCall:!0,reasoning:!0,vision:!0,costInput:15,costOutput:75},{id:"claude-3-5-haiku-20241022",name:"Claude 3.5 Haiku",contextWindow:2e5,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!0,costInput:.8,costOutput:4}]},{id:"google",name:"Google Gemini",transport:"openai-chat",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai",apiKeyEnvVars:["GOOGLE_API_KEY","GEMINI_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"gemini-2.5-flash",models:[{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.15,costOutput:.6},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:1.25,costOutput:10}]},{id:"mistral",name:"Mistral AI",transport:"openai-chat",baseUrl:"https://api.mistral.ai",apiKeyEnvVars:["MISTRAL_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"mistral-large-latest",models:[{id:"mistral-large-latest",name:"Mistral Large",contextWindow:128e3,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:2,costOutput:6}]},{id:"xai",name:"xAI (Grok)",transport:"openai-chat",baseUrl:"https://api.x.ai",apiKeyEnvVars:["XAI_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"grok-3-mini-fast",models:[{id:"grok-3-mini-fast",name:"Grok 3 Mini Fast",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:.5}]},{id:"siliconflow",name:"\u7845\u57FA\u6D41\u52A8 (SiliconFlow)",transport:"openai-chat",baseUrl:"https://api.siliconflow.cn",apiKeyEnvVars:["SILICONFLOW_API_KEY","SF_API_KEY"],authType:"bearer",isAggregator:!0,defaultModel:"deepseek-ai/DeepSeek-V3",models:[{id:"deepseek-ai/DeepSeek-V3",name:"DeepSeek V3 (via SiliconFlow)",contextWindow:64e3,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.5,costOutput:2},{id:"Qwen/Qwen3-235B-A22B",name:"Qwen3 235B (via SiliconFlow)",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:4}]},{id:"openrouter",name:"OpenRouter",transport:"openai-chat",baseUrl:"https://openrouter.ai/api",apiKeyEnvVars:["OPENROUTER_API_KEY"],authType:"bearer",isAggregator:!0,defaultModel:"anthropic/claude-sonnet-4",extraHeaders:{"HTTP-Referer":"https://claw.bot","X-Title":"XiaozhiClaw"},models:[{id:"anthropic/claude-sonnet-4",name:"Claude Sonnet 4 (via OpenRouter)",contextWindow:2e5,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:3,costOutput:15},{id:"deepseek/deepseek-chat",name:"DeepSeek V3 (via OpenRouter)",contextWindow:64e3,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.27,costOutput:1.1}]},{id:"groq",name:"Groq",transport:"openai-chat",baseUrl:"https://api.groq.com/openai",apiKeyEnvVars:["GROQ_API_KEY"],authType:"bearer",isAggregator:!0,defaultModel:"llama-3.3-70b-versatile",models:[{id:"llama-3.3-70b-versatile",name:"Llama 3.3 70B (via Groq)",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.59,costOutput:.79}]},{id:"together",name:"Together AI",transport:"openai-chat",baseUrl:"https://api.together.xyz",apiKeyEnvVars:["TOGETHER_API_KEY"],authType:"bearer",isAggregator:!0,defaultModel:"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",models:[{id:"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",name:"Llama 3.1 70B Turbo (via Together)",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.88,costOutput:.88}]}];import{existsSync as fn,mkdirSync as hn,readFileSync as yn,writeFileSync as Tn}from"node:fs";import{join as rt}from"node:path";import{homedir as bn}from"node:os";var Cn="https://models.dev/api.json",kn=15e3,vn=1440*60*1e3,xn=300*1e3,z=class{cache=null;cacheDir;cacheFile;ttlMs;fetching=!1;lastFetchAttempt=0;constructor(t){this.cacheDir=t?.cacheDir??rt(bn(),".openclaw","cache"),this.cacheFile=rt(this.cacheDir,"model_catalog.json"),this.ttlMs=t?.ttlMs??vn}getModels(t){this.ensureLoaded();let n=this.cache?.providers.get(t);return n?[...n.models.values()]:[]}getModel(t,n){return this.ensureLoaded(),this.cache?.providers.get(t)?.models.get(n)}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(!fn(this.cacheFile))return;let t=yn(this.cacheFile,"utf8"),n=JSON.parse(t);if(!n.fetchedAt||!n.data)return;this.cache={fetchedAt:n.fetchedAt,providers:it(n.data)}}catch{}}saveToDisk(t){try{hn(this.cacheDir,{recursive:!0});let n=JSON.stringify({fetchedAt:Date.now(),data:t},null,0);Tn(this.cacheFile,n,"utf8")}catch{}}backgroundFetch(){this.fetching||Date.now()-this.lastFetchAttempt<xn||(this.fetching=!0,this.fetchRemote().finally(()=>{this.fetching=!1}))}async fetchRemote(){this.lastFetchAttempt=Date.now();try{let t=await fetch(Cn,{signal:AbortSignal.timeout(kn),headers:{Accept:"application/json"}});if(!t.ok)return!1;let n=await t.json(),o=it(n);return o.size===0?!1:(this.cache={fetchedAt:Date.now(),providers:o},this.saveToDisk(n),!0)}catch{return!1}}};function it(e){let t=new Map;if(!e||typeof e!="object")return t;for(let[n,o]of Object.entries(e)){if(!o||typeof o!="object")continue;let r=o.models;if(!r||typeof r!="object")continue;let i=new Map;for(let[a,s]of Object.entries(r)){if(!s||typeof s!="object")continue;let l=s,u=l.limit??{},d=l.modalities??{},m=Array.isArray(d.input)?d.input:[];i.set(a,{id:a,name:typeof l.name=="string"?l.name:a,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||m.includes("image"),costInput:typeof l.cost_input=="number"?l.cost_input:void 0,costOutput:typeof l.cost_output=="number"?l.cost_output:void 0})}i.size>0&&t.set(n,{models:i})}return t}var Rn={claude:"anthropic",gemini:"google","x-ai":"xai","z-ai":"xai",silicon:"siliconflow","silicon-flow":"siliconflow"},ie=class{builtins=new Map;catalog;overrides=new Map;constructor(t){for(let n of we)this.builtins.set(n.id,n);this.catalog=t?.catalog??new z}applyOverride(t,n){this.overrides.set(t,{...this.overrides.get(t),...n})}getProvider(t){let n=Rn[t]??t,o=this.builtins.get(n),r=this.overrides.get(n);if(!(!o&&!r))return!o&&r?!r.id||!r.transport||!r.baseUrl?void 0:{id:r.id,name:r.name??r.id,transport:r.transport,baseUrl:r.baseUrl,apiKeyEnvVars:r.apiKeyEnvVars??[],authType:r.authType??"bearer",isAggregator:r.isAggregator??!1,defaultModel:r.defaultModel,models:r.models}:o&&!r?o:{...o,...r,models:r.models??o.models}}listProviders(){let t=new Map;for(let[n,o]of this.builtins)t.set(n,o);for(let[n]of this.overrides){let o=this.getProvider(n);o&&t.set(n,o)}return[...t.values()]}listModels(t){let o=this.getProvider(t)?.models??[],r=this.catalog.getModels(t);if(r.length===0)return o;let i=new Map;for(let a of r)i.set(a.id,a);for(let a of o)i.set(a.id,a);return[...i.values()]}async refreshCatalog(){return this.catalog.refreshCatalog()}resolveApiKey(t,n){if(n)return n;let o=this.getProvider(t);if(o)for(let r of o.apiKeyEnvVars){let i=process.env[r];if(i?.trim())return i.trim()}}};var q=class{baseUrl;extraHeaders;timeoutMs;supportsStreamOptions;omitZeroTemperature;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.extraHeaders=t.extraHeaders??{},this.timeoutMs=t.timeoutMs??18e4,this.supportsStreamOptions=t.supportsStreamOptions??!0,this.omitZeroTemperature=t.omitZeroTemperature??!1}async*stream(t,n,o){let r=`${this.baseUrl}/v1/chat/completions`,i={model:t.model,messages:t.messages,stream:!0};this.supportsStreamOptions&&(i.stream_options={include_usage:!0}),t.tools&&t.tools.length>0&&(i.tools=t.tools,t.toolChoice&&(i.tool_choice=t.toolChoice)),t.temperature!==void 0&&(this.omitZeroTemperature&&t.temperature===0||(i.temperature=t.temperature)),t.maxTokens!==void 0&&(i.max_tokens=t.maxTokens),t.reasoning&&(i.reasoning=t.reasoning);let a=AbortSignal.timeout(this.timeoutMs),s=o?AbortSignal.any([o,a]):a,l=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`,...this.extraHeaders},body:JSON.stringify(i),signal:s});if(!l.ok){let u=await l.text().catch(()=>"");throw new Error(`LLM API error ${l.status}: ${u.slice(0,500)}`)}if(!l.body)throw new Error("LLM API returned no response body");yield*this.parseSSEStream(l.body)}async*parseSSEStream(t){let n=new TextDecoder,o="";for await(let r of t){o+=n.decode(r,{stream:!0});let i;for(;(i=o.indexOf(`
|
|
2
|
+
`))!==-1;){let a=o.slice(0,i).trim();if(o=o.slice(i+1),!a||a.startsWith(":")||!a.startsWith("data: "))continue;let s=a.slice(6);if(s==="[DONE]")return;let l;try{l=JSON.parse(s)}catch{continue}yield*this.mapChunk(l)}}if(o.trim()){let r=o.trim();if(r.startsWith("data: ")&&r.slice(6)!=="[DONE]")try{let i=JSON.parse(r.slice(6));yield*this.mapChunk(i)}catch{}}}*mapChunk(t){if(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}),!(!t.choices||t.choices.length===0))for(let n of t.choices){let o=n.delta;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 r of o.tool_calls)yield{type:"tool_call_delta",index:r.index,id:r.id,name:r.function?.name,arguments:r.function?.arguments??""};n.finish_reason&&(yield{type:"done",finishReason:n.finish_reason})}}}};var W=class{baseUrl;apiVersion;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiVersion=t.apiVersion??"2023-06-01",this.timeoutMs=t.timeoutMs??18e4}async*stream(t,n,o){let r=`${this.baseUrl}/v1/messages`,{system:i,messages:a}=Mn(t.messages),s={model:t.model,messages:a,max_tokens:t.maxTokens??8192,stream:!0};i&&(s.system=i),t.tools&&t.tools.length>0&&(s.tools=t.tools.map(_n),t.toolChoice&&(s.tool_choice=t.toolChoice==="auto"?{type:"auto"}:t.toolChoice==="required"?{type:"any"}:{type:"none"})),t.temperature!==void 0&&(s.temperature=t.temperature),t.reasoning&&(s.thinking={type:"enabled",budget_tokens:An(t.reasoning.effort)});let l=AbortSignal.timeout(this.timeoutMs),u=o?AbortSignal.any([o,l]):l,d=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":n,"anthropic-version":this.apiVersion},body:JSON.stringify(s),signal:u});if(!d.ok){let m=await d.text().catch(()=>"");throw new Error(`Anthropic API error ${d.status}: ${m.slice(0,500)}`)}if(!d.body)throw new Error("Anthropic API returned no response body");yield*this.parseSSEStream(d.body)}async*parseSSEStream(t){let n=new TextDecoder,o="",r="",i=new Map;for await(let a of t){o+=n.decode(a,{stream:!0});let s;for(;(s=o.indexOf(`
|
|
3
|
+
`))!==-1;){let l=o.slice(0,s).trim();if(o=o.slice(s+1),!l){r="";continue}if(l.startsWith("event: ")){r=l.slice(7).trim();continue}if(!l.startsWith("data: "))continue;let u=l.slice(6),d;try{d=JSON.parse(u)}catch{continue}yield*this.mapEvent(r,d,i)}}}*mapEvent(t,n,o){switch(t){case"message_start":{let i=n.message?.usage;i?.input_tokens&&(yield{type:"usage",promptTokens:i.input_tokens??0,completionTokens:i.output_tokens??0});break}case"content_block_start":{let r=n.index,i=n.content_block;if(!i)break;let a=i.type;o.set(r,{type:a,id:i.id,name:i.name}),a==="tool_use"&&(yield{type:"tool_call_delta",index:r,id:i.id,name:i.name,arguments:""});break}case"content_block_delta":{let r=n.index,i=n.delta;if(!i)break;let a=i.type;a==="text_delta"?yield{type:"delta",text:i.text}:a==="input_json_delta"?yield{type:"tool_call_delta",index:r,arguments:i.partial_json}:a==="thinking_delta"&&(yield{type:"reasoning_delta",text:i.thinking});break}case"content_block_stop":{let r=n.index;o.delete(r);break}case"message_delta":{let r=n.delta,i=n.usage;i&&(yield{type:"usage",promptTokens:0,completionTokens:i.output_tokens??0}),r?.stop_reason&&(yield{type:"done",finishReason:Sn(r.stop_reason)});break}case"message_stop":break;case"error":{let r=n.error;throw new Error(`Anthropic stream error: ${r?.message??JSON.stringify(n)}`)}}}};function Sn(e){switch(e){case"end_turn":case"stop_sequence":return"stop";case"tool_use":return"tool_calls";case"max_tokens":return"length";default:return e}}var st={xhigh:32e3,high:16e3,medium:8e3,low:4e3};function An(e){return st[e]??st.high}function Mn(e){let t,n=[];for(let o of e){if(o.role==="system"){t=t?`${t}
|
|
4
|
+
|
|
5
|
+
${o.content??""}`:o.content??"";continue}if(o.role==="user")n.push({role:"user",content:o.content??""});else if(o.role==="assistant")if(o.tool_calls&&o.tool_calls.length>0){let r=[];o.content&&r.push({type:"text",text:o.content});for(let i of o.tool_calls){let a;try{a=JSON.parse(i.function.arguments)}catch{a={}}r.push({type:"tool_use",id:i.id,name:i.function.name,input:a})}n.push({role:"assistant",content:r})}else n.push({role:"assistant",content:o.content??""});else o.role==="tool"&&n.push({role:"user",content:[{type:"tool_result",tool_use_id:o.tool_call_id??"",content:o.content??""}]})}return{system:t,messages:n}}function _n(e){return{name:e.function.name,description:e.function.description,input_schema:e.function.parameters??{type:"object",properties:{}}}}function at(e,t){e.baseUrl&&t.applyOverride(e.provider,{baseUrl:e.baseUrl});let n=t.getProvider(e.provider);if(!n)throw new Error(`Unknown LLM provider: "${e.provider}". Available: ${t.listProviders().map(i=>i.id).join(", ")}`);let o=e.baseUrl??n.baseUrl;return{transport:wn(n,o),apiKey:e.apiKey,resolvedModel:e.model,providerDef:n}}function lt(e){for(let t of e.listProviders()){let n=e.resolveApiKey(t.id);if(n)return{providerId:t.id,apiKey:n,defaultModel:t.defaultModel??t.models?.[0]?.id??""}}}function wn(e,t){switch(e.transport){case"openai-chat":return new q({baseUrl:t,extraHeaders:e.extraHeaders,supportsStreamOptions:e.supportsStreamOptions,omitZeroTemperature:e.omitZeroTemperature});case"anthropic-messages":return new W({baseUrl:t});default:throw new Error(`Unsupported transport type: "${e.transport}" for provider "${e.id}"`)}}function En(e){let t=new Map;return{register(n){let o=t.get(n.point)??[],r={handler:n.handler,priority:n.priority??100,label:n.label};return o.push(r),o.sort((i,a)=>i.priority-a.priority),t.set(n.point,o),()=>{let i=o.indexOf(r);i>=0&&o.splice(i,1)}},async invoke(n,o){let r=t.get(n);if(!r||r.length===0)return{action:"continue",context:o};let i=o;for(let a of r)try{let s=await a.handler(n,i);if(!s||s.action==="continue"){s?.context&&(i=s.context);continue}if(s.action==="abort"||s.action==="skip")return e.info({hook:n,label:a.label,action:s.action,reason:s.reason},"hook intercepted"),s}catch(s){e.warn({hook:n,label:a.label,err:s.message},"hook handler failed (non-blocking)")}return{action:"continue",context:i}}}}export{_e as Agent,ie as ProviderRegistry,lt as autoDetectProvider,H as buildSkillInstruction,En as createHookRegistry,at as createLLMClient,gn as parseCliArgs,ge as shouldCreateSkill,fe as shouldImproveSkill};
|