@cline/core 0.0.95 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ClineCore.d.ts +6 -1
- package/dist/account/rpc.d.ts +3 -1
- package/dist/cline-core/runtime-services.d.ts +4 -2
- package/dist/cloud/controller.d.ts +5 -2
- package/dist/cloud/hub-client.d.ts +51 -0
- package/dist/cloud/hub-protocol.d.ts +18 -0
- package/dist/cloud/index.d.ts +2 -0
- package/dist/cloud/index.js +16 -16
- package/dist/cloud/types.d.ts +4 -1
- package/dist/extensions/context/compaction-shared.d.ts +1 -0
- package/dist/extensions/context/compaction.d.ts +7 -0
- package/dist/extensions/context/summarize-conversation.d.ts +7 -0
- package/dist/extensions/context/summary-generation.d.ts +14 -0
- package/dist/extensions/mcp/apps.d.ts +16 -0
- package/dist/extensions/mcp/client.d.ts +1 -0
- package/dist/extensions/mcp/index.d.ts +5 -1
- package/dist/extensions/mcp/manager.d.ts +2 -1
- package/dist/extensions/mcp/session-apps.d.ts +28 -0
- package/dist/extensions/mcp/types.d.ts +22 -0
- package/dist/extensions/plugin/plugin-command-origin.d.ts +8 -0
- package/dist/extensions/plugin/plugin-registry.d.ts +1 -0
- package/dist/extensions/plugin/plugin-runtime.d.ts +7 -0
- package/dist/hub/client/index.d.ts +6 -0
- package/dist/hub/client/managed-hub-build-watcher.d.ts +2 -0
- package/dist/hub/client/plugin-commands.d.ts +4 -0
- package/dist/hub/client/session-client.d.ts +2 -0
- package/dist/hub/daemon/entry.js +241 -228
- package/dist/hub/index.d.ts +1 -0
- package/dist/hub/index.js +231 -218
- package/dist/hub/runtime-host/hub-runtime-host.d.ts +6 -0
- package/dist/hub/server/cloud-session-service.d.ts +50 -0
- package/dist/hub/server/handlers/capability-handlers.d.ts +18 -1
- package/dist/hub/server/handlers/context.d.ts +13 -2
- package/dist/hub/server/handlers/mcp-apps-handlers.d.ts +5 -0
- package/dist/hub/server/hub-server-options.d.ts +3 -0
- package/dist/hub/server/hub-server-transport.d.ts +2 -0
- package/dist/index.d.ts +8 -4
- package/dist/index.js +278 -258
- package/dist/plugin-runtime/node_modules/@cline/agents/dist/index.js +76 -0
- package/dist/plugin-runtime/node_modules/@cline/agents/package.json +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/ai-sdk-b1d8eb67.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/anthropic-33qvrctr.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/bedrock-paabhz8w.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/cline-yhsfqcy1.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/cloud/index.js +21 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/community-gqgs7446.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/foundation-models-embedding-model-strategy-SAVQFBF4-822304b0.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/foundation-models-language-model-strategy-BPQO66W7-hky2m2yx.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-bsd-sqf1kd37.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-bsd-tx1kp6xn.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-darwin-6cpgjxme.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-darwin-fxchqbze.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-linux-m3bzwmzc.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-linux-pr9sb5fr.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-unsupported-nckraycx.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-unsupported-w91yq3tm.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-win-xdyxc2tf.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-win-yxsvs11a.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/google-pgdk2dm9.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/hub/daemon/entry.js +1160 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/hub/index.js +1147 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-02jpyn9y.js +85 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-0cb4390m.js +137 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-0f8xrhgt.js +209 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-1f8vb421.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-28c7m0fv.js +16 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-2em3jg4q.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-4n1zpzbe.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-54eea0ex.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-5j92dtg5.js +16 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-6akf3a5d.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-6k6ep10s.js +136 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-71ym4q6s.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-91p1ghfk.js +14 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-9qkpjy7x.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-9swk4nej.js +3 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-aa2s5myc.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-ae0ajw38.js +13 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-bxvyzjhc.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-bzy863k0.js +6 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-d96n0s70.js +20 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-dsd6vt8c.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-e2q4azd9.js +119 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-egd18jj2.js +4 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-eh83hr16.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-ev9r2dy3.js +1204 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-f2mvvryf.js +190 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-h7gn5v3f.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-h7s1a560.js +12 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-hkhq3jtz.js +21 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-j8r18nfg.js +15 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-jhny555h.js +6 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-m1gpa2eg.js +146 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-m2ad6tgj.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-m7mks2jq.js +4 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-mcnngj50.js +62 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-n2srkkh0.js +39 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-nbs1tsny.js +142 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-nqjnz7m4.js +9 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-rmhzyxr8.js +3 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-rtzf3vvk.js +6 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-sw74pcm3.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-t3eanyjj.js +3 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-tseksj1v.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-v0ctpcdr.js +12 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-v4-dx8bd4wq.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-v695918t.js +14 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-v96yy1pw.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-vfm7r9wk.js +65 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-xecthgrg.js +9 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-xn1xhp06.js +9 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-yfdscfdx.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-yrnwqsdt.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/jiti-static-3mgy2y9y.js +473 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/jiti-w1xrs0vd.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/langfuse-stream-telemetry-9tppg77c.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/langfuse-telemetry-y658kpzy.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/mistral-cmhqd91b.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/multipart-parser-qkjjf8mm.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/ollama-8z6y9d1h.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/openai-cfmja1ez.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/openai-compatible-1t7n5sxj.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/orchestration-embedding-model-strategy-GT27AFII-k6yqgnyd.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/orchestration-language-model-strategy-YEQPUCOT-6rdyebbq.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/services/feature-flags/posthog.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/services/telemetry/index.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/token-1h068py9.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/token-util-7jchft51.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/vertex-qfxfsrn4.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/package.json +1 -0
- package/dist/plugin-runtime/node_modules/@cline/llms/dist/index.browser.js +16 -0
- package/dist/plugin-runtime/node_modules/@cline/llms/dist/index.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/llms/package.json +1 -0
- package/dist/plugin-runtime/node_modules/@cline/sdk/dist/index.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/sdk/package.json +1 -0
- package/dist/plugin-runtime/node_modules/@cline/shared/dist/automation/index.js +57 -0
- package/dist/plugin-runtime/node_modules/@cline/shared/dist/db/index.js +127 -0
- package/dist/plugin-runtime/node_modules/@cline/shared/dist/index.browser.js +110 -0
- package/dist/plugin-runtime/node_modules/@cline/shared/dist/index.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/shared/dist/node.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/shared/dist/remote-config/index.js +68 -0
- package/dist/plugin-runtime/node_modules/@cline/shared/dist/storage/index.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/shared/dist/types/index.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/shared/package.json +1 -0
- package/dist/plugin-runtime/package.json +1 -0
- package/dist/{extensions → plugin-runtime}/plugin-sandbox-bootstrap.js +129 -129
- package/dist/remote/remote-environments.d.ts +1 -0
- package/dist/runtime/config/agent-runtime-config-builder.d.ts +2 -0
- package/dist/runtime/host/local-runtime-host.d.ts +10 -0
- package/dist/runtime/host/runtime-host.d.ts +6 -0
- package/dist/runtime/orchestration/runtime-oauth-token-manager.d.ts +3 -0
- package/dist/runtime/orchestration/session-runtime-orchestrator.d.ts +10 -1
- package/dist/runtime/orchestration/session-runtime.d.ts +2 -0
- package/dist/runtime/tools/subprocess-sandbox.d.ts +22 -0
- package/dist/services/llms/cline-recommended-models.d.ts +2 -0
- package/dist/services/local-runtime-bootstrap.d.ts +1 -0
- package/dist/services/plugin-command-api.d.ts +47 -0
- package/dist/services/plugin-commands.d.ts +25 -27
- package/dist/services/skills-cli.d.ts +2 -0
- package/dist/services/telemetry/core-events.d.ts +26 -0
- package/dist/services/telemetry/index.js +1 -1
- package/dist/services/telemetry/run-health.d.ts +40 -0
- package/dist/services/telemetry/stall-signals.d.ts +12 -0
- package/dist/types/config.d.ts +1 -0
- package/dist/types/session.d.ts +7 -0
- package/package.json +6 -5
|
@@ -0,0 +1,1160 @@
|
|
|
1
|
+
import{Zt,Dn,mo,ho,go,fo,yo,tr,ir,nr,mi,xo,ar,or,rr,bo,Ut,sr,Rt,Ft,Ti,ba,zi,va,wa,hs,Mt,gs,pe,fe,ka,fs,ei,vo,cr,ye,wo,me,Wn,lr,hn,ko,To,_o,ur,Mn,Gi,jt,Io,Nn,pr,Ln,ze,Be,Vi,$t,ne,qt,_t,So,Ki,dr,mr,Bn,he,y,S,Un,Ge,hr,Fn,jn,gr,fr,yr,re,We,It,$n,Hi,ke,ti,rl,sl,qn,Qf,Lm,zt,Jf,Eo,Xe,xr,br,vr,wr,kr,Tr,_r,zn,B,Gn,Ir,Vn,P,Sr,Kn,_i,Ii,ys,gn,xs,bs,vs,Ta,_a,Ia,ws,Sa,Ea,Ra,Oa,Aa,Ca,Pa,Da,Wa,Ma,Na,La,Ba,Ua,Fa,ks,Ot,Qi,Ji,Ts,_s,Is,ja,Ss,Es,Rs,Os,As,$a,Cs,_,Si,ty,qa,Ze,Yi,ht,Gt,za,Ga,Ei,Z,Ve,fn,Hn,Ps,xe,Va,Ka,Ha,Qa,Nt,Ja,Ya,ii,yn,Xa,Er,Rr,Qn,Or,Ar,Za,eo,Xi,Yn,ni,Cr,et}from"../../index-e2q4azd9.js";import"../../index-f2mvvryf.js";import{kn,Di}from"../../index-6k6ep10s.js";import"../../index-v0ctpcdr.js";import"../../index-n2srkkh0.js";import"../../index-vfm7r9wk.js";import"../../index-d96n0s70.js";import"../../index-02jpyn9y.js";import{Jr,li,bi,An,da,ln,st,un,mt,Dt,vi,K,Fi,ha,ga,rt,Lt,pn,Oe,ui,Xt,dn,Cn,ji,Bt,$i,os,rs,ss,cs}from"../../index-28c7m0fv.js";import{X}from"../../index-0cb4390m.js";import{ki,ms,ya,Zo,xa}from"../../index-v695918t.js";import{cc,On,J,pa,q,cn,at,lo,zo,Go,x,ot,f,h,wt,V,Vo,Je}from"../../index-nbs1tsny.js";import{er}from"../../index-xn1xhp06.js";import{Jo}from"../../index-9qkpjy7x.js";import{po}from"../../index-91p1ghfk.js";import{Wt,fa,mn}from"../../index-54eea0ex.js";import"../../index-1f8vb421.js";import"../../index-ae0ajw38.js";import"../../index-egd18jj2.js";import"../../index-9swk4nej.js";import"../../index-j8r18nfg.js";import"../../index-bzy863k0.js";import"../../index-rmhzyxr8.js";import{R}from"../../index-rtzf3vvk.js";import{ta,gi}from"../../index-aa2s5myc.js";import{v,e,n,r,m,o,t,ae,p,w,M,d,on,s,a,Y,je}from"../../index-mcnngj50.js";import{randomUUID as FE}from"node:crypto";import{existsSync as oI,mkdirSync as nm,readFileSync as aI,renameSync as wh,rmdirSync as qE,rmSync as om,statSync as jE,unlinkSync as lI,writeFileSync as dI}from"node:fs";import{dirname as uI,join as ig}from"node:path";import{setTimeout as BE}from"node:timers/promises";import{existsSync as Wu,readFileSync as dA,statSync as uA}from"node:fs";import{basename as SI,dirname as eu,extname as cA,join as Ku,resolve as Fl}from"node:path";import{mkdirSync as pA,readFileSync as mA,statSync as hA,writeFileSync as fA}from"node:fs";import{dirname as gA}from"node:path";import{existsSync as ox,readFileSync as ax}from"node:fs";import{basename as lx,dirname as vg,extname as dx,join as ux,resolve as Dd}from"node:path";import{existsSync as sn,readFileSync as MI}from"node:fs";import{builtinModules as cx,createRequire as px}from"node:module";import{dirname as NI,extname as OI,isAbsolute as mx,relative as bY,resolve as ft}from"node:path";import{fileURLToPath as $I}from"node:url";import{existsSync as bg}from"node:fs";import{dirname as Ig,join as ru,resolve as hx}from"node:path";import{fileURLToPath as fx}from"node:url";import{existsSync as jl}from"node:fs";import{createRequire as DI}from"node:module";import{dirname as su,join as Qs}from"node:path";import{fileURLToPath as Cx}from"node:url";import{spawn as Rx}from"node:child_process";import{basename as Px}from"node:path";import{Worker as Eg}from"node:worker_threads";import{spawn as SC}from"node:child_process";import{spawn as AC}from"node:child_process";import{openSync as xC}from"node:fs";import{existsSync as CC,readdirSync as RC,readFileSync as PC}from"node:fs";import{join as Rg}from"node:path";import{readdirSync as KC}from"node:fs";import{homedir as GC}from"node:os";import{isAbsolute as XC,join as Pc,resolve as hi}from"node:path";import{setTimeout as Lg}from"node:timers/promises";import{createHash as JC}from"node:crypto";import{createHash as yP}from"node:crypto";import{createHash as NM}from"node:crypto";import{spawn as wy}from"node:child_process";import{randomUUID as Kk}from"node:crypto";import{createWriteStream as vN,existsSync as wN,mkdtempSync as bN,renameSync as by,rmSync as cu,writeFileSync as IN}from"node:fs";import{readdir as kN,readFile as SN,rm as qd,stat as Iy}from"node:fs/promises";import{tmpdir as Gk}from"node:os";import{join as ri}from"node:path";import{StringDecoder as TN}from"node:string_decoder";import{execFile as _N,spawnSync as $Q}from"node:child_process";import{readFile as ky}from"node:fs/promises";import*as Mr from"node:fs/promises";import*as Kr from"node:path";import*as nS from"node:os";import*as ls from"node:fs/promises";import*as ts from"node:path";import{createReadStream as CO}from"node:fs";import*as rc from"node:fs/promises";import*as di from"node:path";import{createInterface as RO}from"node:readline";import{Readable as PO}from"node:stream";import{randomUUID as MO}from"node:crypto";import{spawn as uS}from"node:child_process";import*as cS from"node:fs/promises";import*as sc from"node:path";import{mkdir as qO}from"node:fs/promises";import{mkdir as BO,writeFile as HO}from"node:fs/promises";import{join as zO}from"node:path";import{spawn as XO}from"node:child_process";import{realpathSync as JO}from"node:fs";import{readdir as VO}from"node:fs/promises";import YO from"node:os";import mu from"node:path";import{isMainThread as pS,parentPort as Ly,Worker as QO}from"node:worker_threads";import{stat as c$}from"node:fs/promises";import no from"node:path";import{randomUUID as N$}from"node:crypto";import{mkdirSync as KL,writeFileSync as GL}from"node:fs";import{dirname as XL}from"node:path";import{createHash as y1}from"node:crypto";import{lstat as v1,readdir as BS,readFile as lf,realpath as df,stat as Wl}from"node:fs/promises";import{validateHeaderName as w1,validateHeaderValue as b1}from"node:http";import{isIP as I1}from"node:net";import{basename as P5,dirname as k1,isAbsolute as HS,join as js,relative as zS,resolve as bn}from"node:path";import{chmodSync as iv,existsSync as Yc,mkdirSync as q1,readFileSync as j1,renameSync as B1,rmSync as H1,writeFileSync as z1}from"node:fs";import{basename as nv,dirname as Rm}from"node:path";import{existsSync as wD,mkdirSync as bD,readFileSync as ID,renameSync as kD,rmSync as SD,writeFileSync as TD}from"node:fs";import{dirname as JS,join as _D}from"node:path";import{existsSync as FD,readFileSync as qD}from"node:fs";import{dirname as jD,join as $m}from"node:path";import{createHash as aU}from"node:crypto";import{resolve as lU}from"node:path";import{setTimeout as dU}from"node:timers/promises";import{existsSync as cU,mkdirSync as pU,readFileSync as mU,writeFileSync as hU}from"node:fs";import{dirname as fU}from"node:path";import{execFile as xU,spawn as CU}from"node:child_process";import{createHash as RU}from"node:crypto";import{mkdir as PU,readdir as MU,rm as ku,stat as NU,writeFile as OU}from"node:fs/promises";import{join as Kl}from"node:path";import{promisify as $U}from"node:util";import{appendFileSync as KU,readFileSync as GU}from"node:fs";import{join as XU}from"node:path";import{existsSync as VU,readdirSync as YU}from"node:fs";import{basename as QU,extname as ZU,join as eF}from"node:path";import{spawn as oF}from"node:child_process";import{execFile as EF}from"node:child_process";import{basename as AF,resolve as xF}from"node:path";import{performance as kv}from"node:perf_hooks";import{promisify as CF}from"node:util";import{createHash as FF}from"node:crypto";import{createHash as ZF}from"node:crypto";import{resolve as eq}from"node:path";import{existsSync as Wd,mkdirSync as sq,readdirSync as iq,rmdirSync as nq,rmSync as oq,unlinkSync as aq}from"node:fs";import{dirname as Av,join as tl}from"node:path";import{existsSync as mq,mkdirSync as hq,readFileSync as fq,writeFileSync as gq}from"node:fs";import{resolve as yq}from"node:path";var vq=v(Jr(),1);import{execFile as _q}from"node:child_process";import{randomUUID as Eq}from"node:crypto";import{promisify as Aq}from"node:util";import{appendFileSync as Fq}from"node:fs";import{join as qq}from"node:path";import{existsSync as Bq,readdirSync as Hq,readFileSync as zq}from"node:fs";import{basename as Pv,extname as Wq,join as Kq}from"node:path";import{createHash as kj}from"node:crypto";import{watch as Sj}from"node:fs";import{readdir as Tj,readFile as _j,stat as Ej}from"node:fs/promises";import{join as Aj}from"node:path";import{readdir as ff,readFile as Cj,realpath as lp,stat as $o}from"node:fs/promises";import{basename as Ws,dirname as Rj,extname as xu,isAbsolute as Pj,join as Pr,relative as Mj,resolve as zs}from"node:path";import{createHash as Qj}from"node:crypto";import{spawn as hB}from"node:child_process";import{mkdir as fB}from"node:fs/promises";import{StringDecoder as Y0}from"node:string_decoder";import{randomUUID as gB}from"node:crypto";import{appendFileSync as NB,existsSync as Zn,mkdirSync as rw,readdirSync as OB,readFileSync as up,renameSync as sw,statSync as $B,writeFileSync as iw}from"node:fs";import{join as cp}from"node:path";import{existsSync as LB,mkdirSync as DB}from"node:fs";import{join as UB}from"node:path";import{existsSync as nH}from"node:fs";import{readFile as oH}from"node:fs/promises";import{readFile as pH,stat as mH}from"node:fs/promises";import{existsSync as bH,mkdirSync as IH}from"node:fs";import{join as kH}from"node:path";import{existsSync as SH,mkdirSync as TH}from"node:fs";import{dirname as _H}from"node:path";import{appendFileSync as EH,existsSync as AH,mkdirSync as ww,readFileSync as xH,writeFileSync as bw}from"node:fs";import{readFile as Iw,rm as CH}from"node:fs/promises";import{dirname as kw,join as RH}from"node:path";import{randomUUID as PH}from"node:crypto";import{mkdir as MH,open as mT,rename as NH,rm as OH}from"node:fs/promises";import{dirname as Sw}from"node:path";import{chmodSync as YH,existsSync as QH,mkdirSync as ZH}from"node:fs";import{dirname as ez}from"node:path";import{join as iz}from"node:path";import{createHash as nz,randomBytes as wT}from"node:crypto";import{mkdir as Vm,open as _w,readFile as bT,rename as oz,rm as pc,writeFile as az}from"node:fs/promises";import{dirname as IT,join as Af}from"node:path";import{resolve as vp}from"node:path";import{basename as Lz}from"node:path";import{mkdirSync as Dz,writeFileSync as Uz}from"node:fs";import{isAbsolute as Fz,join as RT}from"node:path";import{existsSync as eW,readdirSync as tW,readFileSync as rW,statSync as sW}from"node:fs";import{relative as iW}from"node:path";import{randomUUID as ul}from"node:crypto";import{createHash as kW}from"node:crypto";import{existsSync as FW,mkdirSync as qW,realpathSync as jW,watch as BW}from"node:fs";import{relative as HW,resolve as zW}from"node:path";import{isAbsolute as KW,relative as GW,resolve as uo,sep as XW}from"node:path";import{stat as YW}from"node:fs/promises";import{join as QW}from"node:path";import{existsSync as co,readdirSync as dK,readFileSync as uK}from"node:fs";import{basename as Bo,dirname as rh,extname as sh,isAbsolute as GT,join as Lf,relative as XT,resolve as ih}from"node:path";import{readFile as cK,writeFile as pK}from"node:fs/promises";import{isAbsolute as gK,relative as yK,resolve as Ww}from"node:path";import{existsSync as oh,realpathSync as NK,statSync as OK,watch as $K}from"node:fs";import{relative as LK}from"node:path";import{existsSync as Qr,linkSync as DK,lstatSync as Ap,mkdirSync as UK,readdirSync as FK,readFileSync as qK,realpathSync as Vw,renameSync as jK,rmSync as Yw,writeFileSync as BK}from"node:fs";import{basename as HK,dirname as zK,isAbsolute as ah,join as xp,relative as r_,resolve as Qw,sep as WK}from"node:path";import{createHash as KK}from"node:crypto";import{existsSync as Cp,realpathSync as Zw}from"node:fs";import{dirname as GK,isAbsolute as Df,relative as Uf,resolve as s_,sep as XK}from"node:path";import{randomUUID as ib}from"node:crypto";import{resolve as nb}from"node:path";import{resolve as fb}from"node:path";import{realpathSync as lh,statSync as yG}from"node:fs";import{isAbsolute as d_,relative as vG,sep as u_}from"node:path";import{randomUUID as $G}from"node:crypto";import{randomUUID as DG}from"node:crypto";import{randomUUID as zG}from"node:crypto";import{posix as Uu}from"node:path";var S_=v(ms(),1),T_=v(er(),1);import{spawn as WG}from"node:child_process";import{closeSync as KG,mkdirSync as GG,openSync as XG,readFileSync as JG,unlinkSync as VG}from"node:fs";import{basename as YG,dirname as QG,join as ZG}from"node:path";import{fileURLToPath as eX}from"node:url";import{join as B2}from"node:path";import{join as RJ}from"node:path";import{resolve as Yb}from"node:path";import{timingSafeEqual as WJ}from"node:crypto";import KJ from"node:http";import{URL as vh}from"node:url";import{isAbsolute as GJ,relative as XJ,resolve as em,sep as JJ}from"node:path";import{spawnSync as aV}from"node:child_process";import{release as fV}from"node:os";var pE=v(li(),1),mE=v(os(),1),hE=v(rs(),1),fE=v(po(),1),gE=v(fa(),1),ea=v(ss(),1),Tn=v(cs(),1),ra=v(mn(),1),yE=v(Jo(),1),yc=v(Wt(),1),Bi=v(li(),1),PE=(i,l,u)=>()=>{if(i)try{l=i(i=0)}catch(c){u=[c]}if(u)throw u[0];return l};async function ME(i,l,u,c){let g=NE(l),b=await $E(u,c);if(g.length===0&&!b)return i;let I=[{type:"text",text:i},...g];if(b)I.push(...b);return I}function NE(i){if(!i||i.length===0)return[];let l=[];for(let u of i){let c=OE(u);if(c)l.push(c)}return l}function OE(i){let l=i.trim();if(!l)return;let u=l.match(/^data:([^;,]+);base64,(.+)$/);if(u){let c=u[1],g=u[2];if(!c||!g)return;return{type:"image",mediaType:c,data:g}}return{type:"image",mediaType:"image/png",data:l}}async function $E(i,l){if(!i||i.length===0)return;let u=l??(async()=>{throw Error("File loading is not configured in this runtime. Provide userFileContentLoader to enable userFiles support.")}),c=await Promise.all(i.map(async(g)=>{let b=g.replace(/\\/g,"/");try{let I=await u(g);return{type:"file",path:b,content:I}}catch(I){let k=I instanceof Error?I.message:String(I);return{type:"file",path:b,content:`Error fetching content: ${k}`}}}));if(c.length===0)return;return c}function LE(i){return i.trim().split(/[\\/]/).at(-1)?.toLowerCase().replace(/\.(?:cmd|exe)$/i,"")??""}function DE(i){if(LE(i.command)!=="npx")return;if(Object.keys(i.env??{}).length>0)return;let l=i.args??[],u=0;while(l[u]==="-y"||l[u]==="--yes")u+=1;if(!/^mcp-remote(?:@[^/\s]+)?$/.test(l[u]??""))return;let c=l[u+1];if(!c||l.length!==u+2)return;try{let g=new URL(c);if(g.protocol!=="http:"&&g.protocol!=="https:")return;return{type:"streamableHttp",url:g.toString()}}catch{return}}function UE(i){return i.type==="stdio"?DE(i)??i:i}function bc(i){if(!i)return;if(i==="http")return"streamableHttp";return i}function vn(){return yn()}function HE(i,l){nm(uI(i),{recursive:!0});let u=`${i}.tmp.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}`;try{dI(u,l,{encoding:"utf8",flag:"wx"}),wh(u,i)}catch(c){try{lI(u)}catch{}throw c}}function zE(i){Atomics.wait(II,0,0,i)}function WE(i){return`${i}.lock`}function cI(){return`${process.pid}.${Date.now()}.${FE()}`}function pI(i,l){nm(uI(i),{recursive:!0});let u=`${i}.tmp.${l}`;om(u,{recursive:!0,force:!0}),nm(u,{recursive:!0}),dI(ig(u,`owner.${l}`),l,{encoding:"utf8",flag:"wx"});try{return wh(u,i),{lockDir:i,ownerFile:ig(i,`owner.${l}`)}}catch(c){if(om(u,{recursive:!0,force:!0}),oI(i))return;throw c}}function mI(i,l){let u;try{u=Date.now()-jE(i).mtimeMs}catch(g){if(g.code==="ENOENT")return;throw g}if(u<Ih)return;l.logger?.log(`[mcp-settings] Stale lock directory at ${i} (age ${u}ms); reclaiming.`,{severity:"warn"});let c=`${i}.stale.${cI()}`;try{wh(i,c)}catch(g){if(g.code==="ENOENT")return;throw g}om(c,{recursive:!0,force:!0})}function KE(i){try{lI(i.ownerFile)}catch(l){if(l.code!=="ENOENT")throw l}try{qE(i.lockDir)}catch(l){let u=l.code;if(u!=="ENOENT"&&u!=="ENOTEMPTY"&&u!=="EEXIST")throw l}}function hI(i){let l=WE(i);if(Ql.has(l))throw Error(`Reentrant MCP settings update for ${i}. Keep mutators pure: compute values up front and do not call back into the settings API.`);return{lockDir:l,token:cI()}}function GE(i,l){let{lockDir:u,token:c}=hI(i),g=l.timeoutMs??Ih,b=Date.now();while(!0){let I=pI(u,c);if(I)return Ql.add(u),I;if(Date.now()-b>g)throw new bh(`Timed out waiting for MCP settings lock at ${u} after ${g}ms.`);mI(u,l),zE(bI)}}async function XE(i,l){let{lockDir:u,token:c}=hI(i),g=l.timeoutMs??Ih,b=Date.now();while(!0){let I=pI(u,c);if(I)return Ql.add(u),I;if(Date.now()-b>g)throw new bh(`Timed out waiting for MCP settings lock at ${u} after ${g}ms.`);mI(u,l),await BE(bI)}}function fI(i,l,u){try{let c=YE(l),g=QE(c,u);return HE(l,`${JSON.stringify(c,null,2)}
|
|
2
|
+
`),g}finally{Ql.delete(i.lockDir),KE(i)}}function JE(i,l,u={}){let c=GE(i,u);return fI(c,i,l)}async function VE(i,l,u={}){let c=await XE(i,u);return fI(c,i,l)}function YE(i){let l=eA(i);if(!l.mcpServers||typeof l.mcpServers!=="object"||Array.isArray(l.mcpServers))l.mcpServers={};return l}function QE(i,l){let u=JSON.stringify(i),c=JSON.parse(u),g=l(c),b=JSON.stringify(c),I=l(i);if(JSON.stringify(i)!==b)throw new lm("MCP settings mutator must be deterministic and free of side effects; repeated calls produced different settings.");if(JSON.stringify(I)!==JSON.stringify(g))throw new lm("MCP settings mutator must be deterministic and free of side effects; repeated calls produced different return values.");return I}function ZE(i){let l=aI(i,"utf8"),u;try{u=JSON.parse(l)}catch(c){let g=c instanceof Error?c.message:String(c);throw Error(`Failed to parse MCP settings JSON at "${i}": ${g}`)}if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`Invalid MCP settings at "${i}": expected object.`);return u}function eA(i){try{return ZE(i)}catch(l){if(l.code==="ENOENT")return{};throw l}}function gI(i,l){if(!Object.hasOwn(i,l))return;let u=i[l];if(!u||typeof u!=="object"||Array.isArray(u))return;return u}function tA(i,l,u){Object.defineProperty(i,l,{value:u,enumerable:!0,configurable:!0,writable:!0})}function yI(i={}){let l=i.filePath??vn(),u=aI(l,"utf8"),c;try{c=JSON.parse(u)}catch(b){let I=b instanceof Error?b.message:String(b);throw Error(`Failed to parse MCP settings JSON at "${l}": ${I}`)}let g=wI.safeParse(c);if(!g.success){let b=g.error.issues.map((I)=>{let k=I.path.join(".");return k?`${k}: ${I.message}`:I.message}).join("; ");throw Error(`Invalid MCP settings at "${l}": ${b}`)}return g.data}function Hu(i){if(!i)return;let l={...i.clientInformation?{clientInformation:i.clientInformation}:{},...i.tokens?{tokens:i.tokens}:{},...i.codeVerifier?{codeVerifier:i.codeVerifier}:{},...i.discoveryState?{discoveryState:i.discoveryState}:{},...i.redirectUrl?{redirectUrl:i.redirectUrl}:{},...i.lastError?{lastError:i.lastError}:{},...i.lastAuthenticatedAt?{lastAuthenticatedAt:i.lastAuthenticatedAt}:{},...i.authorizationRequired?{authorizationRequired:!0}:{}};return Object.keys(l).length>0?l:void 0}function rA(i){if(i===void 0)return;let l=Nd.safeParse(i);if(!l.success)return;return Hu(l.data)}function vI(i={}){let l=i.filePath??vn();return oI(l)}function am(i={}){let l=yI(i);return Object.entries(l.mcpServers).map(([u,c])=>sA(u,c))}function sA(i,l){return{name:i,transport:UE(l.transport),disabled:l.disabled,timeoutSeconds:l.timeoutSeconds,metadata:l.metadata,oauthClient:l.oauthClient,oauth:l.oauth}}function iA(i){let l=i.filePath??vn(),u=i.name.trim();if(!u)throw Error("MCP server settings toggle requires a server name.");JE(l,(c)=>{let g=c.mcpServers;if(!g||typeof g!=="object"||Array.isArray(g))throw Error(`Invalid MCP settings at "${l}": mcpServers must be an object.`);let b={...g},I=gI(b,u);if(!I)throw Error(`Unknown MCP server: ${u}`);let k={...I};if(i.disabled)k.disabled=!0;else delete k.disabled;tA(b,u,k),c.mcpServers=b})}function nA(i,l={}){let u=yI(l);if(!Object.hasOwn(u.mcpServers,i))return;return Hu(u.mcpServers[i]?.oauth)}function oA(i,l,u){return(c)=>{let g=c.mcpServers,b=gI(g,i);if(!b)throw Error(`Unknown MCP server: ${i}`);if(u.expectedOAuthClient!==void 0){let T=Od.safeParse(b.oauthClient),E=T.success?T.data:void 0,A=u.expectedOAuthClient??void 0;if(E?.clientId!==A?.clientId||E?.clientSecret!==A?.clientSecret)throw new zu(i)}let I=rA(b.oauth)??{},k=Hu(l(I));if(k)b.oauth=k;else delete b.oauth;return k??{}}}async function aA(i,l,u={}){let c=u.filePath??vn();return VE(c,oA(i,l,u))}async function lA(i,l={}){let u=am(l);for(let c of u)await i.registerServer(c);return u}var En,Ic,kc,Nd,Od,ng,og,ag,lg,dg,ug,Sc,cg,pg,mg,wI,zu,bh,lm,Ih=1e4,bI=25,II,Ql,kI=PE(()=>{En=d(e(),e()),Ic=d(e(),m()),kc=je((i)=>ze(i)?Be(i):void 0,n().optional()),Nd=t({clientInformation:d(e(),m()).optional(),tokens:d(e(),m()).optional(),codeVerifier:e().optional(),discoveryState:d(e(),m()).optional(),redirectUrl:e().url().optional(),lastError:e().optional(),lastAuthenticatedAt:n().int().positive().optional(),authorizationRequired:r().optional()}).strip(),Od=t({clientId:e().min(1),clientSecret:e().min(1).optional()}).strip(),ng=t({type:a("stdio"),command:e().min(1),args:o(e()).optional(),cwd:e().min(1).optional(),env:En.optional()}),og=t({type:a("sse"),url:e().url(),headers:En.optional()}),ag=t({type:a("streamableHttp"),url:e().url(),headers:En.optional()}),lg=w("type",[ng,og,ag]),dg=t({transport:lg,disabled:r().optional(),timeout:kc,metadata:Ic.optional(),oauthClient:Od.optional(),oauth:Nd.optional()}).transform((i)=>({transport:i.transport,disabled:i.disabled,timeoutSeconds:i.timeout,metadata:i.metadata,oauthClient:i.oauthClient,oauth:i.oauth})),ug=s(["stdio","sse","http","streamableHttp"]).optional(),Sc=t({type:s(["stdio","sse","streamableHttp"]).optional(),transportType:ug,disabled:r().optional(),timeout:kc,metadata:Ic.optional(),oauthClient:Od.optional(),oauth:Nd.optional()}),cg=Sc.extend({command:e().min(1),args:o(e()).optional(),cwd:e().min(1).optional(),env:En.optional()}).superRefine((i,l)=>{let u=i.type??bc(i.transportType);if(u&&u!=="stdio")l.addIssue({code:ta.custom,message:'Expected type "stdio" for command-based MCP server',path:["type"]})}).transform((i)=>({transport:{type:"stdio",command:i.command,args:i.args,cwd:i.cwd,env:i.env},disabled:i.disabled,timeoutSeconds:i.timeout,metadata:i.metadata,oauthClient:i.oauthClient,oauth:i.oauth})),pg=Sc.extend({url:e().url(),headers:En.optional()}).superRefine((i,l)=>{let u=i.type??bc(i.transportType)??"sse";if(u!=="sse"&&u!=="streamableHttp")l.addIssue({code:ta.custom,message:'Expected type "sse" or "streamableHttp" for URL-based MCP server',path:["type"]})}).transform((i)=>{if((i.type??bc(i.transportType)??"sse")==="streamableHttp")return{transport:{type:"streamableHttp",url:i.url,headers:i.headers},disabled:i.disabled,timeoutSeconds:i.timeout,metadata:i.metadata,oauthClient:i.oauthClient,oauth:i.oauth};return{transport:{type:"sse",url:i.url,headers:i.headers},disabled:i.disabled,timeoutSeconds:i.timeout,metadata:i.metadata,oauthClient:i.oauthClient,oauth:i.oauth}}),mg=p([dg,cg,pg]),wI=t({mcpServers:d(e(),mg)}).passthrough(),zu=class extends Error{constructor(l){super(`OAuth client configuration changed while authorizing MCP server "${l}". Start authorization again.`);this.name="McpOAuthClientChangedError"}},bh=class extends Error{constructor(l){super(l);this.name="McpSettingsLockTimeoutError"}},lm=class extends Error{constructor(l){super(l);this.name="McpSettingsMutatorPurityError"}},II=new Int32Array(new SharedArrayBuffer(4)),Ql=new Set}),yA=500,Re={SCHEDULE:{RUN_STARTED:"schedule.run_started",RUN_FINISHED:"schedule.run_finished"},CLIENT:{EXTENSION_ACTIVATED:"user.extension_activated"},SESSION:{STARTED:"session.started",ENDED:"session.ended",ERROR_RECORDED:"session.error_recorded"},AGENT:{UNEXPECTED_REASONING_TOKENS:xr},USER:{AUTH_STARTED:"user.auth_started",AUTH_SUCCEEDED:"user.auth_succeeded",AUTH_FAILED:"user.auth_failed",AUTH_LOGGED_OUT:"user.auth_logged_out",AUTH_REFRESH_SOFT_FAILURE:"user.auth_refresh_soft_failure",AUTH_RUN_RETRY:"user.auth_run_retry",PROVIDER_CONFIGURED:"user.provider_configured",TELEMETRY_OPT_OUT:"user.opt_out"},TASK:{CREATED:"task.created",RESTARTED:"task.restarted",COMPLETED:"task.completed",GIT_SNAPSHOT:"task.git_snapshot",CONVERSATION_TURN:"task.conversation_turn",TOKEN_USAGE:"task.tokens",MODE_SWITCH:"task.mode",TOOL_USED:"task.tool_used",SKILL_USED:"task.skill_used",DIFF_EDIT_FAILED:"task.diff_edit_failed",PROVIDER_API_ERROR:"task.provider_api_error",MISTAKE_LIMIT_REACHED:"task.mistake_limit_reached",CAPABILITY_OWNER_GONE:"task.capability_owner_gone",PROVIDER_REQUEST_STARTED:br,PROVIDER_STREAM_STARTED:vr,FIRST_CHUNK_RECEIVED:wr,PROVIDER_STREAM_FAILED:kr,MAX_TOKENS_RECOVERY:_r,CANCELLED:Tr,RUN_IDLE:"task.run_idle",MENTION_USED:"task.mention_used",MENTION_FAILED:"task.mention_failed",MENTION_SEARCH_RESULTS:"task.mention_search_results",AGENT_CREATED:"task.agent_created",AGENT_TEAM_CREATED:"task.agent_team_created",SUBAGENT_STARTED:"task.subagent_started",SUBAGENT_COMPLETED:"task.subagent_completed",COMPACTION_EXECUTED:"task.compaction_executed",COMPACTION_SKIPPED:"task.compaction_skipped",COMPACTION_BUDGET_EMERGENCY:"task.compaction_budget_emergency"},HOOKS:{DISCOVERY_COMPLETED:"hooks.discovery_completed",DETACHED_RUNTIME:"hooks.detached_runtime"},WORKSPACE:{INITIALIZED:"workspace.initialized",INIT_ERROR:"workspace.init_error",PATH_RESOLVED:"workspace.path_resolved"},SDK:{ERROR:zn,TOOL_TIMEOUT:"sdk.tool_timeout",PLAN_MODE_COMMAND_BLOCKED:"sdk.plan_mode_command_blocked"},FEATURE_FLAGS:{FLAG_CALLED:"$feature_flag_called"}};function Me(i,l,u){i?.capture({event:l,properties:u})}function kh(i){if(!i)return;return i.substring(0,yA)}function vA(i){if(typeof i==="string")return"Error";return i.name?.trim()||i.constructor?.name||"Error"}function wA(i){return typeof i==="string"?i:i.message}function hg(i,l){return i.some((u)=>l.has(u.trim().toLowerCase()))}function bA(i,l){let u=[...l.vcs_types],c={root_count:l.root_count,vcs_types:u,is_multi_root:l.root_count>1,has_git:hg(u,new Set(["git"])),has_mercurial:hg(u,new Set(["mercurial","hg"]))};if(l.init_duration_ms!==void 0)c.init_duration_ms=l.init_duration_ms;if(l.feature_flag_enabled!==void 0)c.feature_flag_enabled=l.feature_flag_enabled;if(l.is_remote_workspace!==void 0)c.is_remote_workspace=l.is_remote_workspace;Me(i,Re.WORKSPACE.INITIALIZED,c)}function IA(i,l,u){Me(i,Re.WORKSPACE.INIT_ERROR,{error_type:vA(l),error_message:kh(wA(l)),fallback_to_single_root:u.fallback_to_single_root,workspace_count:u.workspace_count??0})}function Sh(i,l){Me(i,Re.USER.AUTH_STARTED,{provider:l})}function Th(i,l,u){Me(i,Re.USER.AUTH_SUCCEEDED,{provider:l,...u})}function tu(i,l,u,c){Me(i,Re.USER.AUTH_FAILED,{provider:l,errorMessage:kh(u),...c?.requestId?{request_id:c.requestId}:{}})}function _h(i,l,u,c){Me(i,Re.USER.AUTH_LOGGED_OUT,{provider:l,reason:u,...c})}function ql(i,l,u){Me(i,Re.USER.AUTH_REFRESH_SOFT_FAILURE,{provider:l,...u})}function kA(i,l,u){Me(i,Re.USER.AUTH_RUN_RETRY,{provider:l,recovered:u?.recovered})}function SA(i,l){i?.captureRequired(Re.USER.TELEMETRY_OPT_OUT,l)}function Gu(i,l){let u=l.id?.trim();if(u)i?.setDistinctId(u);i?.updateCommonProperties({user_id:u||l.id,account_id:l.id,account_email:l.email,provider:l.provider,organization_id:l.organizationId,organization_name:l.organizationName,member_id:l.memberId})}function TA(i,l){i?.setDistinctId(l?.trim()||void 0),i?.updateCommonProperties({user_id:void 0,account_id:void 0,account_email:void 0,provider:void 0,organization_id:void 0,organization_name:void 0,member_id:void 0})}function _A(i,l){Me(i,Re.TASK.CREATED,l)}function EA(i,l){Me(i,Re.TASK.RESTARTED,l)}function fg(i,l){Me(i,Re.TASK.COMPLETED,l)}function TI(i,l){Me(i,Re.TASK.CONVERSATION_TURN,{...l,timestamp:new Date().toISOString()})}function AA(i,l){Me(i,Re.TASK.TOKEN_USAGE,l)}function xA(i,l,u){Me(i,Re.TASK.MODE_SWITCH,{ulid:l,mode:u})}function Ko(i,l){Me(i,Re.TASK.TOOL_USED,l)}function CA(i,l){Me(i,Re.TASK.SKILL_USED,l)}function RA(i,l){Me(i,Re.TASK.DIFF_EDIT_FAILED,l)}function PA(i,l){Me(i,Re.TASK.MISTAKE_LIMIT_REACHED,{...l,timestamp:new Date().toISOString()})}function gg(i,l){Me(i,Re.TASK.CAPABILITY_OWNER_GONE,l)}function MA(i,l){Me(i,Re.TASK.RUN_IDLE,Eh(l))}function NA(i,l){Me(i,Re.SDK.TOOL_TIMEOUT,Eh(l))}function OA(i,l){Me(i,Re.SDK.PLAN_MODE_COMMAND_BLOCKED,Eh(l))}function Eh(i){let l={};for(let[u,c]of Object.entries(i))if(c!==void 0)l[u]=c;return l}function $A(i,l,u){Me(i,Re.TASK.MENTION_USED,{mentionType:l,contentLength:u,timestamp:new Date().toISOString()})}function LA(i,l,u,c){Me(i,Re.TASK.MENTION_FAILED,{mentionType:l,errorType:u,errorMessage:kh(c),timestamp:new Date().toISOString()})}function DA(i,l,u,c,g){Me(i,Re.TASK.MENTION_SEARCH_RESULTS,{queryLength:l.length,resultCount:u,searchType:c,isEmpty:g,timestamp:new Date().toISOString()})}function Ah(i,l){Me(i,Re.TASK.AGENT_CREATED,{...l,timestamp:new Date().toISOString()})}function UA(i,l){Me(i,Re.TASK.AGENT_TEAM_CREATED,{...l,timestamp:new Date().toISOString()})}function yg(i,l){Me(i,l.event==="ended"?Re.TASK.SUBAGENT_COMPLETED:Re.TASK.SUBAGENT_STARTED,{...l,timestamp:new Date().toISOString()})}function FA(i,l){Me(i,Re.HOOKS.DETACHED_RUNTIME,{hookName:l.hookName,durationMs:l.durationMs,exitCode:l.exitCode??void 0,exited:l.exited,timestamp:new Date().toISOString()})}function qA(i,l,u,c){Me(i,Re.HOOKS.DISCOVERY_COMPLETED,{hookName:l,globalCount:u,workspaceCount:c,totalCount:u+c,timestamp:new Date().toISOString()})}function jA(i,l){Me(i,Re.TASK.COMPACTION_EXECUTED,{...l,timestamp:new Date().toISOString()})}function BA(i,l){Me(i,Re.TASK.COMPACTION_SKIPPED,{...l,timestamp:new Date().toISOString()})}function HA(i,l){Me(i,Re.TASK.COMPACTION_BUDGET_EMERGENCY,{...l,timestamp:new Date().toISOString()})}function zA(i,l){Me(i,Re.SESSION.ERROR_RECORDED,l)}function sa(i,l){try{Me(i,l.phase==="started"?Re.SCHEDULE.RUN_STARTED:Re.SCHEDULE.RUN_FINISHED,{triggerKind:l.triggerKind,attemptCount:l.attemptCount,startDelayMs:l.startDelayMs,...l.phase==="finished"?{outcome:l.outcome,durationMs:l.durationMs}:{}})}catch{}}var Tc=je((i)=>Array.isArray(i)?i.filter((l)=>typeof l==="string").map((l)=>l.trim()).filter(Boolean):void 0,o(e()).optional()).transform((i)=>{if(!i)return;let l=[...new Set(i)].sort((u,c)=>u.localeCompare(c));return l.length>0?l:void 0}),WA=s(["basic","agentic"]).catch("agentic"),KA=on(s(Gi),t({enabled:r()}).strip()).optional(),GA=s(["plan","act"]),xh=t({telemetryOptOut:r().default(!1).catch(!1),autoUpdateEnabled:r().default(!0).catch(!0),compactionStrategy:WA.optional(),compactionEnabled:r().optional().catch(void 0),planActMode:GA.optional().catch(void 0),toolAutoApprove:r().optional().catch(void 0),tuiTheme:e().optional().catch(void 0),disabledTools:Tc.optional(),tools:KA,disabledPlugins:Tc.optional(),disabledAgentPlugins:Tc.optional()}).strip().transform((i)=>{let l={autoUpdateEnabled:i.autoUpdateEnabled,telemetryOptOut:i.telemetryOptOut};if(i.compactionStrategy)l.compactionStrategy=i.compactionStrategy;if(i.compactionEnabled!==void 0)l.compactionEnabled=i.compactionEnabled;if(i.planActMode)l.planActMode=i.planActMode;if(i.toolAutoApprove!==void 0)l.toolAutoApprove=i.toolAutoApprove;if(i.tuiTheme?.trim())l.tuiTheme=i.tuiTheme.trim();if(i.disabledTools?.length)l.disabledTools=i.disabledTools;if(i.tools&&Object.keys(i.tools).length>0)l.tools=i.tools;if(i.disabledPlugins?.length)l.disabledPlugins=i.disabledPlugins;if(i.disabledAgentPlugins?.length)l.disabledAgentPlugins=i.disabledAgentPlugins;return l});function $d(){return xh.parse({})}var Ld;function XA(){Ld=void 0}function JA(i){if(i.disabledTools)Object.freeze(i.disabledTools);if(i.tools){for(let l of Object.values(i.tools))Object.freeze(l);Object.freeze(i.tools)}if(i.disabledPlugins)Object.freeze(i.disabledPlugins);if(i.disabledAgentPlugins)Object.freeze(i.disabledAgentPlugins);return Object.freeze(i)}function VA(i){let l;try{l=mA(i,"utf8")}catch{return{value:$d(),loadFailed:!0}}try{let u=xh.safeParse(JSON.parse(l));return u.success?{value:u.data,loadFailed:!1}:{value:$d(),loadFailed:!0}}catch{return{value:$d(),loadFailed:!0}}}function _I(){let i=ii(),l=hA(i,{throwIfNoEntry:!1}),u=l?.mtimeMs??0,c=l?.size??0,g=Ld;if(g&&g.path===i&&g.mtimeMs===u&&g.size===c)return g;let b=l?VA(i):{value:$d(),loadFailed:!1},I=JA(b.value);return Ld={path:i,mtimeMs:u,size:c,value:I,loadFailed:b.loadFailed},Ld}function as(){return _I().value}function Zl(i,l={}){let u=ii(),c=as();pA(gA(u),{recursive:!0});let g=xh.parse(i);if(!c.telemetryOptOut&&g.telemetryOptOut)SA(l.telemetry);fA(u,`${JSON.stringify(g,null,2)}
|
|
3
|
+
`,"utf8"),XA()}function YA(){return as().telemetryOptOut}function ed(i){return new Set(i??as().disabledTools??[])}function EI(i){return new Set(i??as().disabledPlugins??[])}function Ch(i){return new Set(i??as().disabledAgentPlugins??[])}function AI(i){return Gi.includes(i)}function QA(){let i=_I();return{web_search:{enabled:!i.loadFailed},...i.value.tools}}function xI(i){return QA()[i]?.enabled===!0}function ZA(i,l){let u=as();Zl({...u,tools:{...u.tools,[i]:{enabled:l}}})}function ex(i){if(AI(i)){let g=xI(i);return ZA(i,!g),g}let l=as(),u=new Set(l.disabledTools??[]),c=u.has(i);if(c)u.delete(i);else u.add(i);return Zl({...l,disabledTools:[...u]}),!c}function tx(i,l){let u=[...new Set(i.map((I)=>I.trim()).filter(Boolean))];if(u.length===0)return;let c=as(),g=ed(c.disabledTools),b={...c.tools};for(let I of u){if(AI(I)){b[I]={enabled:!l};continue}if(l)g.add(I);else g.delete(I)}Zl({...c,disabledTools:[...g],tools:b})}function rx(i,l){return tx([i],l),l}function sx(i,l){let u=i.trim();if(!u)return;let c=as(),g=EI(c.disabledPlugins);if(l)g.add(u);else g.delete(u);Zl({...c,disabledPlugins:[...g]})}function ix(i,l){let u=i.trim();if(!u)return;let c=as(),g=Ch(c.disabledAgentPlugins);if(l)g.add(u);else g.delete(u);Zl({...c,disabledAgentPlugins:[...g]})}function CI(i,l){let u=EI(l);if(u.size===0)return[...i];return i.filter((c)=>!u.has(c))}function Xu(i,l){let u=ed(l);if(u.size===0)return[...i];return i.filter((c)=>!u.has(c.name))}function nx(i,l){if(!i||i.length===0)return i;let u=ed(l);if(u.size===0)return i;return i.map((c)=>{if(!c.setup)return c;return{...c,setup:(g,b)=>c.setup?.({...g,registerTool:(I)=>{if(!u.has(I.name))g.registerTool(I)}},b)}})}var RI=new WeakSet;function PI(i){return RI.add(i),i}function wg(i){return RI.has(i)}var kg="CLINE_PLUGIN_RUNTIME_DIR",Sg=!1,Tg;function _g(i){return bg(ru(i,"plugin-sandbox-bootstrap.js"))&&bg(ru(i,"node_modules","@cline","core","package.json"))}function gx(){let i=process.env[kg]?.trim();if(i){let u=hx(i);if(!_g(u))throw Error(`${kg} does not contain a complete plugin runtime: ${i}`);return u}if(typeof __CLINE_PLUGIN_RUNTIME_DIR__<"u")return __CLINE_PLUGIN_RUNTIME_DIR__;if(Sg)return Tg;Sg=!0;let l=Ig(fx(import.meta.url));for(;;){for(let c of[l,ru(l,"plugin-runtime"),ru(l,"dist","plugin-runtime")])if(_g(c))return Tg=c,c;let u=Ig(l);if(u===l)return;l=u}}var yx;function vx(){return yx}var wx=NI($I(import.meta.url)),EY=px(import.meta.url),bx=ft(wx,"..","..","..","..",".."),AY=kx(bx),xY=new Set(cx.flatMap((i)=>[i,i.replace(/^node:/,"")])),Ud=new Set(sr),Ix=["development","node","import","require","default"];function kx(i){let l={},u={"@cline/sdk":ft(i,"packages/sdk/src/index.ts"),"@cline/agents":ft(i,"packages/agents/src/index.ts"),"@cline/core":ft(i,"packages/core/src/index.ts"),"@cline/llms":ft(i,"packages/llms/src/index.ts"),"@cline/shared":ft(i,"packages/shared/src/index.ts"),"@cline/shared/storage":ft(i,"packages/shared/src/storage/index.ts"),"@cline/shared/db":ft(i,"packages/shared/src/db/index.ts")};for(let[c,g]of Object.entries(u))if(sn(g))l[c]=g;for(let c of["agents","core","llms","shared"]){let g=ft(i,"packages",c),b=ft(g,"package.json");if(!sn(b))continue;try{let I=JSON.parse(MI(b,"utf8"));if(typeof I.name!=="string"||!I.exports)continue;if(typeof I.exports==="string"){let k=ft(g,I.exports);if(sn(k))l[I.name]=k;continue}if(typeof I.exports!=="object")continue;for(let[k,T]of Object.entries(I.exports)){let E=Sx(g,T);if(!E)continue;let A=k==="."?I.name:`${I.name}/${k.replace(/^\.\//,"")}`;l[A]=E}}catch{}}return l}function Sx(i,l){let u=LI(l);if(!u)return null;let c=Tx(i,u);for(let g of c)if(sn(g))return g;return null}function LI(i,l=new Set){if(typeof i==="string")return i;if(!i||typeof i!=="object")return null;if(l.has(i))return null;l.add(i);let u=i;for(let c of Ix){let g=LI(u[c],l);if(g)return g}return null}function Tx(i,l){let u=l.replace(/^\.\//,""),c=[ft(i,l)];if(u.startsWith("dist/")){let g=u.replace(/^dist\//,"src/").replace(/\.(mjs|cjs|js)$/,"");return[ft(i,`${g}.ts`),ft(i,`${g}.tsx`),ft(i,`${g}.mts`),ft(i,`${g}.cts`),...c]}return c}function _x(i){return!(i.startsWith(".")||i.startsWith("/")||i.startsWith("file:")||i.startsWith("data:")||i.startsWith("http:")||i.startsWith("https:"))}function Ex(i,l){let u=l.startsWith("file:")?$I(l):mx(l)?l:ft(NI(i),l);if(sn(u)&&Ud.has(OI(u)))return u;for(let c of Ud){let g=`${u}${c}`;if(sn(g))return g}for(let c of Ud){let g=ft(u,`index${c}`);if(sn(g))return g}return null}function Ax(i){let l=new Set,u=[/\bimport\s+(?:type\s+)?[^"'`]*?\bfrom\s*["'`]([^"'`]+)["'`]/g,/\bexport\s+[^"'`]*?\bfrom\s*["'`]([^"'`]+)["'`]/g,/\bimport\s*\(\s*["'`]([^"'`]+)["'`]\s*\)/g,/\brequire\s*\(\s*["'`]([^"'`]+)["'`]\s*\)/g];for(let c of u)for(let g of i.matchAll(c)){let b=g[1];if(b)l.add(b)}return[...l]}function Rh(i){let l=[],u=(c,g)=>{if(g.has(c))return;g.add(c);let b;try{b=MI(c,"utf8")}catch{l.push(`${c}:missing`);return}if(l.push(`${c}:${b.length}:${xx(b)}`),!Ud.has(OI(c)))return;for(let I of Ax(b)){if(_x(I))continue;let k=Ex(c,I);if(k)u(k,g)}};return u(i,new Set),l.join("|")}function xx(i){let l=2166136261,u=16777619^i.length;for(let c=0;c<i.length;c++){let g=i.charCodeAt(c);l=Math.imul(l^g,16777619),u=Math.imul(u^g,1540483477),u^=u>>>15}return`${(l>>>0).toString(36)}${(u>>>0).toString(36)}`}var iu=2147483647;function UI(i){return typeof i==="number"&&Number.isInteger(i)&&i>0&&i<=2147483647?i:void 0}var Mx=300;function _c(i){if(i instanceof Error)return i;return Error(String(i))}function dm(i){return i.exitCode===null&&i.signalCode===null}function ad(i){return dm(i)&&i.connected}var Nx="CLINE_JS_RUNTIME_PATH";function um(i){let l=i?.trim();if(!l)return!1;let u=Px(l).toLowerCase();return u==="node"||u==="node.exe"||u==="bun"||u==="bun.exe"}function Ph(i,l={}){let u=l.isBunRuntime??typeof globalThis.Bun<"u",c=l.selfExecPath??process.execPath;return u&&!!i&&i===c&&!um(i)}function FI(i={}){let l=i.env??process.env,u=i.runtimeExecutable?.trim()||l[Nx]?.trim();if(u)return u;let c=i.execPath?.trim()||process.execPath;if(um(c))return c;for(let g of[l.BUN_EXEC_PATH,l.npm_node_execpath,l.NODE]){let b=g?.trim();if(b&&um(b))return b}if(Ph(c,i.host))return c;return"node"}function Ox(i,l={}){if(l.launcher)return[l.launcher.command,...l.launcher.argsPrefix,...i];let u=FI({env:l.env,execPath:l.execPath,runtimeExecutable:l.runtimeExecutable}),c=Ph(u)?["--use-system-ca",...i]:i;return It([u,...c],{env:l.env,execArgv:l.execArgv,debugRole:l.name==="plugin-sandbox"?"plugin-sandbox":"sandbox"})}class qI{options;idleTimeoutMs;process=null;requestCounter=0;pending=new Map;idleTimer;shutdowns=new Map;constructor(i){if(this.options=i,this.idleTimeoutMs=UI(i.idleTimeoutMs),i.idleTimeoutMs!==void 0&&this.idleTimeoutMs===void 0)throw RangeError(`idleTimeoutMs must be an integer between 1 and ${iu}`)}get processLabel(){return this.options.name??"sandbox"}clearPendingRequest(i){let l=this.pending.get(i);if(!l)return;if(this.pending.delete(i),l.timeout)clearTimeout(l.timeout);return this.armIdleTimer(l.child),l}clearIdleTimer(){if(!this.idleTimer)return;clearTimeout(this.idleTimer),this.idleTimer=void 0}hasPendingRequests(i){for(let l of this.pending.values())if(l.child===i)return!0;return!1}armIdleTimer(i){if(this.process!==i)return;if(this.clearIdleTimer(),this.idleTimeoutMs===void 0||!ad(i)||this.hasPendingRequests(i))return;let l=setTimeout(()=>{if(this.idleTimer===l)this.idleTimer=void 0;if(this.process!==i||!ad(i)||this.hasPendingRequests(i))return;this.shutdownProcess(i).catch(()=>{})},this.idleTimeoutMs);l.unref(),this.idleTimer=l}start(){if(this.process&&ad(this.process))return;let i=this.process;if(this.process=null,this.clearIdleTimer(),i&&dm(i))this.shutdownProcess(i).catch(()=>{});let l=this.options.bootstrapFile?[this.options.bootstrapFile]:["-e",this.options.bootstrapScript??""],u=Ox(l,{name:this.options.name,runtimeExecutable:this.options.runtimeExecutable,launcher:this.options.launcher}),c=u[0]??FI(this.options),g={...We(process.env)};if(this.options.launcher)delete g.BUN_BE_BUN;else if(Ph(c))g.BUN_BE_BUN="1";let b=Rx(c,u.slice(1),{stdio:["ignore","ignore","pipe","ipc"],env:g,windowsHide:!0});this.process=b;let I="",k=(T)=>{let E=I+T;I=E.length>4000?E.slice(-4000):E};b.stderr?.setEncoding("utf8"),b.stderr?.on("data",(T)=>{k(T)}),b.on("message",(T)=>{this.onMessage(b,T)}),b.on("error",(T)=>{this.failPendingForProcess(b,Error(`${this.processLabel} process error: ${_c(T).message}`))}),b.on("exit",(T,E)=>{if(this.process===b)this.process=null,this.clearIdleTimer();let A=I.trim();this.failPendingForProcess(b,Error(`${this.options.name??"sandbox"} process exited (code=${String(T)}, signal=${String(E)})${A?`: ${A}`:""}`))}),this.armIdleTimer(b)}async call(i,l,u={}){this.start();let c=this.process;if(!c||!ad(c))throw Error(`${this.processLabel} process is not available`);this.clearIdleTimer();let g=`req_${++this.requestCounter}`,b={type:"call",id:g,method:i,args:l};return await new Promise((I,k)=>{let T={child:c,resolve:(E)=>I(E),reject:k};if((u.timeoutMs??0)>0)T.timeout=setTimeout(()=>{let E=this.clearPendingRequest(g);if(!E)return;this.shutdownProcess(E.child).catch(()=>{}),E.reject(Error(`${this.processLabel} call timed out after ${u.timeoutMs}ms: ${i}`))},u.timeoutMs);this.pending.set(g,T);try{c.send(b,(E)=>{if(!E)return;let A=this.clearPendingRequest(g);if(!A)return;A.reject(Error(`${this.processLabel} failed to send call "${i}": ${_c(E).message}`))})}catch(E){this.clearPendingRequest(g),k(_c(E))}})}async shutdown(){this.clearIdleTimer();let i=this.process,l=[...this.shutdowns.values()];if(i)l.push(this.shutdownProcess(i));if(l.length===0){this.failPending(Error(`${this.processLabel} shutdown`));return}await Promise.all(l)}shutdownProcess(i){let l=this.shutdowns.get(i);if(l)return l;if(this.process===i)this.process=null,this.clearIdleTimer();let u=this.terminateProcess(i).finally(()=>{if(this.shutdowns.get(i)===u)this.shutdowns.delete(i)});return this.shutdowns.set(i,u),u}async terminateProcess(i){if(!dm(i)){this.failPendingForProcess(i,Error(`${this.processLabel} shutdown`));return}await new Promise((l)=>{let u=setTimeout(()=>{try{i.kill("SIGKILL")}catch{}l()},Mx);i.once("exit",()=>{clearTimeout(u),l()});try{i.kill("SIGTERM")}catch{clearTimeout(u),l()}}),this.failPendingForProcess(i,Error(`${this.processLabel} shutdown`))}onMessage(i,l){if(!l)return;if(l.type==="event"){if(this.process===i&&typeof l.name==="string"&&l.name.length>0)this.options.onEvent?.({name:l.name,payload:l.payload});return}if(l.type!=="response"||!l.id)return;let u=this.pending.get(l.id);if(!u||u.child!==i)return;let c=this.clearPendingRequest(l.id);if(!c)return;if(l.ok){c.resolve(l.result);return}c.reject(Error(l.error?.message||`${this.processLabel} call failed`))}failPendingForProcess(i,l){for(let[u,c]of this.pending.entries()){if(c.child!==i)continue;if(this.pending.delete(u),c.timeout)clearTimeout(c.timeout);c.reject(l)}}failPending(i){for(let[l,u]of this.pending.entries()){if(this.pending.delete(l),u.timeout)clearTimeout(u.timeout);u.reject(i)}}}function Ec(i){if(i instanceof Error)return i;return Error(String(i))}class jI{options;idleTimeoutMs;worker=null;requestCounter=0;pending=new Map;idleTimer;exited=new WeakSet;shutdowns=new Map;outboxes=new WeakMap;draining;stopping=new WeakSet;constructor(i){if(this.options=i,this.idleTimeoutMs=UI(i.idleTimeoutMs),i.idleTimeoutMs!==void 0&&this.idleTimeoutMs===void 0)throw RangeError(`idleTimeoutMs must be an integer between 1 and ${iu}`)}get label(){return this.options.name??"worker-sandbox"}isAvailable(i){return!this.exited.has(i)&&!this.shutdowns.has(i)}clearIdleTimer(){if(!this.idleTimer)return;clearTimeout(this.idleTimer),this.idleTimer=void 0}hasPendingRequests(i){for(let l of this.pending.values())if(l.worker===i)return!0;return!1}armIdleTimer(i){if(this.worker!==i)return;if(this.clearIdleTimer(),this.idleTimeoutMs===void 0||!this.isAvailable(i)||this.hasPendingRequests(i))return;let l=setTimeout(()=>{if(this.idleTimer===l)this.idleTimer=void 0;if(this.worker!==i||!this.isAvailable(i)||this.hasPendingRequests(i))return;this.draining=this.stopGracefully(i).finally(()=>{this.draining=void 0})},this.idleTimeoutMs);l.unref(),this.idleTimer=l}clearPendingRequest(i){let l=this.pending.get(i);if(!l)return;if(this.pending.delete(i),l.timeout)clearTimeout(l.timeout);return this.armIdleTimer(l.worker),l}start(){if(this.worker&&this.isAvailable(this.worker))return;this.worker=null,this.clearIdleTimer();let i=this.options.bootstrapFile?new Eg(this.options.bootstrapFile,this.workerOptions(!1)):new Eg(this.options.bootstrapScript??"",this.workerOptions(!0));this.worker=i,this.outboxes.set(i,[]);let l="";i.stdout?.resume(),i.stderr?.setEncoding("utf8"),i.stderr?.on("data",(c)=>{let g=l+c;l=g.length>4000?g.slice(-4000):g}),i.on("message",(c)=>{this.onMessage(i,c)});let u;i.on("error",(c)=>{u=Ec(c)}),i.on("exit",(c)=>{if(this.exited.add(i),this.worker===i)this.worker=null,this.clearIdleTimer();let g=[u?.message,l.trim()].filter(Boolean).join(": "),b=Error(`${this.label} exited (code=${String(c)})${g?`: ${g}`:""}`);if(u?.stack)b.stack=u.stack;let I=this.shutdowns.has(i)||this.stopping.has(i);if(this.failPendingForWorker(i,b),!I)try{this.options.onUnexpectedExit?.(b)}catch{}}),this.armIdleTimer(i)}workerOptions(i){return{eval:i,stdout:!0,stderr:!0,env:We(process.env)}}async call(i,l,u={}){if(this.draining)await this.draining;this.start();let c=this.worker;if(!c||!this.isAvailable(c))throw Error(`${this.label} is not available`);return await this.send(c,i,l,u)}async stopGracefully(i){this.stopping.add(i);let l=this.options.disposeMethod;if(l&&this.isAvailable(i))await this.send(i,l,{},{timeoutMs:this.options.disposeTimeoutMs}).catch(()=>{});await this.shutdownWorker(i)}async send(i,l,u,c){this.clearIdleTimer();let g=`req_${++this.requestCounter}`;return await new Promise((b,I)=>{let k={worker:i,resolve:(T)=>b(T),reject:I};if((c.timeoutMs??0)>0)k.timeout=setTimeout(()=>{let T=this.clearPendingRequest(g);if(!T)return;this.shutdownWorker(T.worker).catch(()=>{}),T.reject(Error(`${this.label} call timed out after ${c.timeoutMs}ms: ${l}`))},c.timeoutMs);this.pending.set(g,k);try{let T={type:"call",id:g,method:l,args:u},E=this.outboxes.get(i);if(E)E.push({id:g,message:structuredClone(T)});else i.postMessage(T)}catch(T){this.clearPendingRequest(g),I(Ec(T))}})}async shutdown(){if(this.clearIdleTimer(),this.draining)await this.draining;let i=this.worker,l=[...this.shutdowns.values()];if(i)l.push(this.stopGracefully(i));if(l.length===0){this.failPending(Error(`${this.label} shutdown`));return}await Promise.all(l)}shutdownWorker(i){let l=this.shutdowns.get(i);if(l)return l;if(this.worker===i)this.worker=null,this.clearIdleTimer();let u=i.terminate().then(()=>{return},()=>{return}).finally(()=>{if(this.exited.add(i),this.failPendingForWorker(i,Error(`${this.label} shutdown`)),this.shutdowns.get(i)===u)this.shutdowns.delete(i)});return this.shutdowns.set(i,u),u}onMessage(i,l){if(!l)return;if(l.type==="ready"){let g=this.outboxes.get(i);this.outboxes.delete(i);for(let b of g??[]){if(!this.pending.has(b.id))continue;try{i.postMessage(b.message)}catch(I){this.clearPendingRequest(b.id)?.reject(Ec(I))}}return}if(l.type==="event"){if(this.worker===i&&typeof l.name==="string"&&l.name.length>0)this.options.onEvent?.({name:l.name,payload:l.payload});return}if(l.type!=="response"||!l.id)return;let u=this.pending.get(l.id);if(!u||u.worker!==i)return;let c=this.clearPendingRequest(l.id);if(!c)return;if(l.ok){c.resolve(l.result);return}c.reject(Error(l.error?.message||`${this.label} call failed`))}failPendingForWorker(i,l){for(let[u,c]of this.pending.entries()){if(c.worker!==i)continue;if(this.pending.delete(u),c.timeout)clearTimeout(c.timeout);c.reject(l)}}failPending(i){for(let[l,u]of this.pending.entries()){if(this.pending.delete(l),u.timeout)clearTimeout(u.timeout);u.reject(i)}}}var $x="CLINE_PLUGIN_IDLE_TIMEOUT_MS",BI="CLINE_PLUGIN_BOOTSTRAP_PATH",Lx=1800000,Dx="__cline_tool_update",Ux="__cline_setup_started";function Fx(i){return{...i,contributions:{tools:i.contributions?.tools??[],commands:i.contributions?.commands??[],rules:i.contributions?.rules??[],messageBuilders:i.contributions?.messageBuilders??[],providers:i.contributions?.providers??[],automationEventTypes:i.contributions?.automationEventTypes??[],mcpServers:i.contributions?.mcpServers??[],shortcuts:i.contributions?.shortcuts??[],flags:i.contributions?.flags??[]}}}function td(i){return(i instanceof Error?i.message:String(i)).includes("Unknown sandbox plugin id:")}function qx(){return`@cline/cli-${process.platform==="win32"?"windows":process.platform}-${process.arch}`}function jx(){let i=process.env.CLINE_WRAPPER_PATH?.trim();if(!i)return;try{let l=DI(i).resolve(`${qx()}/package.json`),u=Qs(su(l),"extensions","plugin-sandbox-bootstrap.js");return jl(u)?u:void 0}catch{return}}function Bx(){let i=process.execPath?.trim();if(!i)return;let l=Qs(su(su(i)),"extensions","plugin-sandbox-bootstrap.js");return jl(l)?l:void 0}function Hx(i){let l=i.exists??jl;for(let u of i.siblingCandidates)if(l(u))return{file:u};if(l(i.sourceBootstrapPath))return{sourcePath:i.sourceBootstrapPath};for(let u of i.installedCandidates)if(u&&l(u))return{file:u};return}function zx(){let i=su(Cx(import.meta.url)),l=DI(import.meta.url),u=process.env[BI]?.trim();if(u&&jl(u))return{file:u};let c=Qs(i,"plugin-sandbox-bootstrap.ts"),g=jl(c)?void 0:gx();if(g)return{file:Qs(g,"plugin-sandbox-bootstrap.js")};let b=Hx({siblingCandidates:[Qs(i,"plugin-sandbox-bootstrap.js"),Qs(i,"plugin-sandbox-bootstrap.mjs"),Qs(i,"extensions","plugin-sandbox-bootstrap.js"),Qs(i,"agents","plugin-sandbox-bootstrap.js")],sourceBootstrapPath:c,installedCandidates:[jx(),Bx()]});if(!b||"file"in b)return b;let I=b.sourcePath,k="jiti";try{k=l.resolve("jiti")}catch{}return{sourcePath:I,script:[`const createJiti = require(${JSON.stringify(k)});`,`const jiti = createJiti(${JSON.stringify(I)}, { cache: false, requireCache: false, esmResolve: true, interopDefault: false });`,`Promise.resolve(jiti.import(${JSON.stringify(I)}, {})).catch((error) => {`," console.error(error);"," process.exitCode = 1;","});"].join(`
|
|
4
|
+
`)}}var Ac,Wx=!1;function Kx(){if(Wx)throw new nu;if(Ac??=zx(),!Ac)throw new nu;return Ac}class nu extends Error{constructor(){super(`This build does not ship plugin-sandbox-bootstrap.js, so plugins cannot run. Set ${BI} to a copy of the file, or reinstall Cline.`);this.name="PluginBootstrapMissingError"}}function Gx(i,l){return{extensions:[],pluginPaths:[],disabledByPolicy:[],warnings:[],failures:i.map((u)=>({pluginPath:u,phase:"load",message:l.message,stack:l.stack})),shutdown:async()=>{}}}function ia(i,l,u){if(typeof i==="number"&&Number.isInteger(i)&&i>0&&i<=iu)return i;if(u){let c=process.env[u];if(c){let g=Number(c);if(Number.isInteger(g)&&g>0&&g<=iu)return g}}return l}async function Mh(i){let l=ia(i.idleTimeoutMs,Lx,$x),u;try{u=Kx()}catch(F){if(F instanceof nu)return Gx(i.pluginPaths,F);throw F}let c="file"in u?{bootstrapFile:u.file}:{bootstrapScript:u.script},g=ia(i.importTimeoutMs,4000,"CLINE_PLUGIN_IMPORT_TIMEOUT_MS"),b=ia(i.hookTimeoutMs,3000),I=i.setupTimeoutMs===void 0?void 0:ia(i.setupTimeoutMs,4000),k=g+(I??0),T=new Map,E=(F)=>{let j=F.payload;if(F.name===Dx){T.get(String(j?.callId))?.(j?.update);return}if(F.name===Ux){i.onSetupStarted?.(String(j?.pluginPath));return}i.onEvent?.(F)},A=i.transport==="worker"?new jI({name:"plugin-worker",...c,idleTimeoutMs:l,onEvent:E,onUnexpectedExit:i.onUnexpectedExit,disposeMethod:"dispose",disposeTimeoutMs:b}):new qI({name:"plugin-sandbox",launcher:"bootstrapFile"in c?vx():void 0,...c,idleTimeoutMs:l,onEvent:E}),C=ia(i.contributionTimeoutMs,60000),N={pluginPaths:i.pluginPaths,exportName:i.exportName,providerId:i.providerId,modelId:i.modelId,cwd:i.cwd,session:i.session,client:i.client,user:i.user,workspaceInfo:i.workspaceInfo,loggerEnabled:Boolean(i.logger),telemetryEnabled:i.telemetryAvailable===!0,setupTimeoutMs:I,policy:i.policy,policyNames:i.policyNames},O,L=()=>(O??=A.call("initialize",N,{timeoutMs:k}).finally(()=>{O=void 0}),O),D;try{D=await A.call("initialize",N,{timeoutMs:k})}catch(F){throw await A.shutdown().catch(()=>{}),F}let U=D.plugins.map(Fx);return{extensions:U.map((F)=>{let j={name:F.name,__clinePluginPath:F.pluginPath,manifest:F.manifest,setup:(H)=>{Vx(H,A,F,C,L,T),Yx(H,A,F,C,L),Qx(H,A,F,C,L),eC(H,A,F,C,L),Zx(H,F)}};return j.hooks=rC(A,F,b,L),j}),disabledByPolicy:D.disabledByPolicy??[],failures:D.failures,pluginPaths:U.map((F)=>F.pluginPath),shutdown:async()=>{await A.shutdown()},warnings:D.warnings}}function Xx(i){let l=i instanceof Error?i.message:String(i);return/cyclic|circular|bigint|can ?not be cloned|could not be cloned/i.test(l)}function cm(i,l=new WeakSet){if(i===null||typeof i!=="object")return typeof i==="function"||typeof i==="symbol"||typeof i==="bigint"?void 0:i;if(l.has(i))return;let u=i;if(typeof u.toJSON==="function")try{return u.toJSON()}catch{return}l.add(i);try{if(Array.isArray(i))return i.map((g)=>cm(g,l)??null);let c={};for(let[g,b]of Object.entries(i)){let I=cm(b,l);if(I!==void 0)c[g]=I}return c}finally{l.delete(i)}}var Ag=new Set;function HI(i,l,u){let c=`${i}:${l}`;if(Ag.has(c))return;Ag.add(c);let g=u instanceof Error?u.message:String(u);console.warn(`[plugin-sandbox] ${i} "${l}" received a payload that is not JSON-serializable (${g}); retrying with non-serializable values dropped. Host-only objects must not be placed on tool contexts or hook payloads.`)}async function zI(i,l,u){try{return await i(l)}catch(c){if(!Xx(c))throw c;return u(c),await i(cm(l))}}var Jx=0;function Vx(i,l,u,c,g,b){for(let I of u.contributions?.tools??[]){let k={...I.definition??{},name:I.name,description:I.description??"",inputSchema:I.inputSchema??{type:"object",properties:{}},timeoutMs:I.timeoutMs,retryable:I.retryable,execute:async(T,E)=>{let{signal:A,emitUpdate:C,emitEvent:N,...O}=E??{},L=`${u.pluginId}:${++Jx}`;if(C)b.set(L,C);let D=()=>{l.call("abortToolCall",{callId:L,reason:A?.reason instanceof Error?A.reason.message:void 0}).catch(()=>{})};A?.addEventListener("abort",D,{once:!0});let U=async(F)=>{let{input:j,context:H}=F,Q=()=>({pluginId:u.pluginId,contributionId:I.id,input:j,context:H,callId:L,aborted:A?.aborted===!0});try{return await l.call("executeTool",Q(),{timeoutMs:I.timeoutMs??c})}catch(z){if(!td(z))throw z;return await g(),await l.call("executeTool",Q(),{timeoutMs:I.timeoutMs??c})}};try{return await zI(U,{input:T,context:O},(F)=>HI("tool",I.name,F))}finally{A?.removeEventListener("abort",D),b.delete(L)}}};i.registerTool(k)}}function Yx(i,l,u,c,g){for(let b of u.contributions?.commands??[])i.registerCommand(PI({name:b.name,description:b.description,handler:async(I)=>{try{return await l.call("executeCommand",{pluginId:u.pluginId,contributionId:b.id,input:I},{timeoutMs:c})}catch(k){if(!td(k))throw k;return await g(),await l.call("executeCommand",{pluginId:u.pluginId,contributionId:b.id,input:I},{timeoutMs:c})}}}))}function Qx(i,l,u,c,g){for(let b of u.contributions?.rules??[])i.registerRule({id:b.ruleId,source:b.source,content:b.hasContentHandler===!0?async()=>{try{return await l.call("resolveRuleContent",{pluginId:u.pluginId,contributionId:b.id},{timeoutMs:c})}catch(I){if(!td(I))throw I;return await g(),await l.call("resolveRuleContent",{pluginId:u.pluginId,contributionId:b.id},{timeoutMs:c})}}:b.content??""})}function Zx(i,l){for(let u of l.contributions?.providers??[])i.registerProvider({name:u.name,description:u.description,metadata:u.metadata});for(let u of l.contributions?.automationEventTypes??[])i.registerAutomationEventType({eventType:u.eventType,source:u.source,description:u.description,attributesSchema:u.attributesSchema,payloadSchema:u.payloadSchema,examples:u.examples,metadata:u.metadata});for(let u of l.contributions?.mcpServers??[])i.registerMcpServer(u)}function eC(i,l,u,c,g){for(let b of u.contributions?.messageBuilders??[])i.registerMessageBuilder({name:b.name,async build(I){try{let k=await l.call("buildMessages",{pluginId:u.pluginId,contributionId:b.id,messages:I},{timeoutMs:c});return xg(k)?k:I}catch(k){if(!td(k))throw k;await g();let T=await l.call("buildMessages",{pluginId:u.pluginId,contributionId:b.id,messages:I},{timeoutMs:c});return xg(T)?T:I}}})}function xg(i){return Array.isArray(i)&&i.every((l)=>typeof l==="object"&&l!==null&&("role"in l)&&("content"in l))}function tC(i,l,u,c,g){return async(b)=>await zI(async(I)=>{try{return await i.call("invokeHook",{pluginId:l,hookName:u,payload:I},{timeoutMs:c})}catch(k){if(!td(k))throw k;return await g(),await i.call("invokeHook",{pluginId:l,hookName:u,payload:I},{timeoutMs:c})}},b,(I)=>HI("hook",u,I))}function rC(i,l,u,c){let g={};for(let b of l.hooks??[])g[b]=tC(i,l.pluginId,b,u,c);return Object.keys(g).length>0?g:void 0}var sC=4000,iC=4000,nC=3000,oC=60000,aC=5,lC="CLINE_PLUGIN_IMPORT_TIMEOUT_MS";class Nh extends Error{label;timeoutMs;constructor(i,l){super(`${i} timed out after ${l}ms`);this.label=i,this.timeoutMs=l,this.name="PluginCallTimeoutError"}}function dC(i){let l=process.env[i]?.trim();if(!l)return;let u=Number(l);return Number.isFinite(u)&&u>0?u:void 0}function xc(i){if(i instanceof Error)return{message:i.message,stack:i.stack};return{message:String(i)}}function WI(i){let l=vg(i);for(let u=0;u<4;u++){let c=ux(l,"package.json");if(ox(c)){try{let b=JSON.parse(ax(c,"utf8"));if(b&&typeof b==="object"&&"cline"in b)return l}catch{}return i}let g=vg(l);if(g===l)break;l=g}return i}function bl(i,l){return l===i?lx(i,dx(i)):Xi(i,l)}function uC(i){let l=Dd(i);return bl(l,WI(l))}function Cc(i,l,u){return new Promise((c,g)=>{let b=!1,I=setTimeout(()=>{b=!0,g(new Nh(u,l))},l);I.unref?.(),Promise.resolve().then(i).then((k)=>{if(b)return;b=!0,clearTimeout(I),c(k)},(k)=>{if(b)return;b=!0,clearTimeout(I),g(k)})})}function cC(i,l){if(!i)return!0;for(let u of l){let c=i[u]?.enabled;if(typeof c==="boolean")return c}return i["*"]?.enabled??!0}function pC(i){return{extension:void 0,importId:i,setupFailed:!1,closed:!1,disposers:[]}}class Oh{entries=new Map;listeners=new Set;logger;defaults;failureThreshold;constructor(i={}){this.logger=i.logger,this.defaults={import:i.importTimeoutMs??dC(lC)??sC,setup:i.setupTimeoutMs??iC,hook:i.hookTimeoutMs??nC,call:i.toolTimeoutMs??oC},this.failureThreshold=i.failureThreshold??aC}setLogger(i){this.logger=i}subscribe(i){return this.listeners.add(i),()=>{this.listeners.delete(i)}}list(){return[...this.entries.values()].map((i)=>this.toStatus(i)).sort((i,l)=>i.name.localeCompare(l.name))}get(i){return this.match(i).map((l)=>this.toStatus(l))}async reload(i){let l=this.match(i);for(let u of l)u.lastError=void 0,u.errorCount=0,u.timeoutCount=0,this.log("info","plugin.reload",u,{}),await this.reloadEntry(u);return l.map((u)=>this.toStatus(u))}async preload(i){return await(await this.loadForSession(i)).release(),this.list()}async loadForSession(i){let l=[],u=[],c=[],g=i.sessionId,b=this.resolveTimeouts(i);for(let O of this.recordDiscovery(i,c))l.push(this.toInitializationFailure(O));let I=[];for(let O of i.pluginPaths){let L=this.ensureEntry(Dd(O));if(L.exportName=i.exportName,this.refreshEntry(L),L.nameResolved&&!this.isEnabledForSession(L,i)){c.push(this.policyIssue(L));continue}if(L.blocked){l.push(this.toInitializationFailure(L)),c.push(this.toIssue(L,"error"));continue}I.push(L)}let k=await Promise.all(I.map((O)=>this.startWorkerCopy(O,i,b,g))),T=new Map,E=0;for(let O of k){let{entry:L}=O;if("error"in O){if(O.importId!==L.importId){c.push(this.staleIssue(L,O.phase,O.error,g));continue}if(O.phase==="setup")this.recordFailure(L,"setup",O.error,{sessionId:g,state:"failed"});else this.recordFailure(L,"import",O.error,{fatal:!0,sessionId:g});l.push(this.toInitializationFailure(L)),c.push(this.toIssue(L,"error"));continue}if("policyDisabled"in O){c.push(this.policyIssue(L));continue}if(!O.instance)continue;let{instance:D}=O;if(!this.isEnabledForSession(L,i)){c.push(this.policyIssue(L)),await D.shutdown?.().catch(()=>{});continue}let U=T.get(L.name);if(U)u.push({type:"duplicate_plugin_override",pluginName:L.name,pluginPath:L.pluginPath,overriddenPluginPath:U.entry.pluginPath,message:`Plugin "${L.name}" from ${L.pluginPath} overrides ${U.entry.pluginPath}`}),await U.instance.shutdown?.().catch(()=>{});T.set(L.name,{entry:L,instance:D,order:E++})}let A=[...T.values()].sort((O,L)=>O.order-L.order);if(g)for(let{entry:O}of A)O.sessions.set(g,i.onIssue);let C=A.map(({entry:O,instance:L})=>this.wrapForSession(O,L,i,b)),N;return{extensions:C,pluginPaths:A.map(({entry:O})=>O.pluginPath),failures:l,warnings:u,issues:c,release:()=>(N??=Promise.all(A.map(({entry:O,instance:L})=>this.releaseInstance(O,L,g,b))).then(()=>{return}),N)}}refreshEntry(i){let l=Rh(i.pluginPath);if(i.fingerprint===l&&i.state!=="disabled")return;i.fingerprint=l,i.importId+=1,i.blocked=!1,i.consecutiveFailures=0,i.extension=void 0,i.nameResolved=!1,this.setState(i,"loading",!0)}async startWorkerCopy(i,l,u,c){let g=i.importId,b=pC(g),I=!1,k=!1,T=l.setupContext,E=Date.now(),A;try{A=await Mh({transport:"worker",pluginPaths:[i.pluginPath],exportName:l.exportName,importTimeoutMs:u.import,setupTimeoutMs:u.setup,hookTimeoutMs:u.hook,contributionTimeoutMs:u.call,onEvent:l.emitEvent,onSetupStarted:()=>{k=!0},policy:l.policy,policyNames:{[i.pluginPath]:[bl(i.pluginPath,i.pluginRoot)]},onUnexpectedExit:(L)=>{if(!I||b.closed)return;this.recordFailure(i,"uncaught",L,{fatal:!0,instance:b,sessionId:c})},providerId:l.providerId,modelId:l.modelId,cwd:l.cwd,workspaceInfo:T?.workspaceInfo,session:T?.session,client:T?.client,user:T?.user,logger:T?.logger,telemetryAvailable:Boolean(T?.telemetry)})}catch(L){return{entry:i,error:L,phase:k?"setup":"import",importId:g}}let C=A.disabledByPolicy[0];if(C){if(await A.shutdown().catch(()=>{}),g===i.importId)i.name=C.name,i.nameResolved=!0;return{entry:i,policyDisabled:!0}}let N=A.failures[0],O=A.extensions?.[0];if(N||!O){if(await A.shutdown().catch(()=>{}),!N)return{entry:i};let L=Error(N.message);if(N.stack)L.stack=N.stack;return{entry:i,error:L,phase:N.phase==="setup"?"setup":"import",importId:g}}if(I=!0,b.extension=O,b.shutdown=A.shutdown,g===i.importId){if(i.name=O.name,i.nameResolved=!0,i.extension=O,!i.blocked&&(i.state==="loading"||i.state==="failed"))this.setState(i,"ready");this.log("info","plugin.import.ready",i,{elapsedMs:Date.now()-E})}return{entry:i,instance:b}}async reloadEntry(i){i.fingerprint=void 0,this.refreshEntry(i);let l={pluginPaths:[i.pluginPath],exportName:i.exportName},u=await this.startWorkerCopy(i,l,this.resolveTimeouts(l),void 0);if("error"in u){if(u.importId!==i.importId)return;this.recordFailure(i,u.phase,u.error,{fatal:u.phase==="import",...u.phase==="setup"?{state:"failed"}:{}});return}if("instance"in u)await u.instance?.shutdown?.().catch(()=>{})}staleIssue(i,l,u,c){let{message:g,stack:b}=xc(u);return{name:i.name,pluginPath:i.pluginPath,state:"failed",reason:"error",lastError:{phase:l,message:g,...b?{stack:b}:{},pluginPath:i.pluginPath,timestamp:Date.now(),...c?{sessionId:c}:{}}}}recordDiscovery(i,l){let u=[];for(let{pluginPath:c,error:g}of i.discoveryFailures??[]){let b=this.ensureEntry(c);this.recordFailure(b,"discover",g,{fatal:!0,sessionId:i.sessionId}),u.push(b),l.push(this.toIssue(b,"error"))}for(let c of i.disabledPluginPaths??[]){let g=this.ensureEntry(c);if(g.state!=="disabled")g.extension=void 0,this.setState(g,"disabled");if(this.isEnabledForSession(g,i))l.push(this.toIssue(g,"settings"))}return u}isEnabledForSession(i,l){return cC(l.policy,[i.name,bl(i.pluginPath,i.pluginRoot)])}policyIssue(i){return{name:i.name,pluginPath:i.pluginPath,state:"disabled",reason:"session_policy"}}resolveTimeouts(i){return{import:i.importTimeoutMs??this.defaults.import,setup:this.defaults.setup,hook:i.hookTimeoutMs??this.defaults.hook,call:i.callTimeoutMs??this.defaults.call}}match(i){let l=i.trim();if(!l)return[];let u=Dd(l);return[...this.entries.values()].filter((c)=>c.pluginPath===u||c.name===l||bl(c.pluginPath,c.pluginRoot)===l)}ensureEntry(i){let l=Dd(i),u=this.entries.get(l);if(!u){let c=WI(l);u={pluginPath:l,pluginRoot:c,name:bl(l,c),state:"loading",blocked:!1,consecutiveFailures:0,importId:0,errorCount:0,timeoutCount:0,sessions:new Map,updatedAt:Date.now()},this.entries.set(l,u)}return u}wrapForSession(i,l,u,c){let g=l.extension,b=u.emitEvent?(k,T)=>u.emitEvent?.({name:k,payload:T}):void 0;l.emitEvent=b;let I=g.setup;return{...g,__clinePluginPath:i.pluginPath,hooks:this.wrapHooks(i,l,g.hooks,u,c),setup:I?async(k,T)=>{if(!this.isUsable(i,l))return;let E={...u.setupContext?.session??{},...T.session??{}},A={...u.setupContext??{},...T,session:Object.keys(E).length>0?E:void 0,cwd:u.cwd??T.cwd,emitEvent:b,onDispose:(C)=>{if(typeof C==="function")l.disposers.push(C)}};await this.runSetup(i,l,(C)=>I.call(g,C,A),k,u,c)}:void 0}}async runSetup(i,l,u,c,g,b){let I={tools:[],commands:[],calls:[]},k=new Set(l.extension.manifest.capabilities),T=(N,O)=>{if(!k.has(N))throw Error(`${O} requires the "${N}" capability`)},E={registerTool:(N)=>{I.tools.push(N)},registerCommand:(N)=>{I.commands.push(N)},registerRule:(N)=>{T("rules","registerRule");let O=this.wrapRule(i,l,N,g,b);I.calls.push((L)=>L.registerRule(O))},registerMessageBuilder:(N)=>{let O=this.wrapMessageBuilder(i,l,N,g,b);I.calls.push((L)=>L.registerMessageBuilder(O))},registerProvider:(N)=>{I.calls.push((O)=>O.registerProvider(N))},registerAutomationEventType:(N)=>{T("automationEvents","registerAutomationEventType"),I.calls.push((O)=>O.registerAutomationEventType(N))},registerMcpServer:(N)=>{T("mcp","registerMcpServer"),I.calls.push((O)=>O.registerMcpServer(N))}},A=(N)=>{l.setupFailed=!0,this.recordFailure(i,"setup",N,{instance:l,sessionId:g.sessionId,state:"failed",notify:g.onIssue})},C=Date.now();try{await Cc(()=>u(E),b.setup,`Plugin "${i.name}" setup`)}catch(N){A(N);return}this.warnIfSlow(i,"setup",C,b.setup,g);try{for(let N of I.tools)c.registerTool(this.wrapTool(i,l,N,g,b));for(let N of I.commands)c.registerCommand(this.wrapCommand(i,l,N,g,b));for(let N of I.calls)N(c)}catch(N){throw A(N),N}if(l.importId===i.importId&&!i.blocked&&i.state==="failed")this.setState(i,"ready")}wrapHooks(i,l,u,c,g){if(!u)return;let b={};for(let[I,k]of Object.entries(u)){if(typeof k!=="function")continue;let T=`hook:${I}`;b[I]=async(...E)=>{if(!this.isUsable(i,l))return;try{return await this.guardedCall(i,l,T,g.hook,c,()=>k.apply(u,E))}catch(A){if(c.hookErrorMode==="throw")throw A;return}}}return b}wrapTool(i,l,u,c,g){let b=`tool:${u.name}`;return{...u,execute:async(I,k)=>(this.assertUsable(i,l,`tool "${u.name}"`),this.guardedCall(i,l,b,u.timeoutMs??g.call,c,()=>u.execute(I,{...k,cwd:k.cwd??c.cwd,emitEvent:k.emitEvent??l.emitEvent}),()=>k.signal?.aborted===!0))}}wrapCommand(i,l,u,c,g){let b=u.handler;if(typeof b!=="function")return u;let I={...u,handler:async(k)=>(this.assertUsable(i,l,`command "/${u.name}"`),this.guardedCall(i,l,`command:${u.name}`,g.call,c,()=>b.call(u,k)))};return PI(I)}wrapRule(i,l,u,c,g){let b=u.content;if(typeof b!=="function")return u;return{...u,content:async()=>{if(!this.isUsable(i,l))return"";try{return await this.guardedCall(i,l,`rule:${u.id}`,g.call,c,()=>b.call(u))}catch{return""}}}}wrapMessageBuilder(i,l,u,c,g){return{...u,build:async(b)=>{if(!this.isUsable(i,l))return b;try{return await this.guardedCall(i,l,`messageBuilder:${u.name}`,g.call,c,()=>u.build.call(u,b))}catch{return b}}}}async guardedCall(i,l,u,c,g,b,I){let k=Date.now();try{let T=await Cc(b,c,`Plugin "${i.name}" ${u}`);if(l.importId===i.importId)i.consecutiveFailures=0;return this.warnIfSlow(i,u,k,c,g),T}catch(T){if(!I?.())this.recordFailure(i,u,T,{instance:l,sessionId:g.sessionId});throw T}}isUsable(i,l){return!i.blocked&&!l.setupFailed&&!l.closed}assertUsable(i,l,u){if(this.isUsable(i,l))return;let c=l.closed?"its session ended":i.lastError?`${i.lastError.phase}: ${i.lastError.message}`:"it is turned off";throw Error(`Plugin "${i.name}" ${u} is unavailable (${c})`)}async releaseInstance(i,l,u,c){if(l.closed)return;if(l.closed=!0,u)i.sessions.delete(u);for(let g of l.disposers.splice(0).reverse())try{await Cc(g,c.hook,`Plugin "${i.name}" dispose`)}catch(b){let{message:I,stack:k}=xc(b);this.log("warn","plugin.error",i,{phase:"dispose",sessionId:u,errorMessage:I,stack:k})}await l.shutdown?.().catch(()=>{})}recordFailure(i,l,u,c){let{message:g,stack:b}=xc(u),I=u instanceof Nh,k=c.instance!==void 0&&c.instance.importId!==i.importId;this.log("warn","plugin.error",i,{phase:l,sessionId:c.sessionId,errorMessage:g,timedOut:I,stale:k,stack:b});let T={phase:l,message:`${c.messagePrefix??""}${g}`,...b?{stack:b}:{},pluginPath:i.pluginPath,timestamp:Date.now(),...c.sessionId?{sessionId:c.sessionId}:{},...I?{timedOut:I}:{}};if(k){let L=c.notify??(c.sessionId?i.sessions.get(c.sessionId):void 0);try{L?.({name:i.name,pluginPath:i.pluginPath,state:c.state??"degraded",reason:"error",lastError:T})}catch{}return}if(i.errorCount+=1,I)i.timeoutCount+=1;i.consecutiveFailures+=1,i.lastError=T;let E=c.fatal===!0||!c.state&&i.consecutiveFailures>=this.failureThreshold,A=E?"failed":c.state??"degraded",C=i.state!==A||E&&!i.blocked;if(E)i.blocked=!0,i.extension=void 0;this.setState(i,A,!0);let N=this.toIssue(i,"error"),O=[];if(C&&!c.state){for(let L of i.sessions.values())if(L)O.push(L)}if(c.notify&&!O.includes(c.notify))O.push(c.notify);for(let L of O)try{L(N)}catch{}}setState(i,l,u=!1){let c=i.state!==l;if(i.state=l,i.updatedAt=Date.now(),!c&&!u)return;let g=this.toStatus(i);for(let b of this.listeners)try{b(g)}catch{}}warnIfSlow(i,l,u,c,g){let b=Date.now()-u;if(b<=c)return;this.log("warn","plugin.call.slow",i,{phase:l,sessionId:g.sessionId,elapsedMs:b,limitMs:c})}log(i,l,u,c){let g={event:l,pluginName:u.name,pluginPath:u.pluginPath,state:u.state,...c};if(i==="info"){this.logger?.debug?.(`[plugins] ${l} ${u.name}`,g);return}let b=typeof c.phase==="string"?` (${c.phase})`:"",I=typeof c.errorMessage==="string"?`: ${c.errorMessage}`:"";this.logger?.log(`[plugins] ${l} ${u.name}${b}${I}`,{severity:"warn",...g})}toStatus(i){return{name:i.name,pluginPath:i.pluginPath,state:i.state,...i.lastError?{lastError:{...i.lastError}}:{},errorCount:i.errorCount,timeoutCount:i.timeoutCount,sessionIds:[...i.sessions.keys()].sort(),...i.extension?{capabilities:[...i.extension.manifest.capabilities].sort(),hooks:Object.keys(i.extension.hooks??{}).sort()}:{},updatedAt:i.updatedAt}}toIssue(i,l){return{name:i.name,pluginPath:i.pluginPath,state:i.state,reason:l,...i.lastError?{lastError:{...i.lastError}}:{}}}toInitializationFailure(i){return{pluginPath:i.pluginPath,pluginName:i.name,phase:i.lastError?.phase==="setup"?"setup":"load",message:i.lastError?.message??`Plugin is ${i.state}`,stack:i.lastError?.stack}}}function mC(i){let l=i.lastError?.phase,u=i.lastError?.message??"unknown error";if(i.state==="degraded")return`Plugin "${i.name}" ${l??"call"} failed: ${u}. The plugin is still active; repeated failures will turn it off.`;if(i.state==="disabled")return`Plugin "${i.name}" is disabled${i.reason==="session_policy"?" for this session":" in settings"}.`;let c=l==="uncaught"?" with an uncaught error":l?` during ${l}`:"";return`Plugin "${i.name}" failed${c}: ${u} (${i.pluginPath}). Its tools and hooks are unavailable.`}var Cg;function rd(){return Cg??=new Oh,Cg}var $h="package.json",hC="package";function KI(i){return Za(i)}function GI(i){return Yn(i)}function fC(i){try{return Wu(i)&&uA(i).isDirectory()}catch{return!1}}function sd(i){let l=[],u=new Set;for(let c of i){let g=Fl(c);if(u.has(g))continue;u.add(g),l.push(g)}return l}function XI(i){let l=sd(i);return CI(l)}function Lh(i){return KI(i).flatMap((l)=>GI(l)).filter((l)=>Wu(l))}function gC(i,l){let u=[];for(let c of i)try{u.push(...ni([c],l))}catch{}return u}function Rc(i){return typeof i==="object"&&i!==null}function yC(i){try{let l=JSON.parse(dA(Ku(i,$h),"utf8"));if(!Rc(l)||!Rc(l.cline))return[];let u=l.cline.plugins;if(!Array.isArray(u))return[];let c=[];for(let g of u){if(typeof g==="string"){c.push(g);continue}if(!Rc(g)||!Array.isArray(g.paths))continue;for(let b of g.paths)if(typeof b==="string")c.push(b)}return c}catch{return[]}}function JI(i,l){let u=Fl(l);return yC(i).some((c)=>Fl(i,c)===u)}function vC(i,l){return SI(i)===hC&&Wu(Ku(eu(i),$h))&&JI(eu(i),l)}function wC(i){let l=Fl(i),u=[],c=eu(l);while(!0){if(vC(c,l)){u.push(c);break}if(Wu(Ku(c,$h))){if(JI(c,l))u.push(c);break}let g=eu(c);if(g===c)break;c=g}return sd(u)}function Dh(i={}){let l=i.cwd??process.cwd(),u=[],c=[];for(let k of i.pluginPaths??[])try{c.push(...ni([k],l))}catch(T){u.push({pluginPath:Fl(l,k),error:T})}let g=sd([...c,...Lh(i.workspacePath)]);if(i.includeDisabled)return{paths:g,disabledPaths:[],discoveryFailures:u};let b=CI(g),I=new Set(b);return{paths:b,disabledPaths:g.filter((k)=>!I.has(k)),discoveryFailures:u}}function Uh(i={}){let l=i.cwd??process.cwd(),u=Lh(i.workspacePath),c=[...ni(i.pluginPaths??[],l),...u];return i.includeDisabled?sd(c):XI(c)}function bC(i={}){let l=i.cwd??process.cwd(),u=Lh(i.workspacePath),c=gC(i.pluginPaths??[],l);return XI([...c,...u])}function Ju(i){let l=[];for(let u of i)for(let c of wC(u)){let g=Ku(c,Ze);if(fC(g))l.push(g)}return sd(l)}function IC(i={}){return Ju(bC(i))}var kC="CLINE_PLUGIN_MODE";function Vu(i){let l=process.env[kC]?.trim();return i??(l==="sandbox"?l:"worker")}async function VI(i={}){if(Vu(i.mode)==="worker"){let c=Dh(i);if(c.paths.length===0&&c.disabledPaths.length===0&&c.discoveryFailures.length===0)return{extensions:[],failures:[],warnings:[],pluginPaths:[],issues:[]};let g=await(i.registry??rd()).loadForSession({sessionId:i.session?.sessionId,pluginPaths:c.paths,disabledPluginPaths:c.disabledPaths,discoveryFailures:c.discoveryFailures,policy:i.policy,exportName:i.exportName,providerId:i.providerId,modelId:i.modelId,cwd:i.cwd,hookErrorMode:i.hookErrorMode,emitEvent:i.onEvent,onIssue:i.onIssue,importTimeoutMs:i.importTimeoutMs,hookTimeoutMs:i.hookTimeoutMs,callTimeoutMs:i.contributionTimeoutMs,setupContext:{session:i.session,client:i.client,user:i.user,workspaceInfo:i.workspaceInfo,automation:i.automation,logger:i.logger,telemetry:i.telemetry}});return{extensions:g.extensions,failures:g.failures,pluginPaths:g.pluginPaths,warnings:g.warnings,issues:g.issues,shutdown:async()=>g.release()}}let l=Uh(i);if(l.length===0)return{extensions:[],failures:[],warnings:[],pluginPaths:[],issues:[]};let u=await Mh({pluginPaths:l,transport:"subprocess",exportName:i.exportName,importTimeoutMs:i.importTimeoutMs,hookTimeoutMs:i.hookTimeoutMs,contributionTimeoutMs:i.contributionTimeoutMs,onEvent:i.onEvent,telemetryAvailable:Boolean(i.telemetry),providerId:i.providerId,modelId:i.modelId,cwd:i.cwd,session:i.session,client:i.client,user:i.user,workspaceInfo:i.workspaceInfo,logger:i.logger});return{extensions:u.extensions??[],shutdown:u.shutdown,failures:u.failures,pluginPaths:u.pluginPaths,warnings:u.warnings,issues:u.failures.map((c)=>({name:c.pluginName??SI(c.pluginPath,cA(c.pluginPath)),pluginPath:c.pluginPath,state:"failed",reason:"error",lastError:{phase:c.phase==="setup"?"setup":"import",message:c.message,stack:c.stack,pluginPath:c.pluginPath,timestamp:Date.now()}}))}}var TC=/^CLINE_(?:CONNECTOR_DETACHED_CHILD|[A-Z0-9]+_CONNECT_CHILD)$/;function YI(i=process.env){let l={...i};delete l[ti],delete l[rl];for(let u of Object.keys(l))if(TC.test(u))delete l[u];return l}var _C=15000;async function EC(i,l,u={}){let c="launchSpec"in u?u.launchSpec:Eo();if(!c)throw Error("connector CLI launch information is unavailable");let g=u.spawnProcess??SC,b=u.timeoutMs??_C;await new Promise((I,k)=>{let T=!1,E,A=(O)=>{if(T)return;if(T=!0,E)clearTimeout(E);if(O)k(O);else I()},C;try{C=g(c.launcher,[...c.connectArgsPrefix,"--cleanup-instance",l,i],{cwd:c.cwd,env:YI(),stdio:["ignore","ignore","pipe"],windowsHide:!0})}catch(O){A(O instanceof Error?O:Error(String(O)));return}let N="";C.stderr?.setEncoding("utf8"),C.stderr?.on("data",(O)=>{N+=String(O)}),E=setTimeout(()=>{try{C.kill("SIGKILL")}catch{}A(Error(`cleanup timed out after ${b}ms`))},b),E.unref?.(),C.once("error",(O)=>{A(O instanceof Error?O:Error(String(O)))}),C.once("close",(O)=>{if(O===0||O===null){A();return}A(Error(`cleanup exited with code ${O}${N.trim()?`: ${N.trim()}`:""}`))})})}var Pg={startedAt:(i)=>typeof i.startedAt==="string"?i.startedAt:void 0,port:(i)=>typeof i.port==="number"?i.port:void 0,baseUrl:(i)=>typeof i.baseUrl==="string"?i.baseUrl:void 0,connectionMode:(i)=>typeof i.connectionMode==="string"?i.connectionMode:void 0,userName:(i)=>typeof i.userName==="string"?i.userName:void 0,botUsername:(i)=>typeof i.botUsername==="string"?i.botUsername:void 0,applicationId:(i)=>typeof i.applicationId==="string"?i.applicationId:void 0,phoneNumberId:(i)=>typeof i.phoneNumberId==="string"?i.phoneNumberId:void 0},MC={discord:{required:["userName","applicationId"],optional:["startedAt","port","baseUrl"]},telegram:{required:["botUsername"],optional:["startedAt"]},gchat:{required:["userName"],optional:["startedAt","port","baseUrl"]},linear:{required:["userName"],optional:["startedAt","port","baseUrl"]},slack:{required:["userName"],optional:["startedAt","connectionMode","port","baseUrl"]},whatsapp:{required:["userName"],optional:["startedAt","phoneNumberId","port","baseUrl"]}};function NC(i){if(!Number.isInteger(i)||i<=0)return!1;try{return process.kill(i,0),!0}catch{return!1}}function OC(i,l){let u;try{let T=JSON.parse(PC(l,"utf8"));if(!T||typeof T!=="object"||Array.isArray(T))return;u=T}catch{return}let c=typeof u.pid==="number"?u.pid:void 0,g=typeof u.hubUrl==="string"?u.hubUrl:typeof u.rpcAddress==="string"?u.rpcAddress:void 0;if(!c||!g||!NC(c))return;let b=MC[i];if(!b)return;let I={};for(let T of b.required){let E=Pg[T](u);if(!E||typeof E==="string"&&!E.trim())return;I[T]=E}for(let T of b.optional){let E=Pg[T](u);if(E!==void 0)I[T]=E}let k=i==="telegram"?I.botUsername:i==="discord"?I.applicationId:i==="whatsapp"&&typeof u.instanceKey==="string"?u.instanceKey:I.userName;if(!k)return;return{id:`${i}:${k}`,type:i,instanceId:k,pid:c,hubUrl:g,...I}}function QI(){let i=[];for(let{name:l}of mi()){let u=Rg(Hn(),l);if(!CC(u))continue;for(let c of RC(u)){if(!c.endsWith(".json")||c.endsWith(".threads.json"))continue;let g=OC(l,Rg(u,c));if(g)i.push(g)}}return i.sort((l,u)=>{if(l.type!==u.type)return l.type.localeCompare(u.type);let c=l.botUsername??l.userName??"",g=u.botUsername??u.userName??"";return c.localeCompare(g)})}function $C(i,l){try{Je((u)=>{if(i)u.setEnabled(i,!1,l);else u.disableAll()})}catch{}}function Mg(i,l){try{return Je((u)=>u.getConnection(i,l))}catch{return}}async function LC(i){let l=i.log??(()=>{}),u;try{u=Je((g)=>g.listConnections()).filter((g)=>g.enabled).map((g)=>({channel:g.channel,instanceId:g.instanceId,args:g.connectArgs}))}catch(g){return l(`[connect] failed to read persisted connectors: ${g instanceof Error?g.message:String(g)}`),[]}let c=[];for(let g of u){let{channel:b,instanceId:I}=g;if(i.isHealthy?.(g)){l(`[connect] skipping ${b} connector ${I}: already live in this host`);continue}l(`[connect] reconnecting ${b} connector ${I}`);try{let k=await i.start(g);if(c.push({channel:b,instanceId:I,ok:k}),!k)l(`[connect] failed to reconnect ${b} connector ${I}`)}catch(k){let T=k instanceof Error?k.message:String(k);c.push({channel:b,instanceId:I,ok:!1,error:T}),l(`[connect] failed to reconnect ${b} connector ${I}: ${T}`)}}return c}var DC=1000,UC=60000,FC=5,qC=60000,Ng=5000,jC=5000,BC=2000,HC=100;function pi(i,l){return`${i}\x00${l}`}function zC(i){if(!Number.isInteger(i)||i<=0)return!1;try{return process.kill(i,0),!0}catch{return!1}}function Og(i){return i===void 0?void 0:new Date(i).toISOString()}class ZI{entries=new Map;instanceLocks=new Map;pollTimer;disposed=!1;launchSpec;spawnProcess;isProcessRunning;killProcess;listActive;cleanupInstance;isAutostartEnabled;log;now;setTimer;clearTimer;constructor(i={}){this.launchSpec=i.launchSpec??Eo,this.spawnProcess=i.spawnProcess??AC,this.isProcessRunning=i.isProcessRunning??zC,this.killProcess=i.killProcess??((l,u)=>process.kill(l,u)),this.listActive=i.listActive??QI,this.cleanupInstance=i.cleanupInstance,this.isAutostartEnabled=i.isAutostartEnabled??((l,u)=>Mg(l,u)?.enabled===!0),this.log=i.log??((l)=>process.stderr.write(`[hub-daemon] ${l}
|
|
5
|
+
`)),this.now=i.now??(()=>Date.now()),this.setTimer=i.setTimer??((l,u)=>{let c=setTimeout(l,u);return c.unref?.(),c}),this.clearTimer=i.clearTimer??((l)=>clearTimeout(l))}adoptRunningConnectors(){let i=[];for(let l of this.listActive()){let u=pi(l.type,l.instanceId);if(this.entries.has(u))continue;let c={channel:l.type,instanceId:l.instanceId,args:[],argsKnown:!1,origin:"adopted",state:"running",pid:l.pid,startedAt:l.startedAt?Date.parse(l.startedAt):this.now(),restarts:0};this.entries.set(u,c),i.push(this.toRecord(c)),this.log(`[connect] adopted running ${l.type} connector ${l.instanceId} pid=${l.pid}`)}if(i.length>0)this.ensurePolling();return i}withInstanceLock(i,l){let u=(this.instanceLocks.get(i)??Promise.resolve()).then(l,l),c=u.then(()=>{return},()=>{return});return this.instanceLocks.set(i,c),c.then(()=>{if(this.instanceLocks.get(i)===c)this.instanceLocks.delete(i)}),u}async start(i){return this.withInstanceLock(pi(i.channel,i.instanceId),()=>this.startLocked(i))}async startLocked(i){let{channel:l,instanceId:u}=i,c=pi(l,u),g=this.entries.get(c);if(g&&this.isEntryAlive(g)){if(!i.restart)return{started:!1,reason:"already_running",record:this.toRecord(g)};await this.stopLocked({channel:l,instanceId:u,disableAutostart:!1})}else if(g)this.cancelRestart(g),g.state="stopped",g.child?.removeAllListeners("exit");let b={channel:l,instanceId:u,args:[...i.args],argsKnown:!0,origin:"spawned",state:"running",restarts:g?.restarts??0};if(this.entries.set(c,b),this.spawnEntry(b),b.state!=="running")return{started:!1,record:this.toRecord(b)};return{started:!0,record:this.toRecord(b)}}async stop(i){return this.withInstanceLock(pi(i.channel,i.instanceId),()=>this.stopLocked(i))}async stopLocked(i){let l=pi(i.channel,i.instanceId),u=this.entries.get(l);if(i.disableAutostart!==!1)$C(i.channel,i.instanceId);if(!u)return!1;this.cancelRestart(u),u.state="stopped";let c=u.child?.pid??u.pid;if(c&&this.isProcessRunning(c)){if(this.signal(c,"SIGTERM"),!await this.waitForProcessExit(c,jC))this.signal(c,"SIGKILL"),await this.waitForProcessExit(c,BC)}return await this.runCleanup(u),this.entries.delete(l),!0}signal(i,l){try{this.killProcess(i,l)}catch{}}async waitForProcessExit(i,l){let u=this.now()+l;while(this.isProcessRunning(i)){if(this.now()>=u)return!1;await new Promise((c)=>{this.setTimer(c,HC)})}return!0}list(){return[...this.entries.values()].map((i)=>this.toRecord(i)).sort((i,l)=>i.channel.localeCompare(l.channel)||i.instanceId.localeCompare(l.instanceId))}dispose(){this.disposed=!0;for(let i of this.entries.values())this.cancelRestart(i),i.child?.removeAllListeners("exit");if(this.pollTimer!==void 0)this.clearTimer(this.pollTimer),this.pollTimer=void 0;this.entries.clear(),this.instanceLocks.clear()}spawnEntry(i){let l=this.launchSpec();if(!l){i.state="failed",i.lastError="connector CLI launch information is unavailable",this.log(`[connect] cannot start ${i.channel} connector ${i.instanceId}: ${i.lastError}`);return}let u=Ps(i.channel,i.instanceId),c=["ignore","ignore","ignore"];try{Cr(u);let g=xC(u,"a");c=["ignore",g,g]}catch{}try{let g=this.spawnProcess(l.launcher,[...l.connectArgsPrefix,i.channel,...i.args],{cwd:l.cwd,env:{...YI(),[sl]:"1"},detached:!0,stdio:c,windowsHide:!0});i.child=g,i.pid=g.pid??void 0,i.startedAt=this.now(),i.state="running",i.lastError=void 0,g.unref?.(),g.once("error",(b)=>{i.lastError=b instanceof Error?b.message:String(b),this.handleExit(i,void 0,void 0)}),g.once("exit",(b,I)=>{this.handleExit(i,b??void 0,I??void 0)}),this.log(`[connect] started ${i.channel} connector ${i.instanceId} pid=${i.pid}`)}catch(g){i.state="backoff",i.lastError=g instanceof Error?g.message:String(g),this.log(`[connect] failed to spawn ${i.channel} connector ${i.instanceId}: ${i.lastError}`),this.scheduleRestart(i)}}handleExit(i,l,u){if(this.disposed||i.state==="stopped")return;if(i.child=void 0,i.pid=void 0,i.lastExitCode=l,i.lastExitSignal=u,i.startedAt!==void 0&&this.now()-i.startedAt>=qC)i.restarts=0;this.log(`[connect] ${i.channel} connector ${i.instanceId} exited${l===void 0?"":` code=${l}`}${u?` signal=${u}`:""}`),this.runCleanup(i).then(()=>{let c=pi(i.channel,i.instanceId);if(this.disposed||i.state==="stopped"||this.entries.get(c)!==i)return;if(!this.isAutostartEnabled(i.channel,i.instanceId)){this.log(`[connect] not restarting ${i.channel} connector ${i.instanceId}: autostart is disabled`),this.entries.delete(c);return}this.scheduleRestart(i)})}scheduleRestart(i){if(i.restarts>=FC){i.state="failed",i.nextRestartAt=void 0,this.log(`[connect] giving up on ${i.channel} connector ${i.instanceId} after ${i.restarts} failed restarts${i.lastError?`: ${i.lastError}`:""}`);return}let l=Math.min(DC*2**i.restarts,UC);i.restarts+=1,i.state="backoff",i.nextRestartAt=this.now()+l,this.log(`[connect] restarting ${i.channel} connector ${i.instanceId} in ${l}ms (attempt ${i.restarts})`);let u=pi(i.channel,i.instanceId);i.restartTimer=this.setTimer(()=>{i.restartTimer=void 0,i.nextRestartAt=void 0,this.withInstanceLock(u,async()=>{if(this.disposed||i.state==="stopped"||this.entries.get(u)!==i)return;let c=this.resolveRestartArgs(i);if(!c){i.state="failed",this.log(`[connect] cannot restart ${i.channel} connector ${i.instanceId}: no stored launch arguments`);return}i.args=c,i.argsKnown=!0,i.origin="spawned",this.spawnEntry(i)})},l)}resolveRestartArgs(i){if(i.argsKnown)return i.args;let l=Mg(i.channel,i.instanceId);return l?.connectArgs?.length?l.connectArgs:void 0}cancelRestart(i){if(i.restartTimer!==void 0)this.clearTimer(i.restartTimer),i.restartTimer=void 0;i.nextRestartAt=void 0}async runCleanup(i){if(!this.cleanupInstance)return;try{await this.cleanupInstance(i.channel,i.instanceId)}catch(l){this.log(`[connect] cleanup failed for ${i.channel} connector ${i.instanceId}: ${l instanceof Error?l.message:String(l)}`)}}isEntryAlive(i){if(i.state==="backoff"||i.state==="failed")return!1;let l=i.child?.pid??i.pid;return l!==void 0&&this.isProcessRunning(l)}ensurePolling(){if(this.pollTimer!==void 0||this.disposed)return;let i=()=>{if(this.pollTimer=void 0,this.disposed)return;for(let l of[...this.entries.values()]){if(l.origin!=="adopted"||l.state!=="running"||l.child)continue;if(l.pid===void 0||!this.isProcessRunning(l.pid))this.handleExit(l,void 0,void 0)}if(this.hasAdoptedRunning())this.pollTimer=this.setTimer(i,Ng)};this.pollTimer=this.setTimer(i,Ng)}hasAdoptedRunning(){for(let i of this.entries.values())if(i.origin==="adopted"&&i.state==="running")return!0;return!1}toRecord(i){return{channel:i.channel,instanceId:i.instanceId,state:i.state,origin:i.origin,restarts:i.restarts,...i.pid===void 0?{}:{pid:i.pid},...i.startedAt===void 0?{}:{startedAt:Og(i.startedAt)},...i.nextRestartAt===void 0?{}:{nextRestartAt:Og(i.nextRestartAt)},...i.lastExitCode===void 0?{}:{lastExitCode:i.lastExitCode},...i.lastExitSignal===void 0?{}:{lastExitSignal:i.lastExitSignal},...i.lastError===void 0?{}:{lastError:i.lastError}}}}var ek;function $g(i){ek=i}function tk(){return ek}async function WC(i=(u)=>process.stderr.write(`[hub-daemon] ${u}
|
|
6
|
+
`),l=tk()){if(!l)return i("[connect] cannot reconnect connectors: no connector supervisor is active"),[];let u=new Set(l.list().map((g)=>`${g.channel}\x00${g.instanceId}`)),c=Jf();return await LC({isHealthy:({channel:g,instanceId:b})=>c?.channel===g&&c.instanceId===b,start:async({channel:g,instanceId:b,args:I})=>{let k=u.has(`${g}\x00${b}`);if(k)i(`[connect] restarting surviving ${g} connector ${b} for the new hub session`);let T=await l.start({channel:g,instanceId:b,args:I,restart:k});if(!T.started&&T.reason==="already_running")i(`[connect] ${g} connector ${b} is already running under this hub`);return T.started},log:i})}var VC;function Us(i){if(typeof i!=="string"||i.length===0)return"unset";return JC("sha256").update(i).digest("hex").slice(0,8)}function lt(i){try{VC?.debug(i)}catch{}}function YC(){let i;return{promise:new Promise((l)=>{i=l}),resolve:i}}async function Fh(i){let l=await import("node:http"),u=i.host??"127.0.0.1",c=i.timeoutMs??300000,g=i.successHtml??QC,b=YC(),I=!1,k=null,T=null,E=null,A=(O)=>{if(I)return;I=!0,b.resolve(O)},C=()=>{if(k)clearTimeout(k),k=null;let O=E;if(E=null,T)T.close(),T.closeAllConnections?.(),T=null;if(O!==null&&i.onClose)Promise.resolve(i.onClose({host:u,port:O})).catch(()=>{})},N=async()=>(k=setTimeout(()=>{C(),A(null)},c),b.promise);for(let O of i.ports){let L=l.createServer((U,F)=>{try{let j=new URL(U.url||"",`http://${u}:${O}`);if(j.pathname!==i.callbackPath){F.statusCode=404,F.end("Not found");return}let H={url:j,code:j.searchParams.get("code")??void 0,state:j.searchParams.get("state")??void 0,provider:j.searchParams.get("provider")??void 0,error:j.searchParams.get("error")??void 0};if(H.error){F.statusCode=400,F.end(`Authentication failed: ${H.error}`),C(),A(H);return}if(!H.code){F.statusCode=400,F.end("Missing authorization code");return}if(i.expectedState&&H.state!==i.expectedState){F.statusCode=400,F.end("State mismatch");return}F.statusCode=200,F.setHeader("Content-Type","text/html; charset=utf-8"),F.end(g),C(),A(H)}catch{F.statusCode=500,F.end("Internal error")}}),D=await new Promise((U)=>{let F=(j)=>{L.off("error",F),U({bound:!1,error:j})};L.once("error",F),L.listen(O,u,()=>{L.off("error",F),T=L,U({bound:!0})})});if(D.error){if(D.error.code==="EADDRINUSE")continue;throw C(),D.error}if(D.bound){E=O;let U=`http://${u}:${O}${i.callbackPath}`;if(i.onListening)await Promise.resolve(i.onListening({host:u,port:O,callbackUrl:U})).catch(()=>{});return{callbackUrl:U,waitForCallback:N,cancelWait:()=>{C(),A(null)},close:()=>{C(),A(null)}}}}return{callbackUrl:"",waitForCallback:async()=>null,cancelWait:()=>{},close:()=>{}}}var QC=`<!DOCTYPE html>
|
|
7
|
+
<html lang="en">
|
|
8
|
+
<head>
|
|
9
|
+
<meta charset="utf-8">
|
|
10
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
11
|
+
<title>Authentication Successful</title>
|
|
12
|
+
<style>
|
|
13
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
14
|
+
body {
|
|
15
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
|
|
16
|
+
min-height: 100vh;
|
|
17
|
+
display: flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
justify-content: center;
|
|
20
|
+
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
|
|
21
|
+
color: #fff;
|
|
22
|
+
}
|
|
23
|
+
.container { text-align: center; padding: 48px; max-width: 420px; }
|
|
24
|
+
.icon {
|
|
25
|
+
width: 72px; height: 72px; margin: 0 auto 24px;
|
|
26
|
+
background: linear-gradient(135deg, #10a37f 0%, #1a7f64 100%);
|
|
27
|
+
border-radius: 50%;
|
|
28
|
+
display: flex; align-items: center; justify-content: center;
|
|
29
|
+
}
|
|
30
|
+
.icon svg { width: 36px; height: 36px; stroke: #fff; stroke-width: 3; fill: none; }
|
|
31
|
+
h1 { font-size: 24px; font-weight: 600; margin-bottom: 12px; }
|
|
32
|
+
p { font-size: 15px; color: rgba(255,255,255,0.7); line-height: 1.5; }
|
|
33
|
+
.closing { margin-top: 32px; font-size: 13px; color: rgba(255,255,255,0.5); }
|
|
34
|
+
</style>
|
|
35
|
+
</head>
|
|
36
|
+
<body>
|
|
37
|
+
<div class="container">
|
|
38
|
+
<div class="icon">
|
|
39
|
+
<svg viewBox="0 0 24 24"><polyline points="20 6 9 17 4 12"></polyline></svg>
|
|
40
|
+
</div>
|
|
41
|
+
<h1>Authentication Successful</h1>
|
|
42
|
+
<p>You're now signed in. You can close this window.</p>
|
|
43
|
+
<p class="closing">This window will close automatically...</p>
|
|
44
|
+
</div>
|
|
45
|
+
<script>setTimeout(() => window.close(), 3000);</script>
|
|
46
|
+
</body>
|
|
47
|
+
</html>`;function rk(i){let l="";for(let u=0;u<i.length;u+=1)l+=String.fromCharCode(i[u]??0);return btoa(l).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}async function ZC(i){let l=new TextEncoder().encode(i),u=await crypto.subtle.digest("SHA-256",l);return new Uint8Array(u)}function eR(i=32){let l=new Uint8Array(i);return crypto.getRandomValues(l),rk(l)}async function sk(){let i=eR(),l=rk(await ZC(i));return{verifier:i,challenge:l}}function qh(i){return i.endsWith("/")?i.slice(0,-1):i}function Xo(i,l){return new URL(l,`${qh(i)}/`).toString()}function ou(i,l={}){let u=i.trim();if(!u)return{};try{let c=new URL(u);return{code:c.searchParams.get("code")??void 0,state:c.searchParams.get("state")??void 0,provider:l.includeProvider?c.searchParams.get("provider")??void 0:void 0}}catch{}if(l.allowHashCodeState&&u.includes("#")){let[c,g]=u.split("#",2);return{code:c||void 0,state:g||void 0}}if(u.includes("code=")){let c=new URLSearchParams(u);return{code:c.get("code")??void 0,state:c.get("state")??void 0,provider:l.includeProvider?c.get("provider")??void 0:void 0}}return{code:u}}function Yu(i){try{let l=JSON.parse(i),u=l.error,c=typeof u==="string"?u:u&&typeof u==="object"&&typeof u.type==="string"?u.type:void 0,g=typeof l.error_description==="string"?l.error_description:typeof l.message==="string"?l.message:u&&typeof u==="object"&&typeof u.message==="string"?u.message:void 0;return{code:c,message:g}}catch{return{}}}function jh(i,l){return Date.now()>=i.expires-l}async function Bh(i){if(!i.onManualCodeInput){let b=await i.waitForCallback();return{code:b?.code,state:b?.state,provider:b?.provider,error:b?.error}}let l,u,c=i.onManualCodeInput().then((b)=>{l=b,i.cancelWait()}).catch((b)=>{u=b instanceof Error?b:Error(String(b)),i.cancelWait()}),g=await i.waitForCallback();if(u)throw u;if(g?.code||g?.error)return{code:g.code,state:g.state,provider:g.provider,error:g.error};if(l)return ou(l,i.parseOptions);if(await c,u)throw u;if(l)return ou(l,i.parseOptions);return{}}var Qu={authorize:"/api/v1/auth/authorize",token:"/api/v1/auth/token",register:"/api/v1/auth/register",refresh:"/api/v1/auth/refresh"},ik={deviceAuthorization:"/user_management/authorize/device",authenticate:"/user_management/authenticate"},nk="https://api.workos.com",tR="/auth",Dg=Array.from({length:11},(i,l)=>48801+l),rR=300000,sR=30000,id=30000,iR=300,nR=5;class Wr extends Error{status;errorCode;requestId;constructor(i,l){super(i);this.name="ClineOAuthTokenError",this.status=l?.status,this.errorCode=l?.errorCode,this.requestId=l?.requestId}isLikelyInvalidGrant(){if(this.errorCode&&/invalid_grant|invalid_token|unauthorized/i.test(this.errorCode))return!0;if(this.status===400||this.status===401||this.status===403)return/invalid|expired|revoked|unauthorized/i.test(this.message);return!1}}function oR(i){let l=Date.parse(i);if(Number.isNaN(l))throw Error(`Invalid expiresAt value: ${i}`);return l}function Hh(i,l,u={}){let c=i.userInfo.clineUserId??u.accountId,g=i.refreshToken??u.refresh;if(!g)throw Error("Token response did not include a refresh token");let b={...u.metadata??{},provider:l,tokenType:i.tokenType,userInfo:i.userInfo};return delete b.startedAt,{access:i.accessToken,refresh:g,expires:oR(i.expiresAt),accountId:c??void 0,email:i.userInfo.email||u.email,metadata:b}}async function zh(i){if(!i)return{};return typeof i==="function"?await i():i}function Ug(i,l){if(typeof i!=="number"||!Number.isFinite(i)||i<=0)return l;return Math.floor(i)}function aR(i){return typeof i==="string"&&i.trim()||void 0}function lR(i){let l=ne(i);if(!l)return{};return{sessionId:aR(l.sid)}}function dR(i){let l={},u=i.metadata?.sessionStartedAtMs;if(typeof u==="number"&&Number.isFinite(u)&&u>0)l.sessionDurationMs=Date.now()-u;return l}function ok(i){return{...lR(i.access),...dR(i)}}function Wh(i,l){if(!i.success||!i.data?.accessToken)throw Error(l);return i.data}async function uR(i,l){let u=await fetch(Xo(nk,ik.deviceAuthorization),{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:i}),signal:AbortSignal.any([AbortSignal.timeout(l?.requestTimeoutMs??id),...l?.signal?[l.signal]:[]])}),c=await u.json().catch(()=>({}));if(!u.ok)throw new Wr(`Device authorization failed: ${u.status}${c.error_description?` - ${c.error_description}`:""}`,{status:u.status,errorCode:c.error,requestId:u.headers.get("x-request-id")??void 0});if(!c.device_code||!c.user_code||!c.verification_uri)throw Error("Invalid WorkOS device authorization response");return{deviceCode:c.device_code,userCode:c.user_code,verificationUri:c.verification_uri,verificationUriComplete:c.verification_uri_complete,expiresInSeconds:Ug(c.expires_in,iR),pollIntervalSeconds:Ug(c.interval,nR)}}async function cR(i){let l=Date.now()+i.expiresInSeconds*1000,u=Math.max(1,i.initialPollIntervalSeconds);while(Date.now()<=l){let c=await fetch(Xo(i.workosApiBaseUrl,ik.authenticate),{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:i.deviceCode,client_id:i.clientId}),signal:AbortSignal.any([AbortSignal.timeout(i.requestTimeoutMs),...i.signal?[i.signal]:[]])}),g=await c.json().catch(()=>({}));if(c.ok){if(!g.access_token||!g.refresh_token)throw Error("Invalid WorkOS token response");return{accessToken:g.access_token,refreshToken:g.refresh_token,tokenType:g.token_type??"Bearer"}}switch(g.error){case"authorization_pending":{await Lg(u*1000,void 0,{signal:i.signal});break}case"slow_down":{u+=1,await Lg(u*1000,void 0,{signal:i.signal});break}case"access_denied":case"expired_token":case"invalid_grant":throw new Wr(g.error_description||"WorkOS authorization failed",{status:c.status,errorCode:g.error,requestId:c.headers.get("x-request-id")??void 0});default:throw new Wr(`WorkOS token polling failed: ${c.status}${g.error_description?` - ${g.error_description}`:""}`,{status:c.status,errorCode:g.error,requestId:c.headers.get("x-request-id")??void 0})}i.onProgress?.("Waiting for browser authentication confirmation...")}throw Error("WorkOS device authorization timed out")}async function pR(i,l,u,c){let g={accessToken:i.accessToken,refreshToken:i.refreshToken},b=await fetch(Xo(l.apiBaseUrl,Qu.register),{method:"POST",headers:{"Content-Type":"application/json",...await zh(l.headers)},body:JSON.stringify(g),signal:AbortSignal.any([AbortSignal.timeout(l.requestTimeoutMs??id),...c?[c]:[]])});if(!b.ok){let k=await b.text().catch(()=>""),T=Yu(k);throw new Wr(`Token registration failed: ${b.status}${T.message?` - ${T.message}`:""}`,{status:b.status,errorCode:T.code,requestId:b.headers.get("x-request-id")??void 0})}let I=await b.json();return Hh(Wh(I,"Invalid token exchange response"),u??l.provider,{metadata:{sessionStartedAtMs:Date.now()}})}async function mR(i,l,u,c){let g={grant_type:"authorization_code",code:i,client_type:"extension",redirect_uri:l,provider:c??u.provider},b=await fetch(Xo(u.apiBaseUrl,Qu.token),{method:"POST",headers:{"Content-Type":"application/json",...await zh(u.headers)},body:JSON.stringify(g),signal:AbortSignal.timeout(u.requestTimeoutMs??id)});if(!b.ok){let k=await b.text().catch(()=>""),T=Yu(k);throw new Wr(`Token exchange failed: ${b.status}${T.message?` - ${T.message}`:""}`,{status:b.status,errorCode:T.code,requestId:b.headers.get("x-request-id")??void 0})}let I=await b.json();return Hh(Wh(I,"Invalid token exchange response"),c??u.provider,{metadata:{sessionStartedAtMs:Date.now()}})}async function hR(i){Sh(i.telemetry,i.provider??"cline");let l=i.useWorkOSDeviceAuth??!0,u=i.callbackPorts?.length?i.callbackPorts:Dg,c=i.callbackPath??tR,g=l?null:await Fh({ports:u,callbackPath:c,onListening:i.callbacks.onServerListening,onClose:i.callbacks.onServerClose}),b=g?.callbackUrl||`http://127.0.0.1:${u[0]??Dg[0]}${c}`;try{let I;if(l){let k=ke().workOsClientId,T=await uR(k,i);i.callbacks.onAuth({url:T.verificationUriComplete??T.verificationUri,instructions:`Enter this code in your browser: ${T.userCode}`});let E=await cR({clientId:k,deviceCode:T.deviceCode,expiresInSeconds:T.expiresInSeconds,initialPollIntervalSeconds:T.pollIntervalSeconds,requestTimeoutMs:i.requestTimeoutMs??id,workosApiBaseUrl:nk,onProgress:i.callbacks.onProgress});I=await pR(E,i,i.provider)}else{let k=new URL(Xo(i.apiBaseUrl,Qu.authorize));k.searchParams.set("client_type","extension"),k.searchParams.set("callback_url",b),k.searchParams.set("redirect_uri",b),i.callbacks.onAuth({url:k.toString(),instructions:"Continue the authentication process in your browser."});let T,E=i.provider,A=await Bh({waitForCallback:g?.waitForCallback??(async()=>null),cancelWait:g?.cancelWait??(()=>{}),onManualCodeInput:i.callbacks.onManualCodeInput,parseOptions:{includeProvider:!0}});if(A.error)throw Error(`OAuth error: ${A.error}`);if(T=A.code,E=A.provider??E,!T){let C=await i.callbacks.onPrompt({message:"Paste the authorization code (or full redirect URL):"}),N=ou(C,{includeProvider:!0});T=N.code,E=N.provider??E}if(!T)throw Error("Missing authorization code");I=await mR(T,b,i,E)}return Th(i.telemetry,i.provider??"cline",ok(I)),Gu(i.telemetry,{id:I.accountId,email:I.email,provider:i.provider??"cline"}),I}catch(I){throw tu(i.telemetry,i.provider??"cline",I instanceof Error?I.message:String(I),{requestId:I instanceof Wr?I.requestId:void 0}),I}finally{g?.close()}}async function fR(i,l){let u=Xo(l.apiBaseUrl,Qu.refresh);lt(`cline.refresh.request url=${u} refreshTokenHash=${Us(i.refresh)}`);let c=await fetch(u,{method:"POST",headers:{"Content-Type":"application/json",...await zh(l.headers)},body:JSON.stringify({refreshToken:i.refresh,grantType:"refresh_token"}),signal:AbortSignal.timeout(l.requestTimeoutMs??id)});if(!c.ok){let k=await c.text().catch(()=>""),T=Yu(k),E=c.headers.get("x-request-id")??void 0;throw lt(`cline.refresh.error status=${c.status} errorCode=${T.code??"none"} message=${T.message??"none"} requestId=${E??"none"}`),new Wr(`Token refresh failed: ${c.status}${T.message?` - ${T.message}`:""}`,{status:c.status,errorCode:T.code,requestId:E})}let g=await c.json(),b=i.metadata?.provider??l.provider,I=Hh(Wh(g,"Invalid token refresh response"),b,i);return lt(`cline.refresh.success newAccessTokenHash=${Us(I.access)} newRefreshTokenHash=${Us(I.refresh)} expires=${I.expires}`),I}async function gR(i,l,u){if(!i)return lt("cline.getCredentials outcome=no_current_credentials"),null;let c=u?.refreshBufferMs??rR,g=u?.retryableTokenGraceMs??sR,b=u?.forceRefresh===!0;if(!b&&!jh(i,c))return lt(`cline.getCredentials outcome=still_valid forceRefresh=${b}`),i;lt(`cline.getCredentials outcome=needs_refresh forceRefresh=${b} accessTokenHash=${Us(i.access)}`);try{return await fR(i,l)}catch(I){let k=ok(i),T=I instanceof Wr&&I.requestId?{request_id:I.requestId}:{},E={status:I instanceof Wr?I.status:void 0,errorCode:I instanceof Wr?I.errorCode:void 0,...T,...k,errorName:I instanceof Error?I.name:void 0};if(I instanceof Wr&&I.isLikelyInvalidGrant())return lt(`cline.getCredentials outcome=invalid_grant status=${I.status} errorCode=${I.errorCode??"none"}`),_h(l.telemetry,l.provider??"cline","token_invalid",{status:I.status,errorCode:I.errorCode,...T,...k}),null;if(i.expires-Date.now()>g)return lt(`cline.getCredentials outcome=transient_failure_kept_current error=${I instanceof Error?I.message:String(I)}`),ql(l.telemetry,l.provider??"cline",{...E,tokenExpired:!1}),i;throw lt(`cline.getCredentials outcome=transient_failure_rethrown error=${I instanceof Error?I.message:String(I)}`),ql(l.telemetry,l.provider??"cline",{...E,tokenExpired:!0}),I}}var ut={authorizationEndpoint:"https://auth.openai.com/oauth/authorize",tokenEndpoint:"https://auth.openai.com/oauth/token",clientId:"app_EMoamEEZ73f0CkXaXp7hrann",redirectUri:"http://localhost:1455/auth/callback",scopes:"openid profile email offline_access",callbackPort:1455,jwtClaimPath:"https://api.openai.com/auth",refreshBufferMs:300000,retryableTokenGraceMs:30000,httpTimeoutMs:30000};class Co extends Error{status;errorCode;constructor(i,l){super(i);this.name="OpenAICodexOAuthTokenError",this.status=l?.status,this.errorCode=l?.errorCode}isLikelyInvalidGrant(){if(this.errorCode&&/invalid_grant/i.test(this.errorCode))return!0;if(this.status===400||this.status===401||this.status===403)return/invalid_grant|revoked|expired|invalid refresh/i.test(this.message);return!1}}async function yR(i,l,u=ut.redirectUri){let c=await fetch(ut.tokenEndpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",client_id:ut.clientId,code:i,code_verifier:l,redirect_uri:u}),signal:AbortSignal.timeout(ut.httpTimeoutMs)});if(!c.ok)return{type:"failed"};let g=await c.json();if(!g.access_token||!g.refresh_token||typeof g.expires_in!=="number")return{type:"failed"};return{type:"success",access:g.access_token,refresh:g.refresh_token,expires:Date.now()+g.expires_in*1000,email:g.email,idToken:g.id_token}}async function vR(i){try{let l=await fetch(ut.tokenEndpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:i,client_id:ut.clientId}),signal:AbortSignal.timeout(ut.httpTimeoutMs)});if(!l.ok){let c=await l.text().catch(()=>""),g=Yu(c);throw new Co(`Token refresh failed: ${l.status}${g.message?` - ${g.message}`:""}`,{status:l.status,errorCode:g.code})}let u=await l.json();if(!u.access_token||!u.refresh_token||typeof u.expires_in!=="number")return{type:"failed"};return{type:"success",access:u.access_token,refresh:u.refresh_token,expires:Date.now()+u.expires_in*1000,email:u.email,idToken:u.id_token}}catch(l){if(l instanceof Co)throw l;return{type:"failed"}}}async function wR(i="pi"){let{verifier:l,challenge:u}=await sk(),c=R(32),g=new URL(ut.authorizationEndpoint);return g.searchParams.set("response_type","code"),g.searchParams.set("client_id",ut.clientId),g.searchParams.set("redirect_uri",ut.redirectUri),g.searchParams.set("scope",ut.scopes),g.searchParams.set("code_challenge",u),g.searchParams.set("code_challenge_method","S256"),g.searchParams.set("state",c),g.searchParams.set("id_token_add_organizations","true"),g.searchParams.set("codex_cli_simplified_flow","true"),g.searchParams.set("originator",i),{verifier:l,state:c,url:g.toString()}}function bR(){try{let i=new URL(ut.redirectUri),l=i.port.length>0?Number.parseInt(i.port,10):ut.callbackPort;return{host:i.hostname||"localhost",port:Number.isFinite(l)?l:ut.callbackPort,callbackPath:i.pathname||"/auth/callback",redirectUri:i.toString()}}catch{return{host:"localhost",port:ut.callbackPort,callbackPath:"/auth/callback",redirectUri:ut.redirectUri}}}function IR(i,l){let u=l?ne(l):ne(i),c=u?u:ne(i),g=c?.[ut.jwtClaimPath]?.chatgpt_account_id;if(typeof g==="string"&&g.length>0)return g;let b=c?.organizations;if(Array.isArray(b)&&b.length>0){let k=b[0];if(typeof k?.id==="string"&&k.id.length>0)return k.id}let I=c?.chatgpt_account_id;if(typeof I==="string"&&I.length>0)return I;return null}function ak(i,l){let u=IR(i.access,i.idToken)??l?.accountId;if(!u)throw Error("Failed to extract accountId from token");return{access:i.access,refresh:i.refresh||l?.refresh||"",expires:i.expires,accountId:u,email:i.email??l?.email,metadata:{...l?.metadata??{},provider:"openai-codex"}}}async function kR(i){Sh(i.telemetry,"openai-codex");let l=bR(),{verifier:u,state:c,url:g}=await wR(i.originator),b=await Fh({host:l.host,ports:[l.port],callbackPath:l.callbackPath,expectedState:c});if(!b.callbackUrl&&!i.onManualCodeInput){let k=Error(`Port ${l.port} is already in use, so the OpenAI sign-in callback cannot be received. Close the application using that port (for example another Codex or Cline sign-in) and try again.`);throw tu(i.telemetry,"openai-codex",k.message),k}i.onAuth({url:g,instructions:"Continue the authentication process in your browser."});let I;try{let k=await Bh({waitForCallback:b.waitForCallback,cancelWait:b.cancelWait,onManualCodeInput:i.onManualCodeInput,parseOptions:{allowHashCodeState:!0}});if(k.error)throw Error(`OAuth error: ${k.error}`);if(k.state&&k.state!==c)throw Error("State mismatch");if(I=k.code,!I){let A=await i.onPrompt({message:"Paste the authorization code (or full redirect URL):"}),C=ou(A,{allowHashCodeState:!0});if(C.state&&C.state!==c)throw Error("State mismatch");I=C.code}if(!I)throw Error("Missing authorization code");let T=await yR(I,u,l.redirectUri);if(T.type!=="success")throw Error("Token exchange failed");let E=ak(T);return Th(i.telemetry,"openai-codex"),Gu(i.telemetry,{id:E.accountId,email:E.email,provider:"openai-codex"}),E}catch(k){throw tu(i.telemetry,"openai-codex",k instanceof Error?k.message:String(k)),k}finally{b.close()}}async function SR(i,l){let u=await vR(i);if(u.type!=="success")throw Error("Failed to refresh OpenAI Codex token");let c=ak(u,l);if(!c.refresh)throw Error("Failed to refresh OpenAI Codex token: missing refresh token");return c}async function TR(i,l){if(!i)return null;let u=l?.refreshBufferMs??ut.refreshBufferMs,c=l?.retryableTokenGraceMs??ut.retryableTokenGraceMs;if(l?.forceRefresh!==!0&&!jh(i,u))return i;try{return await SR(i.refresh,i)}catch(g){let b={status:g instanceof Co?g.status:void 0,errorCode:g instanceof Co?g.errorCode:void 0,errorName:g instanceof Error?g.name:void 0};if(g instanceof Co&&g.isLikelyInvalidGrant())return _h(l?.telemetry,"openai-codex","invalid_grant",{status:g.status,errorCode:g.errorCode}),null;let I=i.expires-Date.now()<=c;if(ql(l?.telemetry,"openai-codex",{...b,tokenExpired:I}),!I)return i;throw g}}class lk{ttlMs;maxEntries;entries=new Map;constructor(i,l){this.ttlMs=i,this.maxEntries=l}get(i,l=Date.now()){this.pruneExpired(l);let u=this.entries.get(i);if(!u)return;return this.entries.delete(i),this.entries.set(i,u),u.value}set(i,l,u=Date.now(),c=this.ttlMs){this.pruneExpired(u),this.entries.delete(i);while(this.entries.size>=this.maxEntries){let g=this.entries.keys().next().value;if(g===void 0)break;this.entries.delete(g)}this.entries.set(i,{value:l,expiresAt:u+c})}pruneExpired(i){for(let[l,u]of this.entries)if(u.expiresAt<=i)this.entries.delete(l)}}var _R="a8331954c0cf48ba99b5dd223a14c6ea",ER="https://idcs-9dc693e80d9b469480d7afe00e743931.identity.oraclecloud.com",AR="openid offline_access",dk="https://code-internal.aiservice.us-chicago-1.oci.oraclecloud.com/20250206/app/litellm",xR="c1aba3deed5740659981a752714eba33",CR="https://login-ext.identity.oraclecloud.com",RR="openid offline_access",uk="https://code.aiservice.us-chicago-1.oci.oraclecloud.com/20250206/app/litellm",PR="/auth/oca",MR=Array.from({length:11},(i,l)=>48801+l),NR=300000,OR=30000,ck=30000,$R=600000;class Ro extends Error{status;errorCode;constructor(i,l){super(i);this.name="OcaOAuthTokenError",this.status=l?.status,this.errorCode=l?.errorCode}isLikelyInvalidGrant(){if(this.errorCode&&/invalid_grant|invalid_token|unauthorized/i.test(this.errorCode))return!0;return this.status===400||this.status===401||this.status===403}}var Gs={internal:{clientId:_R,idcsUrl:ER,scopes:AR,baseUrl:dk},external:{clientId:xR,idcsUrl:CR,scopes:RR,baseUrl:uk}},Bl=new Map,LR=86400000,DR=300000,UR=32,Mc=new lk(LR,UR);function pk(i){if(typeof i==="function")return i();return i??"internal"}function mk(i){return{internal:{clientId:i?.internal?.clientId??Gs.internal.clientId,idcsUrl:i?.internal?.idcsUrl??Gs.internal.idcsUrl,scopes:i?.internal?.scopes??Gs.internal.scopes,baseUrl:i?.internal?.baseUrl??Gs.internal.baseUrl},external:{clientId:i?.external?.clientId??Gs.external.clientId,idcsUrl:i?.external?.idcsUrl??Gs.external.idcsUrl,scopes:i?.external?.scopes??Gs.external.scopes,baseUrl:i?.external?.baseUrl??Gs.external.baseUrl}}}function FR(i=Date.now()){let l=i-$R;for(let[u,c]of Bl.entries())if(c.createdAt<l)Bl.delete(u)}function qR(i,l,u){if(typeof i.expires_in==="number"&&i.expires_in>0)return Date.now()+i.expires_in*1000;let c=ne(l)?.exp;if(typeof c==="number"&&c>0)return c*1000;let g=ne(u)?.exp;if(typeof g==="number"&&g>0)return g*1000;return Date.now()+3600000}function hk(i,l,u){let c=i.access_token;if(!c)throw Error("Token response did not include an access token");let g=i.refresh_token??u?.refresh;if(!g)throw Error("Token response did not include a refresh token");let b=ne(i.id_token),I=ne(c),k=b?.sub??I?.sub,T=b?.email??I?.email;return{access:c,refresh:g,expires:qR(i,c,i.id_token),accountId:k??u?.accountId,email:T??u?.email,metadata:{...u?.metadata??{},provider:"oca",mode:l,subject:k,idToken:i.id_token}}}async function fk(i,l){let u=qh(i),c=Mc.get(u);if(c)return c;let g=`${u}/.well-known/openid-configuration`,b=await fetch(g,{method:"GET",signal:AbortSignal.timeout(l)});if(!b.ok){let k=`${u}/oauth2/v1/token`;return Mc.set(u,k,Date.now(),DR),k}let I=(await b.json()).token_endpoint||`${u}/oauth2/v1/token`;return Mc.set(u,I),I}function gk(i){return{code:i.error,message:i.error_description}}async function jR(i){let l=Bl.get(i.state);if(!l)throw Error("No PKCE verifier found for this state");Bl.delete(i.state);let u=i.mode==="external"?i.config.external:i.config.internal,c=await fk(u.idcsUrl,i.requestTimeoutMs),g=new URLSearchParams({grant_type:"authorization_code",code:i.code,redirect_uri:l.redirectUri,client_id:u.clientId,code_verifier:l.verifier}),b=await fetch(c,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:g,signal:AbortSignal.timeout(i.requestTimeoutMs)}),I=await b.json();if(!b.ok){let T=gk(I);throw new Ro(`Token exchange failed: ${b.status}${T.message?` - ${T.message}`:""}`,{status:b.status,errorCode:T.code})}let k=ne(I.id_token);if(!I.id_token||!k)throw Error("No ID token received from OCA");if(k.nonce!==l.nonce)throw Error("OIDC nonce verification failed");return hk(I,i.mode)}function BR(i){let l=i.mode==="external"?i.config.external:i.config.internal,u=new URL(`${qh(l.idcsUrl)}/oauth2/v1/authorize`);return u.searchParams.set("client_id",l.clientId),u.searchParams.set("response_type","code"),u.searchParams.set("scope",l.scopes),u.searchParams.set("code_challenge",i.challenge),u.searchParams.set("code_challenge_method","S256"),u.searchParams.set("redirect_uri",i.callbackUrl),u.searchParams.set("state",i.state),u.searchParams.set("nonce",i.nonce),u.toString()}async function HR(i){Sh(i.telemetry,"oca");let l=mk(i.config),u=pk(i.mode),c=i.callbackPorts?.length?i.callbackPorts:MR,g=i.callbackPath??PR,b=i.requestTimeoutMs??ck,I=await Fh({ports:c,callbackPath:g,onListening:i.callbacks.onServerListening,onClose:i.callbacks.onServerClose}),k=I.callbackUrl;if(!k)throw Error("Unable to bind local OAuth callback server");let T=R(16),E=R(16),{verifier:A,challenge:C}=await sk();FR(),Bl.set(T,{verifier:A,nonce:E,mode:u,redirectUri:k,createdAt:Date.now()});let N=BR({callbackUrl:k,mode:u,state:T,nonce:E,challenge:C,config:l});i.callbacks.onAuth({url:N,instructions:"Continue the authentication process in your browser."});try{let O=await Bh({waitForCallback:I.waitForCallback,cancelWait:I.cancelWait,onManualCodeInput:i.callbacks.onManualCodeInput}),{code:L,state:D}=O;if(O.error)throw Error(`OAuth error: ${O.error}`);if(!L){if(!i.callbacks.onManualCodeInput)throw Error("Timed out waiting for OCA callback");throw Error("Missing authorization code")}if(!D||D!==T)throw Error("State mismatch");let U=await jR({code:L,state:D,mode:u,config:l,requestTimeoutMs:b});return Th(i.telemetry,"oca"),Gu(i.telemetry,{id:U.accountId,email:U.email,provider:"oca"}),U}catch(O){throw tu(i.telemetry,"oca",O instanceof Error?O.message:String(O)),O}finally{I.close()}}async function zR(i,l={}){let u=mk(l.config),c=l.requestTimeoutMs??ck,g=i.metadata?.mode,b=g==="internal"||g==="external"?g:pk(l.mode),I=b==="external"?u.external:u.internal,k=await fk(I.idcsUrl,c),T=new URLSearchParams({grant_type:"refresh_token",refresh_token:i.refresh,client_id:I.clientId}),E=await fetch(k,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:T,signal:AbortSignal.timeout(c)}),A=await E.json();if(!E.ok){let C=gk(A);throw new Ro(`Token refresh failed: ${E.status}${C.message?` - ${C.message}`:""}`,{status:E.status,errorCode:C.code})}return hk(A,b,i)}async function WR(i,l,u){if(!i)return null;let c=l?.refreshBufferMs??u?.refreshBufferMs??NR,g=l?.retryableTokenGraceMs??u?.retryableTokenGraceMs??OR;if(l?.forceRefresh!==!0&&!jh(i,c))return i;try{return await zR(i,u)}catch(b){let I=u?.telemetry??l?.telemetry,k={status:b instanceof Ro?b.status:void 0,errorCode:b instanceof Ro?b.errorCode:void 0,errorName:b instanceof Error?b.name:void 0};if(b instanceof Ro&&b.isLikelyInvalidGrant())return _h(I,"oca","invalid_grant",{status:b.status,errorCode:b.errorCode}),null;let T=i.expires-Date.now()<=g;if(ql(I,"oca",{...k,tokenExpired:T}),!T)return i;throw b}}var au="workos:";function KR(i){let l=i.trim();return l.toLowerCase().startsWith(au)?l:`${au}${l}`}function GR(i){let l=i.trim();return l.toLowerCase().startsWith(au)?l.slice(au.length):l}function XR(i){let l=ne(i)?.exp;if(typeof l==="number"&&l>0)return l*1000;return null}function JR(i,l){let u=i.auth?.expiresAt;if(typeof u==="number"&&Number.isFinite(u)&&u>0)return u;let c=XR(l);if(c)return c;return Date.now()-1}function VR(i,l){let u=i.auth?.accessToken?.trim(),c=i.auth?.refreshToken?.trim();if(!u||!c)return null;let g=l?.normalizeAccessToken?.(u)??u;if(!g)return null;return{access:g,refresh:c,expires:JR(i,g),accountId:i.auth?.accountId,metadata:i.auth?.metadata}}function YR(i){let l=i.formatAccessToken?.(i.credentials.access)??i.credentials.access,u={...i.settings?.auth??{},accessToken:l,refreshToken:i.credentials.refresh,accountId:i.credentials.accountId,expiresAt:i.credentials.expires},c=Object.fromEntries(Object.entries(i.credentials.metadata??{}).filter(([,I])=>I!==void 0)),g={...i.settings?.auth?.metadata??{},...c};if(Object.keys(g).length>0)u.metadata=g;let b={...i.settings??{provider:i.storageProviderId},provider:i.storageProviderId,auth:u};if(i.save!==!1)i.manager.saveProviderSettings(b,{...i.setLastUsed===void 0?{}:{setLastUsed:i.setLastUsed},tokenSource:"oauth"});return b}function pm(i){let l=i.storageProviderId??i.providerId;return{providerId:i.providerId,storageProviderId:l,getApiKey(u){let c=u?.auth?.accessToken?.trim();if(c)return i.formatAccessToken?.(c)??c;return u?.apiKey?.trim()||u?.auth?.apiKey?.trim()||void 0},login:i.login,refresh:i.refresh,saveCredentials(u){return YR({...u,storageProviderId:l,formatAccessToken:i.formatAccessToken})},isConfigured(u){return!!u?.auth?.accessToken},normalizeStoredAccessToken:i.normalizeStoredAccessToken}}function Fg(i){return pm({providerId:i.providerId,storageProviderId:i.storageProviderId,formatAccessToken:KR,normalizeStoredAccessToken:GR,login:({settings:l,callbacks:u,telemetry:c})=>hR({apiBaseUrl:l?.baseUrl?.trim()||ke().apiBaseUrl,useWorkOSDeviceAuth:!0,callbacks:u,telemetry:c}),refresh:({settings:l,credentials:u,forceRefresh:c,telemetry:g})=>gR(u,{apiBaseUrl:l.baseUrl?.trim()||ke().apiBaseUrl,telemetry:g},{forceRefresh:c})})}var QR=[Fg({providerId:"cline"}),Fg({providerId:"cline-pass",storageProviderId:"cline"}),pm({providerId:"oca",login:({settings:i,callbacks:l,telemetry:u})=>HR({mode:i?.oca?.mode,callbacks:l,telemetry:u}),refresh:({settings:i,credentials:l,forceRefresh:u,telemetry:c})=>WR(l,{forceRefresh:u,telemetry:c},{mode:i.oca?.mode,telemetry:c})}),pm({providerId:"openai-codex",login:({callbacks:i,telemetry:l})=>kR({onAuth:i.onAuth,onPrompt:i.onPrompt,onProgress:i.onProgress,onManualCodeInput:i.onManualCodeInput,telemetry:l}),refresh:({credentials:i,forceRefresh:l,telemetry:u})=>TR(i,{forceRefresh:l,telemetry:u})})],ZR=new Map(QR.map((i)=>[i.providerId,i]));function oi(i){return ZR.get(i.trim().toLowerCase())}function qg(i){return oi(i)!==void 0}function jg(i,l){let u=oi(i);if(!u)return null;return VR(l,{normalizeAccessToken:u.normalizeStoredAccessToken})}function eP(i){let l=oi(i.providerId);if(!l)throw Error(`Provider "${i.providerId}" does not support OAuth credentials`);return l.saveCredentials({manager:i.manager,settings:i.settings,credentials:i.credentials,setLastUsed:i.setLastUsed,save:i.save})}function tP(i,l){let u=oi(i);if(u)return u.getApiKey(l);return l?.auth?.accessToken?.trim()||l?.apiKey?.trim()||l?.auth?.apiKey?.trim()||void 0}function yk(i){if(typeof i==="string")return i;if(Array.isArray(i))return i;return JSON.stringify(i)}function rP(i){if(i.metadata?.displayOnly===!0)return[];let l=iP(i.content),u=[],c=i.id??aP(),g=0,b=[],I=i.role==="user"&&typeof i.metadata?.userRunSpan==="number"&&Number.isInteger(i.metadata.userRunSpan)&&i.metadata.userRunSpan>=0?i.metadata.userRunSpan:void 0,k=!1,T=(C)=>{if(I===void 0)return i.metadata;if(C&&!k)return k=!0,i.metadata;return{...i.metadata,userRunSpan:0}},E=()=>{if(b.length===0)return;let C=g===0?c:`${c}_part_${g}`;g+=1,u.push({id:C,role:i.role,content:b.map(nP),createdAt:i.ts??Date.now(),metadata:T(!0),modelInfo:i.modelInfo,metrics:Bg(i.metrics)}),b=[]};if(l.length===0)return u.push({id:c,role:i.role,content:[{type:"text",text:ur}],createdAt:i.ts??Date.now(),metadata:i.metadata,modelInfo:i.modelInfo,metrics:Bg(i.metrics)}),u;let A=l.length===1&&l[0].type==="tool_result";for(let C of l){if(C.type!=="tool_result"){b.push(C);continue}E();let N=`_tool_${C.tool_use_id}`;u.push({id:A||c.endsWith(N)?c:`${c}${N}`,role:"tool",content:[wk(C)],createdAt:i.ts??Date.now(),metadata:T(!1)})}return E(),u}function Nc(i){return i.flatMap(rP)}function sP(i){let l=i.content.map(bk).filter((u)=>u!==void 0);return{id:i.id,role:i.role==="tool"?"user":i.role,content:l,ts:i.createdAt,metadata:i.metadata,modelInfo:i.modelInfo,metrics:oP(i.metrics)}}function ld(i){return i.map(sP)}function vk(i){let l=[];for(let u of i){let c=u.content.map(bk).filter((I)=>I!==void 0),g=u.role==="tool"?"user":u.role,b=l[l.length-1];if(g==="user"&&c.length>0&&c.every((I)=>I.type==="tool_result")&&b?.role==="user"&&Array.isArray(b.content)&&b.content.every((I)=>I.type==="tool_result")){b.content.push(...c);continue}l.push({role:g,content:c})}return l}function iP(i){if(typeof i==="string")return i.trim().length>0?[{type:"text",text:i}]:[];return[...i]}function nP(i){switch(i.type){case"text":return{type:"text",text:i.text};case"thinking":return{type:"reasoning",text:i.thinking,metadata:i.signature?{signature:i.signature,details:i.details}:i.details?{details:i.details}:void 0};case"redacted_thinking":return{type:"reasoning",text:"",redacted:!0,metadata:{data:i.data}};case"image":return{type:"image",image:i.data,mediaType:i.mediaType};case"media":return{type:"media",media:i.media};case"file":return{type:"file",path:i.path,content:i.content};case"tool_use":return{type:"tool-call",toolCallId:i.id,toolName:i.name,input:i.input,metadata:i.signature?{signature:i.signature}:void 0};case"tool_result":return wk(i)}}function wk(i){return{type:"tool-result",toolCallId:i.tool_use_id,toolName:i.name,output:i.content,isError:i.is_error}}function bk(i){switch(i.type){case"text":return{type:"text",text:i.text};case"reasoning":{if(i.redacted===!0)return{type:"redacted_thinking",data:i.metadata?.data??""};let l=i.metadata;return{type:"thinking",thinking:i.text,signature:l?.signature,details:l?.details}}case"image":return typeof i.image==="string"?{type:"image",data:i.image,mediaType:i.mediaType??"image/png"}:void 0;case"file":return{type:"file",path:i.path,content:i.content};case"media":return{type:"media",media:i.media};case"tool-call":{let l=i.metadata;return{type:"tool_use",id:i.toolCallId,name:i.toolName,input:i.input??{},signature:l?.thoughtSignature??l?.signature}}case"tool-result":return{type:"tool_result",tool_use_id:i.toolCallId,name:i.toolName,content:yk(i.output),is_error:i.isError}}}function Bg(i){if(!i)return;return{inputTokens:i.inputTokens??0,outputTokens:i.outputTokens??0,cacheReadTokens:i.cacheReadTokens??0,cacheWriteTokens:i.cacheWriteTokens??0,cost:i.cost}}function oP(i){if(!i)return;return{inputTokens:i.inputTokens,outputTokens:i.outputTokens,cacheReadTokens:i.cacheReadTokens,cacheWriteTokens:i.cacheWriteTokens,cost:i.cost}}var Hg=0;function aP(){return Hg+=1,`msg_${Date.now().toString(36)}_${Hg.toString(36)}`}function lP(i){switch(i.type){case"text":return[{type:"text-delta",text:i.text}];case"media":return[{type:"media",media:i.media}];case"reasoning":return[{type:"reasoning-delta",text:i.reasoning,metadata:i.signature?{thoughtSignature:i.signature,details:i.details}:{details:i.details}}];case"tool_calls":{let l=i.tool_call.function,u=l.arguments;return[{type:"tool-call-delta",toolCallId:i.tool_call.call_id??l.id,toolName:l.name,inputText:typeof u==="string"?u:void 0,input:typeof u==="string"?void 0:u,...i.signature?{metadata:{thoughtSignature:i.signature}}:{}}]}case"usage":return[{type:"usage",usage:{inputTokens:i.inputTokens,outputTokens:i.outputTokens,cacheReadTokens:i.cacheReadTokens,cacheWriteTokens:i.cacheWriteTokens,reasoningTokenCount:i.thoughtsTokenCount,totalCost:i.totalCost}}];case"done":return[{type:"finish",reason:dP(i),error:i.error,...i.error?{errorClass:ui(i.error)}:{}}];default:return[]}}function dP(i){if(i.success===!1)return"error";if(i.incompleteReason==="max_output_tokens"||i.incompleteReason==="max-tokens")return"max-tokens";if(i.incompleteReason==="content_filter"||i.incompleteReason==="content-filter")return"content-filter";return"stop"}function uP(i){return{async*stream(l){let u=!1,c=!1;try{let g=typeof i==="function"?await i():i;g.setAbortSignal?.(l.signal);let b=vk(l.messages),I=l.tools.map((k)=>({name:k.name,description:k.description,inputSchema:k.inputSchema}));for await(let k of g.createMessage(l.systemPrompt??"",b,I))for(let T of lP(k)){if(T.type==="finish")u=!0;else if(T.type==="tool-call-delta")c=!0;yield T}if(!u)yield{type:"finish",reason:c?"tool-calls":"stop"}}catch(g){if(!u){let b=l.signal?.aborted===!0;yield{type:"finish",reason:b?"aborted":"error",error:g instanceof Error?g.message:String(g),...b?{}:{errorClass:ui(g)}}}}}}}function cP(i){let l=Object.fromEntries(Object.entries(i).filter(([,u])=>u!==void 0));return Object.keys(l).length>0?l:void 0}function pP(i){return i.providerId==="openai-compatible"||i.clientType==="openai-compatible"}function mP(i){let l={region:i.region,apiLine:i.apiLine,openRouterProviderSorting:i.openRouterProviderSorting,modelCatalog:i.modelCatalog};if(pP(i))Object.assign(l,{apiVersion:i.azure?.apiVersion,useIdentity:i.azure?.useIdentity});if(i.providerId==="bedrock")Object.assign(l,{authentication:i.aws?.authentication,profile:i.aws?.profile,accessKeyId:i.aws?.accessKey,secretAccessKey:i.aws?.secretKey,sessionToken:i.aws?.sessionToken,usePromptCache:i.aws?.usePromptCache,useCrossRegionInference:i.useCrossRegionInference,useGlobalInference:i.useGlobalInference,endpoint:i.aws?.endpoint,customModelBaseId:i.aws?.customModelBaseId});if(i.providerId==="vertex"){let u=i.gcp?.region??i.region;Object.assign(l,{project:i.gcp?.projectId,projectId:i.gcp?.projectId,location:u,region:u})}if(i.providerId==="claude-code"){let u=i.extensionContext?.workspace;Object.assign(l,{cwd:u?.cwd??u?.rootPath})}if(i.providerId==="sapaicore")Object.assign(l,i.sap);return cP(l)}function hP(i){return typeof i==="number"&&Number.isFinite(i)&&i>0?Math.floor(i):void 0}function Ik(i){let l=i.providerConfig,u=l?.knownModels?l.knownModels:i.knownModels??Oe[i.providerId]?.models??void 0,c=hP(l?.maxInputTokens),g=l?.modelInfo&&l.modelInfo.id===i.modelId?l.modelInfo:void 0;if(c===void 0&&!g)return u;return{...u??{},[i.modelId]:{...u?.[i.modelId],...c!==void 0?{contextWindow:c,maxInputTokens:c}:{},...g,id:i.modelId}}}function fP(i,l){return{id:i,name:l.name??i,description:l.description,contextWindow:l.contextWindow,maxInputTokens:l.maxInputTokens,maxOutputTokens:l.maxTokens,operation:l.operation,operationModes:l.operationModes,modalities:l.modalities,capabilities:Fi(l.capabilities),reasoningOptions:l.reasoningOptions,metadata:{...l.metadata?.apiProtocol?{apiProtocol:l.metadata.apiProtocol}:{},family:l.family,pricing:l.pricing,status:l.status,releaseDate:l.releaseDate}}}function kk(i){let l=i.providerConfig,u=l?.providerId===i.providerId?l:void 0;return{...u??{},providerId:i.providerId,modelId:i.modelId,apiKey:i.apiKey??u?.apiKey,baseUrl:i.baseUrl??u?.baseUrl,headers:i.headers??u?.headers}}function gP(i,l,u){let c={...kk(i),knownModels:Ik(i),maxOutputTokens:i.maxTokensPerTurn,temperature:i.temperature,reasoningEffort:i.reasoningEffort,thinkingBudgetTokens:i.thinkingBudgetTokens,thinking:i.thinking,logger:l,extensionContext:i.extensionContext};if(ji(K(c.providerId)))return uP(()=>Bt(c));let g=dn({fetch:c.fetch,providerConfigs:[{providerId:c.providerId,apiKey:c.apiKey,baseUrl:c.baseUrl,headers:c.headers,timeoutMs:c.timeoutMs,fetch:c.fetch,options:mP(c),models:c.knownModels?Object.entries(c.knownModels).map(([I,k])=>fP(I,k)):void 0}],logger:l,telemetry:u??i.telemetry??i.extensionContext?.telemetry}),b=Cn(c);if(b)g.registerProvider(b);return g.createAgentModel({providerId:c.providerId,modelId:c.modelId},{maxTokens:c.maxOutputTokens,temperature:c.temperature})}function vP(i){if(!i||typeof i!=="object"||Array.isArray(i))return!1;let l=i;if(l.role!=="user"&&l.role!=="assistant")return!1;return typeof l.content==="string"||Array.isArray(l.content)}var wP=Y(vP),Kh=t({version:a(1),updated_at:e().datetime(),conversation_id:e().min(1).optional(),source_message_count:n().int().nonnegative(),source_prefix_hash:e().min(1).optional(),source_last_message_key:e().min(1).optional(),messages:o(wP),system_prompt:e().optional()});function Sk(i){return i.filter((l)=>l.metadata?.displayOnly!==!0)}function mm(i){return JSON.parse(JSON.stringify(i))}function Tk(i){if(i.role!=="user")return i;if(typeof i.content==="string")return{...i,content:me(i.content)};return{...i,content:i.content.map((l)=>l.type==="text"?{...l,text:me(l.text)}:l)}}function _k(i){if(i.includes(":"))throw TypeError("Message role cannot contain ':' in compaction boundary keys")}function bP(i){let l=Tk(i);return _k(l.role),[["role",l.role],["content",l.content],["agent",l.agent??null],["sessionId",l.sessionId??null],["metadata",l.metadata??null],["modelInfo",l.modelInfo??null],["metrics",l.metrics??null]]}function Ek(i){if(!i)return"";let l=Tk(i);if(typeof l.id==="string"&&l.id.trim())return`id:${l.id.trim()}`;if(_k(l.role),typeof l.ts==="number"&&Number.isFinite(l.ts))return`ts:${l.role}:${l.ts}`;return`content:${l.role}:${JSON.stringify(l.content)}`}function Ak(i,l=i.length){let u=yP("sha256");u.update(`cline-session-compaction-source-v2
|
|
48
|
+
`),u.update(`${l}
|
|
49
|
+
`);for(let c of i.slice(0,l))u.update(JSON.stringify(bP(c))),u.update(`
|
|
50
|
+
`);return`sha256:${u.digest("hex")}`}function zg(i){let l=Sk(i.sourceMessages),u=l.at(-1),c=Ek(u);return Kh.parse({version:1,updated_at:i.updatedAt??new Date().toISOString(),...i.conversationId?.trim()?{conversation_id:i.conversationId.trim()}:{},source_message_count:l.length,source_prefix_hash:Ak(l),...c?{source_last_message_key:c}:{},messages:mm(i.compactedMessages),...i.systemPrompt!==void 0?{system_prompt:i.systemPrompt}:{}})}function hm(i,l){if(l=Sk(l),!(i.source_message_count<=l.length))return;let u=!!i.source_prefix_hash&&Ak(l,i.source_message_count)===i.source_prefix_hash,c=l[i.source_message_count-1],g=!i.source_prefix_hash&&i.source_message_count>0&&!!i.source_last_message_key&&Ek(c)===i.source_last_message_key;if(!(u||g))return;return[...mm(i.messages),...mm(l.slice(i.source_message_count))]}function Zu(i){let l=Kh.safeParse(i);return l.success?l.data:void 0}var IP=new Set(["auto_compaction","compaction_budget_emergency","completion_reminder","loop_detection_notice","manual_compaction","mistake_stop_notice","recovery_notice"]);function kP(i){switch(i){case"user":case"assistant":case"tool":case"system":case"status":case"error":return i;default:return"assistant"}}function SP(i){return i.metadata&&typeof i.metadata==="object"&&!Array.isArray(i.metadata)?i.metadata:void 0}function TP(i){let l=i?.userRunSpan;return typeof l==="number"&&Number.isInteger(l)&&l>=0?l:void 0}function _P(i){if(typeof i.content==="string")return{hasAttachment:!1,text:i.content};if(!Array.isArray(i.content))return{hasAttachment:!1,text:"unknown"};let l=!1,u=!1,c=[];for(let g of i.content){if(!g||typeof g!=="object"||Array.isArray(g))continue;let b=g;if(b.type==="text"&&typeof b.text==="string")c.push(b.text);else if(b.type==="tool_result"||b.type==="tool-result")u=!0;else if(b.type==="file"||b.type==="image")l=!0}return{hasAttachment:l&&!u,text:c.join(`
|
|
51
|
+
`)}}function EP(i){let l=me(i);return l.startsWith("[TASK RESUMPTION]")||l==="The user approved switching to act mode. Continue with the approved plan now."}function nd(i){if(kP(i.role)!=="user")return 0;let l=SP(i),u=typeof l?.kind==="string"?l.kind:void 0,c=TP(l);if(u==="compaction"||u==="compaction_summary")return c??1;if(c!==void 0)return c;if(u&&IP.has(u))return 0;let g=_P(i);if(!g.hasAttachment&&!me(g.text))return 0;if(!g.hasAttachment&&EP(g.text))return 0;return 1}function AP(i){return nd(i)>0}function fm(i){let l=0;for(let u of i??[])l+=nd(u);return l}var xP=128000,CP=0.9,xn=0.9,RP=4,PP=0.7,MP=20000,Wg=8192,Kg=2000,xk=2000;function lu(i){return typeof i==="number"&&Number.isFinite(i)&&i>0}function gm(i){let l=lu(i.contextWindow)?i.contextWindow:void 0,u=lu(i.maxInputTokens)?i.maxInputTokens:void 0;if(u!==void 0)return l===void 0?u:Math.min(u,l);return l===void 0?void 0:l*CP}function Al(i,l){if(i.length<=l)return i;return`${i.slice(0,l)}
|
|
52
|
+
...[truncated ${i.length-l} chars]`}function NP(i){let l=gm({maxInputTokens:i.maxInputTokens??i.modelInfo?.maxInputTokens,contextWindow:i.modelInfo?.contextWindow});if(l!==void 0)return l;let u=i.knownModels?.[i.modelId];return gm({maxInputTokens:u?.maxInputTokens,contextWindow:u?.contextWindow})}function OP(i){let l=$P(i);if(typeof l==="string")return l;return l.map((u)=>{switch(u.type){case"text":return u.text;case"file":return`<file path="${u.path}">
|
|
53
|
+
${u.content}
|
|
54
|
+
</file>`;case"image":return`[image:${u.mediaType}]`;default:return""}}).join(`
|
|
55
|
+
`)}function $P(i){if(typeof i==="string")return Al(i,Kg);return i.map((l)=>{switch(l.type){case"text":return{...l,text:Al(l.text,Kg)};case"file":return{...l,content:Al(l.content,xk)};case"image":return l;default:return l}})}function LP(i){return Object.entries(i).map(([l,u])=>`${l}=${JSON.stringify(u)}`).join(", ")}function Ck(i){if(typeof i.content==="string")return`[${i.role==="user"?"User":"Bot"}]: ${i.content}`;let l=[];for(let u of i.content)switch(u.type){case"text":l.push(`[${i.role==="user"?"User":"Bot"}]: ${u.text}`);break;case"thinking":l.push(`[Bot thinking]: ${Al(u.thinking,2000)}`);break;case"redacted_thinking":l.push("[Bot thinking]: [redacted]");break;case"tool_use":l.push(`[Bot tool calls]: ${u.name}(${LP(u.input)})`);break;case"tool_result":l.push(`[Tool result]: ${OP(u.content)}`);break;case"file":l.push(`[${i.role==="user"?"User":"Bot"} file ${u.path}]: ${Al(u.content,xk)}`);break;case"image":l.push(`[${i.role==="user"?"User":"Bot"} image]: ${u.mediaType}`);break;case"media":l.push(`[Bot generated ${u.media.modality}]: ${u.media.mediaType}`);break}return l.join(`
|
|
56
|
+
`)}function DP(i){return i.map(Ck).join(`
|
|
57
|
+
|
|
58
|
+
`).trim()}function UP(){let i=new WeakMap;return(l)=>{let u=l,c=i.get(u);if(typeof c==="number")return c;let{replacer:g,imageCount:b}=Nn(),I,k=0;try{I=JSON.stringify(l,g),k=b()}catch{I=Ck(l)}let T=jt(I.length)+k*Io;return i.set(u,T),T}}function Gh(i){return i.metadata?.kind==="compaction_summary"}function Rk(i){if(!Gh(i))return;let l=i.metadata;if(!l)return;let u=l.details;return{kind:"compaction_summary",displayRole:"system",userRunSpan:typeof l.userRunSpan==="number"&&Number.isInteger(l.userRunSpan)&&l.userRunSpan>=0?l.userRunSpan:1,summary:String(l.summary??""),details:{readFiles:Array.isArray(u?.readFiles)?u.readFiles.filter((c)=>typeof c==="string").map((c)=>c.trim()).filter((c)=>c.length>0):[],modifiedFiles:Array.isArray(u?.modifiedFiles)?u.modifiedFiles.filter((c)=>typeof c==="string").map((c)=>c.trim()).filter((c)=>c.length>0):[]},tokensBefore:Number(l.tokensBefore??0),generatedAt:Number(l.generatedAt??0)}}function FP(i){if(i.role!=="user"||!Array.isArray(i.content))return!1;return i.content.length>0&&i.content.every((l)=>l.type==="tool_result")}function qs(i){return i.role==="user"&&i.metadata?.userRunSpan!==0&&!FP(i)&&!Gh(i)}function qP(i){for(let l=i.length-1;l>=0;l-=1)if(qs(i[l]))return l;return 0}function Pk(i){for(let l=i.length-1;l>=0;l-=1)if(Gh(i[l]))return l;return-1}function jP(i){return i.role==="assistant"||qs(i)}function BP(i,l,u){let c=0,g=i.length;for(let k=i.length-1;k>=0;k-=1)if(c+=u(i[k]),g=k,c>=l)break;if(g<=0)return 0;let b=qP(i),I=b>0?Math.min(g,b):g;while(I>0&&!jP(i[I]))I-=1;return I}function Wi(i){if(typeof i==="string"&&i.trim().length>0)return[i];if(Array.isArray(i))return i.flatMap((l)=>Wi(l));if(i&&typeof i==="object"){let l=i,u=[];for(let c of["path","file_path","target_file","new_file_path","old_file_path"])u.push(...Wi(l[c]));if(Array.isArray(l.files)){for(let c of l.files)if(c&&typeof c==="object")u.push(...Wi(c.path))}if(Array.isArray(l.file_paths))u.push(...Wi(l.file_paths));return u}return[]}function na(i,l){let u=new Set(i);for(let c of l){let g=c.trim();if(!g)continue;u.add(g)}return[...u].sort((c,g)=>c.localeCompare(g))}function Gg(i){let l=[],u=[];for(let c of i){let g=Rk(c);if(g){l=na(l,g.details.readFiles),u=na(u,g.details.modifiedFiles);continue}if(!Array.isArray(c.content))continue;for(let b of c.content){if(b.type==="file"){l=na(l,[b.path]);continue}if(b.type!=="tool_use")continue;let I=Wi(b.input);if(b.name==="read_files"){l=na(l,I);continue}if(b.name==="editor"||b.name==="apply_patch")u=na(u,I)}}return{readFiles:l,modifiedFiles:u}}var Xg=100;function Jg(i){return i.readFiles.length>0||i.editedFiles.length>0||i.commands.length>0}function oa(i,l){let u=l.trim();if(u&&!i.includes(u))i.push(u)}function HP(i){if(i.length<=Xg)return i;return`${i.slice(0,Xg)}...`}function zP(i){let l=typeof i.path==="string"?i.path.trim():"";if(!l)return;let{start_line:u,end_line:c}=i;if(typeof u==="number"&&typeof c==="number")return`${l}:${u}-${c}`;return l}function WP(i){let l=typeof i==="string"?i:i.map((g)=>g.type==="text"?g.text:g.type==="file"?g.content:"").join(`
|
|
59
|
+
`);try{let g=JSON.parse(l);if(g&&typeof g.result==="string")l=g.result}catch{}let{POSITIVE_INFINITY:u,NEGATIVE_INFINITY:c}=Number;for(let g of l.matchAll(/(?:^|\n|\\n)[-+](\d+): /g)){let b=Number(g[1]);if(!Number.isFinite(b))continue;u=Math.min(u,b),c=Math.max(c,b)}return u<=c?{start:u,end:c}:void 0}function Vg(i){let l=[],u=[],c=[],g=new Map;for(let b of i){if(!Array.isArray(b.content))continue;for(let I of b.content){if(I.type==="tool_use"){let k=I.input??{};if(I.name==="read_files"){if(Array.isArray(k.files)){for(let T of k.files)if(T&&typeof T==="object"){let E=zP(T);if(E)oa(l,E)}}else for(let T of Wi(k))oa(l,T);continue}if(I.name==="editor"||I.name==="apply_patch"){let T=Wi(k)[0];if(T)g.set(I.id,T);continue}if(I.name==="run_commands"){let T=Array.isArray(k.commands)?k.commands:[];for(let E of T)if(typeof E==="string"&&E.trim())oa(c,HP(E.trim()))}continue}if(I.type==="tool_result"){let k=g.get(I.tool_use_id);if(!k)continue;let T=WP(I.content);oa(u,T?`${k}:${T.start}-${T.end}`:k),g.delete(I.tool_use_id)}}}for(let b of g.values())oa(u,b);return{readFiles:l,editedFiles:u,commands:c}}function KP(i){return[`Files read:
|
|
60
|
+
${i.readFiles.join(`
|
|
61
|
+
`)}`,`Files edited:
|
|
62
|
+
${i.editedFiles.join(`
|
|
63
|
+
`)}`,`Commands ran:
|
|
64
|
+
${i.commands.join(`
|
|
65
|
+
`)}`].join(`
|
|
66
|
+
|
|
67
|
+
`)}function GP(i){let l=i.readFiles.length>0?i.readFiles.map((c)=>`- ${c}`).join(`
|
|
68
|
+
`):"- none",u=i.modifiedFiles.length>0?i.modifiedFiles.map((c)=>`- ${c}`).join(`
|
|
69
|
+
`):"- none";return`## Files
|
|
70
|
+
Read:
|
|
71
|
+
${l}
|
|
72
|
+
Modified:
|
|
73
|
+
${u}`}function XP(i,l){if(/^## Files$/im.test(i))return i.trim();return`${i.trim()}
|
|
74
|
+
|
|
75
|
+
${GP(l)}`.trim()}function Yg(i){let l=[`Summarize this session for continuation. Be concise and factual.
|
|
76
|
+
|
|
77
|
+
## Goal
|
|
78
|
+
One sentence: what is being built or fixed.
|
|
79
|
+
|
|
80
|
+
## State
|
|
81
|
+
- Done: completed steps
|
|
82
|
+
- In Progress: current work
|
|
83
|
+
- Blocked: blockers or open questions
|
|
84
|
+
|
|
85
|
+
## Highlights
|
|
86
|
+
Key technical choices or notable findings (omit if none).
|
|
87
|
+
|
|
88
|
+
## Next
|
|
89
|
+
Immediate next steps.
|
|
90
|
+
|
|
91
|
+
## Files
|
|
92
|
+
Read: ${i.fileOps.readFiles.join(", ")||"none"}
|
|
93
|
+
Edited: ${i.fileOps.modifiedFiles.join(", ")||"none"}`];if(i.previousSummary?.trim())l.push(`Previous summary:
|
|
94
|
+
${i.previousSummary.trim()}`);return l.push(`Conversation:
|
|
95
|
+
${i.conversationText||"(empty)"}`),l.join(`
|
|
96
|
+
|
|
97
|
+
`)}function JP(i){if(lu(i.maxOutputTokens))return Math.floor(i.maxOutputTokens);let l=i.modelInfo?.maxTokens??i.knownModels?.[i.modelId]?.maxTokens;if(lu(l))return Math.min(Wg,Math.floor(l));return Wg}function VP(i){let l=i.summarizer,u=(g)=>{if(g.providerId==="openai-codex"){let{maxOutputTokens:b,...I}=g;return{...I,thinking:!1}}return{...g,maxOutputTokens:JP(g),thinking:!1}};if(!l)return u(i.activeProviderConfig);let c=l.providerConfig?.providerId===l.providerId?l.providerConfig:void 0;return u({...c??{},providerId:l.providerId,modelId:l.modelId,apiKey:l.apiKey??c?.apiKey,baseUrl:l.baseUrl??c?.baseUrl,headers:l.headers??c?.headers,modelInfo:l.modelInfo??c?.modelInfo,knownModels:l.knownModels??c?.knownModels,maxOutputTokens:l.maxOutputTokens??c?.maxOutputTokens})}function YP(i){return{role:"user",content:[{type:"text",text:`Context summary:
|
|
98
|
+
|
|
99
|
+
${i.summary}`}],metadata:{kind:"compaction_summary",displayRole:"system",userRunSpan:i.userRunSpan,summary:i.summary,details:i.fileOps,tokensBefore:i.tokensBefore,generatedAt:Date.now()}}}function QP(i){switch(i){case"agentic_summary":case"basic_compaction_projection":return{protectLatestTypedUser:!0,protectLiveTailFromDrop:!0,dropUnsafeOutsideLiveTail:!0,dropThinkingBlocks:!0};case"normal_provider_request":return{protectLatestTypedUser:!0,protectLiveTailFromDrop:!0,dropUnsafeOutsideLiveTail:!1,dropThinkingBlocks:!1}}}function Qg(i){return i.map((l)=>({...l,content:Array.isArray(l.content)?l.content.map((u)=>({...u})):l.content,...l.metadata?{metadata:{...l.metadata}}:{}}))}function Ds(i){try{return JSON.stringify(i).length}catch{return String(i).length}}function dd(i,l){return i.reduce((u,c)=>u+l(c),0)}function Oc(i){for(let l=i.length-1;l>=0;l-=1){let u=i[l];if(qs(u))return l}return-1}function ZP(i){for(let l=0;l<i.length;l+=1){let u=i[l];if(qs(u))return l}return-1}function Xh(i){let l=new Set;if(!Array.isArray(i.content))return l;for(let u of i.content)if(u.type==="tool_use")l.add(u.id);else if(u.type==="tool_result")l.add(u.tool_use_id);return l}function eM(i){let l=new Map;for(let u=0;u<i.length;u+=1)for(let c of Xh(i[u])){let g=l.get(c);if(g)g.add(u);else l.set(c,new Set([u]))}return l}function $c(i){let l=new Set;for(let u of i){if(!Array.isArray(u.content))continue;for(let c of u.content)if(c.type==="tool_result")l.add(c.tool_use_id)}for(let u=i.length-1;u>=0;u-=1){let c=i[u];if(!Array.isArray(c.content))continue;if(c.content.some((g)=>g.type==="tool_use"&&!l.has(g.id)))return u}return i.length}function tM(i,l){let u=eM(i),c=new Set,g=[l];while(g.length>0){let b=g.shift();if(b===void 0||c.has(b))continue;c.add(b);for(let I of Xh(i[b]))for(let k of u.get(I)??[])if(!c.has(k))g.push(k)}return c}function rM(i){return i.type==="image"||i.type==="media"||i.type==="redacted_thinking"}function sM(i){return i.type==="image"}function iM(i,l,u){if(l.dropThinkingBlocks&&i.type==="thinking")return!0;return l.dropUnsafeOutsideLiveTail&&!u&&rM(i)}function Zg(i,l,u,c="over_budget"){let g=[],b=[];for(let I=0;I<i.length;I+=1){let k=i[I];if(Array.isArray(k.content)&&k.content.length===0){u.push({kind:"dropped_message",path:{messageIndex:l[I]},reason:c,originalSize:Ds(k),finalSize:0});continue}g.push(k),b.push(l[I])}return{messages:g,originalIndexes:b}}function nM(i,l,u,c,g,b){return i.map((I,k)=>{if(!Array.isArray(I.content))return I;let T=!1,E=k===c||k>=g,A=I.content.flatMap((C,N)=>{if(iM(C,b,E))return T=!0,u.push({kind:"dropped_block",path:{messageIndex:l[k],blockIndex:N},reason:"unsafe_to_truncate",originalSize:Ds(C),finalSize:0}),[];if(C.type==="tool_result"&&Array.isArray(C.content)){let O=C.content.filter((L)=>{if(b.dropUnsafeOutsideLiveTail&&!E&&sM(L))return!1;return!0});if(O.length!==C.content.length){T=!0;let L={...C,content:O};return u.push({kind:"dropped_block",path:{messageIndex:l[k],blockIndex:N},reason:"unsafe_to_truncate",originalSize:Ds(C),finalSize:Ds(L)}),[L]}}return[C]});return T?{...I,content:A}:I})}function oM(i,l,u){return i.map((c,g)=>{if(!Array.isArray(c.content))return c;let b=!1,I=c.content.filter((k,T)=>{if(k.type!=="thinking")return!0;return b=!0,u.push({kind:"dropped_block",path:{messageIndex:l[g],blockIndex:T},reason:"unsafe_to_truncate",originalSize:Ds(k),finalSize:0}),!1});return b?{...c,content:I}:c})}function Po(i,l){if(l<=0)return"";if(i.length<=l)return i;if(l<=16)return i.slice(0,Math.max(1,l));let u=`
|
|
100
|
+
...[truncated ${i.length-l} chars]`,c=Math.max(1,l-u.length),g=`
|
|
101
|
+
...[truncated ${i.length-c} chars]`;return`${i.slice(0,c)}${g}`}function ey(i,l){if(typeof i==="string")return Po(i,l);let u=l;return i.map((c)=>{if(u<=0){if(c.type==="text")return{...c,text:""};if(c.type==="file")return{...c,content:""};return c}if(c.type==="text"){let g=Po(c.text,u);return u-=g.length,{...c,text:g}}if(c.type==="file"){let g=Po(c.content,u);return u-=g.length,{...c,content:g}}return c})}function aM(i){if(typeof i==="string")return i.length;return i.reduce((l,u)=>{if(u.type==="text")return l+u.text.length;if(u.type==="file")return l+u.content.length;return l},0)}function lM(i,l){if(typeof i.content==="string")return{...i,content:Po(i.content,l)};let u=l;return{...i,content:i.content.map((c)=>{if(u<=0){if(c.type==="text")return{...c,text:""};if(c.type==="file")return{...c,content:""};if(c.type==="tool_result")return{...c,content:ey(c.content,0)};return c}if(c.type==="text"){let g=Po(c.text,u);return u-=g.length,{...c,text:g}}if(c.type==="file"){let g=Po(c.content,u);return u-=g.length,{...c,content:g}}if(c.type==="tool_result"){let g=ey(c.content,u);return u-=aM(g),{...c,content:g}}return c})}}function dM(i){if(typeof i.content==="string")return i.content.length>0;return i.content.some((l)=>l.type==="text"||l.type==="file"||l.type==="tool_result")}function uM(i,l,u){return{messages:i.filter((c,g)=>!u.has(g)),originalIndexes:l.filter((c,g)=>!u.has(g))}}function cM(i,l){if(l<0)return!1;for(let u of i)if(u>=l)return!0;return!1}function ry(i,l){return l>=0&&i.has(l)}function Mk(i){let l=[],u=[],c=QP(i.policyIntent);if(i.targetTokens<=0)return{status:"failed",messages:Qg(i.messages),actions:l,liveTailHandling:"preserved_out_of_band",estimatedTokens:dd(i.messages,i.estimateMessageTokens),warnings:[{code:"budget_impossible",message:"Target budget must be greater than zero."}]};let g=Qg(i.messages),b=g.map((E,A)=>A);if(c.dropThinkingBlocks){let E=Zg(oM(g,b,l),b,l,"unsafe_to_truncate");g=E.messages,b=E.originalIndexes}let I=c.protectLatestTypedUser?Oc(g):-1,k=c.protectLiveTailFromDrop?$c(g):g.length;if(c.dropUnsafeOutsideLiveTail){let E=Zg(nM(g,b,l,I,k,c),b,l);g=E.messages,b=E.originalIndexes}let T=dd(g,i.estimateMessageTokens);if(T<=i.targetTokens)return{status:"ok",messages:g,actions:l,liveTailHandling:l.length>0?"included_degraded":"included_verbatim",estimatedTokens:T,warnings:u};for(let E=g.length-1;E>=0&&T>i.targetTokens;E-=1){let A=Oc(g);if(E===A)continue;if(c.protectLiveTailFromDrop&&E>=$c(g))continue;if(!dM(g[E]))continue;let C=Ds(g[E]),N=Math.max(1,C/Math.max(1,i.estimateMessageTokens(g[E]))),O=Math.max(16,Math.floor(i.targetTokens*N/Math.max(1,g.length)));g[E]=lM(g[E],O),l.push({kind:"truncated_text",path:{messageIndex:b[E]},reason:"over_budget",originalSize:C,finalSize:Ds(g[E])}),T=dd(g,i.estimateMessageTokens)}for(let E=0;E<g.length&&T>i.targetTokens;){let A=ZP(g),C=Oc(g),N=c.protectLiveTailFromDrop?$c(g):g.length;if(E===A||E===C){l.push({kind:"preserved",path:{messageIndex:b[E]},reason:"protected_live_tail",originalSize:Ds(g[E]),finalSize:Ds(g[E])}),E+=1;continue}let O=tM(g,E);if(ry(O,A)){E+=1;continue}if(ry(O,C)){E+=1;continue}if(cM(O,N)){E+=1;continue}for(let D of O)l.push({kind:"dropped_message",path:{messageIndex:b[D]},reason:O.size>1||Xh(g[D]).size>0?"tool_pair_boundary":"over_budget",originalSize:Ds(g[D]),finalSize:0});let L=uM(g,b,O);g=L.messages,b=L.originalIndexes,T=dd(g,i.estimateMessageTokens)}if(T>i.targetTokens)return u.push({code:"budget_unachievable_with_protections",message:"Projection could not reach budget without violating protected content."}),{status:"failed",messages:g,actions:l,liveTailHandling:"included_degraded",estimatedTokens:T,warnings:u};return{status:"ok",messages:g,actions:l,liveTailHandling:l.length>0?"included_degraded":"included_verbatim",estimatedTokens:T,warnings:u}}async function pM(i){i.signal?.throwIfAborted();let l=await Bt(i.signal?{...i.providerConfig,abortSignal:i.signal}:i.providerConfig);i.signal?.throwIfAborted();let u="",c=0,g=!1,b=!1,I;for await(let k of l.createMessage(i.systemPrompt,[{role:"user",content:i.request}]))if(i.signal?.throwIfAborted(),k.type==="text"){if(u+=k.text,i.maxOutputChars&&u.length>i.maxOutputChars)throw Error("Summary exceeded its output limit.")}else if(k.type==="reasoning")c+=k.reasoning?.length??0;else if(k.type==="done"){if(!k.success&&k.error)throw Error(k.error);I=k.incompleteReason??I,g||=!k.success}else if(k.type==="tool_calls")b=!0;return i.signal?.throwIfAborted(),{text:u,reasoningChars:c,failed:g,usedTools:b,incompleteReason:I}}var Lc=1024;function mM(i){return Mk({messages:i.messages,targetTokens:Math.max(1,i.targetTokens),policyIntent:"agentic_summary",estimateMessageTokens:i.estimateMessageTokens})}function hM(i){try{return JSON.stringify(i).length}catch{return String(i).length}}async function fM(i){let l=i.context.messages;if(l.length<2)return;let u=BP(l,i.preserveRecentTokens,i.estimateMessageTokens);if(u<=0||u>=l.length)return;let c=l.slice(0,u),g=Pk(c),b=g>=0?Rk(c[g])?.summary:void 0,I=g>=0?c.slice(g+1):c;if(I.length===0)return;let k=Gg(c),T=VP({activeProviderConfig:i.providerConfig,summarizer:i.summarizer}),E=NP(T),A=i.summarizer===void 0,C=Math.max(i.context.budget.request.maxInputTokens,i.context.budget.request.triggerTokens,Lc);if(E===void 0&&!A)i.logger?.log("Agentic compaction summarizer has no known input limit; using conservative summary budget",{severity:"warn",summarizerProviderId:T.providerId,summarizerModelId:T.modelId,fallbackInputLimit:Lc});let N=E??(A?C:Lc),O=jt(Yg({previousSummary:b,conversationText:"",fileOps:k}).length),L=N-O;if(L<=0){i.logger?.debug("Skipped agentic compaction: summarizer budget exhausted",{summarizerProviderId:T.providerId,summarizerModelId:T.modelId,summarizerInputLimit:N,summaryRequestOverheadTokens:O});return}let D=mM({messages:I,targetTokens:L,estimateMessageTokens:i.estimateMessageTokens});if(D.status==="failed"){i.logger?.log("Skipped agentic compaction: summary input budget failed",{severity:"warn",budgetWarnings:D.warnings.map((G)=>G.code),summaryInputEstimatedTokens:D.estimatedTokens,targetTokens:L,summarizerProviderId:T.providerId,summarizerModelId:T.modelId});return}let U=Gg(D.messages),F=DP(D.messages),j=Yg({previousSummary:b,conversationText:F,fileOps:U});i.logger?.debug("Agentic compaction summarizer diagnostics",{messagesToSummarize:c.length,newMessagesToFold:I.length,preservedMessages:l.length-u,previousSummaryChars:b?.length??0,conversationTextChars:F.length,summaryRequestChars:j.length,summaryRequestEstimatedTokens:jt(j.length),newMessagesJsonChars:hM(I),summaryInputEstimatedTokens:D.estimatedTokens,summaryInputActions:D.actions.length,summaryInputWarnings:D.warnings.map((G)=>G.code),summaryRequestOverheadTokens:O,summarizerProviderId:T.providerId,summarizerModelId:T.modelId,summarizerInputLimit:N,maxInputTokens:i.context.budget.request.maxInputTokens,triggerTokens:i.context.budget.request.triggerTokens});let H=await pM({providerConfig:T,systemPrompt:"Summarize the provided coding session into a concise continuation note with detailed next steps.",request:j});i.logger?.debug("Generated compaction summary",{outputChars:H.text.length,reasoningChars:H.reasoningChars,incompleteReason:H.incompleteReason,modelId:T.modelId,providerId:T.providerId});let Q=H.text.trim();if(!Q){i.logger?.log("Skipped agentic compaction: summarizer returned no summary text",{severity:"warn",summarizerProviderId:T.providerId,summarizerModelId:T.modelId,summarizerMaxOutputTokens:T.maxOutputTokens,reasoningChars:H.reasoningChars,incompleteReason:H.incompleteReason,likelyCause:H.reasoningChars>0?"output_budget_consumed_by_reasoning":"empty_response"});return}let z=XP(Q,U),W=l.reduce((G,se)=>G+i.estimateMessageTokens(se),0),ee=[YP({summary:z,fileOps:U,tokensBefore:W,userRunSpan:fm(c)}),...l.slice(u)],te=ee.reduce((G,se)=>G+i.estimateMessageTokens(se),0);i.logger?.debug("Performed agentic compaction",{messagesBefore:l.length,messagesAfter:ee.length,messagesSummarized:u,messagesPreserved:l.length-u,tokensBefore:W,tokensAfter:te,maxInputTokens:i.context.budget.request.maxInputTokens});let oe=D.actions.filter((G)=>G.reason==="over_budget"||G.reason==="tool_pair_boundary").length;return{messages:ee,budget:{policyIntent:"agentic_summary",actionCount:oe,warningCount:D.warnings.length,liveTailHandling:D.liveTailHandling}}}function sy(i,l){return i.reduce((u,c)=>u+l(c),0)}function gM(i){if(typeof i.content==="string"){let u=i.content.trim();return u?{...i,content:u}:void 0}let l=i.content.filter((u)=>u.type!=="text"||u.text.trim());if(l.length===0)return;return{...i,content:l.map((u)=>u.type==="text"?{...u,text:u.text.trim()}:u)}}function yM(i,l){return JSON.stringify(i)!==JSON.stringify(l)}var vM=3;function iy(i){if(i.role!=="assistant")return;if(typeof i.content==="string")return i.content.trim()||void 0;return i.content.filter((l)=>l.type==="text").map((l)=>l.text.trim()).filter(Boolean).join(`
|
|
102
|
+
`)||void 0}function ny(i,l){let u=l.length>0?`
|
|
103
|
+
|
|
104
|
+
Your recent responses:
|
|
105
|
+
${l.join(`
|
|
106
|
+
---
|
|
107
|
+
`)}`:"";return{type:"text",text:`<SYSTEM_NOTICE>
|
|
108
|
+
Earlier context was compacted. Summary of your actions after the request above:
|
|
109
|
+
${KP(i)}${u}</SYSTEM_NOTICE>`}}function Fd(i,l){if(typeof i.content==="string")return i.content.trim()?[{type:"text",text:i.content}]:[];if(l)return[...i.content];return i.content.filter((u)=>u.type!=="file"&&u.type!=="image")}function wM(i,l){let u=new Map;l.forEach((E,A)=>{if(E.id)u.set(E.id,A)});let c=(E)=>E.id?u.get(E.id):void 0,g=new Set;for(let E=l.length-1;E>=0&&g.size<vM;E-=1)if(iy(l[E]))g.add(E);let b=(E,A)=>{let C=[];for(let N=E;N<A;N+=1){if(!g.has(N))continue;let O=iy(l[N]);if(O)C.push(O)}return C},I=-1;for(let E=i.length-1;E>=0;E-=1)if(qs(i[E])){I=E;break}let k=[],T=0;while(T<i.length){if(!qs(i[T])){let C=c(i[T]);k.push({message:i[T],firstOriginalIndex:C,lastOriginalIndex:C,isTypedUser:!1}),T+=1;continue}let E=T;while(E+1<i.length&&qs(i[E+1]))E+=1;let A=i[T];if(E>T){let C=[],N=0;for(let O=T;O<=E;O+=1){if(N+=nd(i[O]),O>T){let L=c(i[O-1]),D=c(i[O]);if(L!==void 0&&D!==void 0&&D>L+1){let U=Vg(l.slice(L+1,D)),F=b(L+1,D);if(Jg(U)||F.length>0)C.push(ny(U,F))}}C.push(...Fd(i[O],O===I))}A={...i[T],content:C,metadata:{...i[T].metadata,userRunSpan:N}}}else{let C=Fd(A,T===I);if(Array.isArray(A.content)&&C.length!==A.content.length)A={...A,content:C}}k.push({message:A,firstOriginalIndex:c(i[T]),lastOriginalIndex:c(i[E]),isTypedUser:!0}),T=E+1}for(let E=0;E<k.length;E+=1){let A=k[E];if(!A.isTypedUser||A.lastOriginalIndex===void 0)continue;let C=k[E+1],N=C?C.firstOriginalIndex:l.length;if(N===void 0||N<=A.lastOriginalIndex+1)continue;let O=Vg(l.slice(A.lastOriginalIndex+1,N)),L=b(A.lastOriginalIndex+1,N);if(!Jg(O)&&L.length===0)continue;A.message={...A.message,content:[...Fd(A.message,!0),ny(O,L)]}}return k.map((E)=>E.message)}function oy(i){if(!i.metrics)return i;let{metrics:l,...u}=i;return u}function bM(i){let l=!1,u={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,cost:0};for(let c of i){let g=c.metrics;if(!g)continue;l=!0,u.inputTokens+=g.inputTokens??0,u.outputTokens+=g.outputTokens??0,u.cacheReadTokens+=g.cacheReadTokens??0,u.cacheWriteTokens+=g.cacheWriteTokens??0,u.cost+=g.cost??0}return l?u:void 0}function IM(i,l){if(!i)return l;if(!l)return i;return{inputTokens:i.inputTokens+l.inputTokens,outputTokens:i.outputTokens+l.outputTokens,cacheReadTokens:i.cacheReadTokens+l.cacheReadTokens,cacheWriteTokens:i.cacheWriteTokens+l.cacheWriteTokens,cost:i.cost+l.cost}}function kM(i){let l=i?.metadata;if(!l||l.kind!=="compaction")return{messagesRemoved:0,usageBefore:void 0};let u=l.usageBefore;return{messagesRemoved:typeof l.messagesRemoved==="number"?l.messagesRemoved:0,usageBefore:u&&typeof u==="object"?{inputTokens:u.inputTokens??0,outputTokens:u.outputTokens??0,cacheReadTokens:u.cacheReadTokens??0,cacheWriteTokens:u.cacheWriteTokens??0,cost:u.cost??0}:void 0}}var Nk="preserved";function Ok(i){return i.metadata?.compaction===Nk}function SM(i){if(Ok(i))return i;return{...i,metadata:{...i.metadata,compaction:Nk}}}function TM(i){if(typeof i.content==="string")return i.content.trim()?i:void 0;let l=i.content.filter((u)=>u.type!=="thinking"&&u.type!=="redacted_thinking");if(!l.some((u)=>u.type==="text"&&u.text.trim()))return;return{...i,content:l}}function _M(i){let l=i.context.messages,u=i.estimateMessageTokens;if(l.length<2)return;let c=Math.max(1,Math.min(i.context.budget.messages.targetTokens,i.context.budget.messages.triggerTokens)),g=[];for(let W=0;W<l.length;W+=1)if(qs(l[W]))g.push(W);let b=new Map;for(let W of g){let ee=gM(l[W]);if(ee)b.set(W,ee)}if(b.size===0)return;let I=g[g.length-1],k=0;for(let[W,ee]of b)k+=u({...ee,content:Fd(ee,W===I)});let T=new Set;for(let W=0;W<l.length;W+=1){if(b.has(W))continue;if(Ok(l[W]))T.add(W),k+=u(l[W])}let E=new Set;{let W=l.length,ee=0;for(let te=l.length-1;te>I;te-=1){if(T.has(te))break;let oe=u(l[te]);if(k+ee+oe>c)break;ee+=oe,W=te}while(W<l.length&&l[W].role!=="assistant")W+=1;for(let te=W;te<l.length;te+=1)E.add(te),k+=u(l[te])}let A=new Map;for(let W=g.length-2;W>=0;W-=1){let ee=g[W]+1,te=g[W+1];for(let oe=te-1;oe>=ee;oe-=1){let G=l[oe];if(T.has(oe))break;if(G.role!=="assistant")continue;if(Array.isArray(G.content)&&G.content.some((Pe)=>Pe.type==="tool_use"))continue;let se=TM(G);if(se){let Pe=u(se);if(k+Pe<=c)A.set(oe,se),k+=Pe}break}}let C=[];for(let W=0;W<l.length;W+=1){let ee=b.get(W);if(ee){C.push(ee);continue}if(T.has(W)||E.has(W)){C.push(l[W]);continue}let te=A.get(W);if(te)C.push(te)}let N=sy(l,i.estimateMessageTokens),O=Math.min(Math.max(c,k),Math.max(1,i.context.budget.messages.triggerTokens)),L=Mk({messages:C,targetTokens:O,policyIntent:"basic_compaction_projection",estimateMessageTokens:i.estimateMessageTokens});if(L.status==="failed")i.logger?.debug("Basic compaction returned best-effort projection",{budgetWarnings:L.warnings.map((W)=>W.code),projectedTokens:L.estimatedTokens,targetTokens:c,maxInputTokens:i.context.budget.request.maxInputTokens});let D=wM(L.messages,l);if(!yM(l,D))return;let U=kM(D[0]),F=IM(U.usageBefore,bM(l)),j={kind:"compaction",reason:i.context.mode==="manual"?"manual_compaction":i.context.mode==="overflow_recovery"?"overflow_recovery_compaction":"auto_compaction",displayRole:"system",messagesRemoved:U.messagesRemoved+(l.length-D.length),...F?{usageBefore:F}:{}},H=D.map((W,ee)=>{if(ee===0&&qs(W))return oy({...W,metadata:{...W.metadata,...j,userRunSpan:nd(W)}});return oy(qs(W)?W:SM(W))}),Q=sy(H,i.estimateMessageTokens),z=L.actions.filter((W)=>W.reason==="over_budget"||W.reason==="tool_pair_boundary").length;return i.logger?.debug("Performed basic compaction",{messagesBefore:l.length,messagesAfter:H.length,messagesRemoved:l.length-H.length,tokensBefore:N,tokensAfter:Q,budgetStatus:L.status,budgetActions:z,budgetWarnings:L.warnings.map((W)=>W.code),targetTokens:c,maxInputTokens:i.context.budget.request.maxInputTokens}),{messages:H,budget:{policyIntent:"basic_compaction_projection",actionCount:z,warningCount:L.warnings.length,liveTailHandling:L.liveTailHandling}}}var EM=0.5;function ay(i,l){if(l.aborted)return!0;return i instanceof Error&&(i.name==="AbortError"||i.name==="AgentRuntimeAbortError")}function ym(i){return i instanceof Error?{errorName:i.name,errorMessage:i.message}:{errorMessage:String(i)}}function $k(i){try{return JSON.stringify(i).length}catch{return String(i).length}}function AM(i){let l=0,u=0,c=0;for(let g of i){if(!Array.isArray(g.content))continue;for(let b of g.content){if(b.type!=="tool_result")continue;let I=$k(b.content);l+=1,u+=I,c=Math.max(c,I)}}return{toolResultCount:l,toolResultSerializedChars:u,maxToolResultSerializedChars:c}}var Dc={basic:({context:i,estimateMessageTokens:l,logger:u})=>_M({context:i,estimateMessageTokens:l,logger:u}),agentic:({context:i,providerConfig:l,compaction:u,estimateMessageTokens:c,logger:g})=>fM({context:i,providerConfig:l,summarizer:u?.summarizer,preserveRecentTokens:Math.min(u?.preserveRecentTokens??MP,i.budget.messages.targetTokens),estimateMessageTokens:c,logger:g})};function xM(i){let l=typeof i.manualTargetRatio==="number"&&Number.isFinite(i.manualTargetRatio)?i.manualTargetRatio:0.5,u=Math.min(0.95,Math.max(0.05,l));return Math.max(1,Math.floor(Math.min(i.messageTriggerTokens,i.messageInputTokens*u)))}function CM(i){let l=i.messagePairCount>=5&&typeof i.modelMaxTokens==="number"&&Number.isFinite(i.modelMaxTokens)&&i.modelMaxTokens<i.maxInputTokens?Math.floor(i.maxInputTokens*EM):Math.floor(i.triggerTokens*PP),u=Math.max(1,i.triggerTokens-1);return Math.max(1,Math.min(l,i.maxInputTokens,u))}function ly(i,l){return Math.max(1,Math.floor(i-l))}function RM(i){let l=0,u=!1;for(let c of i)if(c.role==="user")u=!0;else if(c.role==="assistant"&&u)l+=1,u=!1;return l}function Lk(i,l={}){let u={...i.compaction,...l.compaction};if(u.enabled!==!0)return;let c=UP(),g=u?.strategy??"agentic",b=Dc[g],I=l.mode??"auto",k=u?.compact?"custom":g;return async(T)=>{let E=T.overflowRecovery?"overflow_recovery":I,A=T.apiMessages.reduce((ce,Se)=>ce+c(Se),0),C=pr({systemPrompt:T.systemPrompt,messages:T.apiMessages,tools:T.tools}),N=T.messages.reduce((ce,Se)=>ce+c(Se),0),O=Math.max(0,C-A),L=gm({maxInputTokens:T.model.info?.maxInputTokens,contextWindow:T.model.info?.contextWindow});if(E==="auto"&&L===void 0)return;let D=L??xP,U=typeof T.previousRequestInputTokens==="number"&&T.previousRequestInputTokens>0?T.previousRequestInputTokens:0,F=U>0&&C>0?Math.min(RP,Math.max(1,U/C)):1,j=D/F,H=j*xn,Q=ly(H,O),z=C>=H;if(i.logger?.debug("Context compaction diagnostics",{mode:E,strategy:g,iteration:T.iteration,providerId:i.providerId,modelId:i.modelId,requestInputTokens:C,apiMessageTokens:A,messageInputTokens:N,requestOverheadTokens:O,maxInputTokens:j,rawMaxInputTokens:D,actualPreviousInputTokens:U,underestimateFactor:F,requestTriggerTokens:H,messageTriggerTokens:Q,thresholdRatio:xn,shouldCompact:z,messageCount:T.messages.length,apiMessageCount:T.apiMessages.length,apiMessagesJsonChars:$k(T.apiMessages),...AM(T.apiMessages)}),E==="auto"&&!z)return;let W,ee;if(E==="auto")W=CM({maxInputTokens:j,modelMaxTokens:T.model.info?.maxTokens,triggerTokens:H,messagePairCount:RM(T.messages)}),ee=ly(W,O);else ee=xM({messageInputTokens:N,messageTriggerTokens:Q,manualTargetRatio:l.manualTargetRatio}),W=O+ee;let te={agentId:T.agentId,conversationId:T.conversationId,parentAgentId:T.parentAgentId,iteration:T.iteration,messages:T.messages,model:T.model,mode:E,abortSignal:T.abortSignal,budget:{request:{inputTokens:C,maxInputTokens:j,triggerTokens:H,targetTokens:W,overheadTokens:O,thresholdRatio:xn,utilizationRatio:j>0?C/j:0},messages:{inputTokens:N,triggerTokens:Q,targetTokens:ee}}},oe=E==="manual"?"manual_compaction":E==="overflow_recovery"?"overflow_recovery_compaction":"auto_compaction",G=E==="manual"?"":E==="overflow_recovery"?"overflow-recovery-":"auto-";T.emitStatusNotice?.(`${G}compacting`,{kind:oe,reason:oe,phase:"started",iteration:T.iteration,triggerTokens:H,targetTokens:W,maxInputTokens:j,messageTargetTokens:ee});let se=T.messages.length,Pe=Date.now(),Le={context:te,providerConfig:{...kk(i),abortSignal:T.abortSignal},compaction:u,estimateMessageTokens:c,logger:i.logger},Te=k,le;if(E==="overflow_recovery"){if(u?.compact){try{le=await u.compact(te)}catch(ce){if(ay(ce,T.abortSignal))throw ce;i.logger?.log("Custom compaction failed during overflow recovery; falling back to basic compaction",{severity:"warn",...ym(ce)}),le=void 0}if(le?.messages){let ce=le.messages.reduce((Se,_e)=>Se+c(_e),0);if(!(le.messages.length>0&&ce<N&&ce<=ee))i.logger?.log("Custom compaction did not produce an acceptable overflow-recovery transcript; falling back to basic compaction",{severity:"warn",customMessageCount:le.messages.length,customMessageTokens:ce,messageTargetTokens:ee}),le=void 0}}if(!le?.messages)Te="basic",le=await Dc.basic(Le)}else if(u?.compact)le=await u.compact(te);else try{le=await b(Le)}catch(ce){if(g!=="agentic"||ay(ce,T.abortSignal))throw ce;i.logger?.log("Agentic compaction failed; falling back to basic compaction",{severity:"warn",...ym(ce)}),Te="basic",le=await Dc.basic(Le)}let Ie=Date.now()-Pe,we=i.sessionId??T.conversationId,He={agentId:T.agentId,conversationId:T.conversationId,parentAgentId:T.parentAgentId??void 0};if(le?.messages){let ce=le.messages.reduce((_e,Ee)=>_e+c(Ee),0),Se=O+ce;if(i.logger?.log("Context compaction completed",{severity:"info",strategy:Te,maxInputTokens:j,messageInputTokens:N,apiInputTokens:A,requestInputTokens:C,requestOverheadTokens:O,afterMessageTokens:ce,afterRequestTokens:Se,tokensSaved:C-Se,utilizationBefore:`${(C/j*100).toFixed(1)}%`,utilizationAfter:`${(Se/j*100).toFixed(1)}%`,thresholdTrigger:`${(xn*100).toFixed(1)}%`,messagesBefore:se,messagesAfter:le.messages.length,messagesRemoved:se-le.messages.length}),T.emitStatusNotice?.(`${G}compacted`,{kind:oe,reason:oe,phase:"completed",iteration:T.iteration,tokensBefore:C,tokensAfter:Se,messagesBefore:se,messagesAfter:le.messages.length,maxInputTokens:j}),jA(i.telemetry,{ulid:we,strategy:Te,mode:E,messagesBefore:se,messagesAfter:le.messages.length,messagesRemoved:se-le.messages.length,tokensBefore:C,tokensAfter:Se,tokensSaved:C-Se,triggerTokens:H,maxInputTokens:j,thresholdRatio:xn,durationMs:Ie,provider:i.providerId,modelId:i.modelId,...He}),le.budget&&(le.budget.actionCount>0||le.budget.warningCount>0))HA(i.telemetry,{ulid:we,strategy:Te,mode:E,policyIntent:le.budget.policyIntent,actionCount:le.budget.actionCount,warningCount:le.budget.warningCount,liveTailHandling:le.budget.liveTailHandling,provider:i.providerId,modelId:i.modelId,...He}),T.emitStatusNotice?.("compaction-budget-adjusted",{kind:"compaction_budget_emergency",reason:"compaction_budget_emergency",iteration:T.iteration,policyIntent:le.budget.policyIntent,actionCount:le.budget.actionCount,warningCount:le.budget.warningCount})}else T.emitStatusNotice?.(`${G}compaction-skipped`,{kind:oe,reason:oe,phase:"skipped",iteration:T.iteration,maxInputTokens:j}),BA(i.telemetry,{ulid:we,strategy:Te,mode:E,reason:"no_result",tokensBefore:C,triggerTokens:H,maxInputTokens:j,thresholdRatio:xn,durationMs:Ie,provider:i.providerId,modelId:i.modelId,...He});return le}}function PM(i){let l=Lk(i.config,{mode:"manual",compaction:{enabled:!0,strategy:"agentic",preserveRecentTokens:0}}),u=l!==void 0;return async(c)=>{if(u&&l&&Pk(c.messages)<0)try{let g=await l({...c,emitStatusNotice:(b,I)=>c.emitStatusNotice?.(b,{...I,importedFrom:i.importedFrom})});if(u=!1,g?.messages)return g}catch(g){if(c.abortSignal.aborted)throw g;u=!1,i.config.logger?.log("Failed to summarize imported session on resume; continuing with the raw transcript",{severity:"warn",sessionId:i.config.sessionId,...ym(g)})}return i.next?.(c)}}function MM(i){return async(l)=>{let u=i.getState?.(),c=u?hm(u,l.messages):void 0;if(u&&c){let b=i.compact?await i.compact({...l,messages:c,apiMessages:await i.prepareApiMessages(c)}):void 0;if(b?.messages){let I=b.systemPrompt??u.system_prompt,k=zg({sourceMessages:l.messages,compactedMessages:b.messages,conversationId:l.conversationId,systemPrompt:I});return await i.saveState?.(k,l.messages),{...b,...I!==void 0?{systemPrompt:I}:{}}}return{messages:c,...b?.systemPrompt!==void 0?{systemPrompt:b.systemPrompt}:u.system_prompt!==void 0?{systemPrompt:u.system_prompt}:{}}}let g=i.compact?await i.compact(l):void 0;if(g?.messages){let b=zg({sourceMessages:l.messages,compactedMessages:g.messages,conversationId:l.conversationId,systemPrompt:g.systemPrompt});await i.saveState?.(b,l.messages)}return g}}var dy=64,OM=/[^a-zA-Z0-9_-]+/g,Dk=8,$M=1,LM="mcp_tool";function DM(i){return NM("sha1").update(i).digest("hex").slice(0,Dk)}function UM(i){return i.replace(OM,"_")}var Jh=({serverName:i,toolName:l})=>{let u=`${i}__${l}`,c=UM(u);if(c===u&&u.length<=dy)return u;let g=DM(u),b=dy-$M-Dk;return`${c.slice(0,b)||LM}_${g}`},FM=new Set(["rm","rmdir","unlink","mv","cp","dd","touch","mkdir","ln","link","chmod","chown","chgrp","truncate","shred","install","patch","rsync","mkfifo","mknod","del","erase","move","ren","rename","md","rd","mklink","copy","xcopy","robocopy","new-item","ni","remove-item","move-item","copy-item","rename-item","set-content","add-content","clear-content","out-file","mi","ri","cpi","rni","ac","clc"]),qM=new Set(["add","am","apply","checkout","cherry-pick","clean","clone","commit","init","merge","mv","pull","push","rebase","reset","restore","revert","rm","stash","submodule","switch","worktree"]),ud=new Set(["install","i","ci","add","remove","rm","uninstall","unlink","link","update","up","upgrade","dedupe","prune","publish"]),Il=new Set(["install","uninstall","add","remove"]),jM=new Set(["add","remove","rm","install","uninstall","update","new","init","publish"]),BM=new Set(["install","uninstall","update","cleanup"]),HM=new Set(["install","require","remove","update"]),zM=new Set(["install","get"]),WM=new Set(["add","remove"]),KM=new Set(["install","uninstall","upgrade"]),GM=new Set(["install","update","delete","push"]),fi=new Set(["install","reinstall","remove","purge","uninstall","upgrade","autoremove","add","del"]),XM={git:qM,npm:ud,pnpm:ud,yarn:ud,bun:ud,pip:Il,pip3:Il,pipx:Il,uv:Il,cargo:jM,apt:fi,"apt-get":fi,dnf:fi,yum:fi,apk:fi,brew:fi,snap:fi,gem:BM,composer:HM,go:zM,dotnet:WM,winget:KM,nuget:GM},JM={stash:new Set(["list","show"]),worktree:new Set(["list"]),submodule:new Set(["status","summary"])},VM=new Set(["sudo","doas","env","command","builtin","nohup","time","nice","stdbuf","timeout","xargs"]),YM=new Set(["if","then","else","elif","fi","while","until","do","done","for","case","esac","!","{","}"]),uy=/^[A-Za-z_][A-Za-z0-9_]*\+?=/;function Uk(i){let l=i.replace(/["']/g,"");if(/^(\/dev\/(null|stdout|stderr|tty)|nul:?)$/i.test(l))return!0;if(l.includes(".."))return!1;return l.startsWith("/tmp/")||l.startsWith("/var/tmp/")||l.startsWith("$TMPDIR")||l.startsWith("${TMPDIR")||/^%te?mp%/i.test(l)||/^\$env:te?mp/i.test(l)}function cy(i){return(i.replace(/["']/g,"").split(/[/\\]/).pop()??i).toLowerCase().replace(/\.exe$/,"")}function QM(i){let l=i.split(`
|
|
110
|
+
`),u=[],c;for(let g of l){if(c!==void 0){if(g.replace(/^\t+/,"")===c)c=void 0;continue}u.push(g);let b=g.match(/(?<![<])<<-?\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z0-9_./-]+))/);if(b)c=b[1]??b[2]??b[3]}return u.join(`
|
|
111
|
+
`).replace(/\$\(\([\s\S]*?\)\)/g,"_").replace(/\\./g,"_").replace(/"[^"]*"|'[^']*'/g,(g)=>g.replace(/[\s<>|;&$()`#\\]/g,"_")).replace(/(?:^|\s)#.*$/gm," ")}function vm(i){let l=0;while(l<i.length&&(uy.test(i[l])||YM.has(i[l])))l+=1;while(l<i.length&&VM.has(cy(i[l]))){l+=1;while(l<i.length&&(i[l].startsWith("-")||i[l]==="{}"||uy.test(i[l])||/^\d+[smhd]?$/.test(i[l])))l+=1}if(l>=i.length)return;let u=cy(i[l]),c=i.slice(l+1);if(u==="tee")return c.filter((I)=>!I.startsWith("-")).some((I)=>!Uk(I))?"`tee`":void 0;if(FM.has(u))return`\`${u}\``;let g=XM[u];if(g){if(u==="git"&&c.some((T)=>T==="--help"||T==="-h"))return;let I=0;while(I<c.length&&c[I].startsWith("-"))I+=u==="git"&&/^-[cC]$/.test(c[I])?2:1;let k=c[I]?.toLowerCase();if(k&&g.has(k)){let T=c[I+1]?.toLowerCase();if(u==="git"&&T!==void 0&&JM[k]?.has(T))return;return`\`${u} ${k}\``}if(u==="yarn"&&c.length===0)return"`yarn` (install)";return}if(/^python[\d.]*$/.test(u)){let I=c.indexOf("-m"),k=I===-1?void 0:c[I+1]?.toLowerCase();if(k==="pip"||k==="pip3"){let T=c.slice(I+2).find((E)=>!E.startsWith("-"))?.toLowerCase();if(T&&Il.has(T))return`\`pip ${T}\``}return}let b=/^-[A-Za-z]*i(\..*)?$/;if((u==="sed"||u==="gsed")&&c.some((I)=>b.test(I)||I.startsWith("--in-place")))return"`sed -i` (in-place edit)";if(u==="perl"&&c.some((I)=>b.test(I)))return"`perl -i` (in-place edit)";if(/^[gnm]?awk$/.test(u)){if(c.some((I,k)=>(I==="-i"||I==="--include")&&c[k+1]?.startsWith("inplace")||I.startsWith("-i")&&I.slice(2).startsWith("inplace")||I.startsWith("--include=inplace")))return"`awk -i inplace` (in-place edit)";return}if(u==="sort"&&c.some((I)=>I.startsWith("-o")||I.startsWith("--output")))return"`sort -o` (writes a file)";if(u==="curl")return c.some((I)=>!I.startsWith("--")&&/^-[A-Za-z]*[oO]/.test(I)||I.startsWith("--output")||I.startsWith("--remote-name"))?"`curl -o` (writes a file)":void 0;if(u==="wget")return c.some((I,k)=>I==="--spider"||/^-[A-Za-z]*O-$/.test(I)||I==="--output-document=-"||I==="-O"&&c[k+1]==="-")?void 0:"`wget` (downloads files)";if(u==="find"){if(c.includes("-delete"))return"`find -delete`";for(let I=0;I<c.length;I+=1){if(!["-exec","-execdir","-ok","-okdir"].includes(c[I]))continue;let k=[];for(let E=I+1;E<c.length&&c[E]!==";"&&c[E]!=="+";E+=1)k.push(c[E]);let T=vm(k);if(T)return T}return}return}function ZM(i){if(typeof i!=="string")return vm([i.command,...i.args??[]]);let l=QM(i),u=l.matchAll(/(?:^|[^<>])(?:>{1,2}|&>{1,2})\s*([^\s;&|<>()]+)/g);for(let c of u)if(!Uk(c[1]))return`output redirection (\`> ${c[1]}\`)`;for(let c of l.split(/[\n;|&()`]+/)){let g=vm(c.trim().split(/\s+/).filter(Boolean));if(g)return g}return}function eN(i){return`Command not executed: ${i} can modify files, and file modifications are blocked in plan mode. `+"You are in PLAN MODE — explore, analyze, and present a plan; do not make changes. "+"Use read-only commands to inspect the project (redirecting output to /tmp, or %TEMP% on Windows, is allowed), and if this change is part of the task, put it in your plan so it can run after the user approves switching to act mode."}var Ht={READ_FILES:"read_files",SEARCH_CODEBASE:"search_codebase",RUN_COMMANDS:"run_commands",FETCH_WEB_CONTENT:"fetch_web_content",APPLY_PATCH:"apply_patch",EDITOR:"editor",SKILLS:"skills",ASK:"ask_question",SUBMIT_AND_EXIT:"submit_and_exit"},tN=[Ht.READ_FILES,Ht.SEARCH_CODEBASE,Ht.RUN_COMMANDS,Ht.FETCH_WEB_CONTENT,Ht.APPLY_PATCH,Ht.EDITOR,Ht.SKILLS,Ht.ASK,Ht.SUBMIT_AND_EXIT],Zi=6000,en=e().describe("The absolute path of a text file to read content from"),du=t({start_line:gi.number().int().positive().nullable().optional().describe("Optional one-based starting line number to read from; use null or omit for the start of the file"),end_line:gi.number().int().positive().nullable().optional().describe("Optional one-based ending line number to read through; use null or omit to read to the end of the file or the read cap, whichever comes first")}).describe("Optional inclusive one-based file line range"),Fk=t({path:en,start_line:du.shape.start_line,end_line:du.shape.end_line}).describe("A file read request with optional inclusive one-based line bounds. Always include path; start_line/end_line must be on the same object as the path they apply to, never in a separate array element"),qk=t({files:o(Fk).describe("Array of file read requests; each element is one file and must include path. Omit start_line/end_line or set them to null to read from the start; provide integers on the same object as the path to return only that inclusive one-based line range — never emit a range as its own array element. Reads are capped, so page through long files with start_line/end_line. Prefer this tool over running terminal command to get file content for better performance and reliability.")}),py={start_line:du.shape.start_line,end_line:du.shape.end_line},Rn=p([Fk,t({file_path:en,...py}).transform(({file_path:i,...l})=>({path:i,...l})),t({filePath:en,...py}).transform(({filePath:i,...l})=>({path:i,...l}))]),rN=p([qk,Rn,o(Rn),o(e()),e(),t({files:o(p([en,Rn]))}),t({files:Rn}),t({files:en}),t({file_paths:o(en)}),t({file_paths:e()}),t({paths:o(p([en,Rn]))}),t({paths:Rn}),t({paths:e()})]),jk=t({queries:o(e()).describe("Array of regex search queries to execute")}),sN=p([jk,o(e()),e(),t({queries:e()})]),uu=e().describe(`The non-interactive shell command to execute - MUST keep input short and concise (within ${Zi*2} characters) to avoid timeouts.`),wm=t({command:e().min(1).describe("The executable to run directly without shell parsing."),args:o(e()).optional().describe("Optional argv list passed directly to the executable.")}),Bk=p([uu,wm]),Hk=t({commands:o(uu).min(1).describe("Array of complete shell command strings to execute.")}),iN=t({commands:o(Bk)}),nN=p([Hk,iN,t({commands:Bk}),o(wm),wm,t({command:uu}),t({cmd:uu}),o(e()),e()]),oN=t({url:e().describe("The URL to fetch"),prompt:e().min(2).describe("Analysis prompt for the fetched content")}),my=t({requests:o(oN).describe("Array of the URLs for the web fetch requests")}),hy=t({path:e().min(1).describe("The absolute path for the action to be performed on"),old_text:je((i)=>i===null?void 0:i,e().optional()).describe(`Exact text to replace (must match exactly once). Omit this when creating a missing file or inserting via insert_line. Keep this at or below ${Zi} characters when possible; larger payloads should be split across multiple tool calls to avoid timeouts.`),new_text:e().describe(`The new content to write when creating a missing file, the replacement text for edits, or the inserted text when insert_line is provided. Keep this at or below ${Zi} characters when possible; for large edits, use multiple calls with small chunks of old_text and new_text to iteratively edit the file.`),insert_line:gi.number().int().nullable().optional().describe("Optional positive one-based boundary line. When provided, the tool inserts new_text before that line instead of performing a replacement edit; use line_count + 1 to append at EOF.")}).describe("Edit a text file by replacing old_text with new_text, create the file with new_text if it does not exist, or insert new_text at insert_line when insert_line is provided. Prefer using this tool for file edits over shell commands. IMPORTANT: large edits can time out, so use small chunks and multiple calls when possible."),zk=t({input:e().min(1).describe("The freeform apply_patch payload in the canonical patch grammar (e.g *** Begin Patch, *** Update File:, @@, and *** End Patch).")}).describe("Modify or create a text file by applying patches using the canonical apply_patch diff grammar. Prefer sending the patch body directly rather than wrapping it in shell syntax. IMPORTANT: large patches can time out, so use small chunks and multiple calls when possible."),aN=p([zk,e()]),fy=t({skill:e().min(1).describe("Name of the skill to execute."),args:e().nullable().optional().describe("Arguments for the skill; use null when omitted")}),gy=t({question:e().min(1).describe('The single question to ask the user. E.g. "How can I help you?"'),options:o(e().min(1)).min(2).max(5).describe("Array of 2-5 user-selectable answer options for the single question")}),yy=t({summary:e().min(10).describe("Summarization of the investigation, steps taken, and resolution status to submit at the end of the session. Before submitting, re-read the task requirements together with any provided tests or assertions, and confirm from your own tool output — not from assumption — that your solution produces the expected results at the expected file locations."),verified:r().describe(`Have you verified that the issue is resolved to the best of your knowledge, including updating and creating all the requested files and items? 'True' if you have completed the investigation and gathered concrete evidence that every requirement is met.
|
|
112
|
+
'False' if you have done all you can but cannot resolve the issue or if you are stuck and cannot proceed further.
|
|
113
|
+
IMPORTANT: verify by EXECUTION, not by assumption. Before setting 'true' you must have observed evidence in this session that your solution works:
|
|
114
|
+
- If the task provides or references specific tests, run those exact test(s) and include the passing output in your reasoning. If they still fail, revise and re-run.
|
|
115
|
+
- If no tests are provided, construct your own check: actually run the program, script, or command you produced; confirm every required output file exists at the exact path requested; and confirm its contents match the required format, data types, and values. Read the output back as evidence.
|
|
116
|
+
Phrases like "assume it works", "should be correct", or "probably fine" are NOT verification. Do NOT set 'true' unless your tool output shows the requirements are met; if you cannot obtain such evidence, set 'false'.`)});function Yo(i){if(i instanceof Error)return i.message;return String(i)}function lN(i){if(typeof i.old_text==="string"&&i.old_text.length>Zi)return`Editor input too large: old_text was ${i.old_text.length} characters, exceeding the recommended limit of ${Zi}. Split the edit into smaller tool calls so later tool calls are less likely to be truncated or time out.`;if(i.new_text.length>Zi)return`Editor input too large: new_text was ${i.new_text.length} characters, exceeding the recommended limit of ${Zi}. Split the edit into smaller tool calls so later tool calls are less likely to be truncated or time out.`;return null}class ec extends Error{timeoutMs;constructor(i,l){super(i);this.name="TimeoutError",this.timeoutMs=l}}function ai(i,l,u){return Promise.race([i,new Promise((c,g)=>{setTimeout(()=>g(new ec(u,l)),l)})])}function Uc(i){let{path:l,start_line:u,end_line:c}=i;if(u==null&&c==null)return l;return`${l}:${u??1}-${c??"EOF"}`}function dN(i){let{start_line:l,end_line:u}=i;if(l==null||u==null||l<=u)return null;return`start_line must be less than or equal to end_line (received start_line: ${l}, end_line: ${u})`}var uN=new Set(["start_line","end_line"]);function cN(i){if(i===null||typeof i!=="object"||Array.isArray(i))return!1;let l=Object.keys(i);return l.length>0&&l.every((u)=>uN.has(u))}function vy(i){let l=[];for(let u of i){if(cN(u)){let c=l[l.length-1];if(typeof c==="string"){l[l.length-1]={path:c,...u};continue}if(c!==null&&typeof c==="object"&&!Array.isArray(c)&&"path"in c&&Object.keys(u).every((g)=>!(g in c))){l[l.length-1]={...c,...u};continue}}l.push(u)}return l}function pN(i){if(Array.isArray(i))return vy(i);if(i!==null&&typeof i==="object")for(let l of["files","paths"]){let u=i[l];if(Array.isArray(u))return{...i,[l]:vy(u)}}return i}function Wk(i){let l=mN(y(nN,i));if(l.length===0)throw Error("run_commands requires at least one command; the commands list was empty.");return l}function mN(i){if(typeof i==="string")return[i];if(Array.isArray(i))return i;if("commands"in i)return Array.isArray(i.commands)?i.commands:[i.commands];if("command"in i)return"args"in i?[i]:[i.command];if("cmd"in i)return[i.cmd];return[i]}function hN(i){if(typeof i==="string")return i;let l=i.args??[];if(l.length===0)return i.command;let u=l.map((c)=>/[\s"]/u.test(c)?JSON.stringify(c):c);return`${i.command} ${u.join(" ")}`}var Fc=200;function fN(i){let l=hN(i);if(l.length<=Fc)return l;let u=l.length-Fc;return`${l.slice(0,Fc)} ... [command truncated: ${u} more chars; full command is in the tool call input]`}var gN="core.plan-mode-command-guard";function yN(i={}){return{name:gN,manifest:{capabilities:["hooks"]},hooks:{beforeTool:(l)=>{if(l.tool.name!==Ht.RUN_COMMANDS)return;let u;try{u=Wk(l.input)}catch{return}for(let c of u){let g=ZM(c);if(g)return OA(i.telemetry,{tool_name:"run_commands",blocked_construct:g,command_count:u.length,agent_id:l.snapshot.agentId,conversation_id:l.snapshot.conversationId,run_id:l.snapshot.runId,iteration:l.snapshot.iteration,tool_call_id:l.toolCall.toolCallId}),{skip:!0,reason:eN(g)}}return}}}}var EN=2000,AN=4096;function xN(i){if(process.platform==="win32")return{file:"powershell.exe",args:["-NoLogo","-NoProfile","-NonInteractive","-Command",`(Get-Process -Id ${i} -ErrorAction Stop).StartTime.ToUniversalTime().Ticks`]};return{file:"ps",args:["-p",String(i),"-o","lstart="],env:{...process.env,LC_ALL:"C",TZ:"UTC"}}}function Xk(i){if(!Number.isSafeInteger(i)||i<=0)return"missing";try{return process.kill(i,0),"running"}catch(l){let u=l instanceof Error&&"code"in l?String(l.code):void 0;if(u==="ESRCH")return"missing";if(u==="EPERM")return"running";return"unavailable"}}function qc(i){return Xk(i)==="missing"?{status:"missing"}:{status:"unavailable"}}function CN(i){let l=i.trim();return l?{status:"found",token:`${process.platform}:${l}`}:void 0}function RN(i){let l=i.lastIndexOf(")");if(l<0)return{status:"unavailable"};let u=i.slice(l+1).trim().split(/\s+/);if(["Z","X","x"].includes(u[0]??""))return{status:"missing"};let c=u[19];return c&&/^\d+$/.test(c)?{status:"running",startTime:c}:{status:"unavailable"}}async function Vh(i){if(!Number.isSafeInteger(i)||i<=0)return{status:"missing"};if(process.platform==="linux"){let u;try{u=await ky(`/proc/${i}/stat`,"utf8")}catch{return qc(i)}let c=RN(u);if(c.status!=="running")return c;try{let g=(await ky("/proc/sys/kernel/random/boot_id","utf8")).trim();return g?{status:"found",token:`linux:${g}:${c.startTime}`}:{status:"unavailable"}}catch{return{status:"unavailable"}}}let l=Xk(i);if(l!=="running")return{status:l};try{let u=xN(i);return await new Promise((c)=>{_N(u.file,u.args,{encoding:"utf8",env:u.env,maxBuffer:AN,timeout:EN,windowsHide:!0},(g,b)=>{let I=!g&&typeof b==="string"?CN(b):void 0;c(I??qc(i))})})}catch{return qc(i)}}var Hl=48000;function Sy(i,l={}){let u=l.maxChars??48000,c=l.totalChars??i.length;if(i.length<=u&&c<=u)return i;let g=Math.ceil(u/2),b=Math.max(1,u-g);return`${i.slice(0,g)}
|
|
117
|
+
[... output truncated: ${c} chars total. Refine the command (grep, head, tail) to view the elided middle ...]
|
|
118
|
+
`+i.slice(-b)}var jd=2000,bm=2000,Jk=48000,Bd=48000,Ty=10485760,PN=86400000,MN=60000,Vk="cline-command-",Yk="output.log",Qk="active-command.json",Zk="completed-at",NN=48,ON=1000;function eS(i){return typeof i==="number"&&Number.isFinite(i)?Math.max(0,i):PN}function $N(i){return typeof i==="number"&&Number.isFinite(i)?Math.max(1,i):MN}function LN(i){try{let l=JSON.parse(i);if(l.version!==1||typeof l.executionId!=="string"||l.executionId.length===0||!Number.isSafeInteger(l.pid)||(l.pid??0)<=0||typeof l.processStartToken!=="string"||l.processStartToken.length===0||typeof l.detachedAtMs!=="number"||!Number.isFinite(l.detachedAtMs)||l.detachedAtMs<0)return;return l}catch{return}}function Im(i,l){let u=`${i}.${Kk()}.tmp`;try{IN(u,l,"utf8");try{by(u,i)}catch(c){if(c instanceof Error&&"code"in c&&["EEXIST","EPERM"].includes(String(c.code)))cu(i,{force:!0}),by(u,i);else throw c}}finally{cu(u,{force:!0})}}function DN(i,l){let u=i?.trim();if(!u)return;let c=Number(u);if(!Number.isFinite(c)||c<0)return;return Math.min(c,l)}async function _y(i){try{return await SN(i,"utf8")}catch(l){if(l instanceof Error&&"code"in l&&l.code==="ENOENT")return;throw l}}async function tS(i,l){let u=ri(i,Qk),c=ri(i,Zk),g=await _y(c),b=DN(g,l.nowMs),I=await _y(u);if(b!==void 0){if(I!==void 0)await qd(u,{force:!0})}else if(I!==void 0){let T=LN(I);if(T){let E;try{E=await l.probeProcessStartToken(T.pid)}catch{E={status:"unavailable"}}if(E.status==="found"&&E.token===T.processStartToken)return Ey(i,l),!1;if(E.status==="unavailable")return Ey(i,l),!1}Im(c,String(l.nowMs)),await qd(u,{force:!0}),b=l.nowMs}if(b===void 0)try{b=(await Iy(ri(i,Yk))).mtimeMs}catch{b=(await Iy(i)).mtimeMs}let k=l.nowMs-l.retentionMs;if(b>k)return sS(i,Math.max(0,b+l.retentionMs-l.nowMs)),!1;return await qd(i,{recursive:!0,force:!0}),!0}function Ey(i,l,u=l.activeCommandPollIntervalMs){setTimeout(()=>{tS(i,{...l,nowMs:Date.now()}).catch(()=>{return})},u).unref()}async function UN(i={}){let l=i.tempDirectory??Gk(),u=eS(i.retentionMs),c=i.nowMs??Date.now(),g=i.processStartTokenProbe??Vh,b=$N(i.activeCommandPollIntervalMs),I;try{I=await kN(l,{withFileTypes:!0})}catch{return 0}let k=0;for(let T of I){if(!T.isDirectory()||!T.name.startsWith(Vk))continue;let E=ri(l,T.name);try{if(await tS(E,{retentionMs:u,nowMs:c,probeProcessStartToken:g,activeCommandPollIntervalMs:b}))k+=1}catch{}}return k}class Yh extends Error{exitCode;output;constructor(i,l){super(`Command exited with code ${i}`);this.exitCode=i,this.output=l,this.name="CommandExitError"}}function Hd(i,l){if(i!==null)return`Command exited with code ${i}`;return l?`Command terminated by signal ${l}`:"Command terminated without an exit code"}class Qh extends Error{signal;output;constructor(i,l){super(Hd(null,i));this.signal=i,this.output=l,this.name="CommandTerminationError"}}class rS extends Error{code;missing;constructor(i,l={}){super(`Failed to execute command: ${i.message}`);this.name="CommandSpawnError";let u=i.code;if(this.code=typeof u==="string"?u:void 0,this.code!=="ENOENT")this.missing=void 0;else if(l.cwd!==void 0&&!wN(l.cwd))this.missing="cwd";else this.missing="executable"}}function Ay(i){let l=Math.ceil(i/2),u=Math.max(1,i-l),c=new TN("utf8"),g="",b="",I=0,k=(T)=>{if(!T)return;I+=T.length;let E=l-g.length;if(E>0){g+=T.slice(0,E),b=(b+T.slice(E)).slice(-u);return}b=(b+T).slice(-u)};return{append(T){let E=c.write(T);return k(E),E},current(){return{text:g+b,totalChars:I,dropped:I>g.length+b.length}},snapshot(){let T=c.end();return k(T),{text:g+b,totalChars:I,dropped:I>g.length+b.length,finalChunk:T}}}}function FN(i,l,u,c){let g=i.emitUpdate,b=typeof c==="number"&&Number.isFinite(c)?Math.max(1,Math.floor(Math.min(Hl,c))):Hl,I={},k=[],T,E=!1,A=()=>{if(!T)return;clearTimeout(T),T=void 0},C=()=>{if(A(),!g){I={},k=[];return}let O=I,L=k;I={},k=[];for(let D of L){let U=O[D];if(!U?.chunk)continue;let F=U.droppedChars>0?`\x1B[0m[${U.droppedChars} command-output characters skipped while streaming]
|
|
119
|
+
`:"",j=F.length<b?F+U.chunk.slice(-(b-F.length)):U.chunk.slice(-b);g({stream:D,chunk:j,executionId:l,detachable:u(),...U.droppedChars>0?{truncated:!0,droppedChars:U.droppedChars}:{}})}},N=()=>{if(!g||T||E)return;T=setTimeout(C,NN),T.unref()};return{append(O,L){if(!g||E||!L)return;let D=I[O];if(!D)D={chunk:"",droppedChars:0},I[O]=D,k.push(O);if(L.length>=b)D.droppedChars+=D.chunk.length+L.length-b,D.chunk=L.slice(-b);else{let U=D.chunk.length+L.length-b;if(U>0)D.droppedChars+=U,D.chunk=D.chunk.slice(U);D.chunk+=L}N()},flush:C,stop(O={}){if(E)return;if(O.flush)C();else A(),I={},k=[];E=!0}}}function sS(i,l){setTimeout(()=>{qd(i,{recursive:!0,force:!0}).catch(()=>{return})},l).unref()}function qN(i,l){let u=bN(ri(Gk(),Vk)),c=ri(u,Yk),g=ri(u,Qk),b=ri(u,Zk);try{Im(g,`${JSON.stringify(l)}
|
|
120
|
+
`)}catch(L){throw cu(u,{recursive:!0,force:!0}),L}let I=vN(c,{encoding:"utf8"}),k=0,T=!1,E=!0,A=!1,C=!1,N=!1,O=()=>{if(N)return;N=!0,sS(u,i)};return I.on("error",()=>{E=!1}),I.once("close",()=>{if(E=!1,A=!0,C)O()}),{path:c,write(L){if(!L||T||!E)return;let D=Ty-k;if(D<=0){T=!0,E=!1,I.end();return}let U=Buffer.from(L,"utf8"),F=U.length<=D?U:U.subarray(0,D);if(I.write(F),k+=F.length,F.length<U.length||k>=Ty)T=!0,E=!1,I.end()},complete:()=>{if(C)return;C=!0;try{Im(b,String(Date.now()))}catch{}try{cu(g,{force:!0})}catch{}if(A){O();return}E=!1,I.end()}}}function jN(i,l,u,c,g,b,I,k=Vh){if(l.signal?.aborted)return Promise.reject(Error("Command was aborted"));return new Promise((T,E)=>{let A=process.platform==="win32",C=wy(i.executable,i.args,{cwd:i.cwd,env:{...process.env,...i.env},stdio:["pipe","pipe","pipe"],detached:!A,windowsHide:!0}),N=C.pid,O=Ay(c),L=Ay(c),D=Kk(),U=Boolean(I&&l.sessionId),F=!1,j,H=!1,Q=!1,z=!1,W,ee=!1,te,oe=()=>{},G=FN(l,D,()=>F,c),se=(ce)=>{if(Q)return;Q=!0,ce()},Pe=async()=>{if(!N)return;if(A){await new Promise((ce)=>{let Se=!1,_e,Ee=()=>{if(Se)return;Se=!0,clearTimeout(Fe),ce()};try{_e=wy("taskkill.exe",["/PID",String(N),"/T","/F"],{stdio:"ignore",shell:!1,windowsHide:!0})}catch{C.kill(),ce();return}let Fe=setTimeout(()=>{_e.kill(),C.kill(),Ee()},5000);_e.once("error",()=>{C.kill(),Ee()}),_e.once("close",(Ke)=>{if(Ke!==0)C.kill();Ee()})});return}try{process.kill(-N,"SIGKILL")}catch{C.kill("SIGKILL")}},Le,Te=()=>Ie(Error("Command was aborted")),le=()=>{if(clearTimeout(Le),W)clearTimeout(W);l.signal?.removeEventListener("abort",Te),oe()},Ie=(ce)=>{if(H||Q)return;H=!0,G.stop({flush:!0}),le(),Pe().finally(()=>se(()=>E(ce)))};if(Le=setTimeout(()=>Ie(new ec(`Command timed out after ${u}ms`,u)),u),l.signal){if(l.signal.addEventListener("abort",Te,{once:!0}),l.signal.aborted)Te()}let we=()=>{if(!F||H||Q||!N||C.exitCode!==null||C.signalCode!==null)return!1;if(!j)return!1;let ce=qN(b,{version:1,executionId:D,pid:N,processStartToken:j,detachedAtMs:Date.now()});G.stop({flush:!0}),ee=!0,te=ce;let Se=O.current(),_e=L.current();if(te.write(Se.text),_e.text)te.write(`
|
|
121
|
+
[stderr]
|
|
122
|
+
${_e.text}`);le(),C.unref(),C.stdout?.unref?.(),C.stderr?.unref?.();let Ee=[`[Command is still running. Output will continue in ${te.path}]`,g?Se.text+(_e.text?`
|
|
123
|
+
[stderr]
|
|
124
|
+
${_e.text}`:""):Se.text].filter(Boolean).join(`
|
|
125
|
+
`);return se(()=>T(Ee)),!0};C.once("spawn",()=>{if(H)return;l.emitUpdate?.({stream:"stdout",chunk:"",executionId:D,detachable:!1});let ce=l.sessionId;if(!U||!N||!ce||!I)return;(async()=>{let Se=await k(N);if(Se.status!=="found"||H||Q||C.exitCode!==null||C.signalCode!==null)return;j=Se.token,F=!0,oe=I.register({executionId:D,sessionId:ce,toolCallId:l.toolCallId,detach:we}),l.emitUpdate?.({stream:"stdout",chunk:"",executionId:D,detachable:!0})})().catch(()=>{return})}),C.stdout?.on("data",(ce)=>{let Se=O.append(ce);if(!Se)return;if(ee){te?.write(Se);return}G.append("stdout",Se)}),C.stderr?.on("data",(ce)=>{let Se=L.append(ce);if(!Se)return;if(ee){te?.write(Se);return}G.append("stderr",Se)});let He=(ce,Se,_e)=>{let Ee=O.snapshot(),Fe=L.snapshot();if(Ee.finalChunk)G.append("stdout",Ee.finalChunk);if(Fe.finalChunk)G.append("stderr",Fe.finalChunk);if(G.stop({flush:!0}),le(),ce!==0){let Ke=g?Ee.text+(Fe.text?`
|
|
126
|
+
[stderr]
|
|
127
|
+
${Fe.text}`:""):Ee.text,Et=Ee.dropped||g&&Fe.dropped,yt=g?Ee.totalChars+Fe.totalChars:Ee.totalChars;if(Et||Ke.length>c)Ke=Sy(Ke,{maxChars:c,totalChars:yt});let $r=`[${Hd(ce,Se)}]`,vt=Ke.length>0?`${$r}
|
|
128
|
+
${Ke}`:$r,At=_e?`${vt}
|
|
129
|
+
${_e}`:vt;se(()=>E(ce===null?new Qh(Se,At):new Yh(ce,At)))}else{let Ke=g?Ee.text+(Fe.text?`
|
|
130
|
+
[stderr]
|
|
131
|
+
${Fe.text}`:""):Ee.text;if(Ee.dropped||g&&Fe.dropped||Ke.length>c){let Et=g?Ee.totalChars+Fe.totalChars:Ee.totalChars;Ke=Sy(Ke,{maxChars:c,totalChars:Et})}se(()=>T(_e?`${Ke}
|
|
132
|
+
${_e}`:Ke))}};C.on("close",(ce,Se)=>{if(H||z)return;let _e=O.snapshot(),Ee=L.snapshot();if(ee){if(W)clearTimeout(W);te?.write(_e.finalChunk),te?.write(Ee.finalChunk),te?.write(`
|
|
133
|
+
[${Hd(ce,Se)}]
|
|
134
|
+
`),te?.complete();return}He(ce,Se??null,"")}),C.on("exit",(ce,Se)=>{if(H)return;W=setTimeout(()=>{if(H||z)return;if(ee){let _e=O.snapshot(),Ee=L.snapshot();te?.write(_e.finalChunk),te?.write(Ee.finalChunk),te?.write(`
|
|
135
|
+
[${Hd(ce,Se)}]
|
|
136
|
+
`),te?.complete();return}if(Q)return;z=!0,C.stdout?.unref?.(),C.stderr?.unref?.(),C.unref(),He(ce,Se??null,"[Command completed with background processes still running; their output is no longer captured]")},ON)}),C.on("error",(ce)=>{if(H)return;if(ee){te?.write(`
|
|
137
|
+
[Command failed: ${ce.message}]
|
|
138
|
+
`),te?.complete();return}G.stop({flush:!0}),le(),se(()=>E(new rS(ce,{cwd:i.cwd})))}),C.stdin?.on("error",(ce)=>{if(H||Q)return;Ie(Error(`Failed to write command input: ${ce.message}`))}),C.stdin?.end(i.input,"utf8")})}function BN(i={}){let{shell:l=_t(process.platform),timeoutMs:u=30000,env:c={},combineOutput:g=!0,executionController:b,processStartTokenProbe:I=Vh}=i,k=eS(i.detachedLogRetentionMs),T=i.maxOutputChars??i.maxOutputBytes??Hl;return(E,A,C)=>{let N=typeof E!=="string"&&"args"in E?{executable:E.command,args:E.args??[]}:dr(l,typeof E==="string"?E:E.command);return jN({executable:N.executable,args:N.args,cwd:A,env:c,input:N.input},C,u,T,g,k,b,I)}}function xy(i,l){let u=i.metadata?.[l];return typeof u==="string"?u:void 0}function HN(i,l,u){NA(i,{tool_name:"run_commands",effective_timeout_ms:u.effectiveTimeoutMs,timeout_source:u.timeoutSource,command_count:u.commandCount,duration_ms:u.durationMs,ulid:l.sessionId,mode:xy(l,"mode"),source:xy(l,"source"),session_id:l.sessionId,agent_id:l.agentId,conversation_id:l.conversationId,run_id:l.runId,iteration:l.iteration,tool_call_id:l.toolCallId})}function zN(i){let l=i.match(/(?<![<])<<-?\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z0-9_./-]+))/);return l?.[1]??l?.[2]??l?.[3]}function WN(i){let l=[];for(let u=0;u<i.length;u+=1){let c=i[u],g=zN(c);if(!g){l.push(c);continue}let b=i.findIndex((k,T)=>T>u&&k.trim()===g);if(b===-1){l.push(c);continue}let I=[c];while(u<b){u+=1;let k=i[u];I.push(k)}l.push(I.join(`
|
|
139
|
+
`))}return l}function KN(i){let l=[],u=[],c=()=>{if(u.length>0)l.push(...WN(u)),u=[]};for(let g of i){if(typeof g==="string"){u.push(g);continue}c(),l.push(g)}return c(),l}async function GN(i,l){let{executor:u,cwd:c,context:g,timeoutMs:b,timeoutSource:I,telemetry:k}=l;return Promise.all(i.map(async(T,E)=>{let A=Date.now(),C=fN(T),N=g.emitUpdate?{...g,emitUpdate:(O)=>{let L=O&&typeof O==="object"&&!Array.isArray(O)?O:{update:O};g.emitUpdate?.({...L,commandIndex:E,query:C})}}:g;try{let O=await ai(u(T,c,N),b,`Command timed out after ${b}ms`);return{query:C,result:O,success:!0}}catch(O){if(O instanceof ec)HN(k,g,{effectiveTimeoutMs:O.timeoutMs,timeoutSource:I,commandCount:i.length,durationMs:Date.now()-A});if(O instanceof Yh||O instanceof Qh)return{query:C,result:O.output,error:O.message,success:!1};let L=Yo(O);return{query:C,result:"",error:`Command failed: ${L}`,success:!1}}}))}function XN(i,l={}){let u=l.fileReadTimeoutMs??1e4;return _({name:"read_files",description:`Read the content of text or image files at the provided absolute paths, or return only an inclusive one-based line range when start_line/end_line are provided on the same file entry as its path. When you already know multiple files you need, read them together in one call, and call this tool in the same response as other independent tool calls. Each read returns at most ${jd} lines / ~${Math.round(Jk/1024)}k characters; longer files report their total line count, page through them with start_line/end_line on that file's entry. Binary files that are not image and large files are not supported. Returns file contents or error messages for each path. `,inputSchema:S(qk),timeoutMs:u*2,retryable:!0,maxRetries:1,execute:async(c,g)=>{let b=y(rN,pN(c)),I;if(typeof b==="string")I=[{path:b}];else if(Array.isArray(b))I=b.map((k)=>typeof k==="string"?{path:k}:k);else if("files"in b)I=(Array.isArray(b.files)?b.files:[b.files]).map((k)=>typeof k==="string"?{path:k}:k);else if("file_paths"in b)I=(Array.isArray(b.file_paths)?b.file_paths:[b.file_paths]).map((k)=>({path:k}));else if("paths"in b)I=(Array.isArray(b.paths)?b.paths:[b.paths]).map((k)=>typeof k==="string"?{path:k}:k);else I=[b];return Promise.all(I.map(async(k)=>{let T=dN(k);if(T)return{query:Uc(k),result:"",error:`Invalid file range: ${T}`,success:!1};try{let E=await ai(i(k,g),u,`File read timed out after ${u}ms`);return{query:Uc(k),result:E,success:!0}}catch(E){let A=Yo(E);return{query:Uc(k),result:"",error:`Error reading file: ${A}`,success:!1}}}))}})}function JN(i,l={}){let u=l.searchTimeoutMs??30000,c=l.cwd??process.cwd();return _({name:"search_codebase",description:`Perform regex pattern searches across the codebase. Supports multiple parallel searches. When several search patterns could be useful and do not depend on each other, run them together in one call, and call this tool in the same response as other independent tool calls. Use for finding code patterns, function definitions, class names, imports, etc. Output beyond ~${Math.round(Bd/1000)}k characters per query is middle-truncated; narrow patterns beat broad ones.`,inputSchema:S(jk),timeoutMs:u*2,retryable:!0,maxRetries:1,execute:async(g,b)=>{let I=y(sN,g),k=Array.isArray(I)?I:typeof I==="object"?Array.isArray(I.queries)?I.queries:[I.queries]:[I];return Promise.all(k.map(async(T)=>{try{let E=await ai(i(T,c,b),u,`Search timed out after ${u}ms`);return{query:T,result:E,success:!0}}catch(E){let A=Yo(E);return{query:T,result:"",error:`Search failed: ${A}`,success:!1}}}))}})}var Cy="Use for listing files, checking git status, running builds, executing tests, etc. Commands must be non-interactive. Commands that require follow-up input like pagers should be skipped or used with supported flags/env (e.g. git --no-pager, --non-interactive) to bypass the interaction steps. ",VN="PowerShell escapes with a backtick (`), not a backslash: inside double quotes, \\\" ends the string. Put literal paths in single quotes. Use cmdlets such as Remove-Item -LiteralPath instead of cmd /c; cmd re-parses the quotes, and a mis-quoted path can become extra targets such as the drive root. Before a recursive or forced delete, confirm the exact target, for example with -WhatIf. ";function YN(i,l){let u=So(i);if(u==="powershell"||u==="cmd"){let g=Ki(i),b=g==="windows"?"powershell.exe":g==="core"?l?"pwsh.exe":"pwsh":"cmd.exe",I=g==="windows"?`Windows PowerShell (${b})`:g==="core"?`PowerShell (${b})`:b,k=`${b} ${u==="powershell"?"-Command":"/c"}`,T=u==="powershell"?"';'":"'&&'";return`Run non-interactive shell commands from the root of the workspace${l?" in Windows environment":""}. `+Cy+`Output beyond ~${Math.round(Hl/1000)}k characters is middle-truncated (start and end preserved); filter output when you need specific sections. Commands run through ${I}; quote paths and arguments for ${b} and use ${T} to sequence commands. Write commands directly; do not wrap them in another ${k} invocation. `+(u==="powershell"?VN:"")+"Only start another shell when you intentionally need a different shell or a separate process. Include multiple commands in the same call when they are independent and safe to run concurrently. When independent reads, searches, or edits are also needed, call those tools in the same response."}let c=u==="wsl"?"Commands run through bash in WSL (wsl.exe); the Windows working directory is mounted under /mnt/<drive>. ":l?"Commands run through a POSIX (bash-compatible) shell on Windows. ":"";return"Run non-interactive shell commands from the root of the workspace. "+Cy+c+`Commands should be properly shell-escaped and targeted to avoid error or timeout. Include multiple commands in the same call when they are independent complete shell commands and safe to run concurrently; multiline scripts and heredocs must be a single command string. When independent reads, searches, or edits are also needed, call those tools in the same response. Output beyond ~${Math.round(Hl/1000)}k characters is middle-truncated (start and end preserved); pipe through grep/head/tail when you need specific sections of large output. For long-running commands, run them in background and redirect output to a tmp file that you can read from later.`}function QN(i,l={}){let u=l.bashTimeoutMs??30000,c=l.bashTimeoutMs===void 0?"default_setting":"configured_setting",g=l.cwd??process.cwd(),b=process.platform==="win32",I=l.shell,k=typeof I==="function"?I:()=>I??_t(process.platform),T=()=>YN(k(),b),E=_({name:"run_commands",description:T(),inputSchema:S(Hk),timeoutMs:u*2,retryable:!1,maxRetries:0,execute:async(A,C)=>{let N=KN(Wk(A));return GN(N,{executor:i,cwd:g,context:C,timeoutMs:u,timeoutSource:c,telemetry:l.telemetry})}});if(typeof I==="function")Object.defineProperty(E,"description",{get:T,enumerable:!0});return E}function ZN(i,l={}){let u=l.webFetchTimeoutMs??30000;return _({name:"fetch_web_content",description:"Fetch content from URLs and analyze them using the provided prompts. Use for retrieving documentation, API references, or any web content. Each request includes a URL and a prompt describing what information to extract. Fetch independent URLs together in one call, and call this tool in the same response as other independent tool calls.",inputSchema:S(my),timeoutMs:u*2,retryable:!0,maxRetries:2,execute:async(c,g)=>{let b=y(my,c);return Promise.all(b.requests.map(async(I)=>{try{let k=await ai(i(I.url,I.prompt,g),u,`Web fetch timed out after ${u}ms`);return{query:I.url,result:k,success:!0}}catch(k){let T=Yo(k);return{query:I.url,result:"",error:`Error fetching web content: ${T}`,success:!1}}}))}})}var eO=`Use \`apply_patch\` to edit files with the canonical freeform patch grammar. Pass the patch text directly as the \`input\` string. Prefer the exact format below:
|
|
140
|
+
|
|
141
|
+
*** Begin Patch
|
|
142
|
+
*** Update File: path/to/file.ts
|
|
143
|
+
@@ optional section marker
|
|
144
|
+
[context before]
|
|
145
|
+
-[old line]
|
|
146
|
+
+[new line]
|
|
147
|
+
[context after]
|
|
148
|
+
*** End Patch
|
|
149
|
+
|
|
150
|
+
Supported actions:
|
|
151
|
+
- \`*** Add File: <path>\`
|
|
152
|
+
- \`*** Update File: <path>\`
|
|
153
|
+
- \`*** Delete File: <path>\`
|
|
154
|
+
- optional \`*** Move to: <new path>\` immediately after an Update File header
|
|
155
|
+
|
|
156
|
+
Rules:
|
|
157
|
+
- In an Add File section, every file-content line must start with \`+\`.
|
|
158
|
+
- In an Update section, use context lines plus \`-\` and \`+\` lines to describe the change.
|
|
159
|
+
- Use \`@@\` markers when extra context is needed to disambiguate repeated code blocks.
|
|
160
|
+
- Do not use line numbers; this format is context-based.
|
|
161
|
+
- Prefer sending the patch body directly. Legacy shell wrappers such as \`%%bash\` and \`apply_patch <<"EOF"\` are accepted for compatibility but are not preferred.
|
|
162
|
+
|
|
163
|
+
Example:
|
|
164
|
+
|
|
165
|
+
*** Begin Patch
|
|
166
|
+
*** Update File: src/page.tsx
|
|
167
|
+
@@
|
|
168
|
+
return (
|
|
169
|
+
<div>
|
|
170
|
+
<button onClick={() => console.log("clicked")}>Click me</button>
|
|
171
|
+
+ <button onClick={() => console.log("cancel clicked")}>Cancel</button>
|
|
172
|
+
</div>
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
*** End Patch`;function tO(i,l={}){let u=l.applyPatchTimeoutMs??30000,c=l.cwd??process.cwd();return _({name:"apply_patch",description:eO,inputSchema:S(zk),timeoutMs:u,retryable:!1,maxRetries:0,execute:async(g,b)=>{let I=y(aN,g),k=typeof I==="string"?I:I.input;try{return{query:"apply_patch",result:await ai(i({input:k},c,b),u,`apply_patch timed out after ${u}ms`),success:!0}}catch(T){return{query:"apply_patch",result:"",error:`apply_patch failed: ${Yo(T)}`,success:!1}}}})}function rO(i,l={}){let u=l.editorTimeoutMs??30000,c=l.cwd??process.cwd();return _({name:"editor",description:"An editor for controlled filesystem edits on the text file at the provided path. Provide `insert_line` to insert `new_text` at a specific line number. Otherwise, the tool replaces `old_text` with `new_text`, or creates the file with `new_text` if file does not exist. Use this tool for making small, precise edits to existing files or creating new files over shell commands. If several edits to different files or non-overlapping regions are already known, emit multiple editor tool calls in the same response instead of serializing them across turns.",inputSchema:S(hy),timeoutMs:u,retryable:!1,maxRetries:0,execute:async(g,b)=>{let I=y(hy,g),k=I.insert_line==null?"edit":"insert",T=lN(I);if(T)return{query:`${k}:${I.path}`,result:"",error:T,success:!1};try{let E=await ai(i(I,c,b),u,`Editor operation timed out after ${u}ms`);return{query:`${k}:${I.path}`,result:E,success:!0}}catch(E){let A=Yo(E);return{query:`${k}:${I.path}`,result:"",error:`Editor operation failed: ${A}`,success:!1}}}})}function tc(i,l={}){let u=l.skillsTimeoutMs??15000,c='Execute a skill within the main conversation. When users ask you to perform tasks, check if any available skills match. When users reference a slash command, invoke it with this tool. Input: `skill` (required) and optional `args`. Example: `skill: "pdf"`, `skill: "commit", args: "-m \\"Fix bug\\""`, `skill: "review-pr", args: "123"`, `skill: "ms-office-suite:pdf"`. When a skill matches the user\'s request, invoking this tool is a blocking requirement before any other response. Never mention a skill without invoking this tool.',g=_({name:"skills",description:c,inputSchema:S(fy),timeoutMs:u,retryable:!1,maxRetries:0,execute:async(b,I)=>{let k=y(fy,b);return ai(i(k.skill,k.args||void 0,I),u,`Skills operation timed out after ${u}ms`)}});return Object.defineProperty(g,"description",{get(){let b=i.configuredSkills?.filter((I)=>!I.disabled).map((I)=>I.id.includes(":")?I.id:I.name);if(b&&b.length>0)return`${c} Available skills: ${b.join(", ")}.`;return c},enumerable:!0,configurable:!0}),g}function sO(i){if(!(typeof i==="string"?i.trim():i.some((l)=>l.type==="image"||l.text.trim())))throw Error("The user did not answer. Do not assume an answer: make a reasonable choice and say so, or stop and report what you need.");return i}function iO(i){return{name:"ask_question",successContext:"The user has answered the question. Continue working on their task using that answer.",description:"Ask user a question for clarifying or gathering information needed to complete the task. For example, ask the user clarifying questions about a key implementation decision. You should only ask one question. Provide an array of 2-5 options for the user to choose from. Never include an option to toggle to Act mode. The run continues after the user answers: keep working on the task using their answer.",inputSchema:S(gy),retryable:!1,maxRetries:0,execute:async(l,u)=>{let c=y(gy,l),g=await i(c.question,c.options,u);return sO(g)}}}function nO(i,l={}){let u=l.submitTimeoutMs??15000;return _({name:"submit_and_exit",description:"Submit the final answer and exit the conversation. For example, submit a summary of the investigation and confirm the issue is resolved. You should only submit once all necessary steps are completed AND you have verified the result by execution. Before calling this, re-read the task, then confirm from your own tool output that every required file exists at the specified path and that its contents match the expected format, data types, and values. If the task provides tests, run them and confirm they pass; if it does not, run your own solution end to end and read the output back as evidence. "+"Do not submit on the assumption that your solution works — submit because you have observed evidence that it does. "+"Provide a summary of the investigation and confirm the issue is resolved.",inputSchema:S(yy),lifecycle:{completesRun:!0},timeoutMs:u,retryable:!1,maxRetries:0,execute:async(c,g)=>{let b=y(yy,c);return ai(i(b.summary,b.verified,g),u,`submit_and_exit timed out after ${u}ms`)}})}function oO(i){let{executors:l,enableReadFiles:u=!0,enableSearch:c=!0,enableBash:g=!0,enableWebFetch:b=!0,enableApplyPatch:I=!1,enableEditor:k=!0,enableSkills:T=!0,enableAskQuestion:E=!0,enableSubmitAndExit:A=!1,...C}=i,N=[];if(u&&l.readFile)N.push(XN(l.readFile,C));if(c&&l.search)N.push(JN(l.search,C));if(g&&l.bash)N.push(QN(l.bash,C));if(b&&l.webFetch)N.push(ZN(l.webFetch,C));if(k&&l.editor)N.push(rO(l.editor,C));else if(I&&l.applyPatch)N.push(tO(l.applyPatch,C));if(T&&l.skills)N.push(tc(l.skills,C));let O=A?l.submit:void 0;if(E&&l.askQuestion&&!O)N.push(iO(l.askQuestion));if(O)N.push(nO(O,C));return N}var Ne={BEGIN:"*** Begin Patch",END:"*** End Patch",ADD:"*** Add File: ",UPDATE:"*** Update File: ",DELETE:"*** Delete File: ",MOVE:"*** Move to: ",SECTION:"@@",END_FILE:"*** End of File"},aO=["%%bash","apply_patch","EOF","```"];class gt extends Error{constructor(i){super(i);this.name="DiffError"}}function Hr(i){let l={"‐":"-","‑":"-","‒":"-","–":"-","—":"-","−":"-","“":'"',"”":'"',"„":'"',"«":'"',"»":'"',"‘":"'","’":"'","‛":"'"," ":" "," ":" "};return i.normalize("NFC").replace(/./gu,(u)=>l[u]??u).replace(/\\`/g,"`").replace(/\\'/g,"'").replace(/\\"/g,'"')}class iS{lines;currentFiles;patch={actions:{},warnings:[]};index=0;fuzz=0;currentPath;constructor(i,l){this.lines=i,this.currentFiles=l}parse(){this.skipBeginSentinel();while(this.hasMoreLines()&&!this.isEndMarker())this.parseNextAction();if(this.patch.warnings?.length===0)delete this.patch.warnings;return{patch:this.patch,fuzz:this.fuzz}}addWarning(i){if(!this.patch.warnings)this.patch.warnings=[];this.patch.warnings.push(i)}skipBeginSentinel(){if(this.lines[this.index]?.startsWith(Ne.BEGIN))this.index++}hasMoreLines(){return this.index<this.lines.length}isEndMarker(){return this.lines[this.index]?.startsWith(Ne.END)??!1}parseNextAction(){let i=this.lines[this.index];if(i?.startsWith(Ne.UPDATE)){this.parseUpdate(i.substring(Ne.UPDATE.length).trim());return}if(i?.startsWith(Ne.DELETE)){this.parseDelete(i.substring(Ne.DELETE.length).trim());return}if(i?.startsWith(Ne.ADD)){this.parseAdd(i.substring(Ne.ADD.length).trim());return}throw new gt(`Unknown line while parsing: ${i}`)}checkDuplicate(i,l){if(i in this.patch.actions)throw new gt(`Duplicate ${l} for file: ${i}`)}parseUpdate(i){this.checkDuplicate(i,"update"),this.currentPath=i,this.index++;let l=this.lines[this.index]?.startsWith(Ne.MOVE)?(this.lines[this.index++]??"").substring(Ne.MOVE.length).trim():void 0;if(!(i in this.currentFiles))throw new gt(`Update File Error: Missing File: ${i}`);let u=this.currentFiles[i]??"",c=this.parseUpdateFile(u,i);c.movePath=l,this.patch.actions[i]=c,this.currentPath=void 0}parseUpdateFile(i,l){let u={type:"update",chunks:[]},c=i.split(`
|
|
176
|
+
`),g=0,b=[Ne.END,Ne.UPDATE,Ne.DELETE,Ne.ADD,Ne.END_FILE];while(!b.some((I)=>this.lines[this.index]?.startsWith(I.trim()))){let I=this.lines[this.index],k=I?.startsWith("@@ ")?I.substring(3):void 0;if(k!==void 0||(I==="@@"?I:void 0)!==void 0)this.index++;else if(g!==0)throw new gt(`Invalid Line:
|
|
177
|
+
${this.lines[this.index]}`);if(k?.trim()){let D=Hr(k.trim());for(let U=g;U<c.length;U++){let F=c[U];if(F&&(Hr(F)===D||Hr(F.trim())===D)){if(g=U+1,Hr(F.trim())===D&&Hr(F)!==D)this.fuzz++;break}}}let[T,E,A,C]=uO(this.lines,this.index),[N,O,L]=dO(c,T,g,C);if(N===-1){let D=T.join(`
|
|
178
|
+
`);this.addWarning({path:this.currentPath||l,chunkIndex:u.chunks.length,message:`Could not find matching context (similarity: ${L.toFixed(2)}). Chunk skipped.`,context:D.length>200?`${D.substring(0,200)}...`:D}),this.index=A}else{this.fuzz+=O;for(let D of E)D.origIndex+=N,u.chunks.push(D);g=N+T.length,this.index=A}}return u}parseDelete(i){if(this.checkDuplicate(i,"delete"),!(i in this.currentFiles))throw new gt(`Delete File Error: Missing File: ${i}`);this.patch.actions[i]={type:"delete",chunks:[]},this.index++}parseAdd(i){if(this.checkDuplicate(i,"add"),i in this.currentFiles)throw new gt(`Add File Error: File already exists: ${i}`);this.index++;let l=[],u=[Ne.END,Ne.UPDATE,Ne.DELETE,Ne.ADD];while(this.hasMoreLines()&&!u.some((c)=>this.lines[this.index]?.startsWith(c.trim()))){let c=this.lines[this.index++];if(c===void 0)break;if(!c.startsWith("+"))throw new gt(`Invalid Add File line (missing '+'): ${c}`);l.push(c.substring(1))}this.patch.actions[i]={type:"add",newFile:l.join(`
|
|
179
|
+
`),chunks:[]}}}function Ry(i,l){let u=i.length>l.length?i:l,c=i.length>l.length?l:i;if(u.length===0)return 1;let g=lO(c,u);return(u.length-g)/u.length}function lO(i,l){let u=l.length+1,c=i.length+1,g=Array(u*c).fill(0),b=(k,T)=>g[k*c+T]??0,I=(k,T,E)=>{g[k*c+T]=E};for(let k=0;k<=l.length;k++)I(k,0,k);for(let k=0;k<=i.length;k++)I(0,k,k);for(let k=1;k<=l.length;k++)for(let T=1;T<=i.length;T++)if(l[k-1]===i[T-1])I(k,T,b(k-1,T-1));else I(k,T,1+Math.min(b(k-1,T-1),b(k,T-1),b(k-1,T)));return b(l.length,i.length)}function dO(i,l,u,c){if(l.length===0)return[u,0,1];let g=0,b=(I)=>{let k=Hr(l.join(`
|
|
180
|
+
`));for(let E=I;E<i.length;E++){let A=Hr(i.slice(E,E+l.length).join(`
|
|
181
|
+
`));if(A===k)return[E,0,1];let C=Ry(A,k);if(C>g)g=C}for(let E=I;E<i.length;E++){let A=Hr(i.slice(E,E+l.length).map((N)=>N.trimEnd()).join(`
|
|
182
|
+
`)),C=Hr(l.map((N)=>N.trimEnd()).join(`
|
|
183
|
+
`));if(A===C)return[E,1,1]}for(let E=I;E<i.length;E++){let A=Hr(i.slice(E,E+l.length).map((N)=>N.trim()).join(`
|
|
184
|
+
`)),C=Hr(l.map((N)=>N.trim()).join(`
|
|
185
|
+
`));if(A===C)return[E,100,1]}let T=0.66;for(let E=I;E<i.length;E++){let A=Hr(i.slice(E,E+l.length).join(`
|
|
186
|
+
`)),C=Ry(A,k);if(C>=T)return[E,1000,C];if(C>g)g=C}return[-1,0,g]};if(c){let[I,k,T]=b(i.length-l.length);if(I!==-1)return[I,k,T];return[I,k,T]=b(u),[I,k+1e4,T]}return b(u)}function uO(i,l){let u=l,c=[],g=[],b=[],I=[],k="keep",T=["@@",Ne.END,Ne.UPDATE,Ne.DELETE,Ne.ADD,Ne.END_FILE];while(u<i.length){let E=i[u];if(!E||T.some((N)=>E.startsWith(N.trim())))break;if(E==="***")break;if(E.startsWith("***"))throw new gt(`Invalid line: ${E}`);u++;let A=k,C=E;if(C[0]==="+")k="add";else if(C[0]==="-")k="delete";else if(C[0]===" ")k="keep";else k="keep",C=` ${C}`;if(C=C.slice(1),k==="keep"&&A!==k){if(b.length||g.length)I.push({origIndex:c.length-g.length,delLines:g,insLines:b});g=[],b=[]}if(k==="delete")g.push(C),c.push(C);else if(k==="add")b.push(C);else c.push(C)}if(b.length||g.length)I.push({origIndex:c.length-g.length,delLines:g,insLines:b});if(u<i.length&&i[u]===Ne.END_FILE)return u++,[c,I,u,!0];return[c,I,u,!1]}function oS(i){if(nS.EOL===`\r
|
|
187
|
+
`&&!i.includes("\r"))return i.replaceAll(`
|
|
188
|
+
`,`\r
|
|
189
|
+
`);return i}function Zh(i){return i.includes(`\r
|
|
190
|
+
`)?`\r
|
|
191
|
+
`:`
|
|
192
|
+
`}function km(i,l){return i.split(/\r\n|\n/).join(l)}function pu(i,l,u){let c=Kr.isAbsolute(l),g=c?Kr.normalize(l):Kr.resolve(i,l);if(!u||c)return g;let b=Kr.relative(i,g);if(b.startsWith("..")||Kr.isAbsolute(b))throw new gt(`Path must stay within cwd: ${l}`);return g}function cO(i){return i.split(`
|
|
193
|
+
`).map((l)=>l.replace(/\r$/,""))}function Py(i){if(i.trim()==="")return!1;return aO.some((l)=>i.startsWith(l))}function pO(i){let l=0,u=i.length;while(l<u&&Py(i[l]??""))l++;while(u>l&&Py(i[u-1]??""))u--;return i.slice(l,u)}function mO(i){let l=cO(i),u=l.findIndex((b)=>b.startsWith(Ne.BEGIN)),c=-1;for(let b=l.length-1;b>=0;b--)if(l[b]?.startsWith(Ne.END)){c=b;break}if(u!==-1||c!==-1){if(u===-1||c===-1||c<u)throw new gt("Invalid patch text - incomplete sentinels. Try breaking it into smaller patches.");return{lines:l.slice(u,c+1)}}let g=pO(l);while(g.length>0&&g[0]==="")g.shift();while(g.length>0&&g[g.length-1]==="")g.pop();return{lines:[Ne.BEGIN,...g,Ne.END]}}function My(i,l){let u=new Set;for(let c of i)for(let g of l)if(c.startsWith(g)){u.add(c.substring(g.length).trim());break}return[...u]}function hO(i,l,u){if(l.length===0)return i;let c=i.split(`
|
|
194
|
+
`),g=[],b=0;for(let I of l){if(I.origIndex>c.length)throw new gt(`${u}: chunk.origIndex ${I.origIndex} > lines.length ${c.length}`);if(b>I.origIndex)throw new gt(`${u}: currentIndex ${b} > chunk.origIndex ${I.origIndex}`);g.push(...c.slice(b,I.origIndex)),g.push(...I.insLines),b=I.origIndex+I.delLines.length}return g.push(...c.slice(b)),g.join(`
|
|
195
|
+
`)}async function fO(i,l,u,c){let g=My(i,[Ne.UPDATE,Ne.DELETE]),b={},I={};for(let k of g){let T=pu(l,k,c),E;try{E=await Mr.readFile(T,u)}catch{throw new gt(`File not found: ${k}`)}b[k]=E.replace(/\r\n/g,`
|
|
196
|
+
`),I[k]=Zh(E)}for(let k of My(i,[Ne.ADD])){let T=pu(l,k,c);try{b[k]=await Mr.readFile(T,u)}catch{}}return{files:b,eols:I}}function gO(i,l){let u={},c=l.files,g=(b,I)=>I===void 0?void 0:km(I,l.eols[b]??`
|
|
197
|
+
`);for(let[b,I]of Object.entries(i.actions))switch(I.type){case"delete":u[b]={type:"delete",oldContent:g(b,c[b])};break;case"add":if(I.newFile===void 0)throw new gt("ADD action without file content");u[b]={type:"add",newContent:oS(I.newFile)};break;case"update":u[b]={type:"update",oldContent:g(b,c[b]),newContent:g(b,hO(c[b]??"",I.chunks,b)),movePath:I.movePath};break}return u}function yO(i){let l=[`Patch could not be applied because ${i.length} hunk${i.length===1?"":"s"} did not match the current file content.`];for(let u of i){let c=u.chunkIndex===void 0?"unknown":String(u.chunkIndex+1);if(l.push(`${u.path}: hunk ${c}: ${u.message}`),u.context)l.push(`Context:
|
|
198
|
+
${u.context}`)}return l.join(`
|
|
199
|
+
`)}async function vO(i,l,u,c){let g=[];for(let[b,I]of Object.entries(i)){let k=pu(l,b,c);switch(I.type){case"delete":await Mr.rm(k,{force:!0}),g.push(`${b}: [deleted]`);break;case"add":if(I.newContent===void 0)throw new gt(`Cannot create ${b} with no content`);await Mr.mkdir(Kr.dirname(k),{recursive:!0}),await Mr.writeFile(k,I.newContent,{encoding:u}),g.push(b);break;case"update":{if(I.newContent===void 0)throw new gt(`UPDATE change for ${b} has no new content`);if(I.movePath){let T=pu(l,I.movePath,c);await Mr.mkdir(Kr.dirname(T),{recursive:!0}),await Mr.writeFile(T,I.newContent,{encoding:u}),await Mr.rm(k,{force:!0}),g.push(`${b} -> ${I.movePath}`)}else await Mr.writeFile(k,I.newContent,{encoding:u}),g.push(b);break}}}return g}async function wO(i,l,u={}){let{encoding:c="utf-8",restrictToCwd:g=!0}=u,b=mO(i),I=await fO(b.lines,l,c,g),k=new iS(b.lines,I.files),{patch:T,fuzz:E}=k.parse();if(T.warnings&&T.warnings.length>0)throw new gt(yO(T.warnings));return{changes:gO(T,I),fuzz:E}}function bO(i={}){let{encoding:l="utf-8",restrictToCwd:u=!0}=i;return async(c,g,b)=>{let{changes:I,fuzz:k}=await wO(c.input,g,{encoding:l,restrictToCwd:u}),T=await vO(I,g,l,u),E=["Successfully applied patch to the following files:"];for(let A of T)E.push(A);if(k>0)E.push(`Note: Patch applied with fuzz factor ${k}`);return E.join(`
|
|
200
|
+
`)}}function IO(i,l,u){let c=ts.isAbsolute(l),g=c?ts.normalize(l):ts.resolve(i,l);if(!u)return g;if(c)return g;let b=ts.relative(i,g);if(b.startsWith("..")||ts.isAbsolute(b))throw Error(`Path must stay within cwd: ${l}`);return g}function kO(i,l){if(l.length===0)return 0;return i.split(l).length-1}function SO(i,l,u){let c=i.split(/\r\n|\n/),g=l.split(/\r\n|\n/),b=0;while(b<c.length&&b<g.length&&c[b]===g[b])b++;let I=c.length,k=g.length;while(I>b&&k>b&&c[I-1]===g[k-1])I--,k--;let T=I-b,E=k-b,A=T,C=E;if(T+E>u)A=Math.min(T,Math.max(Math.ceil(u/2),u-E)),C=Math.min(E,u-A);let N=["```diff"];for(let D=b;D<b+A;D++)N.push(`-${D+1}: ${c[D]}`);for(let D=b;D<b+C;D++)N.push(`+${D+1}: ${g[D]}`);let O=T-A,L=E-C;if(O>0||L>0)N.push(`... diff truncated (${O} more removed, ${L} more added lines) ...`);return N.push("```"),N.join(`
|
|
201
|
+
`)}async function TO(i,l,u){return await ls.mkdir(ts.dirname(i),{recursive:!0}),await ls.writeFile(i,oS(l),{encoding:u}),`File created successfully at: ${i}`}async function _O(i){try{return await ls.access(i),!0}catch{return!1}}async function EO(i,l,u,c,g){let b=await ls.readFile(i,c),I=Zh(b),k=km(l,I),T=km(u??"",I),E=kO(b,k);if(E===0)throw Error(`No replacement performed: text not found in ${i}.`);if(E>1)throw Error(`No replacement performed: multiple occurrences of text found in ${i}.`);let A=b.replace(k,()=>T);await ls.writeFile(i,A,{encoding:c});let C=SO(b,A,g);return`Edited ${i}
|
|
202
|
+
${C}`}async function AO(i,l,u,c){let g=await ls.readFile(i,c),b=Zh(g),I=g.split(/\r\n|\n/),k=I.length+1;if(l<1||l>k)throw Error(`Invalid insert_line: ${l}. insert_line must be a positive one-based boundary line in the range 1-${k}. Use ${k} to append at EOF.`);let T=l-1;return I.splice(T,0,...u.split(/\r\n|\n/)),await ls.writeFile(i,I.join(b),{encoding:c}),`Inserted content at line ${l} in ${i}.`}function xO(i={}){let{encoding:l="utf-8",restrictToCwd:u=!0,maxDiffLines:c=200}=i;return async(g,b,I)=>{let k=IO(b,g.path,u);if(g.insert_line!=null)return AO(k,g.insert_line,g.new_text,l);if(!await _O(k))return TO(k,g.new_text,l);if(g.old_text==null)throw Error(`${k} already exists, but \`old_text\` was ${g.old_text===null?"null":"omitted"}. To edit an existing file, set \`old_text\` to the exact text in the file that \`new_text\` should replace (read the file first if needed). To insert instead, provide \`insert_line\`. Do not re-send this call unchanged.`);return EO(k,g.old_text,g.new_text,l,c)}}var NO=16777216,OO=5,aS="Cache not found. Make a new tool call for the latest result again if needed. DO NOT repeat side-effecting actions to recover output.";class ef{sessionId;maxBytes;entries=new Map;referencesByToolCall=new Map;iteration=0;bytes=0;constructor(i,l=NO){this.sessionId=i,this.maxBytes=l}store(i,l){let u=Buffer.byteLength(l),c=this.referencesByToolCall.get(i);if(c)this.remove(c.id);if(this.referencesByToolCall.delete(i),u>this.maxBytes)return;while(this.bytes+u>this.maxBytes){let I=this.entries.keys().next().value;if(I===void 0)break;this.remove(I)}let g=MO(),b=`cline://cache/${encodeURIComponent(this.sessionId)}/${g}.result.txt`;return this.entries.set(g,{text:l,bytes:u,lastReadIteration:this.iteration}),this.referencesByToolCall.set(i,{id:g,uri:b}),this.bytes+=u,b}uriFor(i){return this.referencesByToolCall.get(i)?.uri}read(i){let l=/^cline:\/\/cache\/([^/]+)\/([a-f0-9-]+)\.result\.txt$/.exec(i);if(!l||decodeURIComponent(l[1])!==this.sessionId)throw Error("Invalid tool result cache URI for this session");let u=this.entries.get(l[2]);if(!u)throw Error(aS);return u.lastReadIteration=this.iteration,this.entries.delete(l[2]),this.entries.set(l[2],u),u.text}advanceIteration(){this.iteration++;for(let[i,l]of this.entries)if(this.iteration-l.lastReadIteration>=OO)this.remove(i)}clear(){this.entries.clear(),this.referencesByToolCall.clear(),this.bytes=0}remove(i){let l=this.entries.get(i);if(!l)return;this.bytes-=l.bytes,this.entries.delete(i)}}function lS(i){let l=[];function u(c){if(c!==null&&typeof c==="object"){if("type"in c&&c.type==="image"&&"data"in c&&typeof c.data==="string"){if("mediaType"in c&&typeof c.mediaType==="string")return l.push(c),"[image attached]";if("mimeType"in c&&typeof c.mimeType==="string")return l.push({type:"image",data:c.data,mediaType:c.mimeType}),"[image attached]"}if(Array.isArray(c))return c.map(u);return Object.fromEntries(Object.entries(c).map(([g,b])=>[g,u(b)]))}return c}return{textual:u(i),images:l}}function dS(i){let{textual:l,images:u}=lS(i);return{text:typeof l==="string"?l:JSON.stringify(l,null,2),images:u}}function $O(i){let{textual:l,images:u}=lS(i);return{text:typeof l==="string"?l:l===void 0?void 0:X.stringify(l,{blockQuote:"literal",lineWidth:0}),images:u}}var LO=new Map([[".gif","image/gif"],[".png","image/png"],[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".webp","image/webp"]]),DO={maxFileSizeBytes:1e7,encoding:"utf-8",includeLineNumbers:!0},Ny=1e8,UO=50000;function Oy(i){let{reason:l}=i;if(l instanceof Error)return l;if(l!==void 0)return Error(String(l));return Error("File read was aborted")}async function $y(i,l,u,c,g){if(g?.aborted)throw i.destroy(),Oy(g);let b=Math.max(u??1,1),I=c??Number.POSITIVE_INFINITY,k=Number.isFinite(I),T=k?I:b+UO-1,E=[],A=0,C=0,N=!1,O=!1,L=Number.isFinite(I)?Math.min(I,b+jd-1):b+jd-1,D=l?String(L).length+3:0,U=RO({input:i,crlfDelay:Number.POSITIVE_INFINITY}),F=g?()=>i.destroy(Oy(g)):void 0;if(g&&F)g.addEventListener("abort",F,{once:!0});try{for await(let ee of U){if(C+=1,C>I){C=I;break}if(!k&&N&&C>=T){O=!0;break}if(C<b||N)continue;if(E.length>=jd){N=!0;continue}let te=ee;if(te.length>bm)te=`${te.slice(0,bm)} [line truncated]`;let oe=A+te.length+D+1;if(oe>Jk&&E.length>0){N=!0;continue}E.push({lineNumber:C,text:te}),A=oe}}finally{if(g&&F)g.removeEventListener("abort",F);U.close(),i.destroy()}let j=String(E[E.length-1]?.lineNumber??C).length,H=E.map(({lineNumber:ee,text:te})=>l?`${String(ee).padStart(j," ")} | ${te}`:te).join(`
|
|
203
|
+
`),Q=E[E.length-1]?.lineNumber;if(Q===void 0)return H;let z=Math.min(I,C);if(Q>=z)return H;let W=O?`${C}+ lines`:z;return`${H}
|
|
204
|
+
|
|
205
|
+
[Showing lines ${b}-${Q} of ${W}. Use start_line/end_line to read other sections.]`}function FO(i={}){let{maxFileSizeBytes:l,encoding:u,includeLineNumbers:c}={...DO,...i};return async(g,b)=>{let{path:I,start_line:k,end_line:T}=g;if(I.startsWith("cline://")){b.signal?.throwIfAborted();let L=b.metadata?.toolResultCache;if(!(L instanceof ef))throw Error(aS);return $y(PO.from([L.read(I)]),c,k,T,b.signal)}let E=di.isAbsolute(I)?di.normalize(I):di.resolve(process.cwd(),I),A=qa(E)??E,C=di.extname(A).toLowerCase(),N=LO.get(C),O=await rc.stat(A);if(!O.isFile())throw Error(`Path is not a file: ${A}`);if(N){if(O.size>l)throw Error(`Image file too large: ${O.size} bytes (max: ${l} bytes).`);if(b.metadata?.modelSupportsImages!==!0)throw Error("Current model does not support image input");let L=await rc.readFile(A);return[{type:"text",text:"Successfully read image"},{type:"image",data:L.toString("base64"),mediaType:N}]}if(O.size>Ny)throw Error(`Text file too large to stream safely: ${O.size} bytes (max: ${Ny} bytes). Use a targeted command such as sed, grep, head, or tail to inspect specific sections.`);return $y(CO(A,{encoding:u}),c,k,T,b.signal)}}async function jO(){let i=Ha();return await qO(i,{recursive:!0,mode:448}),i}var WO=`# Cline chat workspace
|
|
206
|
+
|
|
207
|
+
This directory is Cline's shared workspace for chat sessions that were
|
|
208
|
+
started without a project. It is not a project of its own, and other chat
|
|
209
|
+
sessions use it too. Treat the conversation as a chat first: do not create
|
|
210
|
+
or edit files here unless the user asks for something that requires them.
|
|
211
|
+
|
|
212
|
+
If the user asks you to build something or write code:
|
|
213
|
+
|
|
214
|
+
1. Ask where they would like the project to live.
|
|
215
|
+
2. If they have no preference, create a new folder with a short, descriptive
|
|
216
|
+
name inside this directory and do all work inside that folder. Tell the
|
|
217
|
+
user where it is so they can open it as a workspace later.
|
|
218
|
+
|
|
219
|
+
Projects from earlier chat sessions may already exist as folders here; the
|
|
220
|
+
user may refer back to them. Never assume loose files in this directory
|
|
221
|
+
belong to the current conversation, and keep new work inside a named folder
|
|
222
|
+
rather than at the top level.
|
|
223
|
+
`;async function KO(){let i=za();await BO(i,{recursive:!0,mode:448});let l=zO(i,ht);try{await HO(l,WO,{flag:"wx"})}catch(u){if(u.code!=="EEXIST")throw u}return i}async function GO(i){let l=i.cwd?.trim()??"",u=i.workspaceRoot?.trim()??"",c=l||u||await KO();return{...i,cwd:l||c,workspaceRoot:u||c}}var ZO=15000,e$=600000,t$=1000,r$=new Set([".git","node_modules","vendor","dist","build",".next","coverage",".turbo",".cache","target","out"]);function Dy(i){let l=i&&typeof i==="object"&&"code"in i?String(i.code??""):"";return l==="EACCES"||l==="EPERM"||l==="ENOENT"}var Mo=new Map;function s$(){if(!pS)return!1;return!0}function i$(i){if(Mo.size<=1)return;for(let[l,u]of Mo.entries()){if(u.pending)continue;if(i-u.lastAccessedAt>e$)Mo.delete(l)}}async function n$(i){let l=(await new Promise((u,c)=>{let g=XO("rg",["--files","--hidden","-g","!.git"],{cwd:i,stdio:["ignore","pipe","pipe"],windowsHide:!0}),b="",I="";g.stdout.on("data",(k)=>{b+=k.toString()}),g.stderr.on("data",(k)=>{I+=k.toString()}),g.on("error",c),g.on("close",(k)=>{if(k===0){u(b);return}c(Error(I||`rg exited with code ${k}`))})})).split(/\r?\n/).map((u)=>u.trim()).filter((u)=>u.length>0).map((u)=>u.replace(/\\/g,"/"));return new Set(l)}async function mS(i,l,u){let c;try{c=await VO(l,{withFileTypes:!0})}catch(g){if(Dy(g))return;throw g}for(let g of c){let b=mu.join(l,g.name);if(g.isDirectory()){if(r$.has(g.name))continue;try{await mS(i,b,u)}catch(I){if(Dy(I))continue;throw I}continue}if(g.isFile())u.add(qt(mu.relative(i,b)))}}async function o$(i){let l=new Set;return await mS(i,i,l),l}function a$(i){let l=(c)=>{try{return JO.native(c)}catch{return mu.resolve(c)}},u=l(i);return u===l(YO.homedir())||u===mu.parse(u).root}async function zd(i){if(a$(i))return new Set;try{return await n$(i)}catch{return o$(i)}}function l$(){if(pS||!Ly)return;let i=Ly;i.on("message",(l)=>{if(l.type!=="index")return;zd(l.cwd).then((u)=>{let c={type:"indexResult",requestId:l.requestId,files:Array.from(u)};i.postMessage(c)}).catch((u)=>{let c={type:"indexResult",requestId:l.requestId,error:u instanceof Error?u.message:"Failed to build file index"};i.postMessage(c)})})}class hS{worker=new QO(new URL(import.meta.url));nextRequestId=0;pending=new Map;constructor(){this.worker.unref(),this.worker.on("message",(i)=>{if(i.type!=="indexResult")return;let l=this.pending.get(i.requestId);if(!l)return;if(this.pending.delete(i.requestId),i.error){l.reject(Error(i.error));return}l.resolve(i.files??[])}),this.worker.on("error",(i)=>{this.flushPending(i)}),this.worker.on("exit",(i)=>{if(i!==0)this.flushPending(Error(`File index worker exited with code ${i}`))})}requestIndex(i){let l=++this.nextRequestId,u=new Promise((g,b)=>{let I=setTimeout(()=>{this.pending.delete(l),g(null)},t$);I.unref(),this.pending.set(l,{resolve:(k)=>{clearTimeout(I),g(k)},reject:(k)=>{clearTimeout(I),b(k)}})}),c={type:"index",requestId:l,cwd:i};return this.worker.postMessage(c),u}flushPending(i){for(let[l,u]of this.pending.entries())u.reject(i),this.pending.delete(l)}}l$();var jc;function d$(){if(!s$())return null;if(jc===void 0)jc=new hS;return jc}async function u$(i){let l=d$();if(!l)return zd(i);try{let u=await l.requestIndex(i);if(u===null)return zd(i);return new Set(u)}catch{return zd(i)}}async function fS(i,l={}){let u=l.ttlMs??ZO,c=Date.now();i$(c);let g=Mo.get(i);if(g&&u>0&&c-g.lastBuiltAt<=u&&g.files.size>0)return g.lastAccessedAt=c,g.files;if(g?.pending)return g.lastAccessedAt=c,g.pending;let b=u$(i).then((I)=>(Mo.set(i,{files:I,lastBuiltAt:Date.now(),lastAccessedAt:Date.now(),pending:null}),I));return Mo.set(i,{files:g?.files??new Set,lastBuiltAt:g?.lastBuiltAt??0,lastAccessedAt:c,pending:b}),b}var p$=new Set("),.:;!?`'\""),m$=/^[(`'"]+/;function h$(i){let l=i.length;while(l>0&&p$.has(i.charAt(l-1)))l-=1;return i.slice(0,l)}function f$(i){let l=i.matchAll(/(^|[\s])@([^\s]+)/g),u=[];for(let c of l){let g=(c[2]??"").trim();if(g.length===0)continue;let b=h$(g.replace(m$,""));if(b.length===0||b.includes("@"))continue;u.push(b)}return Array.from(new Set(u))}function g$(i,l){let u=i.replace(/\\/g,"/"),c=no.isAbsolute(u)?no.resolve(u):no.resolve(l,u),g=no.relative(l,c);if(g.startsWith("..")||no.isAbsolute(g))return;return qt(g)}async function y$(i,l,u={}){let c=f$(i);if(c.length===0)return{prompt:i,mentions:[],matchedFiles:[],ignoredMentions:[]};let{maxFiles:g,maxFileBytes:b,maxTotalBytes:I}=u,k=await fS(l,{ttlMs:u.ttlMs}),T=[],E=[],A=[],C=0;for(let N of c){if(g&&A.length>=g){E.push(N);continue}let O=g$(N,l);if(!O||!k.has(O)){E.push(N);continue}if(!b||!I){T.push(O);continue}let L=no.join(l,O);try{if(!(await c$(L)).isFile()){E.push(N);continue}let D=C+b;if(D>I){E.push(N);continue}C=D,T.push(O)}catch{E.push(N)}}return{prompt:i,mentions:c,matchedFiles:T,ignoredMentions:E}}var v$=10485760,w$=["ts","tsx","js","jsx","mjs","cjs","json","md","mdx","txt","yaml","yml","toml","py","rb","php","phtml","inc","go","rs","java","kt","swift","c","cpp","h","hpp","css","scss","less","html","vue","svelte","twig","sql","sh","bash","zsh","fish","ps1","env","gitignore","dockerignore","editorconfig"],b$=["node_modules","vendor",".git","dist","build",".next","coverage","__pycache__",".venv","venv",".cache",".turbo",".output","out","target","bin","obj"],yi=null;function I$(){if(yi!==null)return Promise.resolve(yi);return new Promise((i)=>{let l=uS("rg",["--version"],{stdio:["ignore","pipe","pipe"],windowsHide:!0});l.on("close",(u)=>{yi=u===0,i(yi)}),l.on("error",()=>{yi=!1,i(!1)}),setTimeout(()=>{if(!l.killed)l.kill("SIGTERM");if(yi===null)yi=!1,i(!1)},1000)})}function k$(i,l,u,c,g=5000,b){return new Promise((I)=>{let k=uS("rg",["--json",`--context=${c}`,"--max-count=1","-i",i],{cwd:l,stdio:["ignore","pipe","pipe"],windowsHide:!0}),T="",E=!1,A=()=>{if(!k.killed)k.kill("SIGTERM")},C=setTimeout(()=>{if(!E)E=!0,A(),I(null)},g),N=(O)=>{if(!E)E=!0,clearTimeout(C),A(),I(O)};if(b?.aborted){A(),I(null);return}b?.addEventListener("abort",()=>{N(null)}),k.stdout.on("data",(O)=>{if(T.length>v$)return;T+=O.toString()}),k.stderr.on("data",()=>{}),k.on("close",(O)=>{if(O===0||O===1){try{let L=[],D=T.slice(0,T.lastIndexOf(`
|
|
224
|
+
`)+1).split(`
|
|
225
|
+
`).filter((U)=>U.trim());for(let U of D){if(L.length>=u)break;let F=JSON.parse(U);if(F.type==="match"){let j=F.data,H=[];if(F.data.submatches&&F.data.submatches.length>0){let Q=F.data.submatches[0];L.push({file:j.path.text,line:j.line_number,column:(Q?.start??0)+1,match:Q?.match?.text??"",context:H})}}else if(F.type==="context"&&L.length>0){let j=L[L.length-1],H=F.data.line_number===j.line?">":" ";j.context.push(`${H} ${F.data.line_number}: ${F.data.lines?.text??F.data.line?.text??""}`)}}N(L.length>0?L:null)}catch{N(null)}return}N(null)}),k.on("error",()=>{N(null)})})}function S$(i,l,u,c){let g=i.split("/"),b=g[g.length-1]??"";if(g.length-1>c)return!1;for(let k=0;k<g.length-1;k++)if(l.has(g[k]??""))return!1;let I=sc.posix.extname(b).slice(1).toLowerCase();return u.has(I)||!I&&!b.startsWith(".")}function T$(i={}){let{includeExtensions:l=w$,excludeDirs:u=b$,maxResults:c=100,contextLines:g=2,maxDepth:b=20}=i,I=new Set(u),k=new Set(l.map((T)=>T.toLowerCase()));return async(T,E,A)=>{if(A.signal?.aborted)throw Error("Search operation aborted");let C=await I$(),N=null;if(C)N=await k$(T,E,c,g,5000,A.signal);if(N){let j=[`Found ${N.length} result${N.length===1?"":"s"} for pattern: ${T}`,""];for(let H of N)j.push(`${H.file}:${H.line}:${H.column}`),j.push(...H.context),j.push("");if(N.length>=c)j.push(`(Showing first ${c} results. Refine your search for more specific results.)`);return Uy(j.join(`
|
|
226
|
+
`))}let O;try{O=new RegExp(T,"gim")}catch(j){throw Error(`Invalid regex pattern: ${T}. ${j instanceof Error?j.message:""}`)}let L=[],D=0,U=await fS(E);for(let j of U){if(A.signal?.aborted)throw Error("Search operation aborted");if(!S$(j,I,k,b))continue;if(L.length>=c)break;D++;let H=sc.join(E,j);try{let Q=(await cS.readFile(H,"utf-8")).split(`
|
|
227
|
+
`);for(let z=0;z<Q.length;z++){let W=Q[z];O.lastIndex=0;let ee=O.exec(W);while(ee!==null){if(L.length>=c)break;let te=Math.max(0,z-g),oe=Math.min(Q.length-1,z+g),G=[];for(let se=te;se<=oe;se++){let Pe=se===z?">":" ";G.push(`${Pe} ${se+1}: ${Q[se].slice(0,bm)}`)}if(L.push({file:j,line:z+1,column:ee.index+1,match:ee[0],context:G}),ee.index===O.lastIndex)O.lastIndex++;ee=O.exec(W)}}}catch{}}if(L.length===0)return`No results found for pattern: ${T}
|
|
228
|
+
Searched ${D} files.`;let F=[`Found ${L.length} result${L.length===1?"":"s"} for pattern: ${T}`,`Searched ${D} files.`,""];for(let j of L)F.push(`${j.file}:${j.line}:${j.column}`),F.push(...j.context),F.push("");if(L.length>=c)F.push(`(Showing first ${c} results. Refine your search for more specific results.)`);return Uy(F.join(`
|
|
229
|
+
`))}}function Uy(i){if(i.length<=Bd)return i;let l=Math.ceil(Bd/2),u=Math.max(1,Bd-l);return`${i.slice(0,l)}
|
|
230
|
+
[... search output truncated: ${i.length} chars total. Narrow the pattern or scope to view the elided matches ...]
|
|
231
|
+
`+i.slice(-u)}function _$(i){return i.replace(/<script[^>]*>[\s\S]*?<\/script>/gi,"").replace(/<style[^>]*>[\s\S]*?<\/style>/gi,"").replace(/<!--[\s\S]*?-->/g,"").replace(/<(p|div|br|hr|h[1-6]|li|tr)[^>]*>/gi,`
|
|
232
|
+
`).replace(/<[^>]+>/g," ").replace(/ /g," ").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/&#(\d+);/g,(l,u)=>String.fromCharCode(parseInt(u,10))).replace(/\s+/g," ").replace(/\n\s+/g,`
|
|
233
|
+
`).replace(/\n{3,}/g,`
|
|
234
|
+
|
|
235
|
+
`).trim()}function E$(i={}){let{timeoutMs:l=30000,maxResponseBytes:u=5000000,userAgent:c="Mozilla/5.0 (compatible; AgentBot/1.0)",headers:g={},followRedirects:b=!0}=i;return async(I,k,T)=>{let E;try{E=new URL(I)}catch{throw Error(`Invalid URL: ${I}`)}if(!["http:","https:"].includes(E.protocol))throw Error(`Invalid protocol: ${E.protocol}. Only http and https are supported.`);let A=new AbortController,C=setTimeout(()=>A.abort(),l),N;if(T.signal)N=()=>A.abort(),T.signal.addEventListener("abort",N);try{let O=await fetch(I,{method:"GET",headers:{"User-Agent":c,Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7","Accept-Language":"en-US,en;q=0.9",...g},redirect:b?"follow":"manual",signal:A.signal});if(clearTimeout(C),!b&&O.status>=300&&O.status<400)return`Redirect to: ${O.headers.get("location")}`;if(!O.ok)throw Error(`HTTP ${O.status}: ${O.statusText}`);let L=O.headers.get("content-type")||"",D=O.body?.getReader();if(!D)throw Error("Failed to read response body");let U=[],F=0;while(!0){let{done:ee,value:te}=await D.read();if(ee)break;if(F+=te.length,F>u)throw D.cancel().catch(()=>{}),Error(`Response too large: exceeded ${u} bytes`);U.push(te)}let j=new Uint8Array(F),H=0;for(let ee of U)j.set(ee,H),H+=ee.length;let Q=new TextDecoder("utf-8").decode(j),z;if(L.includes("text/html")||L.includes("application/xhtml"))z=_$(Q);else if(L.includes("application/json"))try{let ee=JSON.parse(Q);z=JSON.stringify(ee,null,2)}catch{z=Q}else z=Q;let W=[`URL: ${I}`,`Content-Type: ${L}`,`Size: ${F} bytes`,"","--- Content ---",z.slice(0,50000)];if(z.length>50000)W.push(`
|
|
236
|
+
[Content truncated: showing first 50000 of ${z.length} characters]`);return W.push("","--- Analysis Request ---",`Prompt: ${k}`),W.join(`
|
|
237
|
+
`)}catch(O){if(clearTimeout(C),O instanceof Error){if(O.name==="AbortError")throw Error(`Request timed out after ${l}ms`);throw O}throw Error(`Fetch failed: ${String(O)}`)}finally{if(T.signal&&N)T.signal.removeEventListener("abort",N)}}}class gS{commands=new Map;register(i){return this.commands.set(i.executionId,i),()=>{if(this.commands.get(i.executionId)===i)this.commands.delete(i.executionId)}}proceedWhileRunning(i,l){let u=0;for(let c of[...this.commands.values()]){if(c.sessionId!==i||l!==void 0&&c.toolCallId!==l)continue;try{if(c.detach())u+=1}catch{}}return u}}function A$(i={}){return BN(i)}function x$(i={}){return{readFile:FO(i.fileRead),search:T$(i.search),bash:A$(i.bash),webFetch:E$(i.webFetch),applyPatch:bO(i.applyPatch),editor:xO(i.editor)}}var C$={read_files:"enableReadFiles",search_codebase:"enableSearch",run_commands:"enableBash",fetch_web_content:"enableWebFetch",apply_patch:"enableApplyPatch",editor:"enableEditor",skills:"enableSkills",ask_question:"enableAskQuestion",submit_and_exit:"enableSubmitAndExit"},R$=[{name:"openai-native-use-apply-patch",mode:"act",providerIdIncludes:["openai-native"],enableTools:["apply_patch"],disableTools:["editor"]},{name:"codex-and-gpt-use-apply-patch",mode:"act",modelIdIncludes:["codex","gpt"],enableTools:["apply_patch"],disableTools:["editor"]}];function Fy(i,l){if(!l||l.length===0)return!0;let u=i.toLowerCase();return l.some((c)=>u.includes(c.toLowerCase()))}function P$(i,l,u,c){if(i.mode&&i.mode!=="any"&&i.mode!==c)return!1;return Fy(l,i.providerIdIncludes)&&Fy(u,i.modelIdIncludes)}function M$(i,l,u,c){if(!c||c.length===0)return{};let g=new Map;for(let I of c){if(!P$(I,i,l,u))continue;for(let k of I.disableTools??[])g.set(k,!1);for(let k of I.enableTools??[])g.set(k,!0)}let b={};for(let[I,k]of g.entries())b[C$[I]]=k;return b}var tf={act:{enableReadFiles:!0,enableSearch:!0,enableBash:!0,enableWebFetch:!0,enableApplyPatch:!1,enableEditor:!0,enableSkills:!0,enableAskQuestion:!0,enableSubmitAndExit:!1,enableSpawnAgent:!0,enableAgentTeams:!0},plan:{enableReadFiles:!0,enableSearch:!0,enableBash:!0,enableWebFetch:!0,enableApplyPatch:!1,enableEditor:!1,enableSkills:!0,enableAskQuestion:!0,enableSubmitAndExit:!1,enableSpawnAgent:!0,enableAgentTeams:!0},search:{enableReadFiles:!0,enableSearch:!0,enableBash:!1,enableWebFetch:!1,enableApplyPatch:!1,enableEditor:!1,enableSkills:!1,enableAskQuestion:!1,enableSubmitAndExit:!1,enableSpawnAgent:!0,enableAgentTeams:!0},minimal:{enableReadFiles:!1,enableSearch:!1,enableBash:!0,enableWebFetch:!1,enableApplyPatch:!1,enableEditor:!1,enableSkills:!1,enableAskQuestion:!1,enableSubmitAndExit:!1,enableSpawnAgent:!0,enableAgentTeams:!1},yolo:{enableReadFiles:!0,enableSearch:!1,enableBash:!0,enableWebFetch:!1,enableApplyPatch:!1,enableEditor:!0,enableSkills:!1,enableAskQuestion:!1,enableSubmitAndExit:!0,enableSpawnAgent:!1,enableAgentTeams:!1}};function rf(i){if(i.mode==="plan")return"plan";if(i.mode==="yolo")return"yolo";return"act"}var ds=(i)=>new RegExp(i,"iu"),O$=[String.raw`\b(?:are|r)\s+(?:you|u)\s+(?:still\s+)?(?:stuck|dead|there|alive|ok(?:ay)?|frozen|hung|hanging|working|running|awake|on it|done|finished|thinking|doing anything|responding|back)\b`,String.raw`\b(?:you|u)\s+(?:still\s+)?(?:stuck|dead|alive|frozen|hung)\b`,String.raw`\b(?:did|has|have)\s+(?:you|it|this|that|the\s+\w+)(?:\s+\w+)?\s+(?:finish(?:ed)?|complete[d]?|stop(?:ped)?|die[d]?|hang|hung|crash(?:ed)?|freeze|froze|get\s+stuck|time[d]?\s*out)\b`,String.raw`\b(?:is|was)\s+(?:it|this|that|the\s+\w+)\s+(?:still\s+)?(?:stuck|hung|frozen|running|done|finished|working)\b`,String.raw`\bwhy\s+(?:did|have|has)\s+(?:you|it)\s+stop(?:ped)?\b|\b(?:you|it)\s+(?:just\s+)?stopped\b`,String.raw`\b(?:seems?|appears?|looks?)\s+(?:to\s+be\s+|like\s+(?:you(?:'re| are)|it(?:'s| is))\s+)?(?:stuck|frozen|hung|dead)\b`,String.raw`\bwhat(?:'s|\s+is)?\s+(?:happening|going\s+on)\b|\bwhat\s+happened\b|\bany\s+(?:update|progress)\b|^\s*(?:status|update|progress)\s*\?+\s*$`,String.raw`\bprevious\s+(?:\w+\s+){0,4}(?:response|answer|reply|output)\s+(?:was|got)\s+(?:incomplete|cut\s+off|truncated|interrupted)|\bincomplete\s+or\s+timed\s+out\b`,String.raw`\byou\s+(?:got\s+)?cut\s+off\b(?!\s+by\s+my)|\b(?:your\s+)?(?:response|answer|reply)\s+(?:got\s+|was\s+)?cut\s+off\b(?!\s+by\s+my)`,String.raw`^(?:anyone\s+there|you\s+there|wake\s+up)\s*[?!.]*$`,String.raw`^[??]+$|^\.{3,}$|^.{0,6}[??]{3,}$`,String.raw`还在吗|在吗[??]?$|怎么不动|你怎么停|怎么停了|止まった|固まった|フリーズ|멈췄|завис|застрял|bist\s+du\s+(?:noch\s+)?da`].map(ds),$$=ds(String.raw`\b(?:stuck|hung|hanging|frozen|unresponsive|not\s+responding|no\s+response)\b|卡住|卡了|没反应|不动了`),L$=ds(String.raw`^(?:(?:ok(?:ay)?|k|so|well|please|pls|now|yes|yeah)[,.!]?\s+)*`+String.raw`(?:continue|contine|contiune|keep\s+going|keep\s+working|go\s+on|go\s+ahead|go|proceed|resume|carry\s+on|next|finish(?:\s+it|\s+up)?|do\s+it|try\s+again|retry|again|`+String.raw`继续|繼續|続けて|계속|продолжа\p{L}*|дальше|давай|contin[uú]a|sigue|weiter|mach\s+weiter|continuez)`+String.raw`(?:(?![\p{L}\p{N}_])|(?<=[-ヿ一-鿿]))[\s\p{L}\p{N}_,.!?()'’-]{0,40}$`),D$=ds(String.raw`\b(?:pick\s+(?:it\s+)?(?:back\s+)?up|continue|carry\s+on|resume|keep\s+going)\s+(?:from\s+)?where\s+(?:you|we)\s+(?:left\s+off|stopped|were)\b|\bwhere\s+were\s+we\b`),U$=ds(String.raw`^(?:hello+|hi+|hey+|ping|yo|你好|在吗)\s*[??!.]*$`),F$=ds(String.raw`^\s*(?:API error|API Request Failed|Error:\s*(?:Request|Stream|Connection))|stream-first-event-timeout|Request timed out|socket hang up|ECONNRESET|overloaded_error|upstream connect error|Provider returned error|terminated due to timeout`),q$=ds(String.raw`(?:[.!?:;)\]}"'\x60*>|_~。!?:)」』…]|[←-⯿\u{1F000}-\u{1FAFF}☀-➿️])\s*$`),j$=ds(String.raw`\n\s*(?:[-*•]|\d+[.)])\s+\S[^\n]*$`),B$=ds(String.raw`\b(?:will|I'll|I\s+will)\s+(?:ping|notify|report|update|let\s+you\s+know|check\s+back|get\s+back)\b[^\n]{0,80}\b(?:when|once|after|as\s+soon\s+as)\b|\b(?:wait(?:ing)?\s+for\s+(?:it|the\s+\w+)\s+to\s+(?:finish|complete|land))\b`),H$=ds(String.raw`(?:^|[\n.!:]\s*)(?:now\s+|next[,:]?\s+|then\s+|first[,:]?\s+|ok(?:ay)?[,.]\s+|great[,.!]\s+)?(?:let\s+me|let's|i'll|i\s+will|i'm\s+going\s+to|i\s+am\s+going\s+to|i'm\s+now|going\s+to|launching|starting|running|proceeding|continuing|moving\s+on|time\s+to)\b[^\n]{0,240}[.:…]?\s*$`),z$=ds(String.raw`\?\s*$|\b(?:want\s+me\s+to|should\s+i|shall\s+i|would\s+you\s+like|do\s+you\s+want|let\s+me\s+know|approve|confirm|which\s+(?:option|one|approach)|ready\s+to\s+proceed|when\s+you(?:'re|\s+are)\s+ready|ping\s+me|once\s+you)\b`);function W$(i){let l=i.trim(),u=Array.from(l).length;if(!l||u>200)return"none";if(O$.some((c)=>c.test(l)))return"probe";if(u<=40&&$$.test(l))return"probe";if(u<=80&&L$.test(l))return"nudge";if(D$.test(l))return"nudge";if(U$.test(l))return"greeting";return"none"}function K$(i){let l=i.trimEnd();if(!l)return"empty_turn";if(l.length<600&&F$.test(l))return"api_error";if((l.split("```").length-1)%2===1)return"truncated_text";if(!q$.test(l)&&!j$.test(l))return"truncated_text";let u=l.slice(l.lastIndexOf(`
|
|
238
|
+
|
|
239
|
+
`)+1);if(B$.test(u))return"async_promise";if(H$.test(u)&&!z$.test(u.slice(-300)))return"intent_without_action";return"none"}var qy=60000;function G$(i){if(i.content.length===0)return"empty";let l=new Set(i.content.map((u)=>u.type));if(l.has("tool-call"))return"tool_call";return`assistant_${l.has("text")?"text":"other"}`}function X$(i){return i.content.map((l)=>l.type==="text"?l.text:"").join("")}class yS{telemetry;context;lastEventAt=Date.now();lastEventType="";maxIdleMs=0;maxIdleAfter="";idleReported=!1;agentId="";runId="";finishReason;turnStarted=!1;turnHadOutput=!1;turnMessage;idleTimer;constructor(i,l){this.telemetry=i,this.context=l,this.scheduleIdleCheck()}observe(i){switch(this.recordGap(),this.lastEventType=i.type,this.agentId=i.snapshot.agentId,this.runId=i.snapshot.runId??"",i.type){case"turn-started":this.turnStarted=!0,this.turnHadOutput=!1,this.turnMessage=void 0,this.finishReason=void 0;break;case"assistant-text-delta":case"assistant-reasoning-delta":case"assistant-media":case"tool-call-delta":this.turnHadOutput=!0;break;case"assistant-message":this.turnMessage=i.message,this.finishReason=i.finishReason;break}}endProperties(){this.dispose();let i=Date.now()-this.lastEventAt;this.recordGap();let l=this.turnMessage?G$(this.turnMessage):!this.turnStarted?"none":this.turnHadOutput?"unfinished":"empty",{sessionId:u,isSubagent:c,providerId:g,modelId:b}=this.context;return{...u?{sessionId:u}:{},isSubagent:c,...g?{providerId:g}:{},...b?{modelId:b}:{},maxIdleMs:this.maxIdleMs,maxIdleAfter:this.maxIdleAfter,idleReported:this.idleReported,msSinceLastEvent:i,lastEventType:this.lastEventType,finishReason:this.finishReason,endedOn:l,...l==="empty"||l==="assistant_text"?{textSignature:K$(this.turnMessage?X$(this.turnMessage):"")}:{}}}dispose(){clearTimeout(this.idleTimer),this.idleTimer=void 0}recordGap(){let i=Date.now();if(i-this.lastEventAt>this.maxIdleMs)this.maxIdleMs=i-this.lastEventAt,this.maxIdleAfter=this.lastEventType;this.lastEventAt=i}scheduleIdleCheck(){let i=this.lastEventAt+qy-Date.now();this.idleTimer=setTimeout(()=>{let l=Date.now()-this.lastEventAt;if(l<qy){this.scheduleIdleCheck();return}this.idleReported=!0,this.idleTimer=void 0,MA(this.telemetry,{ulid:this.context.sessionId,agentId:this.agentId,runId:this.runId,idleMs:l,lastEventType:this.lastEventType,isSubagent:this.context.isSubagent})},Math.max(i,0)),this.idleTimer.unref?.()}}var vS=8000,J$=50000,V$=6000000,Y$=200000,Q$=12000,Z$=65536,xl=2000,jy=40000,eL=8,Bc={maxToolResultChars:"CLINE_MESSAGE_BUILDER_MAX_TOOL_RESULT_CHARS",maxTotalTextBytes:"CLINE_MESSAGE_BUILDER_MAX_TOTAL_TEXT_BYTES",minOutdatedRewriteBytes:"CLINE_MESSAGE_BUILDER_MIN_OUTDATED_REWRITE_BYTES"},tL=new Set(["read","read_files"]),wi="[outdated - see the latest file content]",By="Tool execution was interrupted before a result was produced.",Hy=(i)=>`
|
|
240
|
+
|
|
241
|
+
...[truncated ${i} chars]...
|
|
242
|
+
|
|
243
|
+
`,Cl=(i)=>`
|
|
244
|
+
|
|
245
|
+
...[truncated ${i} chars to fit provider request budget]...
|
|
246
|
+
|
|
247
|
+
`,rL=(i)=>`
|
|
248
|
+
|
|
249
|
+
...[assistant text truncated: omitted ${i} chars]...
|
|
250
|
+
|
|
251
|
+
`,zy=(i)=>`
|
|
252
|
+
|
|
253
|
+
...[assistant text truncated: omitted ${i} chars to fit provider request budget]...
|
|
254
|
+
|
|
255
|
+
`,sL=(i)=>`
|
|
256
|
+
|
|
257
|
+
...[assistant text truncated: omitted ${i} chars due to repeated tool-call markup]...
|
|
258
|
+
|
|
259
|
+
`;function iL(i=process.env){return{maxToolResultChars:Ky(i[Bc.maxToolResultChars]),maxTotalTextBytes:Ky(i[Bc.maxTotalTextBytes]),minOutdatedRewriteBytes:oL(i[Bc.minOutdatedRewriteBytes])}}class wS{recoveryNotices=new WeakSet;getToolResultRecovery;recoveryNoticeBytes=0;indexedMessageCount=0;indexedTailRef;toolNameByIdCache=new Map;readLocatorsByToolUseIdCache=new Map;latestReadToolUseByLocatorCache=new Map;latestFullContentOwnerByPathCache=new Map;readResultLocatorCache=new WeakMap;maxToolResultChars;maxFileContentChars;maxTotalTextBytes;mediaBudget;maxAssistantTextChars;maxAssistantToolMarkupChars;minOutdatedRewriteBytes;committedOutdatedRewrites=new Map;constructor(i={}){this.getToolResultRecovery=i.getToolResultRecovery,this.maxToolResultChars=aa(i.maxToolResultChars,vS),this.maxFileContentChars=aa(i.maxFileContentChars,J$),this.maxTotalTextBytes=aa(i.maxTotalTextBytes,V$),this.mediaBudget=i.mediaBudget??{},this.maxAssistantTextChars=aa(i.maxAssistantTextChars,Y$),this.maxAssistantToolMarkupChars=aa(i.maxAssistantToolMarkupChars,Q$),this.minOutdatedRewriteBytes=aL(i.minOutdatedRewriteBytes,Z$)}resetConversationState(){this.resetIndexes(),this.committedOutdatedRewrites.clear()}buildForApi(i){this.recoveryNoticeBytes=0,this.reindex(i),this.commitOutdatedRewrites(i);let l=this.addMissingToolResults(i).map((c)=>{if(!Array.isArray(c.content)){if(c.role==="user"&&typeof c.content==="string"){let I=ye(c.content);if(I!==c.content)return{...c,content:I}}if(c.role==="assistant"&&typeof c.content==="string"){let I=this.truncateAssistantText(c.content);if(I!==c.content)return{...c,content:I}}return c}let g=!1,b=c.content.map((I)=>{let k=this.transformBlock(I,c.role);if(k!==I)g=!0;return k});return g?{...c,content:b}:c}),u=this.applyMediaBudget(l);return this.truncateToTotalTextBudget(u)}transformBlock(i,l){if(l==="user"&&i.type==="text"&&typeof i.text==="string"){let b=ye(i.text);if(b!==i.text)return{...i,text:b};return i}if(l==="assistant"&&i.type==="text"&&typeof i.text==="string"){let b=this.truncateAssistantText(i.text);return b===i.text?i:{...i,text:b}}if(i.type==="file"){let b=kl(i.content,this.maxFileContentChars,Hy);return b===i.content?i:{...i,content:b}}if(i.type!=="tool_result")return i;let u=this.resolveToolName(i),c=this.getToolResultRecovery?.({...i,name:u??i.name});if(c){let{text:b,images:I}=dS(i.content);if(typeof b==="string"&&b.length>this.maxToolResultChars){let k=[{type:"text",text:this.truncateMiddle(b)},...I];if(c.uri){let T={type:"text",text:`Full result is temporarily saved to ${c.uri}. Only read_files can access this cache URI. Use read_files with specific line ranges if omitted content is needed.`},E=qe(T.text);if(this.recoveryNoticeBytes+E<=this.maxTotalTextBytes/2)this.recoveryNoticeBytes+=E,this.recoveryNotices.add(T),k.push(T)}return{...i,content:k}}}let g=i.content;if(this.isReadTool(u)&&i.is_error!==!0){let b=this.committedOutdatedRewrites.get(i.tool_use_id);if(b&&b.size>0){let I=this.getReadLocators(i).filter((k)=>b.has(this.toReadLocatorKey(k))&&this.isOutdatedReadLocator(k,i.tool_use_id));if(I.length>0)g=this.replaceOutdatedReadContent(g,I)}}return g=this.truncateToolResultContent(g),g===i.content?i:{...i,content:g}}reindex(i){let l=this.indexedMessageCount===0||i.length>=this.indexedMessageCount&&i[this.indexedMessageCount-1]===this.indexedTailRef;if(i.length<this.indexedMessageCount||!l)this.resetIndexes();for(let u=this.indexedMessageCount;u<i.length;u++){let c=i[u];if(!Array.isArray(c.content))continue;for(let g=0;g<c.content.length;g++){let b=c.content[g];if(b.type==="file")this.latestFullContentOwnerByPathCache.set(b.path,`file:${u}:${g}`);else if(b.type==="tool_use"){let I=b.name.toLowerCase();if(this.toolNameByIdCache.set(b.id,I),this.isReadTool(I)){let k=this.extractLocatorsFromReadToolInput(b.input);if(k.length>0)this.readLocatorsByToolUseIdCache.set(b.id,k)}}else if(b.type==="tool_result"){let I=this.resolveToolName(b);if(!this.isReadTool(I)||b.is_error===!0)continue;let k=this.getReadLocators(b);for(let T of k)if(this.latestReadToolUseByLocatorCache.set(this.toReadLocatorKey(T),b.tool_use_id),this.isFullFileRead(T))this.latestFullContentOwnerByPathCache.set(T.path,b.tool_use_id)}}}this.indexedMessageCount=i.length,this.indexedTailRef=i.length>0?i[i.length-1]:void 0}commitOutdatedRewrites(i){let l=new Map,u=new Set,c=0;for(let g of i){if(!Array.isArray(g.content))continue;for(let b of g.content){if(b.type!=="tool_result"||b.is_error===!0)continue;let I=this.resolveToolName(b);if(!this.isReadTool(I))continue;u.add(b.tool_use_id);let k=this.committedOutdatedRewrites.get(b.tool_use_id),T=new Set,E=new Set;for(let C of this.getReadLocators(b)){let N=this.toReadLocatorKey(C);if(!this.isOutdatedReadLocator(C,b.tool_use_id))continue;if(E.add(N),!k?.has(N))T.add(N)}if(k){for(let C of k)if(!E.has(C))k.delete(C);if(k.size===0)this.committedOutdatedRewrites.delete(b.tool_use_id)}if(T.size===0)continue;let A=l.get(b.tool_use_id);if(!A)A=new Set,l.set(b.tool_use_id,A);for(let C of T)A.add(C);c+=this.estimateOutdatedReclaimBytes(b.content,T)}}for(let g of this.committedOutdatedRewrites.keys())if(!u.has(g))this.committedOutdatedRewrites.delete(g);if(l.size===0||c<this.minOutdatedRewriteBytes)return;for(let[g,b]of l){let I=this.committedOutdatedRewrites.get(g);if(!I)I=new Set,this.committedOutdatedRewrites.set(g,I);for(let k of b)I.add(k)}}estimateOutdatedReclaimBytes(i,l){let u=this.extractReadLocatorsFromToolResultContent(i),c=u.length>0&&u.every((T)=>l.has(this.toReadLocatorKey(T))),g=(T)=>{let E;try{E=JSON.parse(T)}catch{return c||u.length===0?qe(this.truncateMiddle(T)):0}let A=Array.isArray(E)?E:[E],C=0;for(let N of A){let O=this.extractLocatorFromResultEntry(N);if(O&&l.has(this.toReadLocatorKey(O)))C+=this.providerBoundEntryBytes(N)}return C};if(typeof i==="string")return g(i);let b=new Set(l),I=0;for(let T of i)if(T.type==="text")I+=this.countOutdatedImageEntries(T.text,b);let k=0;for(let T of i)if(T.type==="text")k+=g(T.text);else if(T.type==="image"){if(I>0)I-=1,k+=qe(T.data)}else if(Js(T)){let E=this.extractLocatorFromResultEntry(T);if(E&&l.has(this.toReadLocatorKey(E)))k+=this.providerBoundEntryBytes(T)}else if(T.type==="file"){if(l.has(this.toReadLocatorKey({path:T.path,startLine:null,endLine:null})))k+=qe(this.truncateMiddle(T.content))}return k}providerBoundEntryBytes(i){let l=this.truncateNestedStrings(i);return qe(JSON.stringify(l))}addMissingToolResults(i){let l=this.collectToolResultIds(i),u=[],c=new Map,g=!1,b=()=>{if(c.size===0)return;I(this.createMissingToolResultMessage(c)),c.clear(),g=!0},I=(k)=>{let T=u.at(-1);if(this.shouldMergeUserAfterToolResults(T,k)){u[u.length-1]={...T,content:[...T.content,...this.contentBlocksForUserMerge(k.content)]},g=!0;return}u.push(k)};for(let k of i){if(this.isToolResultOnlyMessage(k)){if(I(this.appendMissingToolResults(k,c)),c.size>0)c.clear(),g=!0;continue}if(Array.isArray(k.content)){let T=k.content.filter((A)=>A.type==="tool_result"),E=k.content.filter((A)=>A.type!=="tool_result");if(T.length>0){let A=this.appendMissingToolResults({...k,role:"user",content:T},c);if(I(A),c.size>0)c.clear();g=!0}if(E.length>0||T.length===0){if(T.length===0)b();let A=T.length>0?{...k,content:E}:k;if(I(A),A.role==="assistant")this.trackMissingToolCalls(A,l,c)}continue}b(),I(k)}return b(),g?u:i}appendMissingToolResults(i,l){if(l.size===0||!Array.isArray(i.content))return i;return{...i,role:"user",content:[...i.content,...this.createMissingToolResultBlocks(l)]}}shouldMergeUserAfterToolResults(i,l){return i?.role==="user"&&l.role==="user"&&this.isToolResultOnlyMessage(i)&&this.contentBlocksForUserMerge(l.content).length>0}contentBlocksForUserMerge(i){return typeof i==="string"?i.length>0?[{type:"text",text:i}]:[]:i}collectToolResultIds(i){let l=new Set;for(let u of i){if(!Array.isArray(u.content))continue;for(let c of u.content)if(c.type==="tool_result")l.add(c.tool_use_id)}return l}isToolResultOnlyMessage(i){return i.role==="user"&&Array.isArray(i.content)&&i.content.length>0&&i.content.every((l)=>l.type==="tool_result")}trackMissingToolCalls(i,l,u){if(!Array.isArray(i.content))return;for(let c of i.content){if(c.type!=="tool_use"||l.has(c.id))continue;u.set(c.id,c.name)}}createMissingToolResultMessage(i){return{role:"user",content:this.createMissingToolResultBlocks(i)}}createMissingToolResultBlocks(i){return Array.from(i,([l,u])=>({type:"tool_result",tool_use_id:l,name:u,content:[{type:"text",text:this.formatMissingToolResultText(u)}],is_error:!0}))}formatMissingToolResultText(i){return i?`${By} Tool: ${i}.`:By}resetIndexes(){this.indexedMessageCount=0,this.indexedTailRef=void 0,this.toolNameByIdCache.clear(),this.readLocatorsByToolUseIdCache.clear(),this.latestReadToolUseByLocatorCache.clear(),this.latestFullContentOwnerByPathCache.clear(),this.readResultLocatorCache=new WeakMap}getReadLocators(i){let l=i,u=this.readResultLocatorCache.get(l);if(u===void 0)u=this.extractReadLocatorsFromToolResultContent(i.content),this.readResultLocatorCache.set(l,u);if(u.length>0)return u;return this.readLocatorsByToolUseIdCache.get(i.tool_use_id)??[]}extractLocatorsFromReadToolInput(i){if(!i||typeof i!=="object")return[];let l=i,u=[],c=this.extractLocatorFromReadRequest(l);if(c)u.push(c);if(Array.isArray(l.files))for(let g of l.files){let b=this.extractLocatorFromReadRequest(g);if(b)u.push(b)}if(Array.isArray(l.file_paths)){for(let g of l.file_paths)if(typeof g==="string"&&g.length>0)u.push({path:g,startLine:null,endLine:null})}return this.dedupeReadLocators(u)}extractReadLocatorsFromToolResultContent(i){if(typeof i==="string")return this.tryParseReadLocators(i);let l=[];for(let u of i){if(u.type==="text"){l.push(...this.tryParseReadLocators(u.text));continue}if(Js(u)){let c=this.extractLocatorFromResultEntry(u);if(c)l.push(c)}}return this.dedupeReadLocators(l)}tryParseReadLocators(i){try{return this.extractLocatorsFromParsedReadResult(JSON.parse(i))}catch{return[]}}extractLocatorsFromParsedReadResult(i){if(Array.isArray(i)){let u=[];for(let c of i){let g=this.extractLocatorFromResultEntry(c);if(g)u.push(g)}return this.dedupeReadLocators(u)}let l=this.extractLocatorFromResultEntry(i);return l?[l]:[]}extractLocatorFromReadRequest(i){if(!i||typeof i!=="object")return;let l=i,u=this.extractPath(l);if(!u)return;return{path:u,startLine:this.extractLineNumber(l.start_line),endLine:this.extractLineNumber(l.end_line)}}extractLocatorFromResultEntry(i){if(!i||typeof i!=="object")return;let l=i,u=this.extractPath(l);if(u)return{path:u,startLine:this.extractLineNumber(l.start_line),endLine:this.extractLineNumber(l.end_line)};if(typeof l.query==="string"&&l.query.length>0)return this.parseReadQuery(l.query);return}extractPath(i){let l=[i.path,i.file_path,i.filePath];for(let u of l)if(typeof u==="string"&&u.length>0)return u;return}extractLineNumber(i){return typeof i==="number"&&Number.isInteger(i)?i:null}parseReadQuery(i){let l=/^(.*):(\d+)-(EOF|\d+)$/.exec(i);if(!l)return{path:i,startLine:null,endLine:null};return{path:l[1],startLine:Number(l[2]),endLine:l[3]==="EOF"?null:Number(l[3])}}dedupeReadLocators(i){let l=new Map;for(let u of i)l.set(this.toReadLocatorKey(u),u);return Array.from(l.values())}toReadLocatorKey(i){if(this.isFullFileRead(i))return i.path;return`${i.path}:${i.startLine??1}-${i.endLine??"EOF"}`}isFullFileRead(i){return i.startLine==null&&i.endLine==null}isOutdatedReadLocator(i,l){let u=this.latestFullContentOwnerByPathCache.get(i.path);if(u&&u!==l)return!0;return this.latestReadToolUseByLocatorCache.get(this.toReadLocatorKey(i))!==l}replaceOutdatedReadContent(i,l){let u=new Set(l.map((b)=>this.toReadLocatorKey(b))),c=new Set(l.map((b)=>b.path));if(typeof i==="string")return this.replaceOutdatedInString(i,u)??wi;let g=0;for(let b of i)if(b.type==="text")g+=this.countOutdatedImageEntries(b.text,u);return i.map((b)=>{if(b.type==="file"){if(!c.has(b.path))return b;return{...b,content:wi}}if(b.type==="image"){if(g===0)return b;return g-=1,{type:"text",text:wi}}if(Js(b))return this.replaceOutdatedReadEntry(b,u);if(b.type!=="text")return b;let I=this.replaceOutdatedInString(b.text,u);if(I===null)return{...b,text:wi};return I===b.text?b:{...b,text:I}})}countOutdatedImageEntries(i,l){let u;try{u=JSON.parse(i)}catch{return 0}let c=Array.isArray(u)?u:[u],g=0;for(let b of c){if(!b||typeof b!=="object")continue;let I=b,k=this.extractLocatorFromResultEntry(I);if(!k)continue;if(!l.has(this.toReadLocatorKey(k)))continue;if(I.result==="Successfully read image"||I.content==="Successfully read image")g+=1}return g}replaceOutdatedInString(i,l){let u;try{u=JSON.parse(i)}catch{return null}let c=Array.isArray(u)?u.map((g)=>this.replaceOutdatedReadEntry(g,l)):this.replaceOutdatedReadEntry(u,l);return JSON.stringify(c)}replaceOutdatedReadEntry(i,l){if(!i||typeof i!=="object")return i;let u=this.extractLocatorFromResultEntry(i);if(!u||!l.has(this.toReadLocatorKey(u)))return i;let c={...i};if(typeof c.result==="string")c.result=wi;else if(typeof c.content==="string")c.content=wi;else c.result=wi;return c}isReadTool(i){return!!i&&tL.has(i)}resolveToolName(i){let l=this.toolNameByIdCache.get(i.tool_use_id);if(l!==void 0)return l;return typeof i.name==="string"&&i.name.length>0?i.name.toLowerCase():void 0}truncateToolResultContent(i){if(typeof i==="string")return this.truncateMiddle(i);return i.map((l)=>{if(this.recoveryNotices.has(l))return l;if(l.type==="file"){let u=this.truncateMiddle(l.content);return u===l.content?l:{...l,content:u}}if(l.type==="text"){let u=this.truncateMiddle(l.text);return u===l.text?l:{...l,text:u}}if(Js(l))return this.truncateNestedStrings(l);return l})}truncateNestedStrings(i){if(typeof i==="string")return this.truncateMiddle(i);if(Array.isArray(i)){let l=!1,u=i.map((c)=>{let g=this.truncateNestedStrings(c);if(g!==c)l=!0;return g});return l?u:i}if(i!==null&&typeof i==="object"){if(sf(i))return i;let l=!1,u={};for(let[c,g]of Object.entries(i)){let b=this.truncateNestedStrings(g);if(b!==g)l=!0;u[c]=b}return l?u:i}return i}truncateMiddle(i){return kl(i,this.maxToolResultChars,Hy)}truncateAssistantText(i){if(this.hasRepeatedToolCallMarkup(i))return kl(i,this.maxAssistantToolMarkupChars,sL);return kl(i,this.maxAssistantTextChars,rL)}hasRepeatedToolCallMarkup(i){if(i.length<=this.maxAssistantToolMarkupChars)return!1;let l=0;for(let u of i.matchAll(nL))if(l+=1,l>=eL)return!0;return!1}truncateToTotalTextBudget(i){let l=this.countMessageTextBytes(i);if(l<=this.maxTotalTextBytes)return i;let u=i.map((b)=>{if(!Array.isArray(b.content))return{...b};return{...b,content:b.content.map((I)=>{let k=dL(I);if(I.type==="tool_result"&&k.type==="tool_result"&&Array.isArray(I.content)&&Array.isArray(k.content))I.content.forEach((T,E)=>{if(this.recoveryNotices.has(T))this.recoveryNotices.add(k.content[E])});return k})}}),c=this.collectTruncationCandidates(u),g=Math.floor(this.maxTotalTextBytes/(2*Math.max(1,c.length)));for(let b of c){if(l<=this.maxTotalTextBytes)break;let I=b.byteLength,k=Math.min(b.minBytes,g);if(I<=k)continue;let T=l-this.maxTotalTextBytes,E=Math.max(k,I-T),A=lL(b.get(),E,b.makeMarker);b.set(A),l-=I-qe(A)}return u}countMessageTextBytes(i){let l=0;for(let u of i){if(typeof u.content==="string"){l+=qe(u.content);continue}for(let c of u.content)if(c.type==="text")l+=qe(c.text);else if(c.type==="thinking")l+=qe(c.thinking);else if(c.type==="file")l+=qe(c.content);else if(c.type==="tool_use")l+=hu(c.input);else if(c.type==="tool_result"){if(typeof c.content==="string")l+=qe(c.content);else for(let g of c.content)if(g.type==="text")l+=qe(g.text);else if(g.type==="file")l+=qe(g.content);else if(Js(g))l+=hu(g)}}return l}collectTruncationCandidates(i){let l=[],u=[];for(let c of i){if(c.role==="assistant"&&typeof c.content==="string"){l.push({byteLength:qe(c.content),minBytes:jy,makeMarker:zy,get:()=>c.content,set:(g)=>{c.content=g}});continue}if(!Array.isArray(c.content))continue;for(let g of c.content){if(g.type==="tool_use"){fu(g.input,u);continue}if(c.role==="assistant"&&g.type==="text"){l.push({byteLength:qe(g.text),minBytes:jy,makeMarker:zy,get:()=>g.text,set:(b)=>{g.text=b}});continue}if(g.type!=="tool_result")continue;if(typeof g.content==="string"){l.push({byteLength:qe(g.content),minBytes:xl,makeMarker:Cl,get:()=>g.content,set:(b)=>{g.content=b}});continue}for(let b of g.content){if(this.recoveryNotices.has(b))continue;if(b.type==="text")l.push({byteLength:qe(b.text),minBytes:xl,makeMarker:Cl,get:()=>b.text,set:(I)=>{b.text=I}});else if(b.type==="file")l.push({byteLength:qe(b.content),minBytes:xl,makeMarker:Cl,get:()=>b.content,set:(I)=>{b.content=I}});else if(Js(b))fu(b,l)}}}return l.sort((c,g)=>g.byteLength-c.byteLength),u.sort((c,g)=>g.byteLength-c.byteLength),[...l,...u]}applyMediaBudget(i){let l=this.resolveMediaBudget();if(l.maxImageEncodedBytes===Number.POSITIVE_INFINITY&&l.maxImageDecodedBytes===Number.POSITIVE_INFINITY&&l.maxTotalMediaBytes===Number.POSITIVE_INFINITY)return i;let u=To(),c=!1,g=i.map((b)=>{if(!Array.isArray(b.content))return b;let I=!1,k=b.content.map((T)=>{let E=this.applyMediaBudgetToBlock(T,l,u);if(E!==T)I=!0;return E});if(!I)return b;return c=!0,{...b,content:k}});return c?g:i}resolveMediaBudget(){return ko(this.mediaBudget)}applyMediaBudgetToBlock(i,l,u){if(Hc(i))return this.limitImageContent(i,l,u);if(i.type!=="tool_result"||typeof i.content==="string")return i;let c=!1,g=i.content.map((b)=>{let I=this.applyMediaBudgetToToolResultEntry(b,l,u);if(I!==b)c=!0;return I});return c?{...i,content:g}:i}applyMediaBudgetToToolResultEntry(i,l,u){if(Hc(i))return this.limitImageContent(i,l,u);if(Js(i))return this.limitNestedMedia(i,l,u);return i}limitNestedMedia(i,l,u){if(Hc(i)){let c=this.limitImageContent(i,l,u);return c.type==="text"?c.text:c}if(Array.isArray(i)){let c=!1,g=i.map((b)=>{let I=this.limitNestedMedia(b,l,u);if(I!==b)c=!0;return I});return c?g:i}if(i!==null&&typeof i==="object"){let c=!1,g={};for(let[b,I]of Object.entries(i)){let k=this.limitNestedMedia(I,l,u);if(k!==I)c=!0;g[b]=k}return c?g:i}return i}limitImageContent(i,l,u){if(!bS(i))return{type:"text",text:hn};let c=_o(i.mediaType,i.data,{maxImageEncodedBytes:l.maxImageEncodedBytes,maxImageDecodedBytes:l.maxImageDecodedBytes,maxTotalMediaBytes:l.maxTotalMediaBytes},u);if(!c.ok)return{type:"text",text:hn};return{...i,data:c.base64,mediaType:c.mediaType}}}var Wy=String.raw`[\|\uFF5C]`,nL=new RegExp(String.raw`<\s*(?:${Wy}\s*)?DSML\s*(?:${Wy}\s*)?(?:tool_calls|invoke)\b[^>]*>|<\s*/?\s*(?:tool_calls?|tool_call|function_calls?|function_call|invoke)\b[^>]*>`,"gi");function qe(i){return Buffer.byteLength(i,"utf8")}function Ky(i){if(i===void 0)return;let l=Number.parseInt(i,10);return Number.isFinite(l)&&l>0?l:void 0}function oL(i){if(i===void 0)return;let l=i.trim().toLowerCase();if(l==="infinity"||l==="disable")return Number.POSITIVE_INFINITY;let u=Number.parseInt(i,10);return Number.isFinite(u)&&u>=0?u:void 0}function aa(i,l){return typeof i==="number"&&Number.isFinite(i)&&i>0?Math.floor(i):l}function aL(i,l){if(typeof i!=="number"||Number.isNaN(i)||i<0)return l;return Number.isFinite(i)?Math.floor(i):i}function kl(i,l,u){if(i.length<=l)return i;let c=u(i.length-l),g=Math.max(0,Math.floor((l-c.length)/2)),b=Math.max(0,i.length-g*2),I=u(b),k=Math.max(0,Math.floor((l-I.length)/2)),T=i.slice(0,k),E=k>0?i.slice(-k):"";return`${T}${I}${E}`}function lL(i,l,u){if(qe(i)<=l)return i;let c=0,g=i.length,b="";while(c<=g){let I=c+g>>>1,k=kl(i,I,u);if(qe(k)<=l)b=k,c=I+1;else g=I-1}return b}function dL(i){if(i.type==="tool_use")return{...i,input:gu(i.input)};if(i.type!=="tool_result"||typeof i.content==="string")return{...i};return{...i,content:i.content.map((l)=>Js(l)?gu(l):{...l})}}function Js(i){if(i===null||typeof i!=="object")return!1;let l=i.type;return l!=="text"&&l!=="image"&&l!=="file"}function Hc(i){return i!==null&&typeof i==="object"&&i.type==="image"}function bS(i){return i!==null&&typeof i==="object"&&i.type==="image"&&typeof i.data==="string"&&typeof i.mediaType==="string"}function sf(i){return bS(i)}function hu(i){if(typeof i==="string")return qe(i);if(Array.isArray(i)){let l=0;for(let u of i)l+=hu(u);return l}if(i!==null&&typeof i==="object"){if(sf(i))return 0;let l=0;for(let u of Object.values(i))l+=hu(u);return l}return 0}function fu(i,l){if(Array.isArray(i)){i.forEach((u,c)=>{if(typeof u==="string")l.push({byteLength:qe(u),minBytes:xl,makeMarker:Cl,get:()=>i[c],set:(g)=>{i[c]=g}});else fu(u,l)});return}if(i!==null&&typeof i==="object"){if(sf(i))return;let u=i;for(let c of Object.keys(u)){let g=u[c];if(typeof g==="string")l.push({byteLength:qe(g),minBytes:xl,makeMarker:Cl,get:()=>u[c],set:(b)=>{u[c]=b}});else fu(g,l)}}}function gu(i){if(Array.isArray(i))return i.map(gu);if(i!==null&&typeof i==="object"){let l={};for(let[u,c]of Object.entries(i))l[u]=gu(c);return l}return i}function zc(){return`conv_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}class IS{messages=[];conversationId=zc();sessionStarted=!1;constructor(i){if((i?.length??0)>0)this.restore(i??[])}getConversationId(){return this.conversationId}getMessages(){return[...this.messages]}appendMessage(i){this.messages.push(i)}appendMessages(i){if(i.length===0)return;this.messages.push(...i)}replaceMessages(i){let l=new Map(i.map((g,b)=>[g.id,b])),u=new Map,c=-1;for(let g of this.messages){let b=g.id?l.get(g.id):void 0;if(b!==void 0)c=b;else if(g.metadata?.displayOnly===!0){let I=u.get(c)??[];I.push(g),u.set(c,I)}}this.messages=[...u.get(-1)??[]];for(let[g,b]of i.entries())this.messages.push(b,...u.get(g)??[])}resetForRun(){this.messages=[],this.conversationId=zc(),this.sessionStarted=!1}clearHistory(){this.messages=[],this.conversationId=zc(),this.sessionStarted=!1}restore(i){this.messages=[...i],this.sessionStarted=!1}isSessionStarted(){return this.sessionStarted}markSessionStarted(){this.sessionStarted=!0}}var ic="0.2.0",zl={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:ic,repository:{type:"git",url:"https://github.com/cline/cline",directory:"sdk/packages/core"},type:"module",types:"./dist/index.d.ts",main:"./dist/index.js",private:!1,publishConfig:{access:"public"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./hub":{types:"./dist/hub/index.d.ts",import:"./dist/hub/index.js"},"./hub/daemon-entry":{types:"./dist/hub/daemon/entry.d.ts",import:"./dist/hub/daemon/entry.js"},"./telemetry":{types:"./dist/services/telemetry/index.d.ts",import:"./dist/services/telemetry/index.js"},"./services/feature-flags/posthog":{types:"./dist/services/feature-flags/posthog.d.ts",import:"./dist/services/feature-flags/posthog.js"},"./cloud":{types:"./dist/cloud/index.d.ts",import:"./dist/cloud/index.js"}},scripts:{build:"bun run ./bun.mts && bun tsc -p tsconfig.build.json && bun run ./scripts/verify-runtime-build-id.ts",typecheck:"bun tsc -p tsconfig.dev.json --noEmit && bun run typecheck:smoke","typecheck:smoke":"bun tsc -p tsconfig.smoke.json --noEmit",test:"bun run test:unit && bun run test:e2e","test:live":"vitest run --config vitest.config.ts src/extensions/context/compaction.live.test.ts","test:compaction":"bun --conditions=development run scripts/compact-session.ts","test:unit":"vitest run --config vitest.config.ts","test:e2e":"vitest run --config vitest.e2e.config.ts","verify:routines":"zsh -lc 'bunx vitest run src/cron/schedule-service.test.ts --config vitest.config.ts'","test:watch":"vitest --config vitest.config.ts"},dependencies:{"@cline/agents":"workspace:*","@cline/shared":"workspace:*","@cline/llms":"workspace:*","@modelcontextprotocol/sdk":"^1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.214.0","@opentelemetry/exporter-logs-otlp-http":"^0.214.0","@opentelemetry/exporter-metrics-otlp-http":"^0.214.0","@opentelemetry/exporter-trace-otlp-http":"^0.214.0","@opentelemetry/resources":"^2.6.1","@opentelemetry/sdk-logs":"^0.214.0","@opentelemetry/sdk-metrics":"^2.6.1","@opentelemetry/sdk-trace-base":"^2.6.1","@opentelemetry/sdk-trace-node":"^2.6.1","@opentelemetry/semantic-conventions":"^1.40.0","http-proxy-agent":"^7.0.2","https-proxy-agent":"^7.0.6",jiti:"^2.7.0","node-machine-id":"^1.1.12",nanoid:"^5.1.7","proxy-from-env":"^2.1.0","simple-git":"3.36.0",ws:"^8.20.0",yaml:"^2.8.2",zod:"^4.3.6"},peerDependencies:{"posthog-node":"^5.8.0"},peerDependenciesMeta:{"posthog-node":{optional:!0}},devDependencies:{"@types/proxy-from-env":"^1.0.4","@types/ws":"^8.18.1","posthog-node":"^5.8.0",skills:"1.7.2"},engines:{node:">=22"},files:["dist","!dist/**/*.d.ts.map"]};function uL(i){let{agentConfig:l}=i,u=cL(l),c=pL(l),g=i.hooks,b=mL(l.maxParallelToolCalls);return{distinctId:l.distinctId,clientName:l.extensionContext?.client?.name,clientVersion:l.extensionContext?.client?.version,clineCoreVersion:ic,sessionId:i.sessionId??l.sessionId,agentId:i.agentId,conversationId:i.conversationId,parentAgentId:i.parentAgentId,agentRole:i.agentRole,systemPrompt:i.systemPrompt??l.systemPrompt,messageModelInfo:c,model:i.model,modelOptions:u,modelTools:l.modelTools,tools:i.tools,hooks:g,prepareTurn:i.prepareTurn,consumePendingUserMessage:l.consumePendingUserMessage,plugins:i.plugins,logger:i.logger??l.logger,telemetry:i.telemetry??l.telemetry,runEndTelemetryProperties:i.runEndTelemetryProperties,initialMessages:i.initialMessages,completionPolicy:i.completionPolicy===null?void 0:i.completionPolicy??l.completionPolicy,maxIterations:l.maxIterations,toolExecution:b,toolPolicies:l.toolPolicies,toolContextMetadata:i.toolContextMetadata,requestToolApproval:l.requestToolApproval}}function cL(i){let l={};if(i.thinking!==void 0)l.thinking=i.thinking;if(i.reasoningEffort!==void 0)l.reasoningEffort=i.reasoningEffort;if(i.thinkingBudgetTokens!==void 0)l.thinkingBudgetTokens=i.thinkingBudgetTokens;if(i.maxTokensPerTurn!==void 0)l.maxTokensPerTurn=i.maxTokensPerTurn;if(i.temperature!==void 0)l.temperature=i.temperature;if(i.apiTimeoutMs!==void 0)l.apiTimeoutMs=i.apiTimeoutMs;return Object.keys(l).length>0?l:void 0}function pL(i){let l=i.providerConfig?.family;return{id:i.modelId,provider:i.providerId,family:l}}function mL(i){if(i===void 0)return;return i>=2?"parallel":"sequential"}function nf(i){let l={...i},u=Object.hasOwn(i,"thinking"),c=Object.hasOwn(i,"thinkingBudgetTokens");if(i.thinking===!1||i.thinking===null)return l.reasoningEffort=void 0,l.thinkingBudgetTokens=void 0,l;if(!u&&c&&typeof i.thinkingBudgetTokens==="number"&&Number.isFinite(i.thinkingBudgetTokens)&&i.thinkingBudgetTokens>0)l.thinking=!0;return l}function hL(){return{lastToolName:"",lastToolSignature:"",consecutiveIdenticalCount:0}}function fL(i){i.lastToolName="",i.lastToolSignature="",i.consecutiveIdenticalCount=0}function Sm(i){if(i==null||typeof i!=="object")return i;if(Array.isArray(i))return i.map(Sm);let l={};for(let u of Object.keys(i).sort())l[u]=Sm(i[u]);return l}function gL(i){if(i==null)return"null";if(typeof i==="string")return i;if(typeof i!=="object")return String(i);try{return JSON.stringify(Sm(i))}catch{return String(i)}}function yL(i,l,u,c){if(l===i.lastToolName&&u===i.lastToolSignature)i.consecutiveIdenticalCount++;else i.consecutiveIdenticalCount=1;return i.lastToolName=l,i.lastToolSignature=u,{softWarning:i.consecutiveIdenticalCount===c.softThreshold,hardEscalation:i.consecutiveIdenticalCount>=c.hardThreshold}}var Gy={softThreshold:3,hardThreshold:5};class kS{config;state=hL();constructor(i){this.config={softThreshold:i?.softThreshold??Gy.softThreshold,hardThreshold:i?.hardThreshold??Gy.hardThreshold}}inspect(i){let l=gL(i.input),u=yL(this.state,i.name,l,this.config);if(u.hardEscalation)return{kind:"hard",message:`Detected ${this.state.consecutiveIdenticalCount} consecutive identical calls to \`${i.name}\`; stopping to avoid a loop.`};if(u.softWarning)return{kind:"soft",message:`Detected ${this.state.consecutiveIdenticalCount} consecutive identical calls to \`${i.name}\`; consider trying a different approach.`};return{kind:"ok"}}reset(){fL(this.state)}}class SS{consecutiveMistakes=0;options;constructor(i){this.options=i}async record(i){let l=this.options.maxConsecutiveMistakes,u=i.forceAtLimit&&l?l:this.consecutiveMistakes+1;this.consecutiveMistakes=u;let c=i.details?.trim()||`consecutive mistake (${i.reason})`;if(this.options.emit({type:"error",error:Error(c),recoverable:!0,iteration:i.iteration}),this.options.log("warn","Recorded consecutive mistake",{agentId:this.options.agentId,conversationId:this.options.getConversationId(),runId:this.options.getActiveRunId(),iteration:i.iteration,reason:i.reason,details:i.details,consecutiveMistakes:u,maxConsecutiveMistakes:this.options.maxConsecutiveMistakes}),!l||u<l)return{action:"continue"};let g={iteration:i.iteration,consecutiveMistakes:u,maxConsecutiveMistakes:l,reason:i.reason,details:i.details};this.options.onLimitTelemetry?.(g);let b=await wL(g,this.options.onLimitReached);if(b.action==="continue"){let I=b.guidance?.trim();if(I)this.options.appendRecoveryNotice(I,i.reason);return this.consecutiveMistakes=0,{action:"continue",guidance:I}}return{action:"stop",reason:b.reason?.trim()||void 0,message:vL({iteration:i.iteration,consecutiveMistakes:u,maxConsecutiveMistakes:l,reason:i.reason,details:i.details,stopReason:b.reason})}}reset(){this.consecutiveMistakes=0}get value(){return this.consecutiveMistakes}}function vL(i){let l=[`Stopped after ${i.consecutiveMistakes}/${i.maxConsecutiveMistakes} consecutive mistakes (${i.reason}) at iteration ${i.iteration}.`],u=i.details?.trim();if(u)l.push(`Error: ${u}`);let c=i.stopReason?.trim();if(c)l.push(`Decision: ${c}`);return l.push("Session state was preserved. Send a new prompt to resume from the latest state."),l.join(" ")}async function wL(i,l){if(!l)return{action:"stop",reason:`maximum consecutive mistakes reached (${i.maxConsecutiveMistakes})`};try{return await l(i)}catch(u){return{action:"stop",reason:u instanceof Error?u.message:`maximum consecutive mistakes reached (${i.maxConsecutiveMistakes})`}}}function bL(i){switch(i){case"auto_compaction":case"manual_compaction":case"compaction_budget_emergency":return i;default:return}}function IL(i){let l=i.content.filter((u)=>u.type==="text");if(l.length===0)return;return l.map((u)=>u.text).join("")}function kL(i){let l=i.content.filter((u)=>u.type==="reasoning");if(l.length===0)return;return{reasoning:l.map((u)=>u.text).join(""),redacted:l.some((u)=>u.redacted===!0)}}function SL(i){return i.content.find((l)=>l.type==="tool-result")}function TL(i){switch(i){case"completed":return"completed";case"aborted":return"aborted";case"failed":return"error"}}function _L(i){if(!i||i.isError!==!0)return;if(typeof i.output==="string")return i.output;if(i.output instanceof Error)return i.output.message;try{return JSON.stringify(i.output)}catch{return String(i.output)}}class TS{lastUsage={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalCost:0,reasoningTokenCount:0};toolStartedAt=new Map;translate(i){switch(i.type){case"run-started":return[];case"message-added":return[];case"turn-started":return[{type:"iteration_start",iteration:i.iteration}];case"turn-finished":return[{type:"iteration_end",iteration:i.iteration,hadToolCalls:i.toolCallCount>0,toolCallCount:i.toolCallCount}];case"assistant-text-delta":return[{type:"content_start",contentType:"text",text:i.text,accumulated:i.accumulatedText}];case"assistant-reasoning-delta":return[{type:"content_start",contentType:"reasoning",reasoning:i.text,redacted:i.redacted===!0}];case"assistant-media":return[{type:"content_end",contentType:"media",media:i.media}];case"assistant-message":return this.translateAssistantMessage(i.message);case"tool-started":return this.translateToolStarted(i);case"tool-call-delta":return[];case"tool-updated":return[{type:"content_update",contentType:"tool",toolName:i.toolCall.toolName,toolCallId:i.toolCall.toolCallId,update:i.update}];case"tool-finished":return this.translateToolFinished(i);case"usage-updated":return this.translateUsage(i.usage);case"status-notice":return[{type:"notice",noticeType:"status",displayRole:"status",message:i.message,reason:bL(i.metadata?.reason),metadata:i.metadata}];case"run-finished":return this.translateRunFinished(i.result);case"run-failed":return[{type:"error",error:i.error,errorClass:i.errorClass,recoverable:!1,iteration:i.snapshot.iteration}];default:return i}}reset(){this.lastUsage={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalCost:0,reasoningTokenCount:0},this.toolStartedAt.clear()}translateAssistantMessage(i){let l=[],u=IL(i);if(u!==void 0)l.push({type:"content_end",contentType:"text",text:u});let c=kL(i);if(c!==void 0)l.push({type:"content_end",contentType:"reasoning",reasoning:c.reasoning});return l}translateToolStarted(i){return this.toolStartedAt.set(i.toolCall.toolCallId,Date.now()),[{type:"content_start",contentType:"tool",toolName:i.toolCall.toolName,toolCallId:i.toolCall.toolCallId,input:i.toolCall.input,execution:i.toolCall.execution}]}translateToolFinished(i){let l=this.toolStartedAt.get(i.toolCall.toolCallId),u=l===void 0?void 0:Date.now()-l;this.toolStartedAt.delete(i.toolCall.toolCallId);let c=SL(i.message),g=c?.output,b=_L(c);return[{type:"content_end",contentType:"tool",toolName:i.toolCall.toolName,toolCallId:i.toolCall.toolCallId,output:g,error:b,durationMs:u,execution:i.toolCall.execution}]}translateUsage(i){let l=i.inputTokens-this.lastUsage.inputTokens,u=i.outputTokens-this.lastUsage.outputTokens,c=i.cacheReadTokens-this.lastUsage.cacheReadTokens,g=i.cacheWriteTokens-this.lastUsage.cacheWriteTokens,b=this.lastUsage.totalCost??0,I=(i.totalCost??0)-b,k=this.lastUsage.reasoningTokenCount??0,T=(i.reasoningTokenCount??0)-k;return this.lastUsage={inputTokens:i.inputTokens,outputTokens:i.outputTokens,cacheReadTokens:i.cacheReadTokens,cacheWriteTokens:i.cacheWriteTokens,totalCost:i.totalCost,reasoningTokenCount:i.reasoningTokenCount},[{type:"usage",inputTokens:Math.max(0,l),outputTokens:Math.max(0,u),cacheReadTokens:c===0?void 0:Math.max(0,c),cacheWriteTokens:g===0?void 0:Math.max(0,g),cost:I===0?void 0:I,reasoningTokenCount:T===0?void 0:Math.max(0,T),totalInputTokens:i.inputTokens,totalOutputTokens:i.outputTokens,totalCacheReadTokens:i.cacheReadTokens===0?void 0:i.cacheReadTokens,totalCacheWriteTokens:i.cacheWriteTokens===0?void 0:i.cacheWriteTokens,totalCost:i.totalCost}]}translateRunFinished(i){let l={inputTokens:i.usage.inputTokens,outputTokens:i.usage.outputTokens,cacheReadTokens:i.usage.cacheReadTokens===0?void 0:i.usage.cacheReadTokens,cacheWriteTokens:i.usage.cacheWriteTokens===0?void 0:i.usage.cacheWriteTokens,totalCost:i.usage.totalCost};return[{type:"done",reason:TL(i.status),text:i.outputText,iterations:i.iterations,usage:l}]}}var EL="session_run_in_progress";class _S extends Error{agentId;code=EL;constructor(i){super(`SessionRuntime.shutdown called while a run is in progress${i?` (agentId=${i})`:""}`);this.agentId=i,this.name="SessionRunInProgressError"}}function AL(i){if(typeof i==="string")return i;if(i instanceof Error)return i.message;try{return JSON.stringify(i)}catch{return String(i)}}async function xL(i){let l=(typeof i.content==="function"?await i.content():i.content).trim();return l.length>0?l:void 0}function CL(i,l){let u=i.trim(),c=l.map((g)=>g.trim()).filter(Boolean).join(`
|
|
260
|
+
|
|
261
|
+
`);if(u&&c)return`${u}
|
|
262
|
+
|
|
263
|
+
${c}`;return u||c}function RL(i,l){let u=l?.["*"]??{},c=l?.[i]??{};return{...u,...c}.enabled!==!1}function PL(i,l){return i.filter((u)=>RL(u.name,l))}function Xy(i,l){return Xu(PL(i,l))}function ML(i){let l=i.filter((u)=>u!==void 0);if(l.length===0)return{};return{beforeRun:async(u)=>{let c;for(let g of l){let b=await g.beforeRun?.(u);if(!b)continue;if(b.stop)return b;let I=[c?.appendContext,b.appendContext].filter((k)=>Boolean(k?.trim())).join(`
|
|
264
|
+
|
|
265
|
+
`);c={...c,...b,appendContext:I||void 0}}return c},afterRun:async(u)=>{for(let c of l)await c.afterRun?.(u)},beforeModel:async(u)=>{let c=u.request,g;for(let b of l){let I=await b.beforeModel?.({...u,request:c});if(!I)continue;if(I.stop)return I;g={...g,...I,options:Mn(g?.options,I.options)},c={...c,...I.messages?{messages:I.messages}:{},...I.tools?{tools:I.tools}:{},...I.options?{options:Mn(c.options,I.options)}:{}}}return g},afterModel:async(u)=>{for(let c of l){let g=await c.afterModel?.(u);if(g?.stop)return g}return},beforeTool:async(u)=>{let c=u.input,g;for(let b of l){let I=await b.beforeTool?.({...u,input:c});if(!I)continue;if(I.stop||I.skip)return I;if(g={...g,...I},Object.hasOwn(I,"input"))c=I.input}return g},afterTool:async(u)=>{let c=u.result,g;for(let b of l){let I=await b.afterTool?.({...u,result:c});if(!I)continue;if(I.stop)return I;if(g={...g,...I},I.result)c=I.result}return g},onEvent:async(u)=>{for(let c of l)await c.onEvent?.(u)}}}class nc{config;agentId;parentAgentId;logger;telemetry;conversation;toolResultCache;cacheableToolNames=new Set;maxCachedResultChars;pendingTerminalError;mistakeTracker;loopTracker;loopDetectionDisabled;messageBuilder;contributionRegistry;extensionsInitialized=!1;listeners=new Set;createAgentRuntimeImpl;activeRunId=null;running=!1;abortRequested=!1;abortReason;activeRuntime=null;activeRunPromise=null;eventAdapter=new TS;shutdownCalled=!1;currentRunToolCalls=[];currentRunUsage={inputTokens:0,outputTokens:0};toolStartedAt=new Map;toolInputs=new Map;currentTurnSuccessfulTools=0;currentTurnFailedTools=0;currentTurnFailureDetails=[];activeTrackerWork=Promise.resolve();trackerAbortInFlight=!1;trackerStopReason;handleExternalAbort=()=>{this.abort(this.config.abortSignal?.reason)};constructor(i,l={}){this.config=i,this.agentId=`agent_${N$()}`,this.parentAgentId=i.parentAgentId,this.logger=l.logger??i.logger,this.telemetry=l.telemetry??i.telemetry,this.createAgentRuntimeImpl=l.createAgentRuntimeImpl??On,this.conversation=new IS(i.initialMessages),this.toolResultCache=new ef(i.sessionId??this.agentId);let u=iL();this.maxCachedResultChars=u.maxToolResultChars??vS,this.messageBuilder=new wS({...u,getToolResultRecovery:(I)=>this.cacheableToolNames.has(I.name??"")?{uri:this.toolResultCache.uriFor(I.tool_use_id)}:void 0}),this.contributionRegistry=Ut({extensions:i.extensions?[...i.extensions]:[],setupContext:{session:i.extensionContext?.session,client:i.extensionContext?.client,user:i.extensionContext?.user,workspaceInfo:i.extensionContext?.workspace,automation:i.extensionContext?.automation,logger:i.extensionContext?.logger??this.logger,telemetry:i.extensionContext?.telemetry??this.telemetry}}),this.contributionRegistry.resolve(),this.contributionRegistry.validate();let c=i.execution?.maxConsecutiveMistakes??6;this.mistakeTracker=new SS({maxConsecutiveMistakes:c,onLimitReached:i.onConsecutiveMistakeLimitReached,onLimitTelemetry:(I)=>{PA(this.telemetry,{ulid:this.config.sessionId??this.conversation.getConversationId(),model:this.config.modelId,provider:this.config.providerId,reason:I.reason,consecutiveMistakes:I.consecutiveMistakes,maxConsecutiveMistakes:I.maxConsecutiveMistakes,agentId:this.agentId,conversationId:this.conversation.getConversationId(),parentAgentId:this.parentAgentId,isSubagent:Boolean(this.parentAgentId)})},emit:(I)=>this.emitLegacyEvent(I),log:(I,k,T)=>NL(this.logger,I,k,T),agentId:this.agentId,getConversationId:()=>this.conversation.getConversationId(),getActiveRunId:()=>this.activeRunId??"",appendRecoveryNotice:(I,k)=>{this.conversation.appendMessage({role:"user",content:[{type:"text",text:I}]})}});let g=i.execution?.loopDetection;this.loopDetectionDisabled=g===!1;let b=g===!1||g===void 0?void 0:g;this.loopTracker=new kS(b)}getAgentId(){return this.agentId}getConversationId(){return this.conversation.getConversationId()}getMessages(){return this.conversation.getMessages()}canStartRun(){return!this.running&&!this.activeRunPromise&&!this.shutdownCalled}getExtensionRegistry(){return this.contributionRegistry.getRegistrySnapshot()}addTools(i){if(i.length===0)return;let l=new Set(this.config.tools.map((c)=>c.name)),u=[...this.config.tools];for(let c of i)if(!l.has(c.name))u.push(c),l.add(c.name);this.config={...this.config,tools:u}}updateConnection(i){let l=nf(i),u={...this.config};if(l.providerId!==void 0)u.providerId=l.providerId;if(l.modelId!==void 0)u.modelId=l.modelId;if(l.apiKey!==void 0)u.apiKey=l.apiKey;if(l.baseUrl!==void 0)u.baseUrl=l.baseUrl;if(l.headers!==void 0)u.headers=l.headers;if(l.providerConfig!==void 0)u.providerConfig=l.providerConfig;if(Object.hasOwn(l,"reasoningEffort"))u.reasoningEffort=l.reasoningEffort??void 0;if(Object.hasOwn(l,"thinkingBudgetTokens"))u.thinkingBudgetTokens=l.thinkingBudgetTokens??void 0;if(Object.hasOwn(l,"thinking")){if(u.thinking=l.thinking??void 0,l.thinking===!1||l.thinking===null)u.reasoningEffort=void 0,u.thinkingBudgetTokens=void 0}this.config=u}clearHistory(){this.conversation.clearHistory(),this.resetConversationBoundaryTrackers()}restore(i){this.conversation.restore(i),this.resetConversationBoundaryTrackers()}resetConversationBoundaryTrackers(){this.toolResultCache.clear(),this.messageBuilder.resetConversationState(),this.mistakeTracker.reset(),this.loopTracker.reset()}subscribeEvents(i){return this.listeners.add(i),()=>{this.listeners.delete(i)}}notifyPendingUserMessage(){this.activeRuntime?.notifyPendingUserMessage()}abort(i){let l=typeof i==="string"?i:i instanceof Error?i.message:i===void 0?void 0:String(i);if(this.abortRequested=!0,this.abortReason=l,this.activeRunPromise)this.activeRunPromise.catch(()=>{});this.activeRuntime?.abort(l)}async shutdown(i,l){if(this.running){if(!this.abortRequested||!this.activeRunPromise)throw new _S(this.agentId);await this.activeRunPromise}if(this.shutdownCalled)return;this.shutdownCalled=!0,this.toolResultCache.clear()}run(i,l,u){let c=this.getRunAdmissionError();if(c)return Promise.reject(c);return this.conversation.resetForRun(),this.resetConversationBoundaryTrackers(),this.executeRun({userMessage:i,userImages:l,userFiles:u,isContinue:!1})}continue(i,l,u){let c=this.getRunAdmissionError();if(c)return Promise.reject(c);return this.executeRun({userMessage:i,userImages:l,userFiles:u,isContinue:!0})}async composeSystemPrompt(i){let l=[];for(let u of this.contributionRegistry.getRegisteredRules()){if(u.whenToolAvailable&&!i.has(u.whenToolAvailable))continue;let c=await xL(u);if(c)l.push(c)}return CL(this.config.systemPrompt,l)}getRunAdmissionError(){if(this.shutdownCalled)return Error(`SessionRuntime.run called after shutdown (agentId=${this.agentId})`);if(this.running||this.activeRunPromise)return Error(`SessionRuntime state is "running"; call canStartRun() first (agentId=${this.agentId})`);return}executeRun(i){let l;return l=this.executeRunWithAuthRetry(i).then((u)=>{if(u.finishReason==="error")return this.recordTerminalError(u.text,"result"),{...u,messages:this.conversation.getMessages()};return this.pendingTerminalError=void 0,u},(u)=>{throw this.recordTerminalError(u instanceof Error?u.message:String(u),"thrown"),u}).finally(()=>{if(this.activeRunPromise===l)this.activeRunPromise=null}),this.activeRunPromise=l,l}recordTerminalError(i,l){this.conversation.appendMessage({id:`error_${crypto.randomUUID()}`,role:"assistant",content:[{type:"text",text:i}],ts:Date.now(),metadata:{displayOnly:!0,displayRole:"error"},modelInfo:{id:this.config.modelId,provider:this.config.providerId}});let u=this.pendingTerminalError;this.pendingTerminalError=void 0,this.emitLegacyEvent(u?.error.message===i?u:{type:"error",error:Error(i),recoverable:!1,iteration:0});try{zA(this.telemetry,{sessionId:this.config.sessionId,provider:this.config.providerId,model:this.config.modelId,source:l})}catch{}}async executeRunWithAuthRetry(i){let l=await this.executeRunInternal(i);if(l.finishReason!=="error"||!this.config.onAuthError||!Si(l.text))return l;if(!await this.config.onAuthError().catch(()=>!1))return l;let u=await this.executeRunInternal({isContinue:!0});return kA(this.telemetry,this.config.providerId,{recovered:u.finishReason!=="error"}),u}async executeRunInternal(i){if(this.shutdownCalled)throw Error(`SessionRuntime.run called after shutdown (agentId=${this.agentId})`);if(this.running)throw Error(`SessionRuntime state is "running"; call canStartRun() first (agentId=${this.agentId})`);this.running=!0,this.abortRequested=!1,this.abortReason=void 0,this.activeRunId=`run_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,await this.initializeExtensions(),this.eventAdapter.reset(),this.currentRunToolCalls=[],this.currentRunUsage={inputTokens:0,outputTokens:0},this.toolStartedAt.clear(),this.toolInputs.clear(),this.currentTurnSuccessfulTools=0,this.currentTurnFailedTools=0,this.currentTurnFailureDetails=[],this.activeTrackerWork=Promise.resolve(),this.trackerAbortInFlight=!1,this.trackerStopReason=void 0;let l=new Date,u=i.userMessage;if(u!==void 0){let z=await $L(u,i.userImages,i.userFiles,this.config.userFileContentLoader);this.conversation.appendMessage({id:crypto.randomUUID(),role:"user",content:z})}let c=gP(this.config,this.logger,this.telemetry),g=new Map;for(let z of this.contributionRegistry.getRegisteredTools())g.set(z.name,z);let b=Xy([...g.values()],this.config.toolPolicies),I=new Map;for(let z of b)I.set(z.name,z);for(let z of this.config.tools)I.set(z.name,z);let k=this.conversation.getConversationId(),T=Jy(this.config),E=tr(T??{})||!ir(T??{}),A=Xy(Array.from(I.values()),this.config.toolPolicies),C=E?[]:A,N=await this.composeSystemPrompt(new Set(C.map((z)=>z.name))),O=Nc(this.conversation.getMessages());this.cacheableToolNames=new Set(C.filter((z)=>z.resultPolicy==="cache-oversized").map((z)=>z.name.toLowerCase()));let L=this.telemetry&&new yS(this.telemetry,{sessionId:this.config.sessionId,isSubagent:Boolean(this.parentAgentId),providerId:this.config.providerId,modelId:this.config.modelId}),D=uL({agentConfig:this.config,sessionId:this.config.sessionId,agentId:this.agentId,conversationId:k,parentAgentId:this.parentAgentId,model:c,logger:this.logger,telemetry:this.telemetry,runEndTelemetryProperties:L?()=>L.endProperties():void 0,tools:C,toolContextMetadata:{modelSupportsImages:nr(T??{}),...this.config.toolContextMetadata,toolResultCache:this.toolResultCache},hooks:this.createRuntimeHooks(),prepareTurn:this.createRuntimePrepareTurn(T,C),initialMessages:O,completionPolicy:E?null:void 0,systemPrompt:N}),U=this.createAgentRuntimeImpl(D);this.activeRuntime=U;let F=U.subscribe((z)=>{if(z.type==="run-started"&&this.abortRequested)U.abort(this.abortReason);L?.observe(z),this.handleRuntimeEvent(z)});if(this.config.abortSignal)if(this.config.abortSignal.aborted)this.handleExternalAbort();else this.config.abortSignal.addEventListener("abort",this.handleExternalAbort,{once:!0});let j,H;try{if(i.isContinue)j=await U.continue(void 0);else j=await U.run("")}catch(z){H=z instanceof Error?z:Error(String(z))}finally{F(),L?.dispose(),this.config.abortSignal?.removeEventListener("abort",this.handleExternalAbort);try{await this.activeTrackerWork}catch(z){this.logger?.error?.("SessionRuntime tracker work failed during drain",{agentId:this.agentId,error:z})}this.activeRuntime=null,this.running=!1,this.abortRequested=!1,this.abortReason=void 0}if(j&&j.messages.length>0){let z=ld(j.messages);this.conversation.replaceMessages(z)}let Q=new Date;try{return this.buildLegacyResult({runResult:j,thrownError:H,startedAt:l,endedAt:Q})}finally{this.activeRunId=null}}extensionInitialization;async initializeExtensions(){return this.extensionInitialization??=this.ensureExtensionsInitialized().catch((i)=>{throw this.extensionInitialization=void 0,i}),this.extensionInitialization}async ensureExtensionsInitialized(){if(this.extensionsInitialized)return;try{await this.contributionRegistry.initialize({tolerateSetupErrors:this.config.hookErrorMode!=="throw"})}catch(i){if(this.config.hookErrorMode==="throw")throw i;this.emitLegacyEvent({type:"error",error:i instanceof Error?i:Error(String(i)),recoverable:!0,iteration:0})}this.extensionsInitialized=!0}createRuntimeHooks(){let i=ML([this.config.hooks,...this.contributionRegistry.getValidatedExtensions().map((u)=>u.hooks)]),l=async()=>(await this.activeTrackerWork.catch(()=>{return}),this.trackerAbortInFlight?{stop:!0,reason:this.trackerStopReason}:void 0);return{...i,beforeTool:async(u)=>{let c=await l();if(c)return c;return i.beforeTool?.(u)},afterTool:async(u)=>{let c=await l();if(c)return c;let g=await i.afterTool?.(u),b=g?.result??u.result;if(u.tool.resultPolicy==="cache-oversized"){let{text:I}=dS(yk(b.output));if(typeof I==="string"&&I.length>this.maxCachedResultChars){let{text:k}=$O(b.output);if(typeof k==="string")this.toolResultCache.store(u.toolCall.toolCallId,k)}}return g},beforeModel:async(u)=>{let c=await l();if(c)return c;let g=await i.beforeModel?.(u);if(g?.stop)return g;let b=g?.messages??u.request.messages,I=await this.prepareMessagesForModelRequest(b);return{...g,messages:I}}}}createRuntimePrepareTurn(i,l){let u=this.config.prepareTurn;if(!u)return;return async(c)=>{let g=ld(c.messages),b=await this.prepareProviderMessagesForApi(g),I=await u({agentId:c.agentId,conversationId:c.conversationId??this.conversation.getConversationId(),parentAgentId:c.parentAgentId??null,iteration:c.iteration,messages:g,apiMessages:b,abortSignal:c.signal??new AbortController().signal,systemPrompt:c.systemPrompt??"",tools:l,model:{id:this.config.modelId,provider:this.config.providerId,info:i},overflowRecovery:c.overflowRecovery,previousRequestInputTokens:c.previousRequestInputTokens,emitStatusNotice:c.emitStatusNotice});if(!I)return;return{...I.messages?{messages:Nc(I.messages)}:{},...I.systemPrompt!==void 0?{systemPrompt:I.systemPrompt}:{}}}}async prepareMessagesForModelRequest(i){let l=await this.prepareProviderMessagesForApi(vk(i));return Nc(l)}async prepareProviderMessagesForApi(i){let l=i,u=this.contributionRegistry.getRegistrySnapshot().messageBuilder;for(let c of u)l=await c.build(l);return this.messageBuilder.buildForApi(l)}handleRuntimeEvent(i){switch(i.type){case"message-added":case"assistant-message":{this.syncConversationFromRuntimeMessage(i.snapshot.messages,[i.message]);break}case"turn-started":{this.toolResultCache.advanceIteration(),this.currentTurnSuccessfulTools=0,this.currentTurnFailedTools=0,this.currentTurnFailureDetails=[];break}case"tool-started":{if(this.toolStartedAt.set(i.toolCall.toolCallId,new Date),this.toolInputs.set(i.toolCall.toolCallId,i.toolCall.input),i.toolCall.execution)break;this.inspectLoopForToolCall(i.toolCall.toolName,i.toolCall.input,i.iteration);break}case"tool-finished":{let l=this.toolStartedAt.get(i.toolCall.toolCallId),u=new Date,c=this.toolInputs.get(i.toolCall.toolCallId);this.toolStartedAt.delete(i.toolCall.toolCallId),this.toolInputs.delete(i.toolCall.toolCallId);let g=i.message.content.find((T)=>T.type==="tool-result"),b=g?.type==="tool-result"&&g.isError===!0,I=b?AL(g?.type==="tool-result"?g.output:void 0):void 0,k={id:i.toolCall.toolCallId,name:i.toolCall.toolName,execution:i.toolCall.execution,input:c,output:g?.type==="tool-result"?g.output:void 0,error:I,durationMs:l===void 0?0:u.getTime()-l.getTime(),startedAt:l??u,endedAt:u};if(this.currentRunToolCalls.push(k),i.toolCall.execution)break;if(b){if(this.currentTurnFailedTools+=1,I)this.currentTurnFailureDetails.push(`[${i.toolCall.toolName}] ${I}`)}else this.currentTurnSuccessfulTools+=1;break}case"turn-finished":{let l=this.currentTurnFailedTools,u=this.currentTurnSuccessfulTools;if(l>0&&u===0){let c=this.currentTurnFailureDetails.join("; ");this.enqueueMistakeRecord({iteration:i.iteration,reason:"tool_execution_failed",details:`${l} tool call(s) failed${c?`: ${c}`:""}`})}else if(u>0)this.mistakeTracker.reset();break}case"usage-updated":{this.currentRunUsage={inputTokens:i.usage.inputTokens,outputTokens:i.usage.outputTokens,cacheReadTokens:i.usage.cacheReadTokens>0?i.usage.cacheReadTokens:void 0,cacheWriteTokens:i.usage.cacheWriteTokens>0?i.usage.cacheWriteTokens:void 0,totalCost:i.usage.totalCost};break}default:break}for(let l of this.eventAdapter.translate(i)){if(l.type==="error"&&!l.recoverable){this.pendingTerminalError=l;continue}this.emitLegacyEvent(l)}}syncConversationFromRuntimeMessage(i,l){if(i.length>0){this.conversation.replaceMessages(ld(i));return}if(l.length===0)return;let u=new Set(this.conversation.getMessages().map((g)=>g.id).filter((g)=>typeof g==="string")),c=ld(l).filter((g)=>!g.id||!u.has(g.id));if(c.length===0)return;this.conversation.replaceMessages([...this.conversation.getMessages(),...c])}emitLegacyEvent(i){for(let l of this.listeners)try{l(i)}catch(u){this.logger?.error?.("SessionRuntime event listener threw",{agentId:this.agentId,error:u})}}inspectLoopForToolCall(i,l,u){if(this.trackerAbortInFlight||this.loopDetectionDisabled)return;let c=this.loopTracker.inspect({name:i,input:l});if(c.kind==="ok")return;if(c.kind==="soft"){if(c.message)this.conversation.appendMessage({role:"user",content:[{type:"text",text:c.message}]});return}this.enqueueMistakeRecord({iteration:u,reason:"tool_execution_failed",forceAtLimit:!0,details:c.message??`Detected repeated tool calls to \`${i}\`; stopping to avoid a loop.`})}enqueueMistakeRecord(i){if(this.trackerAbortInFlight)return;this.activeTrackerWork=this.activeTrackerWork.then(async()=>{if(this.trackerAbortInFlight)return;let l=await this.mistakeTracker.record(i);if(l.action==="stop")this.trackerAbortInFlight=!0,this.trackerStopReason=l.reason??l.message,this.conversation.appendMessage({role:"user",content:[{type:"text",text:l.message}]}),this.activeRuntime?.abort(l.reason??l.message)})}buildLegacyResult(i){let{runResult:l,thrownError:u,startedAt:c,endedAt:g}=i,b=g.getTime()-c.getTime(),I=u?"error":OL(l),k=(l?.status==="failed"?l.error?.message:void 0)||l?.outputText||"",T=l?{inputTokens:l.usage.inputTokens,outputTokens:l.usage.outputTokens,cacheReadTokens:l.usage.cacheReadTokens>0?l.usage.cacheReadTokens:void 0,cacheWriteTokens:l.usage.cacheWriteTokens>0?l.usage.cacheWriteTokens:void 0,totalCost:l.usage.totalCost}:this.currentRunUsage,E=this.conversation.getMessages(),A=Jy(this.config);if(u)throw u;return{text:k,usage:T,messages:E,toolCalls:this.currentRunToolCalls,iterations:l?.iterations??0,finishReason:I,model:{id:this.config.modelId,provider:this.config.providerId,info:A},startedAt:c,endedAt:g,durationMs:b}}}function NL(i,l,u,c){if(!i)return;if(l==="debug"){i.debug(u,c);return}if(l==="error"&&i.error){i.error(u,c);return}let g=l==="warn"?"warn":l==="error"?"error":"info";i.log(u,{...c,severity:g})}function OL(i){if(!i)return"error";switch(i.status){case"completed":return"completed";case"aborted":return"aborted";case"failed":return"error"}}async function $L(i,l,u,c){return await Promise.resolve(),ME(i,l,u,c)}function Jy(i){return Ik(i)?.[i.modelId]}function LL(i,l){let u=i.trim();if(l.providerId.toLowerCase()!=="cline")return u;return Ge({ide:l.clineIdeName?.trim()||"Terminal",workspaceRoot:l.cwd?.trim()||"/",providerId:l.providerId,rules:`# Team Teammate Role
|
|
266
|
+
${u}`,platform:l.clinePlatform,metadata:l.workspaceMetadata})}function DL(i,l){let u=i.trim();if(l.providerId.toLowerCase()!=="cline")return u;return Ge({ide:l.clineIdeName||"Terminal",workspaceRoot:l.cwd?.trim()||"/",providerId:l.providerId,overridePrompt:u,metadata:l.workspaceMetadata,platform:l.clinePlatform})}function ES(i){let l={...i};return{getRuntimeConfig:()=>l,getConnectionConfig:()=>({providerId:l.providerId,modelId:l.modelId,apiKey:l.apiKey,baseUrl:l.baseUrl,headers:l.headers,onAuthError:l.onAuthError,providerConfig:l.providerConfig,knownModels:l.knownModels,thinking:l.thinking,reasoningEffort:l.reasoningEffort,thinkingBudgetTokens:l.thinkingBudgetTokens,maxTokensPerTurn:l.maxTokensPerTurn,temperature:l.temperature}),updateConnectionDefaults:(u)=>{l={...l,...u}}}}function AS(i){let l=i.configProvider.getRuntimeConfig(),u=i.kind==="teammate"?LL(i.prompt,l):DL(i.prompt,l);return{...i.configProvider.getConnectionConfig(),distinctId:l.distinctId,sessionId:l.sessionId,systemPrompt:u,tools:i.tools,maxIterations:i.maxIterations??l.maxIterations,parentAgentId:i.parentAgentId,abortSignal:i.abortSignal,onEvent:i.onEvent,hooks:l.hooks,extensions:l.extensions,hookErrorMode:i.hookErrorMode,toolPolicies:i.toolPolicies,requestToolApproval:i.requestToolApproval,logger:l.logger,role:i.role}}function xS(i){let l=AS(i),u=new nc(l);if(l.onEvent)u.subscribeEvents(l.onEvent);return u}var UL=t({systemPrompt:e().describe("System prompt defining the sub-agent's behavior"),task:e().describe("Task for the sub-agent to complete")});function CS(i){return _({name:"spawn_agent",executionMode:"parallel",description:"Spawn a sub-agent with custom instructions for a specialized task. Waits for the sub-agent to finish and returns its result before your next step.",inputSchema:S(UL),execute:async(l,u)=>{let c=i.createSubAgentTools?await i.createSubAgentTools(l,u):i.subAgentTools??[],g=xS({kind:"subagent",prompt:l.systemPrompt,configProvider:i.configProvider,tools:c,maxIterations:i.defaultMaxIterations,parentAgentId:u.agentId,abortSignal:u.signal,onEvent:i.onSubAgentEvent,hookErrorMode:i.hookErrorMode,toolPolicies:i.toolPolicies,requestToolApproval:i.requestToolApproval}),b=g.getAgentId(),I=g.getConversationId(),k=u.agentId;if(i.onSubAgentStart)try{await i.onSubAgentStart({subAgentId:b,conversationId:I,parentAgentId:k,input:l})}catch{}try{let T=await g.run(l.task),E={text:T.text,iterations:T.iterations,finishReason:T.finishReason,usage:{inputTokens:T.usage.inputTokens,outputTokens:T.usage.outputTokens}};if(i.onSubAgentEnd)try{await i.onSubAgentEnd({subAgentId:b,conversationId:I,parentAgentId:k,input:l,result:E,agentResult:T})}catch{}return E}catch(T){if(i.onSubAgentEnd)try{await i.onSubAgentEnd({subAgentId:b,conversationId:I,parentAgentId:k,input:l,error:T instanceof Error?T:Error(String(T))})}catch{}throw T}},timeoutMs:300000,retryable:!1})}function Zr(i){let l=i.toLowerCase().replace(/[^a-z0-9._-]+/g,"-"),u=0,c=l.length;while(u<c&&l[u]==="-")u++;while(c>u&&l[c-1]==="-")c--;return l.slice(u,c)}function RS(i,l){let u=i.replace(/\s+/g," ").trim();if(u.length<=l)return u;return`${u.slice(0,Math.max(0,l-3)).trimEnd()}...`}function Ai(i,l){if(i===void 0)throw Error(`Missing required field: ${l}`);return i}function FL(i){let l=i.result;if(!l)return;return{textPreview:RS(l.text,vs),iterations:l.iterations,finishReason:l.finishReason,durationMs:l.durationMs,usage:{inputTokens:l.usage.inputTokens,outputTokens:l.usage.outputTokens,cacheReadTokens:l.usage.cacheReadTokens,cacheWriteTokens:l.usage.cacheWriteTokens,totalCost:l.usage.totalCost}}}function cd(i){return i?.toISOString()}function Wc(i){return{id:i.id,agentId:i.agentId,taskId:i.taskId,status:i.status,messagePreview:RS(i.message,bs),priority:i.priority,retryCount:i.retryCount,maxRetries:i.maxRetries,nextAttemptAt:cd(i.nextAttemptAt),continueConversation:i.continueConversation,startedAt:i.startedAt.toISOString(),endedAt:cd(i.endedAt),leaseOwner:i.leaseOwner,heartbeatAt:cd(i.heartbeatAt),lastProgressAt:cd(i.lastProgressAt),lastProgressMessage:i.lastProgressMessage,currentActivity:i.currentActivity,error:i.error,resultSummary:FL(i)}}function qL(i){if(i.status==="failed")throw Error(`Run "${i.id}" failed${i.error?`: ${i.error}`:""}`);if(i.status==="cancelled")throw Error(`Run "${i.id}" was cancelled${i.error?`: ${i.error}`:""}`);if(i.status==="interrupted")throw Error(`Run "${i.id}" was interrupted${i.error?`: ${i.error}`:""}`)}var jL=["team_spawn_teammate","team_shutdown_teammate","team_status","team_task","team_run_task","team_cancel_run","team_list_runs","team_await_runs","team_send_message","team_broadcast","team_read_mailbox","team_mission_log","team_cleanup","team_create_outcome","team_attach_outcome_fragment","team_review_outcome_fragment","team_finalize_outcome","team_list_outcomes"];function PS(i){let l=[];if(i.createBaseTools)l.push(...i.createBaseTools());l.push(...of({runtime:i.runtime,requesterId:i.spec.agentId,teammateConfigProvider:i.teammateConfigProvider,createBaseTools:i.createBaseTools,allowSpawn:!1,includeSpawnTool:!1})),i.runtime.spawnTeammate({agentId:i.spec.agentId,config:AS({kind:"teammate",prompt:i.spec.rolePrompt,role:i.spec.rolePrompt,configProvider:i.teammateConfigProvider,tools:l,maxIterations:i.spec.maxIterations,cwd:i.teammateConfigProvider.getRuntimeConfig().cwd})})}function BL(i){let l=i.leadAgentId??"lead",u=i.restoredFromPersistence===!0,c=of({runtime:i.runtime,requesterId:l,teammateConfigProvider:i.teammateConfigProvider,createBaseTools:i.createBaseTools,allowSpawn:!0,includeSpawnTool:i.includeLeadSpawnTool,includeManagementTools:i.includeLeadManagementTools,onLeadToolsUnlocked:i.onLeadToolsUnlocked}),g=[];for(let b of i.restoredTeammates??[]){if(i.runtime.isTeammateActive(b.agentId))continue;PS({runtime:i.runtime,requesterId:l,teammateConfigProvider:i.teammateConfigProvider,createBaseTools:i.createBaseTools,spec:b}),g.push(b.agentId)}return{tools:c,restoredFromPersistence:u,restoredTeammates:g}}function of(i){let l=i.allowSpawn??!0,u=i.includeSpawnTool??!0,c=i.includeManagementTools??!0,g=[];if(u)g.push(_({name:"team_spawn_teammate",description:"Spawn a teammate with a required agentId and rolePrompt.",inputSchema:S(Ta),execute:async(I)=>{let k=y(Ta,I);if(i.runtime.getMemberRole(i.requesterId)!=="lead")throw Error("Only the lead agent can manage teammates.");if(!l)throw Error("Spawning teammates is disabled in this context.");let T={agentId:k.agentId,rolePrompt:k.rolePrompt};if(PS({runtime:i.runtime,requesterId:i.requesterId,teammateConfigProvider:i.teammateConfigProvider,createBaseTools:i.createBaseTools,spec:T}),!c)i.onLeadToolsUnlocked?.(of({...i,includeSpawnTool:!1,includeManagementTools:!0,onLeadToolsUnlocked:void 0}));return y(ja,{agentId:k.agentId,status:"spawned"})}}));if(!c)return g;g.push(_({name:"team_shutdown_teammate",description:"Shutdown a teammate by agentId.",inputSchema:S(_a),execute:async(I)=>{let k=y(_a,I);if(i.runtime.getMemberRole(i.requesterId)!=="lead")throw Error("Only the lead agent can manage teammates.");return i.runtime.shutdownTeammate(k.agentId,k.reason),y(ja,{agentId:k.agentId,status:"stopped"})}})),g.push(_({name:"team_status",description:"Return a snapshot of team members, task counts, mailbox, and mission log stats.",inputSchema:S(Ia),execute:async(I)=>(y(Ia,I),y(ks,i.runtime.getSnapshot()))})),g.push(_({name:"team_task",description:"Manage shared team tasks with action-specific payloads. create requires title and description, with optional dependsOn and assignee. list accepts optional status, assignee. claim requires taskId. complete requires taskId and summary. block requires taskId and reason. Do not include fields from other actions.",inputSchema:S(Sa),execute:async(I)=>{let k=y(Sa,I);switch(k.action){case"create":{let T=new Set(ws.create??[]),E=Object.entries(I).filter(([C,N])=>T.has(C)&&N!=null).map(([C])=>C),A=i.runtime.createTask({title:Ai(k.title,"title"),description:Ai(k.description,"description"),dependsOn:k.dependsOn,assignee:k.assignee,createdBy:i.requesterId});return y(Ot,{action:"create",taskId:A.id,status:A.status,...E.length>0?{ignoredFields:E,note:`Ignored fields for action=create: ${E.join(", ")}`}:{}})}case"list":return y(Ot,{action:"list",tasks:i.runtime.listTaskItems({status:k.status,assignee:k.assignee})});case"claim":{let T=i.runtime.claimTask(Ai(k.taskId,"taskId"),i.requesterId);return y(Ot,{action:"claim",taskId:T.id,status:T.status,nextStep:"Task is now in_progress. Execute the work using team_run_task or your own tools, then call team_task with action=complete when done."})}case"complete":{let T=i.runtime.completeTask(Ai(k.taskId,"taskId"),i.requesterId,Ai(k.summary,"summary"));return y(Ot,{action:"complete",taskId:T.id,status:T.status})}case"block":{let T=i.runtime.blockTask(Ai(k.taskId,"taskId"),i.requesterId,Ai(k.reason,"reason"));return y(Ot,{action:"block",taskId:T.id,status:T.status})}}}}));let b=new Map;return g.push(_({name:"team_run_task",description:"Route a delegated task to a teammate. Choose sync (wait) or async (run in background).",inputSchema:S(Ea),execute:async(I)=>{let k=y(Ea,I);if(k.runMode==="async"){let A=i.runtime.startTeammateRun(k.agentId,k.task,{taskId:k.taskId||void 0,fromAgentId:i.requesterId,continueConversation:k.continueConversation||void 0});return y(Qi,{agentId:k.agentId,mode:"async",status:"queued",dispatched:!0,message:`Task dispatched to ${k.agentId} and queued as ${A.id}.`,runId:A.id})}let T=b.get(k.agentId);if(T){let A=await T;return y(Qi,{...A,status:"joined",deduped:!0,message:`Task for ${k.agentId} was already dispatched in this tool batch; joined the existing in-flight run.`})}let E=i.runtime.routeToTeammate(k.agentId,k.task,{taskId:k.taskId||void 0,fromAgentId:i.requesterId,continueConversation:k.continueConversation||void 0}).then((A)=>y(Qi,{agentId:k.agentId,mode:"sync",status:"running",dispatched:!0,message:`Task dispatched to ${k.agentId} and completed in sync mode.`,text:A.text,iterations:A.iterations})).finally(()=>{b.delete(k.agentId)});return b.set(k.agentId,E),await E}})),g.push(_({name:"team_cancel_run",description:"Cancel one async teammate run.",inputSchema:S(Oa),execute:async(I)=>{let k=y(Oa,I),T=i.runtime.cancelRun(k.runId,k.reason);return y(Ss,{runId:T.id,status:T.status})}})),g.push(_({name:"team_list_runs",description:"List teammate runs started with team_run_task in async mode, including live activity/progress fields when available.",inputSchema:S(Ra),execute:async(I)=>y(Ji.array(),i.runtime.listRuns(y(Ra,I)).map(Wc))})),g.push(_({name:"team_await_runs",description:"Wait for async teammate runs. Provide runId to wait for one run, or omit it to wait for all active async runs. Uses a long timeout for legitimate teammate work.",inputSchema:S(Aa),timeoutMs:xs,execute:async(I)=>{let k=y(Aa,I);if(k.runId){let A=await i.runtime.awaitRun(k.runId);return qL(A),y(Ji,Wc(A))}let T=await i.runtime.awaitAllRuns(),E=T.filter((A)=>["failed","cancelled","interrupted"].includes(A.status));if(E.length>0){let A=E.map((C)=>`${C.id}:${C.status}${C.error?`(${C.error})`:""}`).join(", ");throw Error(`One or more runs did not complete successfully: ${A}`)}return y(Ji.array(),T.map(Wc))}})),g.push(_({name:"team_send_message",description:"Send a mailbox message to a specific teammate.",inputSchema:S(Ca),execute:async(I)=>{let k=y(Ca,I),T=i.runtime.sendMessage(i.requesterId,k.toAgentId,k.subject,k.body,k.taskId??void 0);return y(Es,{id:T.id,toAgentId:T.toAgentId})}})),g.push(_({name:"team_broadcast",description:"Broadcast a message to all teammates.",inputSchema:S(Pa),execute:async(I)=>{let k=y(Pa,I),T=i.runtime.broadcast(i.requesterId,k.subject,k.body,{taskId:k.taskId??void 0});return y(Rs,{delivered:T.length})}})),g.push(_({name:"team_read_mailbox",description:"Read the current agent mailbox.",inputSchema:S(Da),execute:async(I)=>{let k=y(Da,I);return y(Ts.array(),i.runtime.listMailbox(i.requesterId,{unreadOnly:k.unreadOnly,markRead:!0}))}})),g.push(_({name:"team_mission_log",description:"Append a mission log update for your team.",inputSchema:S(Wa),execute:async(I)=>{let k=y(Wa,I),T=i.runtime.appendMissionLog({agentId:i.requesterId,taskId:k.taskId||void 0,kind:k.kind,summary:k.summary,evidence:k.evidence?.length?k.evidence:void 0,nextAction:k.nextAction||void 0});return y(Os,{id:T.id})}})),g.push(_({name:"team_cleanup",description:"Clean up the team runtime. Fails if teammates are still running.",inputSchema:S(Ma),execute:async(I)=>{if(y(Ma,I),i.runtime.getMemberRole(i.requesterId)!=="lead")throw Error("Only the lead agent can run cleanup.");return i.runtime.cleanup(),y(As,{status:"cleaned"})}})),g.push(_({name:"team_create_outcome",description:"Create a converged team outcome.",inputSchema:S(Na),execute:async(I)=>{let k=y(Na,I),T=i.runtime.createOutcome({title:k.title,requiredSections:k.requiredSections,createdBy:i.requesterId});return y(Is,{outcomeId:T.id,status:T.status,requiredSections:T.requiredSections})}})),g.push(_({name:"team_attach_outcome_fragment",description:"Attach a fragment to an outcome section.",inputSchema:S(La),execute:async(I)=>{let k=y(La,I),T=i.runtime.attachOutcomeFragment({outcomeId:k.outcomeId,section:k.section,sourceAgentId:i.requesterId,sourceRunId:k.sourceRunId||void 0,content:k.content});return y($a,{fragmentId:T.id,status:T.status})}})),g.push(_({name:"team_review_outcome_fragment",description:"Review one outcome fragment.",inputSchema:S(Ba),execute:async(I)=>{let k=y(Ba,I),T=i.runtime.reviewOutcomeFragment({fragmentId:k.fragmentId,reviewedBy:i.requesterId,approved:k.approved});return y($a,{fragmentId:T.id,status:T.status})}})),g.push(_({name:"team_finalize_outcome",description:"Finalize one outcome.",inputSchema:S(Ua),execute:async(I)=>{let k=y(Ua,I),T=i.runtime.finalizeOutcome(k.outcomeId);return y(Cs,{outcomeId:T.id,status:T.status})}})),g.push(_({name:"team_list_outcomes",description:"List team outcomes.",inputSchema:S(Fa),execute:async(I)=>(y(Fa,I),y(_s.array(),i.runtime.listOutcomes()))})),g}function HL(i){if(i==="vscode")return"vscode";if(i==="cli"||i?.startsWith("cline-cli"))return"cli";return}var zL=[{id:"web_search",description:"Search the public web using the selected model provider's native search capability.",headlessToolNames:["web_search"]},{id:"read_files",description:"Read the content of text or image files at the provided absolute paths, or return only an inclusive one-based line range when start_line/end_line are provided. Long files are windowed; page with start_line/end_line.",headlessToolNames:["read_files"]},{id:"search_codebase",description:"Perform regex pattern searches across the codebase for code patterns, definitions, imports, and other text matches.",headlessToolNames:["search_codebase"]},{id:"run_commands",description:"Run shell commands from the root of the workspace for listing files, checking git status, builds, tests, and similar tasks.",headlessToolNames:["run_commands"]},{id:"editor",description:"Make controlled filesystem edits on text files with create, replace, and insert operations.",headlessToolNames:["editor"]},{id:"fetch_web_content",description:"Fetch URL content and analyze it with a prompt describing what to extract.",headlessToolNames:["fetch_web_content"]},{id:"skills",description:"Execute a configured skill within the main conversation when a matching skill exists for the task.",headlessToolNames:["skills"]},{id:"ask_question",description:"Ask the user a single clarifying question with 2-5 selectable options.",headlessToolNames:["ask_question"]},{id:"tasks",description:"Create and manage explicitly requested one-time and recurring agent schedules.",headlessToolNames:["tasks"],unavailableClientTypes:["cli","vscode"]},{id:"spawn_agent",description:CS({configProvider:{}}).description,headlessToolNames:["spawn_agent"]},{id:"teams",description:"Enable team collaboration tools for teammate management, task coordination, mailbox messaging, mission logs, and outcomes.",headlessToolNames:[...jL]}];function WL(i,l){if(!l)return!0;return!zL.find((u)=>u.id===i||u.headlessToolNames.includes(i))?.unavailableClientTypes?.includes(l)}function MS(i={}){let{executorOptions:l={},executors:u,...c}=i,g=c.shell??l.bash?.shell??_t(process.platform),b={...l,bash:{...l.bash,shell:g}},I={...x$(b),...u??{}};return oO({...c,shell:g,executors:I})}var JL=Sr,VL=["idle","running","pending"];function YL(i){return!VL.includes(i)}function Qt(i){return!YL(i)}var jr={CORE:"core",CLI:"cli",SUBAGENT:"subagent",DESKTOP:"desktop",KANBAN:"kanban",API:"api",WEB:"web",VSCODE:"vscode",ENTERPRISE:"enterprise",IDE:"ide",JETBRAINS:"jetbrains",NEOVIM:"neovim",UNKNOWN:"unknown"},NS="sessionHistoryOrigin";function No(i){return typeof i==="string"&&i.trim()?i.trim():void 0}function QL(i){let l=[i?.name,i?.platform].filter((u)=>typeof u==="string").join(" ").toLowerCase();if(!l)return;if(l.includes("vscode")||l.includes("visual studio code"))return jr.VSCODE;if(l.includes("jetbrains")||l.includes("webstorm")||l.includes("intellij")||l.includes("pycharm")||l.includes("goland")||l.includes("clion")||l.includes("rider")||l.includes("android studio"))return jr.JETBRAINS;if(l.includes("neovim"))return jr.NEOVIM;if(l.includes("kanban"))return jr.KANBAN;if(l.includes("desktop"))return jr.DESKTOP;if(l.includes("cline-platform"))return jr.WEB;if(l.includes("cline-cli")||l.includes("cline-acp"))return jr.CLI;if(l.includes("cline-sdk")||l.includes("cline-core"))return jr.CORE;return}function Lo(i){let l=i?.[NS];if(!l||typeof l!=="object"||Array.isArray(l))return;let u=l,c=No(u.mode);if(!c)return;let g=No(u.version),b=No(u.trigger);return{mode:c,...g?{version:g}:{},...b?{trigger:b}:{}}}function wn(i,l){let u=Lo(i),c=No(l.mode)??u?.mode??"user",g=No(l.version)??u?.version,b=No(l.trigger)??u?.trigger;return{...i??{},[NS]:{mode:c,...g?{version:g}:{},...b?{trigger:b}:{}}}}function yu(i){return i.replace(/[^a-zA-Z0-9._-]+/g,"_")}function Vy(i,l){let u=yu(i),c=yu(l),g=`${u}__${c}`;return g.length>180?g.slice(0,180):g}function ZL(i,l){let u=yu(i),c=yu(l);return`${u}__teamtask__${c}__${R(6)}`}function af(i){let l=i.indexOf("__teamtask__");if(l<=0)return null;let u=i.slice(0,l),c=i.slice(l+12),g=c.lastIndexOf("__");if(g<=0)return null;let b=c.slice(0,g),I=c.slice(g+2);if(!u||!b||!I)return null;return{rootSessionId:u,agentId:b,teamTaskId:I}}function OS(i){if(af(i))return null;let l="__",u=i.indexOf(l);if(u<=0)return null;let c=i.slice(0,u),g=i.slice(u+l.length);if(!c||!g)return null;return{rootSessionId:c,agentId:g}}function e1(i){switch(i.hookName){case"agent_end":return"completed";case"agent_error":return"failed";case"session_shutdown":{let l=String(i.reason??"").toLowerCase();if(l.includes("cancel")||l.includes("abort")||l.includes("interrupt"))return"cancelled";if(l.includes("fail")||l.includes("error"))return"failed";return"completed"}default:return"running"}}var t1=s(JL),vu=t({version:a(1),session_id:e().min(1),source:e().min(1),pid:n().int(),started_at:e().min(1),ended_at:e().min(1).optional(),exit_code:n().int().nullable().optional(),status:t1,interactive:r(),provider:e().min(1),model:e().min(1),cwd:e().min(1),workspace_root:e().min(1),team_name:e().min(1).optional(),enable_tools:r(),enable_spawn:r(),enable_teams:r(),prompt:e().optional(),metadata:d(e(),m()).optional(),messages_path:e().min(1).optional(),compaction_path:e().min(1).optional()});function r1(i){if(!i)return!1;return Object.values(i).some((l)=>typeof l==="function")}function Yy(i,l){let u=[...i??[],...l??[]];if(u.length===0)return;let c=[],g=new Set;for(let b of u){if(g.has(b.name))continue;g.add(b.name),c.push(b)}return c}function s1(i){return JSON.stringify(i,(l,u)=>{if(u instanceof Error)return{name:u.name,message:u.message,stack:u.stack};return u})}function Bs(i){return typeof i==="string"&&i.trim()?i.trim():void 0}function Tm(i,l){let u={...i};u.id=Bs(u.id)??R();let c=u.modelInfo&&typeof u.modelInfo==="object"?{...u.modelInfo}:void 0,g={id:Bs(c?.id)??Bs(u.modelId)??Bs(l?.id),provider:Bs(c?.provider)??Bs(u.providerId)??Bs(l?.provider),family:Bs(c?.family)??Bs(l?.family)};if(delete u.providerId,delete u.modelId,g.id&&g.provider)u.modelInfo={id:g.id,provider:g.provider,...g.family?{family:g.family}:{}};else delete u.modelInfo;return u}function _m(i){return i.map((l)=>Tm(l))}function $S(i,l,u=[]){let c=i.map((T,E)=>{let A=u[E],C=A?.role===T.role&&JSON.stringify(A.content)===JSON.stringify(T.content)?{...A,...T}:{...T};return Tm(C)}),g=u.length,b=[];for(let T=g;T<c.length;T+=1)if(c[T]?.role==="assistant"&&c[T]?.metadata?.displayOnly!==!0)b.push(T);if(b.length===0){let T=[...c].reverse().findIndex((E)=>E.role==="assistant"&&E.metadata?.displayOnly!==!0);if(T===-1)return c;b.push(c.length-1-T)}let I=b[b.length-1],k=b.some((T)=>c[T]?.metrics);for(let T of b){let E=c[T],A=E.metrics;if(!A&&T===I&&!k){let C=l.usage;A={inputTokens:C.inputTokens,outputTokens:C.outputTokens,cacheReadTokens:C.cacheReadTokens??0,cacheWriteTokens:C.cacheWriteTokens??0,cost:C.totalCost}}c[T]={...Tm(E,{id:l.model.id,provider:l.model.provider,family:l.model.info?.family}),...A?{metrics:A}:{},ts:E.ts??l.endedAt.getTime()}}return c}function Qy(i){return{sessionId:i.sessionId,source:i.source,pid:i.pid,startedAt:i.startedAt,endedAt:i.endedAt??null,exitCode:i.exitCode??null,status:i.status,interactive:i.interactive,provider:i.provider,model:i.model,cwd:i.cwd,workspaceRoot:i.workspaceRoot,teamName:i.teamName??void 0,enableTools:i.enableTools,enableSpawn:i.enableSpawn,enableTeams:i.enableTeams,parentSessionId:i.parentSessionId??void 0,parentAgentId:i.parentAgentId??void 0,agentId:i.agentId??void 0,conversationId:i.conversationId??void 0,isSubagent:i.isSubagent,prompt:i.prompt??void 0,metadata:i.metadata??void 0,messagesPath:i.messagesPath??void 0,updatedAt:i.updatedAt}}var i1=120;function Oo(i){let l=i?.trim();return l?l.slice(0,i1):void 0}function LS(i){let l=wo(ye(i??"")).trim();if(!l)return;return Oo(l.split(`
|
|
267
|
+
`)[0]?.trim())}function Vs(i){if(!i)return;let l={...i},u=Oo(typeof l.title==="string"?l.title:void 0);if(u)l.title=u;else delete l.title;return Object.keys(l).length>0?l:void 0}function Em(i){let l=Vs(i.metadata)??{},u=i.title!==void 0?Oo(i.title):LS(i.prompt);if(u)l.title=u;return Object.keys(l).length>0?l:void 0}function Zy(i){let l=Lo(i.metadata),u={source:i.source,mode:l?.mode??"user",sessionId:i.sessionId,...i.parentSessionId?{parentThreadId:i.parentSessionId}:{},...i.agentId?{subagent:i.agentId}:{},...l?.version?{version:l.version}:{},...l?.trigger?{trigger:l.trigger}:{}};if(af(i.sessionId))return{agent:"teammate",sessionId:i.sessionId,taskType:"team",origin:u};if(OS(i.sessionId))return{agent:"subagent",sessionId:i.sessionId,taskType:"subagent_task",origin:u};return{agent:"lead",sessionId:i.sessionId,origin:u}}function DS(i){return{version:1,updated_at:i.updatedAt,agent:i.context.agent,sessionId:i.context.sessionId,...i.context.taskType?{taskType:i.context.taskType}:{},origin:i.context.origin,messages:_m(i.messages),...i.systemPrompt?{system_prompt:i.systemPrompt}:{}}}function n1(i,l,u){KL(XL(i),{recursive:!0}),GL(i,`${JSON.stringify(DS({updatedAt:l,context:u,messages:[]}),null,2)}
|
|
268
|
+
`,"utf8")}function o1(i,l){return vu.parse({version:1,session_id:i.sessionId,source:i.source,pid:i.pid,started_at:i.startedAt,ended_at:l?.endedAt??i.endedAt??void 0,exit_code:l?.exitCode??i.exitCode??void 0,status:l?.status??i.status,interactive:i.interactive,provider:i.provider,model:i.model,cwd:i.cwd,workspace_root:i.workspaceRoot,team_name:i.teamName??void 0,enable_tools:i.enableTools,enable_spawn:i.enableSpawn,enable_teams:i.enableTeams,prompt:i.prompt??void 0,metadata:l?.metadata??i.metadata??void 0,messages_path:i.messagesPath??void 0})}async function a1(i,l,u){let c=0;while(!0){let g=await i();if(g===void 0)return{updated:!1};let b=await l(g);if(typeof b==="object"&&b!==null&&"updated"in b&&b.updated===!1){if(c+=1,c>=u)return b;continue}return b}}function zr(){return{inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalCost:0}}function Yt(i,l){return{inputTokens:i.inputTokens+Math.max(0,l.inputTokens??0),outputTokens:i.outputTokens+Math.max(0,l.outputTokens??0),cacheReadTokens:i.cacheReadTokens+Math.max(0,l.cacheReadTokens??0),cacheWriteTokens:i.cacheWriteTokens+Math.max(0,l.cacheWriteTokens??0),totalCost:i.totalCost+Math.max(0,l.totalCost??0)}}function US(i){let l=zr();for(let u of i)l=Yt(l,u);return l}function la(i){return typeof i==="number"&&Number.isFinite(i)?i:0}function ev(i){let l=zr();for(let u of i){let c=u.metrics;if(!c)continue;l=Yt(l,{inputTokens:la(c.inputTokens),outputTokens:la(c.outputTokens),cacheReadTokens:la(c.cacheReadTokens),cacheWriteTokens:la(c.cacheWriteTokens),totalCost:la(c.cost)})}return l}function l1(i){if(!i||typeof i!=="object")return;let l=i,u=l.skill??l.skill_name??l.skillName;if(typeof u!=="string")return;let c=u.trim();return c.length>0?c:void 0}function FS(i){if(!i||typeof i!=="object")return{};let l=i;return{agentId:typeof l.agentId==="string"?l.agentId:void 0,conversationId:typeof l.conversationId==="string"?l.conversationId:void 0,parentAgentId:typeof l.parentAgentId==="string"?l.parentAgentId:void 0}}function Do(i){let l=i.agentId?.trim();if(!l)return;let u=i.parentAgentId?.trim()||void 0,c=i.teamRole,g="root";if(c==="teammate")g="team_teammate";else if(c==="lead")g="team_lead";else if(u)g="subagent";return{agentId:l,agentKind:g,conversationId:i.conversationId?.trim()||void 0,parentAgentId:u,createdByAgentId:i.createdByAgentId?.trim()||u||void 0,isSubagent:Boolean(u),teamId:i.teamId?.trim()||void 0,teamName:i.teamName?.trim()||void 0,teamRole:c,teamAgentId:i.teamAgentId?.trim()||void 0}}function d1(i){return{inputTokens:i.inputTokens,outputTokens:i.outputTokens,cacheWriteTokens:i.cacheWriteTokens,cacheReadTokens:i.cacheReadTokens,totalCost:i.cost}}function u1(i){let l=i.cacheWriteTokens??0,u=i.cacheReadTokens??0;return{tokensIn:Math.max(0,i.inputTokens-u-l),tokensOut:i.outputTokens,cacheWriteTokens:l,cacheReadTokens:u,totalCost:i.cost,reasoningTokenCount:i.reasoningTokenCount}}function c1(i){let l=i.isPrimaryAgentEvent?[i.overrides?.agentId,i.eventMetadata.agentId,i.overrides?.teamAgentId]:[i.overrides?.teamAgentId,i.overrides?.agentId,i.eventMetadata.agentId,i.eventMetadata.conversationId];for(let u of l){let c=u?.trim();if(c)return c}return i.isPrimaryAgentEvent?"root":"unknown"}function Kc(i,l,u){let{sessionId:c,config:g,liveSession:b,emit:I}=i,k=g.telemetry,T=b?.runtime.teamRuntime,E=u?.isPrimaryAgentEvent??!0,A=FS(l),C=Do({agentId:u?.agentId??A.agentId,conversationId:u?.conversationId??A.conversationId,parentAgentId:u?.parentAgentId??A.parentAgentId,createdByAgentId:u?.createdByAgentId,teamId:u?.teamId??T?.getTeamId(),teamName:u?.teamName??T?.getTeamName(),teamRole:u?.teamRole,teamAgentId:u?.teamAgentId});if(l.type==="content_start"&&l.contentType==="tool"&&l.toolName==="skills"){let N=l1(l.input);if(N)CA(k,{ulid:c,skillName:N,skillSource:"project",skillsAvailableGlobal:0,skillsAvailableProject:0,provider:g.providerId,modelId:g.modelId,...C})}if(l.type==="content_end"&&l.contentType==="tool"){let N=l.toolName??"unknown",O=!l.error;if(Ko(k,{ulid:c,tool:N,autoApproved:void 0,success:O,modelId:g.modelId,provider:g.providerId,...C}),!O&&(N==="editor"||N==="apply_patch"))RA(k,{ulid:c,modelId:g.modelId,provider:g.providerId,errorType:l.error,...C})}if(l.type==="usage"&&b?.turnUsageBaseline){let N=d1(l);if(E){b.turnPrimaryUsage=Yt(b.turnPrimaryUsage??zr(),N);let L=Yt(b.turnUsageBaseline,b.turnPrimaryUsage);i.usageBySession.set(c,L),TI(k,{ulid:c,provider:g.providerId,model:g.modelId,source:"assistant",mode:g.mode,...C}),AA(k,{ulid:c,...u1(l),provider:g.providerId,model:g.modelId,...C})}else{let L=c1({isPrimaryAgentEvent:E,overrides:u,eventMetadata:A}),D=b.turnUsageByAgent??new Map;b.turnUsageByAgent=D,D.set(L,Yt(D.get(L)??zr(),N))}let O=Yt(b.turnPrimaryUsage??zr(),US(b.turnUsageByAgent?.values()??[]));i.aggregateUsageBySession.set(c,Yt(b.turnAggregateUsageBaseline??b.turnUsageBaseline,O))}if(l.type==="iteration_end"&&E)i.persistMessages(c,b?.agent.getMessages()??[],b?.config.systemPrompt);I({type:"agent_event",payload:{sessionId:c,event:l,teamAgentId:u?.teamAgentId,teamRole:u!==void 0?u.teamRole??(E?"lead":void 0):void 0}}),I({type:"chunk",payload:{sessionId:c,stream:"agent",chunk:s1(l),ts:Date.now()}})}function Hs(i){return i.workspaceRoot??i.cwd}var p1=new Set(["name","description","license","compatibility","metadata","allowed-tools"]),Am=64,m1=1024,h1=500;function qS(i){return typeof i==="object"&&i!==null&&!Array.isArray(i)}function ua(i,l,u={}){if(i===void 0){if(u.required)throw Error(`Missing required frontmatter field '${l}'.`);return}if(typeof i!=="string")throw Error(`Frontmatter field '${l}' must be a string.`);let c=i.trim();if(u.required&&c.length===0)throw Error(`Frontmatter field '${l}' cannot be empty.`);if(u.maxLength!==void 0&&c.length>u.maxLength)throw Error(`Frontmatter field '${l}' exceeds ${u.maxLength} characters.`);return c}function f1(i,l){let u=i.normalize("NFKC");if(u.length===0||u.length>Am)throw Error(`Skill name must be between 1 and ${Am} characters.`);if(u!==u.toLowerCase())throw Error(`Skill name '${u}' must be lowercase.`);if(u.startsWith("-")||u.endsWith("-")||u.includes("--"))throw Error(`Skill name '${u}' cannot start or end with a hyphen or contain consecutive hyphens.`);for(let c of u)if(c!=="-"&&!/[\p{L}\p{N}]/u.test(c))throw Error(`Skill name '${u}' may contain only lowercase letters, numbers, and hyphens.`);if(l.normalize("NFKC")!==u)throw Error(`Skill directory '${l}' must match frontmatter name '${u}'.`);return u}function g1(i){if(i===void 0)return;if(!qS(i))throw Error("Frontmatter field 'metadata' must be an object.");let l={};for(let[u,c]of Object.entries(i)){if(typeof c!=="string")throw Error(`Frontmatter metadata value '${u}' must be a string.`);l[u]=c}return l}function jS(i,l){let u=he(i).match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)([\s\S]*)$/);if(!u)throw Error("SKILL.md must start with YAML frontmatter delimited by '---'.");let c;try{c=X.parse(u[1])}catch(N){throw Error(`Failed to parse YAML frontmatter: ${N instanceof Error?N.message:String(N)}`)}if(!qS(c))throw Error("SKILL.md frontmatter must be a YAML mapping.");let g=Object.keys(c).filter((N)=>!p1.has(N)).sort();if(g.length>0)throw Error(`Unexpected frontmatter field${g.length===1?"":"s"}: ${g.join(", ")}.`);let b=ua(c.name,"name",{required:!0,maxLength:Am}),I=f1(b,l),k=ua(c.description,"description",{required:!0,maxLength:m1}),T=ua(c.license,"license"),E=ua(c.compatibility,"compatibility",{maxLength:h1});if(c.compatibility!==void 0&&!E)throw Error("Frontmatter field 'compatibility' cannot be empty.");let A=ua(c["allowed-tools"],"allowed-tools"),C=g1(c.metadata);return{metadata:{name:I,description:k,...T!==void 0?{license:T}:{},...E!==void 0?{compatibility:E}:{},...C!==void 0?{metadata:C}:{},...A!==void 0?{"allowed-tools":A}:{}},instructions:u[2].trim(),frontmatter:c}}var Gc="https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",tv="https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",S1=new Set(["$schema","name","version","description","author","homepage","repository","license","keywords","extensions"]),T1=new Set(["name","email","url"]),_1=/^(?!.*(?:--|\.\.))[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$/,Xc="${PLUGIN_ROOT}",Jc="${PLUGIN_DATA}";function nn(i){return typeof i==="object"&&i!==null&&!Array.isArray(i)}function xm(i,l){let u=zS(i,l);return u===""||!u.startsWith("..")&&!HS(u)}function St(i){return i instanceof Error?i.message:String(i)}function uf(i){let l=i?.code;return l==="ENOENT"||l==="ENOTDIR"}function dt(i){return{level:i.level??"error",...i}}async function Cm(i){let l=await df(i);if(!(await Wl(l)).isDirectory())throw Error("expected a directory");return l}async function Rl(i,l,u){let c=await df(l);if(!xm(i,c))throw Error(`path resolves outside the plugin root: ${l}`);let g=await Wl(c);if(!(u==="file"?g.isFile():g.isDirectory()))throw Error(`expected a regular ${u}: ${l}`);return c}async function rv(i,l){let u=bn(l);if(!xm(i,u))throw Error(`path resolves outside its permitted root: ${l}`);let c=u;while(!0)try{let g=await df(c),b=bn(g,zS(c,u));if(!xm(i,b))throw Error(`path resolves outside its permitted root: ${l}`);return b}catch(g){if(!uf(g))throw g;let b=k1(c);if(b===c)throw g;c=b}}async function sv(i){try{return await Wl(i),!0}catch(l){if(uf(l))return!1;throw l}}async function wu(i){try{return await v1(i),!0}catch(l){if(uf(l))return!1;throw l}}async function E1(i){let l;try{l=await Cm(i)}catch{return[]}let u=[],c;try{c=await BS(l,{withFileTypes:!0})}catch{return[]}for(let g of c){let b=js(l,g.name),I;try{I=await Cm(b)}catch{continue}let k=!1;try{k=await wu(js(I,Gt))}catch{continue}if(k)u.push(I)}return u.sort((g,b)=>g.localeCompare(b))}async function A1(i,l){let u=bn(i.cwd??process.cwd()),c=[];for(let k of i.pluginPaths??[]){let T=k.trim();if(!T)continue;let E=bn(u,T);try{c.push(await Cm(E))}catch(A){l.push(dt({scope:"plugin",pluginPath:E,message:`Cannot load Agent Plugin directory: ${St(A)}`}))}}let g=i.searchPaths??eo();for(let k of g)c.push(...await E1(k));let b=[],I=new Set;for(let k of c)if(!I.has(k))I.add(k),b.push(k);return b}function ca(i,l){let u=i[l];if(u===void 0)return;if(typeof u!=="string")throw Error(`Manifest field '${l}' must be a string.`);return u}function x1(i,l,u){if(!nn(i))throw Error("plugin.json must contain a JSON object.");for(let I of Object.keys(i).filter((k)=>!S1.has(k)).sort())u.push(dt({level:"warning",scope:"manifest",pluginPath:l,message:`Ignoring unknown plugin.json field '${I}'.`}));if(i.$schema!==Gc)throw Error(`Unsupported or missing plugin.json $schema; expected '${Gc}'.`);if(typeof i.name!=="string")throw Error("Manifest field 'name' must be a string.");if(i.name.length<1||i.name.length>64||!_1.test(i.name))throw Error("Manifest field 'name' must be 1-64 lowercase alphanumeric, hyphen, or period characters; it must start and end alphanumeric and cannot contain '--' or '..'.");let c;if(i.author!==void 0){if(!nn(i.author))throw Error("Manifest field 'author' must be an object.");let I=Object.keys(i.author).filter((k)=>!T1.has(k));if(I.length>0)throw Error(`Manifest author contains unknown field '${I.sort()[0]}'.`);for(let[k,T]of Object.entries(i.author))if(typeof T!=="string")throw Error(`Manifest author field '${k}' must be a string.`);c=i.author}let g;if(i.keywords!==void 0){if(!Array.isArray(i.keywords)||!i.keywords.every((I)=>typeof I==="string"))throw Error("Manifest field 'keywords' must be an array of strings.");g=[...i.keywords]}let b;if(i.extensions!==void 0)if(nn(i.extensions))b={...i.extensions};else u.push(dt({level:"warning",scope:"manifest",pluginPath:l,pluginName:i.name,message:"Ignoring non-object plugin.json 'extensions' field."}));return{$schema:Gc,name:i.name,...ca(i,"version")!==void 0?{version:i.version}:{},...ca(i,"description")!==void 0?{description:i.description}:{},...c?{author:c}:{},...ca(i,"homepage")!==void 0?{homepage:i.homepage}:{},...ca(i,"repository")!==void 0?{repository:i.repository}:{},...ca(i,"license")!==void 0?{license:i.license}:{},...g?{keywords:g}:{},...b?{extensions:b}:{}}}async function C1(i,l){let u=js(i,Gt),c=await Rl(i,u,"file"),g;try{g=JSON.parse(await lf(c,"utf8"))}catch(b){throw Error(`Invalid plugin.json: ${St(b)}`)}return{manifestPath:c,manifest:x1(g,i,l)}}async function R1(i,l,u){let c=js(i,Ze),g;try{g=await wu(c)}catch(T){return u.push(dt({scope:"skills",pluginPath:i,pluginName:l,componentPath:c,message:`Cannot inspect Agent Plugin skills component: ${St(T)}`})),[]}if(!g)return[];let b;try{b=await Rl(i,c,"directory")}catch(T){return u.push(dt({scope:"skills",pluginPath:i,pluginName:l,componentPath:c,message:`Invalid Agent Plugin skills component: ${St(T)}`})),[]}let I=[],k;try{k=await BS(b,{withFileTypes:!0})}catch(T){return u.push(dt({scope:"skills",pluginPath:i,pluginName:l,componentPath:b,message:`Cannot read Agent Plugin skills component: ${St(T)}`})),[]}for(let T of k.sort((E,A)=>E.name.localeCompare(A.name))){let E=js(b,T.name),A;try{A=await Rl(i,E,"directory")}catch(L){if(T.isSymbolicLink())u.push(dt({scope:"skill",pluginPath:i,pluginName:l,componentPath:E,componentName:T.name,message:`Skipping invalid Agent Plugin skill directory '${T.name}': ${St(L)}`}));continue}let C=js(A,"SKILL.md"),N;try{N=await wu(C)}catch(L){u.push(dt({scope:"skill",pluginPath:i,pluginName:l,componentPath:C,componentName:T.name,message:`Cannot inspect Agent Plugin skill '${T.name}': ${St(L)}`}));continue}if(!N)continue;let O;try{O=await Rl(i,C,"file")}catch(L){u.push(dt({scope:"skill",pluginPath:i,pluginName:l,componentPath:C,componentName:T.name,message:`Skipping invalid Agent Plugin skill '${T.name}': ${St(L)}`}));continue}try{let L=jS(await lf(O,"utf8"),T.name);I.push({pluginName:l,pluginRoot:i,directoryPath:A,filePath:O,metadata:L.metadata})}catch(L){u.push(dt({scope:"skill",pluginPath:i,pluginName:l,componentPath:O,componentName:T.name,message:`Skipping invalid Agent Plugin skill '${T.name}': ${St(L)}`}))}}return I}function cf(i,l,u){let c=Object.keys(i).filter((g)=>!l.has(g)).sort();if(c.length>0)throw Error(`${u} contains unknown field '${c[0]}'.`)}function P1(i,l){if(i===void 0)return;if(!Array.isArray(i)||!i.every((u)=>typeof u==="string"))throw Error(`MCP field '${l}' must be an array of strings.`);return[...i]}function WS(i,l){if(i===void 0)return;if(!nn(i)||!Object.values(i).every((u)=>typeof u==="string"))throw Error(`MCP field '${l}' must be an object of strings.`);return i}function Vc(i,l,u){return i.replace(/\$\{PLUGIN_(ROOT|DATA)\}/g,(c,g)=>g==="ROOT"?l:u)}function M1(i,l,u){let c=y1("sha256").update(u).digest("hex").slice(0,12);return js(i,`${l}-${c}`)}function N1(i,l,u){let c={...i};if(process.platform==="win32")for(let g of Object.keys(c)){let b=g.toUpperCase();if(b==="PLUGIN_ROOT"||b==="PLUGIN_DATA")delete c[g]}return c.PLUGIN_ROOT=l,c.PLUGIN_DATA=u,c}async function O1(i){if(cf(i.server,new Set(["type","command","args","env","cwd"]),"stdio MCP server"),typeof i.server.command!=="string"||!i.server.command)throw Error("stdio MCP server requires a non-empty 'command'.");let l;if(i.server.command.startsWith("./")){if(l=await rv(i.pluginRoot,bn(i.pluginRoot,i.server.command)),await sv(l)){if(!(await Wl(l)).isFile())throw Error("stdio MCP 'command' must resolve to a regular file.")}}else{if(HS(i.server.command)||/[\s/\\\0]/u.test(i.server.command))throw Error("stdio MCP 'command' must be one bare executable token or a plugin-relative path beginning with './'.");l=i.server.command}let u=P1(i.server.args,"args")?.map((k)=>Vc(k,i.pluginRoot,i.pluginDataPath)),c=WS(i.server.env,"env")??{};for(let k of Object.keys(c))if(process.platform==="win32"?k.toUpperCase()==="PLUGIN_ROOT"||k.toUpperCase()==="PLUGIN_DATA":k==="PLUGIN_ROOT"||k==="PLUGIN_DATA")throw Error(`stdio MCP env cannot configure reserved key '${k}'.`);let g=Object.fromEntries(Object.entries(c).map(([k,T])=>[k,Vc(T,i.pluginRoot,i.pluginDataPath)])),b=N1(g,i.pluginRoot,i.pluginDataPath),I=i.pluginRoot;if(i.server.cwd!==void 0){if(typeof i.server.cwd!=="string")throw Error("stdio MCP field 'cwd' must be a string.");let k;if(i.server.cwd.startsWith("./"))k=i.pluginRoot;else if(i.server.cwd===Xc||i.server.cwd.startsWith(`${Xc}/`))k=i.pluginRoot;else if(i.server.cwd===Jc||i.server.cwd.startsWith(`${Jc}/`))k=i.pluginDataPath;else throw Error(`stdio MCP 'cwd' must begin with './', '${Xc}', or '${Jc}'.`);let T=Vc(i.server.cwd,i.pluginRoot,i.pluginDataPath);if(I=await rv(k,i.server.cwd.startsWith("./")?bn(i.pluginRoot,T):T),await sv(I)&&!(await Wl(I)).isDirectory())throw Error("stdio MCP 'cwd' must resolve to a directory.")}return{type:"stdio",command:l,...u?{args:u}:{},cwd:I,env:b}}function $1(i){let l=i.replace(/^\[|\]$/g,"").toLowerCase();if(l==="localhost"||l==="::1")return!0;if(I1(l)===4)return l.split(".")[0]==="127";return!1}function L1(i,l){if(cf(i,new Set(["type","url","headers"]),`${l} MCP server`),typeof i.url!=="string"||!i.url)throw Error(`${l} MCP server requires a non-empty 'url'.`);let u;try{u=new URL(i.url)}catch{throw Error(`${l} MCP 'url' must be an absolute HTTP(S) URL.`)}if(u.protocol!=="http:"&&u.protocol!=="https:"||u.username||u.password||u.hash)throw Error(`${l} MCP 'url' must be HTTP(S) without user information or a fragment.`);if(u.protocol!=="https:"&&!$1(u.hostname))throw Error(`${l} MCP endpoints must use HTTPS unless loopback.`);let c=WS(i.headers,"headers"),g=new Set;for(let[b,I]of Object.entries(c??{})){let k=b.toLowerCase();if(g.has(k))throw Error(`Duplicate case-insensitive MCP header '${b}'.`);g.add(k);try{w1(b),b1(b,I)}catch(T){throw Error(`Invalid MCP header '${b}': ${St(T)}`)}}return l==="sse"?{type:"sse",url:u.toString(),...c?{headers:c}:{}}:{type:"streamableHttp",url:u.toString(),...c?{headers:c}:{}}}async function D1(i){let l=js(i.pluginRoot,"mcp.json"),u;try{u=await wu(l)}catch(k){return i.diagnostics.push(dt({scope:"mcp",pluginPath:i.pluginRoot,pluginName:i.pluginName,componentPath:l,message:`Cannot inspect Agent Plugin MCP component: ${St(k)}`})),[]}if(!u)return[];let c;try{c=await Rl(i.pluginRoot,l,"file")}catch(k){return i.diagnostics.push(dt({scope:"mcp",pluginPath:i.pluginRoot,pluginName:i.pluginName,componentPath:l,message:`Invalid Agent Plugin MCP component: ${St(k)}`})),[]}let g;try{g=JSON.parse(await lf(c,"utf8"))}catch(k){return i.diagnostics.push(dt({scope:"mcp",pluginPath:i.pluginRoot,pluginName:i.pluginName,componentPath:c,message:`Invalid mcp.json: ${St(k)}`})),[]}if(!nn(g))return i.diagnostics.push(dt({scope:"mcp",pluginPath:i.pluginRoot,pluginName:i.pluginName,componentPath:c,message:"mcp.json must contain a JSON object."})),[];try{if(cf(g,new Set(["$schema","mcpServers"]),"mcp.json"),g.$schema!==tv)throw Error(`Unsupported or mismatched mcp.json $schema; expected '${tv}'.`);if(!nn(g.mcpServers))throw Error("mcp.json field 'mcpServers' must be an object.")}catch(k){return i.diagnostics.push(dt({scope:"mcp",pluginPath:i.pluginRoot,pluginName:i.pluginName,componentPath:c,message:`Invalid Agent Plugin MCP component: ${St(k)}`})),[]}let b=M1(i.pluginDataRoot,i.pluginName,i.pluginRoot),I=[];for(let[k,T]of Object.entries(g.mcpServers).sort(([E],[A])=>E.localeCompare(A)))try{if(!nn(T))throw Error("server configuration must be an object.");if(T.type!=="stdio"&&T.type!=="streamable-http"&&T.type!=="sse")throw Error("server has an unsupported or missing transport type.");let E,A;if(T.type==="stdio")A=b,E=await O1({server:T,pluginRoot:i.pluginRoot,pluginDataPath:A});else E=L1(T,T.type);let C={name:`${i.pluginName}.${k}`,transport:E,metadata:{source:"agent-plugin",pluginName:i.pluginName,pluginPath:i.pluginRoot,serverName:k,...A?{pluginDataPath:A}:{}}};I.push({pluginName:i.pluginName,pluginRoot:i.pluginRoot,...A?{pluginDataPath:A}:{},serverName:k,registration:C})}catch(E){i.diagnostics.push(dt({scope:"mcp-server",pluginPath:i.pluginRoot,pluginName:i.pluginName,componentPath:c,componentName:k,message:`Skipping invalid Agent Plugin MCP server '${k}': ${St(E)}`}))}return I}async function U1(i,l){let u;try{u=await C1(i,l)}catch(b){l.push(dt({scope:"manifest",pluginPath:i,componentPath:js(i,Gt),message:`Rejecting Agent Plugin: ${St(b)}`}));return}let{manifest:c,manifestPath:g}=u;return{rootPath:i,manifestPath:g,manifest:c}}async function F1(i,l,u){let{rootPath:c,manifest:g}=i,[b,I]=await Promise.all([R1(c,g.name,u),D1({pluginRoot:c,pluginName:g.name,pluginDataRoot:l,diagnostics:u})]);return{...i,skills:b,mcpServers:I}}async function KS(i={}){let l=[],u=await A1(i,l),c=bn(i.pluginDataRoot??js(Z(),"agent-plugins")),g=new Set((i.disabledPluginNames??[]).map((E)=>E.trim()).filter(Boolean)),b=[],I=new Map;for(let E of u){let A=await U1(E,l);if(!A)continue;let C=A.manifest.name,N=I.get(C);if(N){l.push(dt({level:"warning",scope:"plugin",pluginPath:E,pluginName:C,message:`Ignoring duplicate Agent Plugin '${C}'; '${N}' has precedence.`}));continue}if(I.set(C,E),g.has(C))continue;b.push(await F1(A,c,l))}let k=[],T=new Set;for(let E of b)for(let A of E.mcpServers){if(T.has(A.registration.name)){l.push(dt({scope:"mcp-server",pluginPath:E.rootPath,pluginName:E.manifest.name,componentName:A.serverName,message:`Skipping duplicate Agent Plugin MCP runtime name '${A.registration.name}'.`}));continue}T.add(A.registration.name),k.push(A)}return{plugins:b,skills:b.flatMap((E)=>E.skills),mcpServers:k,diagnostics:l}}function W1(i){return Object.fromEntries(Object.entries(i).map(([l,u])=>[l,{...u}]))}function K1(i){if(i.baseUrl.length===0)return!1;switch(i.client){case"openai-compatible":case"openai":case"openai-r1":case"fetch":return!0;default:return i.protocol==="openai-chat"}}var G1=Object.values(Oe).map((i)=>({id:i.provider.id,baseUrl:i.provider.baseUrl??"",modelsSourceUrl:i.provider.modelsSourceUrl,modelId:i.provider.defaultModelId,knownModels:W1(i.models),capabilities:i.provider.capabilities?[...i.provider.capabilities]:void 0,env:i.provider.env?[...i.provider.env]:void 0,client:i.provider.client,protocol:i.provider.protocol})),X1=Object.fromEntries(G1.map((i)=>[i.id,i]));function J1(){return Object.fromEntries(Object.entries(X1).filter(([,i])=>K1(i)))}function V1(i=[]){let l=i.flatMap((u)=>{switch(u){case"reasoning":case"prompt-cache":case"tools":case"oauth":return[u];default:return[]}});return l.length>0?l:void 0}var Y1="https://models.dev/api.json",Q1=600000,Z1=5000,ov=new Map,Qc=new Map;async function eD(i,l){let u=Object.assign((...c)=>{let[g,b]=c,I=AbortSignal.timeout(Z1),k=b?.signal?AbortSignal.any([b.signal,I]):I;return globalThis.fetch(g,{...b,signal:k})},globalThis.fetch);return da(i,u,{includeClineCloudModels:l})}async function tD(i={}){let l=i.url??Y1,u=i.cacheTtlMs??Q1,c=i.includeClineCloudModels===!0,g=`${l}\x00cloud=${c}`,b=Date.now(),I=ov.get(g);if(I&&I.expiresAt>b)return I.data;let k=Qc.get(g);if(k)return k;let T=eD(l,c).then((E)=>(ov.set(g,{data:E,expiresAt:b+u}),E)).finally(()=>{Qc.delete(g)});return Qc.set(g,T),T}function rD(i){return Object.fromEntries(Object.entries(i).map(([l,u])=>[l,{baseUrl:u.baseUrl,modelId:u.modelId,capabilities:V1(u.capabilities)}]))}var sD=rD(J1()),av=Dt,iD=K,lv=e().min(1).regex(/^[a-z0-9][a-z0-9-]*$/i),nD=s(["anthropic","gemini","openai-chat","openai-responses","openai-r1","ai-sdk"]),oD=s(["anthropic","ai-sdk","ai-sdk-community","openai","openai-compatible","openai-r1","gemini","bedrock","custom","fetch","vertex"]),aD=t({apiKey:e().optional(),accessToken:e().optional(),refreshToken:e().optional(),expiresAt:n().int().positive().optional(),accountId:e().optional(),organizationId:e().optional(),organizationName:e().optional(),memberId:e().optional(),metadata:d(e(),m()).optional()}),lD=t({enabled:r().optional(),effort:Zt.optional(),budgetTokens:n().int().positive().optional()}),dD=t({accessKey:e().optional(),secretKey:e().optional(),sessionToken:e().optional(),region:e().optional(),profile:e().optional(),authentication:s(["iam","api-key","apikey","profile"]).optional(),usePromptCache:r().optional(),useCrossRegionInference:r().optional(),useGlobalInference:r().optional(),endpoint:e().url().optional(),customModelBaseId:e().optional()}),uD=t({projectId:e().optional(),region:e().optional()}),cD=t({apiVersion:e().optional(),useIdentity:r().optional()}),pD=t({clientId:e().optional(),clientSecret:e().optional(),tokenUrl:e().url().optional(),resourceGroup:e().optional(),deploymentId:e().optional(),useOrchestrationMode:r().optional(),api:s(["orchestration","foundation-models"]).optional(),defaultSettings:d(e(),m()).optional()}),mD=t({mode:s(["internal","external"]).optional(),usePromptCache:r().optional()}),hD=t({loadLatestOnInit:r().optional(),includeClineCloudModels:r().optional(),loadPrivateOnAuth:r().optional(),url:e().url().optional(),cacheTtlMs:n().int().positive().optional(),failOnError:r().optional()}),GS=t({provider:lv,apiKey:e().optional(),auth:aD.optional(),model:e().optional(),protocol:nD.optional(),client:oD.optional(),routingProviderId:lv.optional(),maxTokens:n().int().positive().optional(),contextWindow:n().int().positive().optional(),baseUrl:e().url().optional(),headers:d(e(),e()).optional(),timeout:n().int().positive().optional(),reasoning:lD.optional(),aws:dD.optional(),gcp:uD.optional(),azure:cD.optional(),sap:pD.optional(),oca:mD.optional(),region:e().optional(),apiLine:s(["china","international"]).optional(),capabilities:o(s(["reasoning","prompt-cache","streaming","tools","vision","computer-use","oauth","popular"])).optional(),modelCatalog:hD.optional()});function fD(i){return i.protocol==="openai-responses"||i.client==="openai"}function Pm(i,l={}){let u=i.provider,c=iD(u),g=l.includeKnownModels!==!1,b=i.reasoning?.effort||"none",I=b==="none"?void 0:b,k=sD[c],T=ha(c),E=Object.keys(T)[0],A=tP(c,i),C=i.baseUrl??ga(c,i.apiLine)??(c==="oca"?i.oca?.mode==="internal"?dk:uk:k?.baseUrl),N=i.routingProviderId??(fD(i)&&c!==av.OPENAI_NATIVE?av.OPENAI_NATIVE:void 0),O=g?k?.knownModels??(Object.keys(T).length>0?T:void 0):void 0,L={providerId:u,clientType:i.client,routingProviderId:N,modelId:i.model??k?.modelId??E??"default",...g?{knownModels:O}:{},apiKey:A,accessToken:i.auth?.accessToken,refreshToken:i.auth?.refreshToken,accountId:i.auth?.accountId,baseUrl:C,headers:i.headers,timeoutMs:i.timeout,maxOutputTokens:i.maxTokens,maxInputTokens:i.contextWindow,thinking:i.reasoning?.enabled,reasoningEffort:I,thinkingBudgetTokens:i.reasoning?.budgetTokens,region:i.region??i.aws?.region??i.gcp?.region,apiLine:i.apiLine,useCrossRegionInference:i.aws?.useCrossRegionInference,useGlobalInference:i.aws?.useGlobalInference,aws:i.aws?{accessKey:i.aws.accessKey,secretKey:i.aws.secretKey,sessionToken:i.aws.sessionToken,authentication:i.aws.authentication,profile:i.aws.profile,usePromptCache:i.aws.usePromptCache,endpoint:i.aws.endpoint,customModelBaseId:i.aws.customModelBaseId}:void 0,gcp:i.gcp?{projectId:i.gcp.projectId,region:i.gcp.region}:void 0,azure:i.azure,sap:i.sap,oca:i.oca,capabilities:i.capabilities??k?.capabilities,modelCatalog:i.modelCatalog?{loadLatestOnInit:i.modelCatalog.loadLatestOnInit,includeClineCloudModels:i.modelCatalog.includeClineCloudModels,loadPrivateOnAuth:i.modelCatalog.loadPrivateOnAuth,url:i.modelCatalog.url,cacheTtlMs:i.modelCatalog.cacheTtlMs,failOnError:i.modelCatalog.failOnError}:void 0};return Object.fromEntries(Object.entries(L).filter(([D,U])=>U!==void 0))}var Mm=GS,XS=t({providerId:e().min(1),modelId:e().min(1)}),gD=t({voiceInput:XS.optional()}),yD=t({bedrockProfile:r().optional()}),vD=t({settings:GS,updatedAt:e().datetime(),tokenSource:s(["manual","oauth","migration"]).default("manual")}),dv=t({version:a(1),lastUsedProvider:e().min(1).optional(),modes:gD.default({}),repairs:yD.optional(),providers:d(e(),vD)});function Nm(){return{version:1,modes:{},providers:{}}}var Zc=n().finite().positive().optional().catch(void 0),ma=n().finite().nonnegative().optional().catch(void 0),ED=t({id:e().optional(),name:e().optional(),maxTokens:Zc,contextWindow:Zc,maxInputTokens:Zc,capabilities:o(ho).optional(),supportsVision:r().optional(),supportsAttachments:r().optional(),supportsReasoning:r().optional(),operation:fo.optional(),operationModes:o(yo).optional(),modalities:go.optional(),inputPrice:ma,outputPrice:ma,cacheReadsPrice:ma,cacheWritesPrice:ma,temperature:ma,apiFormat:mo.optional()}).passthrough(),AD=t({name:e(),baseUrl:e(),defaultModelId:e().optional(),protocol:fr.optional(),client:yr.optional(),capabilities:o(gr).optional(),modelsSourceUrl:e().optional()}).passthrough(),VS=t({provider:AD.optional(),models:d(e(),ED).optional(),discoveredModelIds:o(e()).optional()}).passthrough(),xD=t({version:a(1),providers:d(e(),VS)}),CD=t({version:a(1),providers:d(e(),m())}),uv=new Set,YS={apiKeyOptional:!0};function QS(i){return i.split(/[-_]/).filter(Boolean).map((l)=>l.charAt(0).toUpperCase()+l.slice(1)).join(" ")}function RD(i){return _D(JS(i.getFilePath()),"models.json")}function Om(){return{version:1,providers:{}}}function PD(i){let l=CD.safeParse(i);if(!l.success)return lt("models.json content is not a valid models file envelope; starting from an empty registry"),Om();let u={};for(let[c,g]of Object.entries(l.data.providers)){let b=VS.safeParse(g);if(b.success)u[c]=b.data;else lt(`models.json: dropping invalid entry for provider=${c}`)}return{version:1,providers:u}}function ZS(i){if(!wD(i))return Om();try{let l=ID(i,"utf8");return PD(JSON.parse(l))}catch{lt(`models.json at ${i} exists but is unreadable or invalid JSON; treating as an empty registry`)}return Om()}function MD(i,l){bD(JS(i),{recursive:!0});let u=xD.parse(l),c=`${i}.${process.pid}.tmp`;try{TD(c,`${JSON.stringify(u,null,2)}
|
|
269
|
+
`,"utf8"),kD(c,i)}catch(g){throw SD(c,{force:!0}),g}}function e0(i){if(!i||i.length===0)return;let l=new Set;if(i.includes("reasoning"))l.add("reasoning");if(i.includes("prompt-cache"))l.add("prompt-cache");if(i.includes("tools"))l.add("tools");return l.size>0?[...l]:void 0}function t0(i){let l=new Set;if(!i||i.length===0)return[...l];if(i.includes("streaming"))l.add("streaming");if(i.includes("tools"))l.add("tools");if(i.includes("reasoning"))l.add("reasoning");if(i.includes("prompt-cache"))l.add("prompt-cache");if(i.includes("vision"))l.add("images"),l.add("files");return[...l]}function ND(i){return i!=null&&typeof i.name==="string"&&typeof i.baseUrl==="string"}function r0(i,l){return i??l??"openai-chat"}function s0(i,l,u){return i??u??(l==="openai-responses"?"openai":"openai-compatible")}function i0(i,l,u,c=!1){let g=new Set(l?.capabilities??u??[]);if(l?.supportsVision!==void 0)if(l.supportsVision)g.add("images");else g.delete("images");if(l?.supportsAttachments!==void 0)if(l.supportsAttachments)g.add("files");else g.delete("files");if(l?.supportsReasoning!==void 0)if(l.supportsReasoning)g.add("reasoning");else g.delete("reasoning");if(!c&&g.size>0&&(l?.operation===void 0||l.operation==="language"))g.add("tools");let b=l?.apiFormat,I=l?.inputPrice!==void 0||l?.outputPrice!==void 0||l?.cacheReadsPrice!==void 0||l?.cacheWritesPrice!==void 0;return{id:i,name:l?.name??i,...l?.maxTokens!==void 0?{maxTokens:l.maxTokens}:{},...l?.contextWindow!==void 0?{contextWindow:l.contextWindow}:{},...l?.maxInputTokens!==void 0?{maxInputTokens:l.maxInputTokens}:{},...g.size>0?{capabilities:[...g]}:{},...l?.temperature!==void 0?{temperature:l.temperature}:{},...b!==void 0?{apiFormat:b}:{},...l?.operation!==void 0?{operation:l.operation}:{},...l?.operationModes!==void 0?{operationModes:l.operationModes}:{},...l?.modalities!==void 0?{modalities:l.modalities}:{},...I?{pricing:{...l?.inputPrice!==void 0?{input:l.inputPrice}:{},...l?.outputPrice!==void 0?{output:l.outputPrice}:{},...l?.cacheReadsPrice!==void 0?{cacheRead:l.cacheReadsPrice}:{},...l?.cacheWritesPrice!==void 0?{cacheWrite:l.cacheWritesPrice}:{}}}:{}}}function OD(i,l){let u=n0(i);for(let[c,g]of Object.entries(l??{})){let b=g.id?.trim()||c.trim();if(!b)continue;let I=u[b]?.capabilities,k=I&&g.capabilities?{...g,capabilities:[...new Set([...I,...g.capabilities])]}:g;pn(i,b,i0(b,k,I,I!==void 0))}}function $D(i,l,u){return{...l??{},id:i,name:l?.name??i,capabilities:l?.capabilities??u}}function n0(i){return Object.assign({},...bi(i).map((l)=>st(l)))}function LD(i){let l=i.provider.trim();if(!l||vi(l))return;let u=i.baseUrl?.trim();if(!u)return;let c=Oe[l],g=n0(l),b=t0(i.capabilities),I=b.length>0?b:void 0,k=i.model?.trim(),T={...g,...c?.models??{}};if(k)T[k]=$D(k,T[k],I);let E=Object.keys(T).filter(Boolean),A=k||E[0];if(!A)return;let C=r0(i.protocol,c?.provider.protocol),N=s0(i.client,C,c?.provider.client);Lt({provider:{id:l,name:c?.provider.name??QS(l),description:c?.provider.description,protocol:C,client:N,baseUrl:u,modelsSourceUrl:c?.provider.modelsSourceUrl,defaultModelId:A,capabilities:e0(i.capabilities)??c?.provider.capabilities,source:"file",metadata:YS},models:T})}function ep(i){for(let l of Object.values(i.providers))LD(l.settings)}function DD(i,l){let u=l.models??{};if(!ND(l.provider)){OD(i,u);return}let c=t0(l.provider.capabilities),g=Object.entries(u).map(([E,A])=>({id:A.id?.trim()||E.trim(),model:A})).filter(({id:E})=>E.length>0),b=l.provider.defaultModelId?.trim()||g[0]?.id||"default",I=r0(l.provider.protocol,void 0),k=s0(l.provider.client,I,void 0),T=Object.fromEntries(g.map(({id:E,model:A})=>[E,{...i0(E,A,c.length>0?c:void 0),status:"active"}]));Lt({provider:{id:i,name:l.provider.name.trim()||QS(i),protocol:I,client:k,baseUrl:l.provider.baseUrl,modelsSourceUrl:l.provider.modelsSourceUrl,defaultModelId:b,capabilities:e0(l.provider.capabilities),source:"file",metadata:YS},models:T})}function UD(i){let l=RD(i);if(uv.has(l))return;let u=ZS(l);for(let[c,g]of Object.entries(u.providers))DD(c,g);uv.add(l)}var bu="openai",BD="openai-compatible",HD=128000;function o0(i){let l=i?.trim();if(!l)return;try{let u=JSON.parse(l);if(!u)return;let c=typeof u.expiresAt==="number"&&Number.isFinite(u.expiresAt)?u.expiresAt<10000000000?u.expiresAt*1000:u.expiresAt:void 0;return{accessToken:u.idToken,refreshToken:u.refreshToken,expiresAt:c,accountId:u.userInfo?.id}}catch{return}}function ie(i){let l=i?.trim();return l?l:void 0}function zD(i){return i==="credentials"?"iam":i}function cv(i){if(!FD(i))return;try{let l=qD(i,"utf8"),u=JSON.parse(l);if(u&&typeof u==="object"&&!Array.isArray(u))return u}catch{}return}function WD(i){let l=i.dataDir??Z(),u=i.globalStatePath??$m(l,"globalState.json"),c=i.secretsPath??$m(l,"secrets.json"),g=cv(u),b=cv(c);if(!g&&!b)return;return{globalState:g??{},secrets:b??{}}}function Dm(i){return K(i)}function Iu(i){if(i===bu)return i;return K(i)}function KD(i,l,u,c){let g=u==="plan"?"planMode":"actMode",b=l===c?ie(u==="plan"?i.planModeApiModelId:i.actModeApiModelId):void 0,I={openrouter:`${g}OpenRouterModelId`,cline:`${g}ClineModelId`,openai:`${g}OpenAiModelId`,ollama:`${g}OllamaModelId`,lmstudio:`${g}LmStudioModelId`,litellm:`${g}LiteLlmModelId`,requesty:`${g}RequestyModelId`,together:`${g}TogetherModelId`,fireworks:`${g}FireworksModelId`,sapaicore:`${g}SapAiCoreModelId`,groq:`${g}GroqModelId`,baseten:`${g}BasetenModelId`,huggingface:`${g}HuggingFaceModelId`,"huawei-cloud-maas":`${g}HuaweiCloudMaasModelId`,oca:`${g}OcaModelId`,aihubmix:`${g}AihubmixModelId`,hicap:`${g}HicapModelId`,nousResearch:`${g}NousResearchModelId`,"vercel-ai-gateway":`${g}VercelAiGatewayModelId`}[l];return(I?ie(typeof i[I]==="string"?i[I]:void 0):void 0)??b}function GD(i,l,u){let c=u==="plan"?i.planModeThinkingBudgetTokens:i.actModeThinkingBudgetTokens,g=[...l==="oca"?[i.actModeOcaReasoningEffort,i.planModeOcaReasoningEffort]:[],...l==="gemini"?[i.geminiActModeThinkingLevel,i.geminiPlanModeThinkingLevel]:[],i.actModeReasoningEffort,i.planModeReasoningEffort].map(ie).find(Boolean),b=Zt.safeParse(g),I=b.success?b.data:void 0,k=typeof c==="number"&&Number.isInteger(c)&&c>0?c:void 0;if(!I&&k===void 0)return;return{...I?{effort:I}:{},...k!==void 0?{budgetTokens:k}:{}}}function XD(i){let l=i["openai-codex-oauth-credentials"];if(!l)return;try{let u=JSON.parse(l),c=ie(u.access_token),g=ie(u.refresh_token),b=ie(u.accountId);if(!c&&!g&&!b)return;return{...c?{apiKey:c}:{},auth:{...c?{accessToken:c}:{},...g?{refreshToken:g}:{},...b?{accountId:b}:{}}}}catch{return}}function JD(i){let l=st(i),u=rt(i),c=u?.provider.defaultModelId;if(c&&(l[c]||u?.models?.[c]))return c;return Object.keys(l)[0]??void 0}function VD(i,l){if(!l||i!=="cline")return l;let u=rt(i)?.models;if(!u)return l;if(u[l])return l;for(let c of mt){if(!l.startsWith(c.aliasPrefix))continue;let g=`${c.canonicalPrefix}${l.slice(c.aliasPrefix.length)}`;if(u[g])return g}return}function YD(i,l,u,c){let g=Dm(i),b=ie(c==="plan"?l.planModeApiProvider:l.actModeApiProvider),I=b?Iu(b):void 0,k=VD(g,KD(l,i,c,I))??JD(g),T=GD(l,g,c),E=typeof l.requestTimeoutMs==="number"&&Number.isInteger(l.requestTimeoutMs)&&l.requestTimeoutMs>0?l.requestTimeoutMs:void 0,A={anthropic:u.apiKey,cline:u.clineApiKey,openai:u.openAiApiKey,"openai-native":u.openAiNativeApiKey,openrouter:u.openRouterApiKey,bedrock:u.awsBedrockApiKey,gemini:u.geminiApiKey,ollama:u.ollamaApiKey,deepseek:u.deepSeekApiKey,requesty:u.requestyApiKey,together:u.togetherApiKey,fireworks:u.fireworksApiKey,qwen:u.qwenApiKey,doubao:u.doubaoApiKey,mistral:u.mistralApiKey,litellm:u.liteLlmApiKey,asksage:u.asksageApiKey,xai:u.xaiApiKey,moonshot:u.moonshotApiKey,zai:u.zaiApiKey,huggingface:u.huggingFaceApiKey,nebius:u.nebiusApiKey,sambanova:u.sambanovaApiKey,cerebras:u.cerebrasApiKey,groq:u.groqApiKey,"huawei-cloud-maas":u.huaweiCloudMaasApiKey,baseten:u.basetenApiKey,"vercel-ai-gateway":u.vercelAiGatewayApiKey,dify:u.difyApiKey,minimax:u.minimaxApiKey,hicap:u.hicapApiKey,aihubmix:u.aihubmixApiKey,nousResearch:u.nousResearchApiKey,oca:u.ocaApiKey},C={};if(i==="openai-codex")Object.assign(C,XD(u));if(i==="cline")try{let F=ie(u["cline:clineAccountId"]);if(F)C.auth={...C.auth??{},...o0(F)}}catch{}if(i===bu&&l.openAiHeaders)C.headers=l.openAiHeaders;if(i==="bedrock"){let F=zD(l.awsAuthentication),j=ie(l.awsProfile),H=F==="profile"||l.awsUseProfile===!0||F===void 0&&j!==void 0,Q=H&&F===void 0?"profile":F;C.aws={accessKey:ie(u.awsAccessKey),secretKey:ie(u.awsSecretKey),sessionToken:ie(u.awsSessionToken),region:ie(l.awsRegion),authentication:Q,profile:H?j:void 0,usePromptCache:l.awsBedrockUsePromptCache,useCrossRegionInference:l.awsUseCrossRegionInference,useGlobalInference:l.awsUseGlobalInference,endpoint:ie(l.awsBedrockEndpoint),customModelBaseId:ie(c==="plan"?l.planModeAwsBedrockCustomModelBaseId:l.actModeAwsBedrockCustomModelBaseId)}}if(i==="vertex")C.gcp={projectId:ie(l.vertexProjectId),region:ie(l.vertexRegion)};if(i===bu&&(l.azureApiVersion||l.azureIdentity!==void 0))C.azure={apiVersion:ie(l.azureApiVersion),useIdentity:l.azureIdentity};if(i==="sapaicore"){let F=l.sapAiCoreUseOrchestrationMode??!0;C.sap={clientId:ie(u.sapAiCoreClientId),clientSecret:ie(u.sapAiCoreClientSecret),tokenUrl:ie(l.sapAiCoreTokenUrl),resourceGroup:ie(l.sapAiResourceGroup),deploymentId:F?void 0:ie(c==="plan"?l.planModeSapAiCoreDeploymentId:l.actModeSapAiCoreDeploymentId),useOrchestrationMode:F}}if(i==="oca"){C.oca={mode:l.ocaMode};let F=ie(u.ocaRefreshToken);if(F)C.auth={...C.auth??{},refreshToken:F}}if(i==="qwen")C.apiLine=l.qwenApiLine;if(i==="moonshot")C.apiLine=l.moonshotApiLine;if(i==="zai")C.apiLine=l.zaiApiLine;if(i==="minimax")C.apiLine=l.minimaxApiLine;let N={anthropic:l.anthropicBaseUrl,openai:l.openAiBaseUrl,ollama:l.ollamaBaseUrl,lmstudio:l.lmStudioBaseUrl,litellm:l.liteLlmBaseUrl,gemini:l.geminiBaseUrl,requesty:l.requestyBaseUrl,asksage:l.asksageApiUrl,dify:l.difyBaseUrl,oca:l.ocaBaseUrl,aihubmix:l.aihubmixBaseUrl,sapaicore:l.sapAiCoreBaseUrl},O=ie(A[i]),L=ie(N[i]),D={provider:g,...O?{apiKey:O}:{},...k?{model:k}:{},...L?{baseUrl:L}:{},...T?{reasoning:T}:{},...E?{timeout:E}:{},...C},U=Mm.safeParse(D);if(!U.success)return;return Object.keys(D).filter((F)=>F!=="provider").length>0?U.data:void 0}function el(i){return typeof i==="number"&&Number.isFinite(i)&&i>0?i:void 0}function QD(i,l,u){if(i!==BD)return;if(!l.baseUrl||!l.model)return;let c=el(u?.contextWindow)??HD,g=el(u?.maxTokens),b=el(u?.inputPrice),I=el(u?.outputPrice),k=el(u?.temperature),T=["streaming","tools"];if(u?.supportsImages!==!1)T.push("images");if(u?.supportsPromptCache===!0)T.push("prompt-cache");return{provider:{name:"OpenAI Compatible",baseUrl:l.baseUrl,defaultModelId:l.model},models:{[l.model]:{id:l.model,name:l.model,contextWindow:c,maxInputTokens:c,capabilities:T,...g!==void 0?{maxTokens:g}:{},...b!==void 0?{inputPrice:b}:{},...I!==void 0?{outputPrice:I}:{},...k!==void 0?{temperature:k}:{}}}}}function ZD(i,l){let u=new Set;for(let g of[i.actModeApiProvider,i.planModeApiProvider]){let b=ie(g);if(b)u.add(Iu(b))}if(ie(l.apiKey))u.add("anthropic");if(ie(l.openRouterApiKey))u.add("openrouter");if(ie(l.openAiApiKey))u.add(bu);if(ie(l.openAiNativeApiKey))u.add("openai-native");if(ie(l["openai-codex-oauth-credentials"]))u.add("openai-codex");if(ie(l.geminiApiKey))u.add("gemini");if(ie(l.ollamaApiKey))u.add("ollama");if(ie(l.deepSeekApiKey))u.add("deepseek");if(ie(l.requestyApiKey))u.add("requesty");if(ie(l.togetherApiKey))u.add("together");if(ie(l.fireworksApiKey))u.add("fireworks");if(ie(l.qwenApiKey))u.add("qwen");if(ie(l.doubaoApiKey))u.add("doubao");if(ie(l.mistralApiKey))u.add("mistral");if(ie(l.liteLlmApiKey))u.add("litellm");if(ie(l.asksageApiKey))u.add("asksage");if(ie(l.xaiApiKey))u.add("xai");if(ie(l.moonshotApiKey))u.add("moonshot");if(ie(l.zaiApiKey))u.add("zai");if(ie(l.huggingFaceApiKey))u.add("huggingface");if(ie(l.nebiusApiKey))u.add("nebius");if(ie(l.sambanovaApiKey))u.add("sambanova");if(ie(l.cerebrasApiKey))u.add("cerebras");if(ie(l.groqApiKey))u.add("groq");if(ie(l.huaweiCloudMaasApiKey))u.add("huawei-cloud-maas");if(ie(l.basetenApiKey))u.add("baseten");if(ie(l.vercelAiGatewayApiKey))u.add("vercel-ai-gateway");if(ie(l.difyApiKey))u.add("dify");if(ie(l.minimaxApiKey))u.add("minimax");if(ie(l.hicapApiKey))u.add("hicap");if(ie(l.aihubmixApiKey))u.add("aihubmix");if(ie(l.nousResearchApiKey))u.add("nousResearch");if(ie(l.awsAccessKey)||ie(l.awsBedrockApiKey)||i.awsAuthentication!==void 0||i.awsUseProfile===!0||ie(i.awsProfile))u.add("bedrock");if(ie(i.vertexProjectId)||ie(i.vertexRegion))u.add("vertex");if(ie(l.clineApiKey))u.add("cline");let c=o0(ie(l["cline:clineAccountId"]));if(c?.accessToken||c?.refreshToken||c?.accountId)u.add("cline");if(ie(l.ocaApiKey))u.add("oca");if(ie(l.sapAiCoreClientId)||ie(l.sapAiCoreClientSecret)||ie(i.sapAiCoreTokenUrl)||ie(i.sapAiCoreBaseUrl)||ie(i.sapAiResourceGroup))u.add("sapaicore");return u}function eU(i,l,u){if(i.repairs?.bedrockProfile)return!1;let c=i.providers.bedrock;if(!c||c.tokenSource!=="migration")return!1;if(l.awsAuthentication!==void 0)return!1;let g=ie(l.awsProfile);if(!g)return!1;let b=c.settings.aws;if(b?.authentication!==void 0||b?.profile!==void 0||b?.accessKey||b?.secretKey||c.settings.apiKey)return!1;return i.providers.bedrock={...c,settings:{...c.settings,aws:{...b??{},authentication:"profile",profile:g}},updatedAt:u},i.repairs={...i.repairs,bedrockProfile:!0},!0}function tU(i){let l=i.providerSettingsManager.read(),u=WD(i);if(!u)return{migrated:!1,providerCount:Object.keys(l.providers).length,lastUsedProvider:l.lastUsedProvider};let{globalState:c,secrets:g}=u,b=c.mode==="plan"?"plan":"act",I=b==="plan"?"act":"plan",k=ie(b==="plan"?c.planModeApiProvider:c.actModeApiProvider),T=k?Iu(k):void 0,E=ie(b==="plan"?c.actModeApiProvider:c.planModeApiProvider),A=E?Iu(E):void 0,C=ZD(c,g),N=Nm();N.providers={...l.providers},N.lastUsedProvider=l.lastUsedProvider,N.modes=l.modes,N.repairs=l.repairs;let O=new Date().toISOString(),L=0,D=$m(jD(i.providerSettingsManager.getFilePath()),"models.json"),U=ZS(D),F=0;for(let z of C){let W=Dm(z);if(N.providers[W])continue;let ee=z!==T&&z===A?I:b,te=YD(z,c,g,ee);if(!te)continue;N.providers[W]={settings:te,updatedAt:O,tokenSource:"migration"},L+=1;let oe=QD(W,te,ee==="plan"?c.planModeOpenAiModelInfo:c.actModeOpenAiModelInfo);if(oe&&!U.providers[W])U.providers[W]=oe,F+=1}let j=eU(N,c,O);if(L===0&&F===0&&!j)return{migrated:!1,providerCount:Object.keys(l.providers).length,lastUsedProvider:l.lastUsedProvider};let H=ie(b==="plan"?c.planModeApiProvider:c.actModeApiProvider),Q=H?Dm(H):void 0;if(N.lastUsedProvider=l.lastUsedProvider??(Q&&N.providers[Q]?Q:Object.keys(N.providers)[0]),i.providerSettingsManager.write(N),F>0)MD(D,U);return{migrated:L>0||F>0||j,providerCount:Object.keys(N.providers).length,lastUsedProvider:N.lastUsedProvider}}function rU(){return new Date().toISOString()}var sU="cline",iU="cline-pass",a0=/[\p{Cc}\p{Cf}]/gu;function Yr(i){if(typeof i!=="string")return i;let l=i.replace(a0,"").trim();return l.length>0?l:void 0}function nU(i){let l={...i,apiKey:Yr(i.apiKey)};if(i.auth)l.auth={...i.auth,apiKey:Yr(i.auth.apiKey),accessToken:Yr(i.auth.accessToken),refreshToken:Yr(i.auth.refreshToken)};if(i.aws)l.aws={...i.aws,accessKey:Yr(i.aws.accessKey),secretKey:Yr(i.aws.secretKey),sessionToken:Yr(i.aws.sessionToken)};if(i.gcp)l.gcp={...i.gcp,projectId:Yr(i.gcp.projectId),region:Yr(i.gcp.region)};if(i.sap)l.sap={...i.sap,clientId:Yr(i.sap.clientId),clientSecret:Yr(i.sap.clientSecret)};if(i.headers)l.headers=Object.fromEntries(Object.entries(i.headers).map(([u,c])=>[u,c.replace(a0,"").trim()]));return l}function oU(i){if(nv(i)!=="providers.json")return;let l=Rm(i);if(nv(l)!=="settings")return;return Rm(l)}class ci{filePath;dataDir;constructor(i={}){if(this.filePath=i.filePath??Ya(),this.dataDir=i.dataDir??oU(this.filePath),this.dataDir||!i.filePath)tU({providerSettingsManager:this,dataDir:this.dataDir});if(UD(this),ep(this.read()),Yc(this.filePath))try{iv(this.filePath,384)}catch{}}getFilePath(){return this.filePath}read(){if(!Yc(this.filePath))return Nm();try{let i=j1(this.filePath,"utf8"),l=JSON.parse(i),u=dv.safeParse(l);if(u.success){ep(u.data);let c=u.data.providers.cline?.settings?.auth;return lt(`providers.read providers=[${Object.keys(u.data.providers).join(",")}] lastUsed=${u.data.lastUsedProvider??"none"} clineAuthPresent=${!!c?.accessToken} clineAccessTokenHash=${Us(c?.accessToken)} clineRefreshTokenHash=${Us(c?.refreshToken)}`),u.data}}catch{}return Nm()}write(i){let l=dv.parse(i),u=Rm(this.filePath);if(!Yc(u))q1(u,{recursive:!0,mode:448});let c=`${this.filePath}.${process.pid}.tmp`;try{z1(c,`${JSON.stringify(l,null,2)}
|
|
270
|
+
`,{encoding:"utf8",mode:384}),B1(c,this.filePath)}catch(g){throw H1(c,{force:!0}),g}try{iv(this.filePath,384)}catch{}ep(l)}saveProviderSettings(i,l={}){let u=nU(Mm.parse(i)),c=this.read(),g=u.provider,b=l.setLastUsed!==!1,I=c.providers[g],k=l.tokenSource??I?.tokenSource??"manual",T={...c,providers:{...c.providers,[g]:{settings:u,updatedAt:rU(),tokenSource:k}},lastUsedProvider:b?g:c.lastUsedProvider};this.write(T);let E=c.providers.cline?.settings?.auth,A=u.provider==="cline"?u.auth:T.providers.cline?.settings?.auth,C=!!E?.accessToken&&!A?.accessToken;return lt(`providers.save providerId=${g} tokenSource=${k} clineAuthWasPresent=${!!E?.accessToken} clineAuthIsPresent=${!!A?.accessToken} authDropped=${C}`),T}resolveProviderSettings(i,l){let u=i.providers[l]?.settings,c=oi(l)?.storageProviderId;if(!c||c===l)return u;let g=i.providers[c]?.settings;if(!g)return u;return Mm.parse({...g.auth?{auth:g.auth}:{},...g.apiKey?{apiKey:g.apiKey}:{},...g.baseUrl?{baseUrl:g.baseUrl}:{},...u??{},provider:l})}getProviderSettings(i){let l=this.read();return this.resolveProviderSettings(l,i)}getVoiceInputSettings(){return this.read().modes.voiceInput}setVoiceInputSettings(i){let l=this.read();if(i)l.modes.voiceInput=XS.parse(i);else delete l.modes.voiceInput;return this.write(l),l}resolveLastUsedProviderId(i,l){let u=i.lastUsedProvider;if(u===iU&&l.isClinePassEnabled===!1)return sU;return u}getLastUsedProviderSettings(i={}){let l=this.read(),u=this.resolveLastUsedProviderId(l,i);if(!u)return;return this.resolveProviderSettings(l,u)}getProviderConfig(i,l){let u=this.getProviderSettings(i);if(!u)return;return Pm(u,l)}getLastUsedProviderConfig(i={}){let l=this.getLastUsedProviderSettings(i);if(!l)return;return Pm(l,i)}async refreshCatalog(){try{await tD({})}catch{}}}async function uU(i,l,u){let c=aU("sha256").update(l).digest("hex"),g=V(`${lU(i)}.oauth-${c}.lock`),b=!1,I=Date.now()+60000;try{g.exec("PRAGMA busy_timeout = 0;");while(!b)try{g.exec("BEGIN EXCLUSIVE;"),b=!0}catch(k){let T=k instanceof Error?k.message:String(k),E=k?.code;if(!(E==="SQLITE_BUSY"||E==="SQLITE_LOCKED"||/SQLITE_BUSY|SQLITE_LOCKED|database is locked/.test(T)))throw k;if(Date.now()>=I)throw Error("Timed out waiting for another process to refresh OAuth credentials.");await dU(25)}return await u()}finally{try{if(b)g.exec("ROLLBACK;")}finally{g.close?.()}}}function tp(i,l){let u=i?.expiresAt,c=l?.expiresAt;return i?.accessToken===l?.accessToken&&i?.refreshToken===l?.refreshToken&&i?.accountId===l?.accountId&&u===c}class od extends Error{providerId;constructor(i){super(`OAuth credentials for provider "${i}" are no longer valid. Re-run authentication for this provider.`);this.name="OAuthReauthRequiredError",this.providerId=i}}class oc{providerSettingsManager;telemetry;onCredentialsRefreshed;refreshInFlight=new Map;constructor(i){this.providerSettingsManager=i?.providerSettingsManager??new ci,this.telemetry=i?.telemetry,this.onCredentialsRefreshed=i?.onCredentialsRefreshed}async resolveProviderApiKey(i){let l=oi(i.providerId);if(!l)return null;return this.resolveWithSingleFlight(l.providerId,l.storageProviderId,i.forceRefresh)}async resolveWithSingleFlight(i,l,u=!1){let c=this.refreshInFlight.get(l);if(c)return c;let g=this.providerSettingsManager.getProviderSettings(l);if(!g||!jg(i,g))return null;let b=g.auth,I=uU(this.providerSettingsManager.getFilePath(),l,()=>this.resolveProviderApiKeyInternal(i,l,u&&tp(b,this.providerSettingsManager.getProviderSettings(l)?.auth))).finally(()=>{this.refreshInFlight.delete(l)});return this.refreshInFlight.set(l,I),I}async resolveProviderApiKeyInternal(i,l,u){let c=oi(i);if(!c)return null;let g=this.providerSettingsManager.getProviderSettings(l);if(!g)return lt(`oauth.resolve providerId=${i} storageProviderId=${l} outcome=no_settings`),null;let b=jg(i,g);if(!b)return lt(`oauth.resolve providerId=${i} storageProviderId=${l} outcome=no_credentials`),null;lt(`oauth.resolve.start providerId=${i} storageProviderId=${l} forceRefresh=${u} accessTokenHash=${Us(b.access)} refreshTokenHash=${Us(b.refresh)}`);let I=await c.refresh({settings:g,credentials:b,forceRefresh:u,telemetry:this.telemetry}),k=this.providerSettingsManager.getProviderSettings(l);if(!tp(g.auth,k?.auth))return null;if(!I)throw lt(`oauth.resolve providerId=${i} outcome=refresh_returned_null`),new od(i);let T=eP({manager:this.providerSettingsManager,providerId:i,settings:{...g,...k},credentials:I,setLastUsed:!1,save:!1}),E=!tp(g.auth,T.auth);if(E)lt(`oauth.resolve.refreshed providerId=${i} newAccessTokenHash=${Us(I.access)} newRefreshTokenHash=${Us(I.refresh)} savingToDisk=true`),this.providerSettingsManager.saveProviderSettings(T,{setLastUsed:!1,tokenSource:"oauth"}),this.onCredentialsRefreshed?.(g,T);else lt(`oauth.resolve providerId=${i} outcome=not_refreshed`);return{apiKey:c.getApiKey(T)??I.access,accountId:I.accountId,refreshed:E}}}var gU=3600000,yU=604800000,pv=2;class l0{provider;telemetry;logger;cacheTtlMs;cacheFilePath;persistentCacheMaxAgeMs;context;cache=new Map;cacheInfo={updateTime:0,userId:null};pendingPoll;constructor(i){this.provider=i.provider,this.telemetry=i.telemetry,this.logger=i.logger,this.cacheTtlMs=i.cacheTtlMs??gU,this.cacheFilePath=i.cacheFilePath,this.persistentCacheMaxAgeMs=i.persistentCacheMaxAgeMs??yU,this.context={...i.context??{}},this.hydrateFromPersistentCache()}setContext(i){let l=this.cacheInfo.userId!==(i.userId??null);if(this.context={...i},l)this.pendingPoll=void 0,this.cache.clear(),this.cacheInfo={updateTime:0,userId:i.userId??null}}hydrateCache(i){this.cacheInfo={updateTime:i.updateTime,userId:i.userId,flagsPayload:i.flagsPayload},this.rebuildCacheFromSnapshot(i.flagsPayload)}getCacheSnapshot(){return{updateTime:this.cacheInfo.updateTime,userId:this.cacheInfo.userId,flagsPayload:this.cacheInfo.flagsPayload}}async poll(i){let l=i??this.context.userId??null;if(this.pendingPoll?.userId===l)return this.pendingPoll.promise;let u={userId:l,promise:this.pollFlags(l)};this.pendingPoll=u;try{await u.promise}finally{if(this.pendingPoll===u)this.pendingPoll=void 0}}async pollFlags(i){let l=Date.now();if(l-this.cacheInfo.updateTime<this.cacheTtlMs){if(this.cacheInfo.userId===i)return}let u=this.cacheInfo;this.cacheInfo={updateTime:l,userId:i||null};try{let c=await this.provider.getAllFlagsAndPayloads({flagKeys:Ti.length>0?Ti:void 0,context:{...this.context,userId:i}});if(this.cacheInfo.userId!==i)return;this.cacheInfo.flagsPayload=c,this.rebuildCacheFromSnapshot(c),this.writePersistentCache()}catch(c){if(this.cacheInfo.userId!==i)return;throw this.cacheInfo=u.updateTime?u:{updateTime:0,userId:null},this.logger?.error?.("Error polling SDK feature flags",{error:c}),c}}hydrateFromPersistentCache(){let i=this.readPersistentCache();if(!i)return;if(i.userId&&this.context.userId&&i.userId!==this.context.userId)return;this.hydrateCache(i)}isFeatureFlagPayload(i){if(i===null||typeof i==="string"||typeof i==="number"||typeof i==="boolean")return!0;if(Array.isArray(i))return i.every((l)=>this.isFeatureFlagPayload(l));if(typeof i==="object")return Object.values(i).every((l)=>this.isFeatureFlagPayload(l));return!1}readPayloadRecord(i){if(!i||typeof i!=="object"||Array.isArray(i))return;let l=Object.entries(i).filter(([,c])=>this.isFeatureFlagPayload(c));if(l.length===0)return;let u={};for(let[c,g]of l)u[c]=g;return u}readPersistentCache(){try{if(!this.cacheFilePath||!cU(this.cacheFilePath))return;let i=JSON.parse(mU(this.cacheFilePath,"utf8"));if(!i||typeof i!=="object")return;let l=i;if(l.version!==pv||typeof l.updatedAt!=="number"||!Number.isFinite(l.updatedAt)||Date.now()-l.updatedAt>this.persistentCacheMaxAgeMs)return;return{updateTime:l.updatedAt,userId:l.userId??null,flagsPayload:{featureFlags:this.readPayloadRecord(l.flagsPayload?.featureFlags),featureFlagPayloads:this.readPayloadRecord(l.flagsPayload?.featureFlagPayloads)}}}catch(i){this.logger?.error?.("Error reading SDK feature flags cache",{error:i});return}}writePersistentCache(){try{if(!this.cacheFilePath)return;pU(fU(this.cacheFilePath),{recursive:!0,mode:448});let i=this.getCacheSnapshot(),l={version:pv,updatedAt:i.updateTime,userId:i.userId,flagsPayload:i.flagsPayload};hU(this.cacheFilePath,`${JSON.stringify(l,null,2)}
|
|
271
|
+
`,"utf8")}catch(i){this.logger?.error?.("Error writing SDK feature flags cache",{error:i})}}getReturnedFlagKeys(i){return[...new Set([...Object.keys(i?.featureFlags??{}),...Object.keys(i?.featureFlagPayloads??{})])]}rebuildCacheFromSnapshot(i){let l=new Map;for(let u of this.getReturnedFlagKeys(i)){let c=this.getFeatureFlag(u);l.set(u,c??!1)}this.cache=l}getFeatureFlag(i){try{let l=this.cacheInfo.flagsPayload?.featureFlagPayloads?.[i],u=this.cacheInfo.flagsPayload?.featureFlags?.[i],c=l??u??Ft[i]??void 0;if(!this.cache.has(i)||this.cache.get(i)!==c)this.telemetry?.capture({event:Re.FEATURE_FLAGS.FLAG_CALLED,properties:{$feature_flag:i,$feature_flag_response:u}});return c}catch(l){return this.logger?.error?.(`Error checking SDK feature flag ${i}`,{error:l}),Ft[i]??!1}}getBooleanFlagEnabled(i){return this.cache.get(i)===!0}getFlagPayload(i){return this.cache.get(i)??Ft[i]}getProvider(){return this.provider}get enabled(){return this.provider.enabled}getSettings(){return this.provider.getSettings()}test(i,l){if(process.env.IS_TEST==="true")this.cache.set(i,l)}async dispose(){await this.provider.dispose()}}var Pn;function mv(){return new ci().getProviderSettings("cline")?.auth?.accountId?.trim()||void 0}async function d0(i){let l=mv(),u=process.env.TELEMETRY_SERVICE_API_KEY;if(!l||!u)return Pn=void 0,!1;if(Pn?.accountId!==l||Pn.apiKey!==u)Pn={accountId:l,apiKey:u,service:new l0({context:{distinctId:l,userId:l},cacheTtlMs:60000,provider:{enabled:!0,getSettings:()=>({enabled:!0}),dispose:async()=>{},async getAllFlagsAndPayloads(g){let{buildClinePostHogClient:b,PostHogFeatureFlagsProvider:I}=await import("../../services/feature-flags/posthog.js"),k=new I({client:b(u),config:{}});try{return await k.getAllFlagsAndPayloads(g)}finally{await k.dispose()}}}})};let c=Pn;try{return c.pending??=c.service.poll().finally(()=>{c.pending=void 0}),await c.pending,Pn===c&&mv()===l&&c.service.getCacheSnapshot().flagsPayload?.featureFlags?.[i]===!0}catch{return!1}}var n8=IU(vU(un)??{recommended:[],free:[],clinePass:[]},ln());function pd(i){if(!i||typeof i!=="object")return null;let l=i;if(typeof l.id!=="string"||l.id.length===0)return null;return{id:l.id,name:typeof l.name==="string"&&l.name.length>0?l.name:l.id,description:typeof l.description==="string"?l.description:"",tags:Array.isArray(l.tags)?l.tags.filter((u)=>typeof u==="string"):[]}}function vU(i){if(!i||typeof i!=="object")return null;let l=i,u=Array.isArray(l.recommended)?l.recommended:[],c=Array.isArray(l.free)?l.free:[],g=Array.isArray(l.clinePass)?l.clinePass:[],b=u.map(pd).filter((E)=>E!==null),I=c.map(pd).filter((E)=>E!==null),k=g.map(pd).filter((E)=>E!==null),T=(Array.isArray(l.clineCloud)?l.clineCloud:[]).map(pd).filter((E)=>E!==null);if(b.length===0&&I.length===0&&k.length===0)return null;return{recommended:b,free:I,clinePass:k,clineCloud:T}}function rp(i){return i.replace(/\s*\(free\)\s*$/i,"").replace(/:free$/i,"").trim()}function wU(i){let l=[i];for(let u of mt)if(i.startsWith(u.canonicalPrefix))l.push(`${u.aliasPrefix}${i.slice(u.canonicalPrefix.length)}`);else if(i.startsWith(u.aliasPrefix))l.push(`${u.canonicalPrefix}${i.slice(u.aliasPrefix.length)}`);return l}function bU(i,l){for(let g of l)for(let b of wU(i.id)){let I=g?.[b]?.name?.trim();if(I)return rp(I)}let u=i.name?.trim();if(u&&u!==i.id)return rp(u);let c=i.id.split("/").at(-1)??i.id;return rp(c)}function IU(i,l){let u=(c,g)=>c.map((b)=>({...b,name:bU(b,g)}));return{recommended:u(i.recommended,[l?.openrouter]),free:u(i.free,[l?.cline,l?.openrouter]),clinePass:u(i.clinePass,[l?.["cline-pass"]]),clineCloud:i.clineCloud&&u(i.clineCloud,[l?.cline])}}function kU(i){let l=i?.auth?.accessToken?.trim()||i?.apiKey?.trim();return l&&l.length>0?l:void 0}var hv=["COMPOSIO_SEARCH_TOOLS","COMPOSIO_MANAGE_CONNECTIONS","COMPOSIO_WAIT_FOR_CONNECTIONS","COMPOSIO_MULTI_EXECUTE_TOOL"];async function SU(i,l){let u;try{let c=i("/api/v1/connectors/meta-tools/sessions",{method:"POST",signal:AbortSignal.timeout(5000)}),g=new Promise((N,O)=>{u=setTimeout(()=>O(Error("Connector discovery timed out")),5000)}),b=await Promise.race([c,g]);if(!b.ok){if(b.status!==404)l?.log?.(`composio-tools: meta-tool session returned HTTP ${b.status}`);return}let I=await Promise.race([b.json().catch(()=>{return}),g]),k=I?.data?.sessionId,T=I?.data?.tools;if(typeof k!=="string"||!k||!Array.isArray(T))return;let E=T.filter((N)=>typeof N?.slug==="string"&&hv.some((O)=>O===N.slug)),A=new Set(E.map((N)=>N.slug)),C=hv.filter((N)=>!A.has(N));if(C.length>0){l?.log?.(`composio-tools: meta-tool session missing required tools: ${C.join(", ")}`);return}return{sessionId:k,tools:[...new Map(E.map((N)=>[N.slug,N])).values()]}}catch(c){l?.log?.(`composio-tools: meta-tool session request failed: ${c instanceof Error?c.message:String(c)}`);return}finally{clearTimeout(u)}}async function TU(i,l,u,c){let g=`/api/v1/connectors/meta-tools/${encodeURIComponent(u)}/execute`,b;try{b=await i(g,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({sessionId:l,arguments:c&&typeof c==="object"?c:{}})})}catch(T){return{successful:!1,error:`Cline connectors request failed: ${T instanceof Error?T.message:String(T)}`}}let I=await b.text(),k;try{k=I?JSON.parse(I):void 0}catch{k=void 0}if(!b.ok){let T=k!==void 0?JSON.stringify(k).slice(0,600):I.slice(0,600);return{successful:!1,error:`Cline connectors proxy returned HTTP ${b.status} for ${u}${T?`: ${T}`:""}`}}return k??{successful:!0}}var _U=120000;function Pl(){return new ci().getProviderSettings("cline")?.auth?.accountId?.trim()||void 0}var fv;async function u0(i){let l=new ci,u;try{fv??=new oc,u=(await fv.resolveProviderApiKey({providerId:"cline"}))?.apiKey??void 0}catch(c){if(c instanceof od)return}if(u??=kU(l.getProviderSettings("cline")),!u||Pl()!==i)return;return{baseUrl:(l.getProviderSettings("cline")?.baseUrl?.trim()||ke().apiBaseUrl).replace(/\/+$/,""),token:u}}async function EU(i){if(Pl()!==i)return{error:{successful:!1,error:"The Cline account changed. Start a new session to use connector tools."}};if(!await d0(Rt.CLINE_COMPOSIO_BETA))return{error:{successful:!1,error:"Composio connectors are not enabled for this account."}};let l=await u0(i);if(!l)return{error:{successful:!1,error:"Sign in to your Cline account to use connector tools (no account token available)."}};return{auth:l}}function gv(i){return(l,u)=>{let c=new Headers(u.headers);return c.set("authorization",`Bearer ${i.token}`),fetch(`${i.baseUrl}${l}`,{...u,headers:c})}}async function AU(i){let l=i?.request,u=l?void 0:Pl(),c,g;if(l)c=l,g=async()=>({request:l});else{if(!u)return;if(!await d0(Rt.CLINE_COMPOSIO_BETA))return;if(Pl()!==u)return;let k=await u0(u);if(!k)return;c=gv(k),g=async()=>{let T=await EU(u);if("error"in T)return T;return{request:gv(T.auth)}}}let b=await SU(c,{log:(k)=>i?.logger?.log?.(k)});if(!b?.tools.length)return;let I;try{I=b.tools.map((k)=>_({name:k.slug.toLowerCase(),resultPolicy:"cache-oversized",description:k.description||k.name||k.slug,inputSchema:k.input_parameters??{type:"object",properties:{}},timeoutMs:_U,retryable:!1,execute:async(T)=>{let E=await g();if("error"in E)return E.error;return TU(E.request,b.sessionId,k.slug,T)}}))}catch(k){i?.logger?.log?.(`composio-tools: invalid meta-tool schemas: ${k instanceof Error?k.message:String(k)}`);return}return{name:"composio-tools",manifest:{capabilities:["tools"]},setup(k){if(!l&&Pl()!==u)return;for(let T of I)k.registerTool(T);i?.logger?.log?.(`composio-tools: registered ${I.length} meta tool(s) for this session`)}}}var Su=$U(xU),c0="cline checkpoint session=",Um=67108864,LU=1209600000;function DU(i){return i.includes(c0)}function p0(){return Kl(Z(),"checkpoint-scratch")}function m0(i,l){let u=RU("sha256").update(`${i}\x00${l}`).digest("hex").slice(0,32);return Kl(p0(),u)}async function UU(){try{let i=p0(),l=Date.now()-LU,u=await MU(i,{withFileTypes:!0});await Promise.all(u.map(async(c)=>{if(!c.isDirectory())return;let g=Kl(i,c.name);try{if((await NU(g)).mtimeMs<l)await ku(g,{recursive:!0,force:!0})}catch{}}))}catch{}}function sp(i,l){i?.log(l,{severity:"warn"})}function FU(i){let l=i?.checkpoint;if(!l||typeof l!=="object"||Array.isArray(l))return;let u=l;if(!u.latest||!Array.isArray(u.history))return;let c=u.latest,g=u.history.filter((b)=>!!b&&typeof b==="object"&&typeof b.ref==="string"&&typeof b.createdAt==="number"&&typeof b.runCount==="number");if(typeof c.ref!=="string"||typeof c.createdAt!=="number"||typeof c.runCount!=="number")return;return{latest:c,history:g}}async function Ct(i,l){let u=await Su("git",["-C",i,...l],{windowsHide:!0});return{stdout:u.stdout.trim(),stderr:u.stderr.trim()}}var pf=["-c","core.ignorestat=false","-c","core.splitIndex=false"];async function md(i,l,u){return(await Su("git",["-C",i,...pf,...u],{windowsHide:!0,maxBuffer:Um,env:{...process.env,GIT_INDEX_FILE:l}})).stdout.trim()}function qU(i,l,u,c){return new Promise((g,b)=>{let I=CU("git",["-C",i,...pf,...u],{windowsHide:!0,env:{...process.env,GIT_INDEX_FILE:l},stdio:["pipe","ignore","pipe"]}),k="";I.stderr.on("data",(T)=>{k+=T}),I.on("error",b),I.on("close",(T)=>{if(T===0)g();else b(Error(`git ${u[0]} exited with ${T}: ${k.trim()}`))}),I.stdin.on("error",()=>{}),I.stdin.end(c)})}async function jU(i,l){let u=(await Su("git",["-C",i,"ls-files","--others","--exclude-standard","-z"],{windowsHide:!0,maxBuffer:Um})).stdout.split("\x00").filter(Boolean);if(u.length===0)return;await PU(l,{recursive:!0,mode:448});let c=Kl(l,"index"),g=Kl(l,"pathspec");await OU(g,`${u.join("\x00")}\x00`);let b=["add","--force","--pathspec-from-file",g,"--pathspec-file-nul"];try{await md(i,c,b)}catch(A){if(String(A.stderr??"").includes("did not match any files"))throw A;await ku(c,{force:!0}),await ku(`${c}.lock`,{force:!0}),await md(i,c,b)}let I=await Su("git",["-C",i,...pf,"ls-files","-z"],{windowsHide:!0,maxBuffer:Um,env:{...process.env,GIT_INDEX_FILE:c}}),k=new Set(u.map((A)=>A.endsWith("/")?A.slice(0,-1):A)),T=I.stdout.split("\x00").filter(Boolean).filter((A)=>!k.has(A));if(T.length>0)await qU(i,c,["update-index","-z","--force-remove","--stdin"],`${T.join("\x00")}\x00`);let E=await md(i,c,["write-tree"]);if(!E)return;return await md(i,c,["commit-tree",E,"-m","untracked files on cline checkpoint"])||void 0}async function BU(i,l,u){let c=(await Ct(i,["stash","create",u])).stdout,g=await jU(i,l);if(c){if(!g)return c;let T=(await Ct(i,["rev-parse",`${c}^{tree}`])).stdout,E=(await Ct(i,["rev-parse",`${c}^1`])).stdout,A=(await Ct(i,["rev-parse",`${c}^2`])).stdout;if(!T||!E||!A)return c;return(await Ct(i,["commit-tree",T,"-p",E,"-p",A,"-p",g,"-m",u])).stdout||c}if(!g)return;let b=(await Ct(i,["rev-parse","HEAD"])).stdout,I=(await Ct(i,["rev-parse","HEAD^{tree}"])).stdout;if(!b||!I)return;let k=(await Ct(i,["commit-tree",I,"-p",b,"-m","index on cline checkpoint"])).stdout;if(!k)return;return(await Ct(i,["commit-tree",I,"-p",b,"-p",k,"-p",g,"-m",u])).stdout||void 0}async function yv(i,l){if(!i)return;await ku(m0(i,l),{recursive:!0,force:!0}).catch(()=>{return});let u=`refs/cline/checkpoints/${l}/`;try{let{stdout:c}=await Ct(i,["for-each-ref","--format=%(refname)",u]),g=c.trim().split(`
|
|
272
|
+
`).filter(Boolean);await Promise.allSettled(g.map((b)=>Ct(i,["update-ref","-d",b])))}catch{}}async function HU(i,l,u){if(!i||u.length===0)return;await Promise.allSettled(u.map((c)=>Ct(i,["update-ref",`refs/cline/checkpoints/${l}/${c.runCount}`,c.ref])))}function zU(i,l){let u=i.findIndex((c)=>c.runCount===l.runCount);if(u<0)return[...i,l];return i.map((c,g)=>g===u?l:c)}function WU(i){UU();let l,u,c=async()=>{if(l===!0)return!0;try{l=(await Ct(i.cwd,["rev-parse","--is-inside-work-tree"])).stdout==="true"}catch{l=!1}return l},g=async(b)=>{if(i.createCheckpoint)return await i.createCheckpoint({cwd:i.cwd,sessionId:i.sessionId,runCount:b});if(!await c())return;let I=Date.now(),k=(N)=>{i.telemetry?.capture({event:"checkpoint.snapshot",properties:{sessionId:i.sessionId,runCount:b,outcome:N,durationMs:Date.now()-I}})},T=async(N)=>{try{let O=(await Ct(i.cwd,["rev-parse","HEAD"])).stdout.trim();if(!O)return;return{ref:O,createdAt:Date.now(),runCount:b,kind:"commit"}}catch(O){sp(i.logger,`${N}: ${O instanceof Error?O.message:String(O)}`);return}},E=`${c0}${i.sessionId} run=${b}`,A="";try{A=await BU(i.cwd,m0(i.cwd,i.sessionId),E)??""}catch(N){sp(i.logger,`Checkpoint snapshot failed after ${Date.now()-I}ms: ${N instanceof Error?N.message:String(N)}`);let O=await T("Checkpoint HEAD fallback failed");return k(O?"head_fallback":"skipped"),O}if(!A){let N=await T("Checkpoint HEAD fallback failed");return k(N?"head_clean":"skipped"),N}let C=`refs/cline/checkpoints/${i.sessionId}/${b}`;try{await Ct(i.cwd,["update-ref",C,A])}catch(N){sp(i.logger,`Checkpoint store failed: ${N instanceof Error?N.message:String(N)}`),k("skipped");return}return k("stash"),{ref:A,createdAt:Date.now(),runCount:b,kind:"stash"}};return{beforeRun:async({snapshot:b})=>{if(b.parentAgentId==null)u=b.messages.length;return},beforeModel:async({snapshot:b})=>{if(b.parentAgentId!=null||b.iteration!==1)return;let I=b.messages.slice(u??Math.max(0,b.messages.length-1));u=void 0;let k=fm(b.messages);if(k<1)return;let T=await i.readSessionMetadata(),E=FU(T),A=fm(I)>=1,C=E?.history.some((L)=>L.runCount===k)??!1;if(!A&&C)return;let N=await g(k);if(!N)return;if(E?.latest.ref===N.ref)return;let O=zU(E?.history??[],N);await i.writeSessionMetadata({...T??{},checkpoint:{latest:N,history:O}});return}}}function JU(i,l){if(!l)return;return{name:i,manifest:{capabilities:["hooks"]},hooks:l}}function tF(i){return Er(i)}var h0;((i)=>{i.TaskStart="TaskStart",i.TaskResume="TaskResume",i.TaskCancel="TaskCancel",i.TaskComplete="TaskComplete",i.TaskError="TaskError",i.PreToolUse="PreToolUse",i.PostToolUse="PostToolUse",i.UserPromptSubmit="UserPromptSubmit",i.PreCompact="PreCompact",i.SessionShutdown="SessionShutdown"})(h0||={});var rF={["TaskStart"]:"agent_start",["TaskResume"]:"agent_resume",["TaskCancel"]:"agent_abort",["TaskComplete"]:"agent_end",["TaskError"]:"agent_error",["PreToolUse"]:"tool_call",["PostToolUse"]:"tool_result",["UserPromptSubmit"]:"prompt_submit",["PreCompact"]:void 0,["SessionShutdown"]:"session_shutdown"},sF=new Map(Object.values(h0).map((i)=>[i.toLowerCase(),i])),iF=new Set(["",".sh",".bash",".zsh",".js",".mjs",".cjs",".ts",".mts",".cts",".py",".ps1"]);function nF(i){let l=ZU(i).toLowerCase();if(!iF.has(l))return;let u=QU(i,l).trim().toLowerCase();return sF.get(u)}function f0(i){let l=[],u=new Set,c=tF(i).filter((g)=>VU(g));for(let g of c)try{for(let b of YU(g,{withFileTypes:!0})){if(!b.isFile())continue;let I=nF(b.name);if(!I)continue;let k=eF(g,b.name);if(u.has(k))continue;u.add(k),l.push({fileName:I,hookEventName:rF[I],path:k})}}catch{}return l.sort((g,b)=>g.path.localeCompare(b.path))}var aF=30000,lF=1000;function dF(i){let l=i.trim();if(!l)return{};let u=l.split(`
|
|
273
|
+
`).map((g)=>g.trim()).filter(Boolean).filter((g)=>g.startsWith("HOOK_CONTROL\t")).map((g)=>g.slice(13)),c=u.length>0?u[u.length-1]:l;try{return{parsedJson:JSON.parse(c)}}catch(g){return{parseError:g instanceof Error?g.message:"Failed to parse subprocess stdout JSON"}}}function vv(i,l){let u=i instanceof Error?i:Error(String(i)),c=u,g=l.join(" ");if(c.code==="EACCES"){let I=Error(`Failed to execute hook command "${g}" (EACCES). Configure hooks with an explicit interpreter/command array (for example: ["bash", "/path/to/script"]) or make the script executable with a valid shebang.`);return I.code=c.code,I}let b=Error(`Failed to execute hook command "${g}": ${u.message}`);return b.code=c.code,b}function uF(i){for(let l of[i.stdin,i.stdout,i.stderr]){if(!l||l.destroyed)continue;l.removeAllListeners("data"),l.destroy()}}async function cF(i,l){let u=i.stdin;if(!u)throw Error("runSubprocessEvent failed to create stdin pipe");await new Promise((c,g)=>{let b=!1,I=(E)=>{if(b)return;b=!0,E()},k=(E)=>{let A=E.code;return A==="EPIPE"||A==="EOF"||A==="ERR_STREAM_DESTROYED"},T=(E)=>{if(k(E)){I(c);return}I(()=>g(E))};u.on("error",T),u.once("close",()=>u.off("error",T)),u.end(l,(E)=>{if(E){if(k(E)){I(c);return}I(()=>g(E));return}I(c)})})}async function wv(i,l){let u=It(l.command,{env:l.env,debugRole:"hook"});if(!Array.isArray(u)||u.length===0)throw Error("runSubprocessEvent requires a non-empty command");let c=!!l.detached,g=oF(u[0],u.slice(1),{cwd:l.cwd,env:We(l.env),stdio:c?["pipe","ignore","ignore"]:["pipe","pipe","pipe"],detached:c,windowsHide:!0}),b="",I="",k=!1,T;if(!c&&(!g.stdout||!g.stderr))throw g.kill("SIGKILL"),Error("runSubprocessEvent failed to create stdout/stderr pipes");g.stdout?.on("data",(C)=>{b+=C.toString()}),g.stderr?.on("data",(C)=>{I+=C.toString()});let E=new Promise((C,N)=>{g.once("spawn",()=>{try{l.onSpawn?.({command:u,pid:g.pid??void 0,detached:c})}catch{}C()}),g.once("error",(O)=>N(vv(O,u)))}),A=new Promise((C,N)=>{let O=!1,L,D=()=>{if(T)clearTimeout(T);if(L)clearTimeout(L)},U=(F)=>{if(O)return;O=!0,D();let{parsedJson:j,parseError:H}=dF(b);C({exitCode:F,stdout:b,stderr:I,parsedJson:j,parseError:H,timedOut:k})};if(g.once("error",(F)=>{D(),N(vv(F,u))}),g.once("close",(F)=>U(F)),!c)g.once("exit",(F)=>{L=setTimeout(()=>{U(F),uF(g)},lF),L.unref?.()})});if(c)A.catch(()=>{return});if(!c&&(l.timeoutMs??0)>0)T=setTimeout(()=>{k=!0,g.kill("SIGKILL")},l.timeoutMs);if(c&&l.onDetachedSettled){let C=Date.now(),N=l.onDetachedSettled,O=!1,L,D=(F)=>{if(O)return;if(O=!0,L)clearTimeout(L);N({command:u,...F})},U=l.detachedObservationMs??aF;L=setTimeout(()=>D({durationMs:U,exitCode:null,exited:!1}),U),L.unref?.(),A.then((F)=>D({durationMs:Date.now()-C,exitCode:F.exitCode,exited:!0})).catch(()=>{if(O=!0,L)clearTimeout(L)})}if(await Promise.race([Promise.all([E,cF(g,JSON.stringify(i))]),A]),c){g.unref();return}return await A}var ip=50000;function pF(i){if(i===void 0||i.length<=ip)return i;return`${i.slice(0,ip)}
|
|
274
|
+
[hook context truncated: exceeded ${ip} characters]`}var S8=t({contextModification:e().optional(),cancel:r().optional(),review:r().optional(),errorMessage:e().optional(),context:e().optional(),overrideInput:m().optional()}).passthrough();function Tu(i){if(!i||typeof i!=="object")return{};let l={};for(let[u,c]of Object.entries(i))l[u]=typeof c==="string"?c:JSON.stringify(c);return l}function Ml(i,l,u){let c=u instanceof Error?`: ${u.message}`:"",g=`${l}${c}`;if(i){try{i.log(g,{severity:"warn",...u!==void 0?{error:u}:{}})}catch{}return}console.warn(g)}function mF(i,l){if(!l)return i;if(!i)return{...l};let u=[i.context,l.context].filter((b)=>typeof b==="string"&&b.length>0).join(`
|
|
275
|
+
`),c=[i.cancelReason,l.cancelReason].filter((b)=>typeof b==="string"&&b.length>0).join(`
|
|
276
|
+
`),g=[...i.appendMessages??[],...l.appendMessages??[]];return{cancel:i.cancel===!0||l.cancel===!0?!0:void 0,review:i.review===!0||l.review===!0?!0:void 0,context:u||void 0,cancelReason:c||void 0,overrideInput:l.overrideInput!==void 0?l.overrideInput:i.overrideInput,systemPrompt:l.systemPrompt!==void 0?l.systemPrompt:i.systemPrompt,appendMessages:g.length>0?g:void 0}}function hF(i){if(!i||typeof i!=="object")return;let l=i,u=typeof l.context==="string"?l.context:typeof l.contextModification==="string"?l.contextModification:void 0,c=typeof l.errorMessage==="string"&&l.errorMessage.trim().length>0?l.errorMessage:void 0,g=typeof l.cancel==="boolean"?l.cancel:void 0;return{cancel:g,review:typeof l.review==="boolean"?l.review:void 0,context:g===!0?void 0:pF(u??c),cancelReason:g===!0?c??u:void 0,overrideInput:Object.hasOwn(l,"overrideInput")?l.overrideInput:void 0}}function Fm(i){let l=String(i??"").toLowerCase();return l.includes("cancel")||l.includes("abort")||l.includes("interrupt")}function bt(i,l){let u=process.env.CLINE_USER_ID?.trim()||process.env.USER?.trim()||"unknown",c={rootSessionId:l.rootSessionId||i.conversationId};return{clineVersion:process.env.CLINE_VERSION?.trim()||"",timestamp:new Date().toISOString(),taskId:i.conversationId,sessionContext:c,workspaceRoots:l.workspacePath?[l.workspacePath]:[],workspaceInfo:l.workspaceInfo,userId:u,agent_id:i.agentId,parent_agent_id:i.parentAgentId}}async function qm(i,l){if(l.command.length===0)throw Error("runHookCommand requires non-empty command");try{return await wv(i,l)}catch(u){let c=yF(l.command,process.platform,u);if(!c)throw u;return await wv(i,{...l,command:c})}}function fF(i){try{let l=GU(i,"utf8").split(/\r?\n/,1)[0]?.trim();if(!l?.startsWith("#!"))return;let u=l.slice(2).trim();if(!u)return;let c=u.split(/\s+/).filter(Boolean);return c.length>0?c:void 0}catch{return}}function gF(i){return!!(i&&typeof i==="object"&&("code"in i)&&i.code==="ENOENT")}function yF(i,l=process.platform,u){if(l!=="win32"||!gF(u))return;if(i[0]!=="py"||i[1]!=="-3")return;return["python",...i.slice(2)]}function g0(i){if(i.length===0)return;let[l,...u]=i,c=l.replace(/\\/g,"/").toLowerCase(),g=c.split("/").at(-1)??c;if(g==="env")return g0(u);if(g==="bash"||g==="sh"||g==="zsh")return[g,...u];if(g==="python3"||g==="python")return process.platform==="win32"?["py","-3",...u]:[g,...u];return i}function vF(i){let l=fF(i);if(l&&l.length>0)return[...g0(l)??l,i];let u=i.toLowerCase();if(u.endsWith(".sh")||u.endsWith(".bash")||u.endsWith(".zsh"))return["bash",i];if(u.endsWith(".js")||u.endsWith(".mjs")||u.endsWith(".cjs"))return It(["node",i],{debugRole:"hook"});if(u.endsWith(".ts")||u.endsWith(".mts")||u.endsWith(".cts"))return["bun","run",i];if(u.endsWith(".py"))return process.platform==="win32"?["py","-3",i]:["python3",i];if(u.endsWith(".ps1"))return[process.platform==="win32"?"powershell":"pwsh","-File",i];return["bash",i]}function wF(i){let l={};for(let u of f0(i)){if(!u.hookEventName)continue;let c=u.hookEventName,g=l[c]??[];g.push(vF(u.path)),l[c]=g}return l}async function np(i){let l;for(let u of i.commands){let c=u.join(" ");try{let g=await qm(i.payload,{command:u,cwd:i.cwd,env:process.env,detached:!1,timeoutMs:i.timeoutMs});if(g?.timedOut){Ml(i.logger,`hook command timed out: ${c}`);continue}if(g?.parseError){Ml(i.logger,`hook command returned invalid JSON control output: ${c} (${g.parseError})`);continue}l=mF(l,hF(g?.parsedJson))}catch(g){Ml(i.logger,`hook command failed: ${c}`,g)}}return l}async function Xn(i){if(i.detached){let l=i.onHookRuntime,u=i.payload.hookName;for(let c of i.commands){let g=c.join(" ");qm(i.payload,{command:c,cwd:i.cwd,env:process.env,detached:!0,onDetachedSettled:l?(b)=>l({hookName:u,durationMs:b.durationMs,exitCode:b.exitCode,exited:b.exited}):void 0}).catch((b)=>{Ml(i.logger,`hook command failed: ${g}`,b)})}return}await Promise.all(i.commands.map(async(l)=>{let u=l.join(" ");try{await qm(i.payload,{command:l,cwd:i.cwd,env:process.env,detached:i.detached})}catch(c){Ml(i.logger,`hook command failed: ${u}`,c)}}))}function si(i){return{agentId:i.agentId,conversationId:i.conversationId??i.runId??i.agentId,parentAgentId:i.parentAgentId??null}}function jm(i,l){return{...si(i.snapshot),userMessage:l}}function y0(i){return{...si(i.snapshot),iteration:i.snapshot.iteration,call:{id:i.toolCall.toolCallId,name:i.toolCall.toolName,input:i.input}}}function v0(i){return{...si(i.snapshot),iteration:i.snapshot.iteration,record:{id:i.toolCall.toolCallId,name:i.toolCall.toolName,input:i.input,output:i.result.output,error:i.result.isError?String(i.result.output):void 0,durationMs:i.durationMs,startedAt:i.startedAt,endedAt:i.endedAt}}}function w0(i){return i.filter((l)=>l.type==="text"&&typeof l.text==="string").map((l)=>l.text).join("")}function bF(i){if(!i)return;let l={};if(i.cancel===!0){if(l.stop=!0,i.cancelReason?.trim())l.reason=i.cancelReason}else if(i.context?.trim())l.appendContext=i.context;if(i.overrideInput!==void 0)l.input=i.overrideInput;return Object.keys(l).length>0?l:void 0}function bv(i){if(!i)return;let l={};if(i.cancel===!0){if(l.stop=!0,i.cancelReason?.trim())l.reason=i.cancelReason}else if(i.context?.trim())l.appendContext=i.context;return Object.keys(l).length>0?l:void 0}function IF(i){let l={cwd:i.workspacePath,workspacePath:i.workspacePath,rootSessionId:i.rootSessionId,workspaceInfo:i.workspaceInfo},u=(c)=>{let g=`${JSON.stringify({ts:new Date().toISOString(),...c})}
|
|
277
|
+
`,b=(process.env.CLINE_HOOKS_LOG_PATH?.trim()||void 0)??XU(et(),"hooks.jsonl");et(b),KU(b,g,"utf8")};return{beforeRun:async(c)=>{let g=jm(c,"");u({...bt(g,l),hookName:"agent_start",taskStart:{taskMetadata:{}}});return},beforeTool:async(c)=>{let g=y0(c);u({...bt(g,l),hookName:"tool_call",iteration:g.iteration,tool_call:{id:g.call.id,name:g.call.name,input:g.call.input},preToolUse:{toolName:g.call.name,parameters:Tu(g.call.input)}});return},afterTool:async(c)=>{let g=v0(c);u({...bt(g,l),hookName:"tool_result",iteration:g.iteration,tool_result:g.record,postToolUse:{toolName:g.record.name,parameters:Tu(g.record.input),result:typeof g.record.output==="string"?g.record.output:JSON.stringify(g.record.output),success:!g.record.error,executionTimeMs:g.record.durationMs}});return},afterRun:async({snapshot:c,result:g})=>{let b=si(c);if(g.status==="completed"){u({...bt(b,l),hookName:"agent_end",iteration:g.iterations,turn:{outputText:g.outputText,status:g.status},taskComplete:{taskMetadata:{}}});return}if(g.status==="aborted"||Fm(g.error?.message)){u({...bt(b,l),hookName:"agent_abort",reason:g.error?.message,taskCancel:{taskMetadata:{}}});return}if(g.error)u({...bt(b,l),hookName:"agent_error",iteration:g.iterations,error:{name:g.error.name,message:g.error.message,stack:g.error.stack}})},onEvent:async(c)=>{if(c.type!=="message-added"||c.message.role!=="user"||c.message.metadata?.displayRole==="system")return;let g=jm({snapshot:c.snapshot},w0(c.message.content));u({...bt(g,l),hookName:"prompt_submit",userPromptSubmit:{prompt:g.userMessage,attachments:[]}})}}}function kF(i){let l=wF(i.workspacePath);if(!Object.values(l).some((A)=>A.length>0))return;let u=async(A,C)=>{let N=l[C]??[];if(N.length===0)return;let O=C==="agent_resume"?{...bt(A,i),hookName:C,taskResume:{taskMetadata:{},previousState:{}}}:{...bt(A,i),hookName:C,taskStart:{taskMetadata:{}}};if(!i.blockingRunStartHooks){await Xn({commands:N,cwd:i.cwd,logger:i.logger,detached:i.detachAsyncHooks??!0,onHookRuntime:i.onHookRuntime,payload:O});return}return np({commands:N,cwd:i.cwd,logger:i.logger,timeoutMs:i.toolCallTimeoutMs??120000,payload:O})},c=async(A)=>{let C=l.prompt_submit??[];if(C.length>0)await Xn({commands:C,cwd:i.cwd,logger:i.logger,detached:i.detachAsyncHooks??!0,onHookRuntime:i.onHookRuntime,payload:{...bt(A,i),hookName:"prompt_submit",userPromptSubmit:{prompt:A.userMessage,attachments:[]}}})},g=async(A)=>{let C=l.tool_call??[];if(C.length===0)return;return np({commands:C,cwd:i.cwd,logger:i.logger,timeoutMs:i.toolCallTimeoutMs??120000,payload:{...bt(A,i),hookName:"tool_call",iteration:A.iteration,tool_call:{id:A.call.id,name:A.call.name,input:A.call.input},preToolUse:{toolName:A.call.name,parameters:Tu(A.call.input)}}})},b=async(A)=>{let C=l.tool_result??[];if(C.length===0)return;return np({commands:C,cwd:i.cwd,logger:i.logger,timeoutMs:i.toolCallTimeoutMs??120000,payload:{...bt(A,i),hookName:"tool_result",iteration:A.iteration,tool_result:A.record,postToolUse:{toolName:A.record.name,parameters:Tu(A.record.input),result:typeof A.record.output==="string"?A.record.output:JSON.stringify(A.record.output),success:!A.record.error,executionTimeMs:A.record.durationMs}}})},I=async(A)=>{let C=l.agent_end??[];if(C.length===0)return;await Xn({commands:C,cwd:i.cwd,logger:i.logger,detached:i.detachAsyncHooks??!0,onHookRuntime:i.onHookRuntime,payload:{...bt(A,i),hookName:"agent_end",iteration:A.iteration,turn:A.turn,taskComplete:{taskMetadata:{}}}})},k=async(A)=>{let C=l.agent_error??[];if(C.length===0)return;await Xn({commands:C,cwd:i.cwd,logger:i.logger,detached:i.detachAsyncHooks??!0,onHookRuntime:i.onHookRuntime,payload:{...bt(A,i),hookName:"agent_error",iteration:A.iteration,error:{name:A.error.name,message:A.error.message,stack:A.error.stack}}})},T=async(A)=>{if(Fm(A.reason)){let N=l.agent_abort??[];if(N.length>0)await Xn({commands:N,cwd:i.cwd,logger:i.logger,detached:i.detachAsyncHooks??!0,onHookRuntime:i.onHookRuntime,payload:{...bt(A,i),hookName:"agent_abort",reason:A.reason,taskCancel:{taskMetadata:{}}}})}let C=l.session_shutdown??[];if(C.length===0)return;await Xn({commands:C,cwd:i.cwd,logger:i.logger,detached:i.detachAsyncHooks??!0,onHookRuntime:i.onHookRuntime,payload:{...bt(A,i),hookName:"session_shutdown",reason:A.reason}})},E={};if((l.agent_start?.length??0)>0||(l.agent_resume?.length??0)>0||(l.prompt_submit?.length??0)>0){if((l.agent_start?.length??0)>0||(l.agent_resume?.length??0)>0)E.beforeRun=async(A)=>{let C=process.env.CLINE_HOOK_AGENT_RESUME==="1"?"agent_resume":"agent_start",N=await u(si(A.snapshot),C);return bv(N)};if((l.prompt_submit?.length??0)>0)E.onEvent=async(A)=>{if(A.type!=="message-added"||A.message.role!=="user"||A.message.metadata?.displayRole==="system")return;await c(jm({snapshot:A.snapshot},w0(A.message.content)))}}if((l.tool_call?.length??0)>0)E.beforeTool=async(A)=>{let C=await g(y0(A));return bF(C)};if((l.tool_result?.length??0)>0)E.afterTool=async(A)=>{let C=await b(v0(A));return bv(C)};if((l.agent_end?.length??0)>0)E.afterRun=async({snapshot:A,result:C})=>{if(C.status!=="completed")return;await I({...si(A),iteration:C.iterations,turn:{outputText:C.outputText,status:C.status}})};if((l.agent_error?.length??0)>0||(l.agent_abort?.length??0)>0||(l.session_shutdown?.length??0)>0){let A=E.afterRun;E.afterRun=async(C)=>{await A?.(C);let{snapshot:N,result:O}=C;if(O.status==="aborted"||Fm(O.error?.message)){await T({...si(N),reason:O.error?.message});return}if(O.error)await k({...si(N),iteration:O.iterations,error:O.error})}}return E}function SF(i){return JU("core.hook_config_files",kF(i))}function xi(i,l){let u=i.map((c)=>c[l]).filter((c)=>typeof c==="function");if(u.length===0)return;return async(c)=>{let g;for(let b of u){let I=await b(c);if(!I||typeof I!=="object")continue;let k=I,T=[g?.appendContext,k.appendContext].filter((E)=>typeof E==="string"&&E.length>0).join(`
|
|
278
|
+
|
|
279
|
+
`);if(k.stop===!0)return{...g??{},...k,stop:!0};g={...g??{},...k,stop:g?.stop===!0||k.stop===!0?!0:k.stop,appendContext:T||void 0,options:g?.options||k.options?{...g?.options??{},...k.options??{}}:void 0}}return g}}function Iv(i){let l=i.filter((u)=>u!==void 0);if(l.length===0)return;return{beforeRun:xi(l,"beforeRun"),afterRun:xi(l,"afterRun"),beforeModel:xi(l,"beforeModel"),afterModel:xi(l,"afterModel"),beforeTool:xi(l,"beforeTool"),afterTool:xi(l,"afterTool"),onEvent:xi(l,"onEvent")}}function Bm(...i){let l,u;for(let g of i){if(!g)continue;if(g.toolExecutors)l={...l??{},...g.toolExecutors};if(g.requestToolApproval)u=g.requestToolApproval}let c=l&&Object.keys(l).length>0;if(!c&&!u)return;return{...c?{toolExecutors:l}:{},...u?{requestToolApproval:u}:{}}}function Ns(i){let l=i?.trim();return l?l:void 0}function TF(i){let l=i.client,u=QL(l)??Ns(i.source),c=Ns(l.version),g=Ns(l.platform)??Ns(l.name),b=Ns(l.platformVersion)??c,I={cline_type:u,extension_version:c,platform:g,platform_version:b};if(i.user?.accountId===void 0)return I;let k=typeof i.user.accountId==="string"?Ns(i.user.accountId):void 0;return{...I,distinct_id:k??Ns(i.user.distinctId),user_id:k,account_id:k,account_email:k?Ns(i.user.email):void 0,organization_id:k?Ns(i.user.organizationId):void 0}}function b0(i,l){let u={},c={},g,b=(I)=>({...l,...c,...u,...I,...g?{distinct_id:g}:{}});return{setDistinctId(I){g=Ns(I)},setMetadata(I){u={...I}},updateMetadata(I){u={...u,...I}},setCommonProperties(I){c={...I}},updateCommonProperties(I){c={...c,...I}},isEnabled:()=>i.isEnabled(),capture:(I)=>i.capture({event:I.event,properties:b(I.properties)}),captureRequired:(I,k)=>i.captureRequired(I,b(k)),recordCounter:(I,k,T,E,A)=>i.recordCounter(I,k,b(T),E,A),recordHistogram:(I,k,T,E,A)=>i.recordHistogram(I,k,b(T),E,A),recordGauge:(I,k,T,E,A)=>i.recordGauge(I,k,b(T),E,A),flush:()=>i.flush(),dispose:async()=>{}}}function _F(i,l){return b0(i,TF(l))}var RF=CF(EF);function PF(i,l){return RF("git",i,{cwd:l.cwd,encoding:"utf8",windowsHide:!0,signal:l.signal,timeout:15000,maxBuffer:10485760,env:{...process.env,GIT_TERMINAL_PROMPT:"0",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||"ssh -o BatchMode=yes"}})}function MF(i){if(!i||typeof i!=="object"||!("stderr"in i))return"";return typeof i.stderr==="string"?i.stderr.trim():""}function NF(i){if(!i||typeof i!=="object"||!("code"in i))return;return typeof i.code==="number"?i.code:void 0}function I0(i){let l=_u(i.cwd),u=i.git??PF,c=async(b)=>(await u(b,{cwd:l,signal:i.signal})).stdout,g=async(b)=>(await c(b)).trim();return{async isInsideWorkTree(){try{return await g(["rev-parse","--is-inside-work-tree"])==="true"}catch(b){if(NF(b)===128&&/not a git repository|Kein Git-Repository/i.test(MF(b)))return!1;throw b}},remotes:()=>ki({baseDir:l}).getRemotes(!0),displayBranch:async()=>(await ki({baseDir:l}).branch()).current.trim(),symbolicBranch:()=>g(["symbolic-ref","--quiet","--short","HEAD"]),headSha:()=>g(["rev-parse","HEAD"]),workspacePrefix:async()=>(await c(["rev-parse","--show-prefix"])).replace(/[\r\n]+$/,""),worktreeStatus:()=>g(["status","--porcelain=v1","--untracked-files=all","--ignore-submodules=none"]),branchRemote:(b)=>g(["config","--get",`branch.${b}.remote`]),branchMergeRef:(b)=>g(["config","--get",`branch.${b}.merge`]),remoteUrl:(b)=>g(["remote","get-url",b]),remoteRefs:(b,I)=>g(["ls-remote","--exit-code",b,I])}}function OF(i){let l=i?.git;if(!l||typeof l!=="object"||Array.isArray(l))return{};let u=l;return{...typeof u.url==="string"&&u.url.trim()?{url:u.url.trim()}:{},...typeof u.branch==="string"&&u.branch.trim()?{branch:u.branch.trim()}:{}}}function Sv(i,l){let u={...i??{}};if(!l.url&&!l.branch)return delete u.git,Object.keys(u).length>0?u:void 0;let c={...u.git&&typeof u.git==="object"&&!Array.isArray(u.git)?u.git:{}};if(l.url)c.url=l.url;else delete c.url;if(l.branch)c.branch=l.branch;else delete c.branch;return u.git=c,u}function $F(i,l){let u=OF(i);return u.url===l.url&&u.branch===l.branch}function k0(i){let l=i.find(({name:u})=>u==="origin")??i[0];return(l?.refs.fetch||l?.refs.push)?.trim()||void 0}function _u(i){return xF(i)}async function S0(i){return(await T0(i)).info}function Tv(i){let l=i instanceof Error?i.message:String(i);return/unknown revision|ambiguous argument|does not have any commits yet/i.test(l)}function hd(i){if(i instanceof Error)return{errorType:i.name?.trim()||i.constructor.name||"Error",message:i.message};return{errorType:"Error",message:String(i)}}async function T0(i){let l=_u(i),u={rootPath:l,hint:AF(l)||void 0},c={},g;try{let b=I0({cwd:l});if(!await b.isInsideWorkTree())return{info:u,vcsType:"none",gitState:c};try{let I=await b.remotes();if(I.length>0){let k=I.map((E)=>{let A=E.refs.fetch||E.refs.push;return`${E.name}: ${A}`});u.associatedRemoteUrls=k;let T=k0(I);if(T)c.url=T}}catch(I){g??=hd(I)}try{let I=await b.headSha();if(I.length>0)u.latestGitCommitHash=I}catch(I){if(!Tv(I))g??=hd(I)}try{let I=await b.displayBranch();if(I.length>0)u.latestGitBranchName=I,c.branch=I}catch(I){if(!Tv(I))g??=hd(I)}return{info:u,vcsType:"git",gitState:c,error:g}}catch(b){return{info:u,vcsType:"none",gitState:c,error:hd(b)}}}async function LF(i){try{let l=I0({cwd:i});if(!await l.isInsideWorkTree())return{};let[u,c]=await Promise.all([l.remotes(),l.displayBranch()]),g=k0(u);return{...g?{url:g}:{},...c?{branch:c}:{}}}catch{return}}async function DF(i){let l=await S0(i);return Un(l)}async function UF(i){let l=kv.now(),u=await T0(i),c=kv.now()-l,g=u.info;return{workspaceInfo:g,workspaceMetadata:Un(g),durationMs:c,vcsType:u.vcsType,gitState:u.gitState,initError:u.error}}class _0{manifest;listeners=new Set;constructor(i){this.manifest=Ii.parse(i??{workspaces:{}})}async addWorkspacePath(i){let l=await S0(i);return this.manifest=ys(this.manifest,l),this.emit({type:"workspace_added",workspace:l}),l}async switchWorkspace(i){let l=_u(i),u=this.manifest.workspaces[l];if(u)return this.manifest=Ii.parse({...this.manifest,currentWorkspacePath:l}),this.emit({type:"workspace_switched",workspace:u}),u;let c=await this.addWorkspacePath(l);return this.manifest=Ii.parse({...this.manifest,currentWorkspacePath:c.rootPath}),this.emit({type:"workspace_switched",workspace:c}),c}subscribe(i){return this.listeners.add(i),()=>{this.listeners.delete(i)}}getCurrentWorkspace(){let i=this.manifest.currentWorkspacePath;if(!i)return;return this.manifest.workspaces[i]}getWorkspace(i){let l=_u(i);return this.manifest.workspaces[l]}listWorkspaces(){return Object.values(this.manifest.workspaces)}getManifest(){return this.manifest}emit(i){for(let l of this.listeners)l(i)}}var _v=new Set,Ev=new Set;function qF(i,l){return FF("sha256").update(i).update("\x00").update(l?.trim()??"").digest("hex")}function jF(i){if(i.vcsTypes&&i.vcsTypes.length>0)return i.vcsTypes;return[i.vcsType==="git"?"git":"none"]}function BF(i){if(!i.telemetry)return;let l=qF(i.rootPath,i.dedupeScope),u=i.rootCount??1;if(!_v.has(l))_v.add(l),bA(i.telemetry,{root_count:u,vcs_types:jF(i),init_duration_ms:i.durationMs,feature_flag_enabled:i.featureFlagEnabled??!0,is_remote_workspace:i.isRemoteWorkspace});if(i.initError&&!Ev.has(l)){Ev.add(l);let c=Error(i.initError.message);c.name=i.initError.errorType||"Error",IA(i.telemetry,c,{fallback_to_single_root:!0,workspace_count:u})}}function HF(i){return`${i.pluginName??i.pluginPath}: ${i.message}`}function zF(i,l,u){if(l.length>0)for(let b of l)u?.log(b.message,{severity:"warn"});if(i.length===0)return;let c=i.slice(0,3).map(HF).join("; "),g=i.length>3?`; and ${i.length-3} more`:"";u?.log(`Some plugins failed to initialize. ${c}${g}. Use --verbose for more details.`,{severity:"warn"});for(let b of i)u?.log(`Plugin initialization failed (${b.phase}) for ${b.pluginPath}`,{severity:"warn",stack:b.stack,pluginPath:b.pluginPath,pluginName:b.pluginName})}function WF(i,l){for(let u of i){let c=u.componentName?` (${u.componentName})`:"";l?.log(`[agent-plugins] ${u.pluginName??u.pluginPath}${c}: ${u.message}`,{severity:u.level==="warning"?"warn":"error"})}}function KF(i){let l=i?.["X-CLIENT-TYPE"]?.trim();if(!l)return;let u=i?.["X-CLIENT-VERSION"]?.trim();return{name:l,...u?{version:u}:{}}}function GF(i,l){let u=typeof i.thinking==="boolean",c=typeof i.reasoningEffort==="string";if(!u&&!c)return l;return{...l??{},...u?{enabled:i.thinking}:{},...c?{effort:i.reasoningEffort}:{}}}function fd(i,l){return _i(i,l)}function XF(i,l,u){if(i.systemPrompt?.trim())return i.systemPrompt;return Ge({ide:"Terminal Shell",workspaceRoot:l.rootPath,workspaceName:l.hint,metadata:u,rules:i.rules,mode:i.mode,providerId:i.providerId,platform:process.platform||"unknown"})}function JF(i,l,u,c,g,b){let I=c.getProviderSettings(i.providerId),k=g||I?.modelCatalog?{...g??{},...I?.modelCatalog??{}}:void 0,T=i.providerConfig?.providerId===i.providerId?i.providerConfig:void 0,E=An({providerId:i.providerId,sessionId:l,source:u,defaultSource:jr.CLI,client:{name:i.extensionContext?.client?.name,version:i.extensionContext?.client?.version,versionHeaderFallback:i.headers?.["X-CLIENT-VERSION"],platform:i.extensionContext?.client?.platform,platformVersion:i.extensionContext?.client?.platformVersion,isMultiRoot:i.extensionContext?.client?.isMultiRoot},coreVersion:ic,openAiCodex:{accountId:T?.accountId??I?.auth?.accountId,accessToken:T?.accessToken??i.apiKey??I?.auth?.accessToken??I?.apiKey,userAgentVersion:process.env.npm_package_version},headers:{stored:I?.headers,config:i.headers,session:T?.headers}}),A={...I??{},provider:i.providerId,model:i.modelId,apiKey:i.apiKey??I?.apiKey,baseUrl:i.baseUrl??I?.baseUrl,headers:void 0,reasoning:GF(i,I?.reasoning),modelCatalog:k},C={...Pm(A),...T??{}};if(E)C.headers=E;if(i.knownModels)C.knownModels=i.knownModels;if(i.extensionContext)C.extensionContext=i.extensionContext;let N=i.fetch??C.fetch??b;if(N)C.fetch=N;return C}async function VF(i){let{input:l,sessionId:u,sessionOrigin:c,providerSettingsManager:g,defaultTelemetry:b,defaultLogger:I,defaultCapabilities:k,defaultToolPolicies:T,defaultFetch:E,connectorsRequest:A,onPluginEvent:C,onPluginIssue:N,onTeamEvent:O,createSubAgentLifecycleCallbacks:L,createSpawnTool:D,localRuntime:U,readSessionMetadata:F,writeSessionMetadata:j}=i,H=Hs(l.config),{modelCatalogDefaults:Q,userInstructionService:z,configExtensions:W,onTeamRestored:ee,...te}=U??{},oe=Object.keys(te).length>0?te:void 0,{workspaceInfo:G,workspaceMetadata:se,gitState:Pe,durationMs:Le,vcsType:Te,initError:le}=await UF(H),Ie=oe?.extensionContext,we=Ie?.client?void 0:KF(l.config.headers),He=Ie?.client??we,ce=Ie?.telemetry??oe?.telemetry??(b&&He?_F(b,{client:He,source:l.source,user:Ie?.user}):b),Se=ce&&c?b0(ce,{session_origin:c.mode,session_origin_trigger:c.trigger}):ce,_e={...Ie??{},...we?{client:we}:{},workspace:{...G,...Ie?.workspace??{}},session:{...Ie?.session??{},sessionId:u},logger:Ie?.logger??oe?.logger??I,telemetry:Se};BF({telemetry:_e.telemetry,rootPath:G.rootPath,dedupeScope:_e.client?.name??l.source,workspaceInfo:G,rootCount:1,vcsType:Te,durationMs:Le,initError:le,featureFlagEnabled:!0});let Ee=fd(W,"hooks")?SF({cwd:l.config.cwd,workspacePath:H,rootSessionId:u,logger:oe?.logger,workspaceInfo:G,onHookRuntime:(Ye)=>FA(_e.telemetry,Ye)}):void 0,Fe=r1(oe?.hooks)?void 0:IF({rootSessionId:u,workspacePath:H,workspaceInfo:G}),Ke=Iv([oe?.hooks,Fe]),Et,yt,$r=[];if(fd(W,"plugins"))try{yt=await VI({pluginPaths:oe?.pluginPaths,workspacePath:H,cwd:l.config.cwd,onEvent:C,providerId:l.config.providerId,modelId:l.config.modelId,workspaceInfo:G,session:_e.session,client:_e.client,user:_e.user,logger:_e.logger,telemetry:_e.telemetry,automation:_e.automation,policy:l.plugins,hookErrorMode:l.config.hookErrorMode,onIssue:N}),$r.push(...yt.issues??[]),Et=yt.failures.length?yt.failures.map((Ye)=>Ye.message).join("; "):void 0,zF(yt.failures,yt.warnings,oe?.logger??_e.logger)}catch(Ye){let Ks=Ye instanceof Error?Ye.message:String(Ye);(oe?.logger??_e.logger)?.log(`Plugin loading failed; the session has no plugins: ${Ks}`,{severity:"error",sessionId:u}),Et=Ks,$r.push({name:"plugins",pluginPath:H,state:"failed",reason:"error",lastError:{phase:"discover",message:Ks,stack:Ye instanceof Error?Ye.stack:void 0,pluginPath:H,timestamp:Date.now(),sessionId:u}})}let vt;if(fd(W,"plugins"))try{vt=await KS({pluginPaths:l.config.agentPluginPaths,cwd:l.config.cwd,disabledPluginNames:[...Ch()]}),WF(vt.diagnostics,_e.logger)}catch(Ye){let Ks=Ye instanceof Error?Ye.message:String(Ye);_e.logger?.log(`[agent-plugins] Package discovery failed; continuing without Agent Plugins: ${Ks}`,{severity:"error"})}let At=await AU({request:A,logger:oe?.logger}),Gr=[...Ee?[Ee]:[],...At?[At]:[]],Lr=Gr.length>0?Gr:void 0,us=Yy(Lr,Yy(oe?.extensions,nx(yt?.extensions))),Ce=fd(W,"plugins")?Ju(yt?.pluginPaths??[]):void 0,xt={...l.config,...oe??{},sessionId:u,hooks:Ke,extensions:us,extensionContext:_e,telemetry:_e.telemetry,logger:_e.logger},Xr=JF(xt,u,l.source,g,Q,E),de=Iv([xt.hooks,xt.checkpoint?.enabled===!0?WU({cwd:xt.cwd,sessionId:u,logger:xt.logger,createCheckpoint:xt.checkpoint?.createCheckpoint,telemetry:xt.telemetry,readSessionMetadata:F,writeSessionMetadata:j}):void 0]),De={...xt,providerConfig:Xr,workspaceMetadata:se,systemPrompt:XF(xt,G,se),hooks:de},pt=l.toolPolicies??xt.toolPolicies??T,be=Bm(k,l.capabilities),$e=be?.requestToolApproval,Vr=be?.toolExecutors,_n=L?.(De),vc=new _0({currentWorkspacePath:G.rootPath,workspaces:{[G.rootPath]:G}});return{effectiveInput:l,config:De,providerConfig:Xr,workspaceMetadata:se,workspaceInfo:G,gitState:Pe,extensions:us,hooks:de,toolPolicies:pt,requestToolApproval:$e,pluginSandboxShutdown:yt?.shutdown,pluginIssues:$r,pluginCommandError:Et,runtimeBuilderInput:{config:De,hooks:de,extensions:us,onTeamEvent:O,createSpawnTool:D,onTeamRestored:ee,onSubAgentEvent:_n?.onSubAgentEvent,onSubAgentStart:_n?.onSubAgentStart,onSubAgentEnd:_n?.onSubAgentEnd,userInstructionService:z,pluginSkillDirectories:Ce,agentPluginSkills:vt?.skills,agentPluginMcpServers:vt?.mcpServers,configExtensions:W,toolExecutors:Vr,toolPolicies:pt,workspaceManager:vc,logger:De.logger,telemetry:De.telemetry,requestToolApproval:$e}}}function mf(i){return i.trim().replace(/^\/+/,"").toLowerCase()}function YF(i){let l=i.trimStart().match(/^\/(\S+)([\s\S]*)$/);return l?{name:mf(l[1]),input:l[2].trim()}:void 0}function QF(i){let l=typeof i==="string"?{reply:i}:i;return{reply:l?.reply?.trim()||void 0,submitPrompt:l?.submitPrompt?.trim()||void 0}}function E0(i){let l=new Map;for(let u of i){let c=mf(u.name);if(!c||/\s/.test(c)||!u.handler||l.has(c))continue;l.set(c,{name:c,description:u.description})}return[...l.values()]}async function A0(i,l,u={}){let c=YF(l);if(!c)return;let g=i.find((I)=>mf(I.name)===c.name&&I.handler);if(!g?.handler)return;let b=!1;try{let I=QF(await g.handler(c.input));return b=!0,I}finally{try{Ko(u.telemetry,{ulid:u.sessionId??P(),tool:`plugin_command:${c.name}`,modelId:u.modelId,provider:u.provider,success:b,...u.agentIdentity})}catch{}}}var tq=30000,rq=600000;class x0{options;entries=new Map;disposed=!1;constructor(i={}){this.options=i}async list(i){return this.withEntry(i,(l)=>structuredClone(l.catalog))}async run(i){return this.withEntry(i,(l)=>A0(l.commands,i.prompt,{telemetry:this.options.telemetry}))}async dispose(){this.disposed=!0;let i=[...this.entries.values()];this.entries.clear(),await Promise.all(i.map((l)=>this.release(l)))}withEntry(i,l){if(this.disposed)throw Error("Plugin command manager is disposed");let u=eq(i.workspacePath),c=this.entries.get(u);if(!c)c={workspacePath:u,catalog:{workspacePath:u,status:"ready",commands:[]},commands:[],tail:Promise.resolve()},this.entries.set(u,c);let g=c;clearTimeout(g.idleTimer),g.idleTimer=setTimeout(()=>{if(this.entries.get(u)!==g)return;this.entries.delete(u),this.release(g)},rq),g.idleTimer.unref?.();let b=g.tail.then(async()=>(await this.refresh(g),l(g)));return g.tail=b.catch(()=>{}),b}async release(i){clearTimeout(i.idleTimer),await i.tail;let l=i.shutdown;i.shutdown=void 0,await l?.().catch(()=>{})}fingerprint(i){let l=ZF("sha256");try{let u=Uh({cwd:i,workspacePath:i});l.update(JSON.stringify(u));for(let c of u)l.update(Rh(c))}catch(u){l.update(`discovery:${String(u)}`)}return l.digest("hex")}async refresh(i){let l=this.fingerprint(i.workspacePath);if(l===i.key&&(i.failedAt===void 0||Date.now()-i.failedAt<tq))return;await i.shutdown?.().catch(()=>{}),i.key=l,i.shutdown=void 0,i.commands=[],i.failedAt=void 0;let u;try{let c=await(this.options.load??VI)({cwd:i.workspacePath,workspacePath:i.workspacePath,registry:new Oh({logger:this.options.logger})});i.shutdown=c.shutdown;let g=Ut({extensions:c.extensions});if(await g.initialize(),i.commands=g.getRegistrySnapshot().commands,c.failures.length)u=c.failures.map((b)=>b.message).join("; ")}catch(c){u=c instanceof Error?c.message:String(c),this.options.logger?.error?.("Plugin command discovery failed",{error:c})}if(u)i.failedAt=Date.now();i.catalog={workspacePath:i.workspacePath,status:u?"error":"ready",error:u,commands:E0(i.commands)}}}function ct(){return new Date().toISOString()}function gd(i){if(!i||!Wd(i))return;try{aq(i)}catch{}}function lq(i){let l=af(i);if(l)return{rootSessionId:l.rootSessionId,fileStem:`${l.agentId}__${l.teamTaskId}`};let u=OS(i);if(u)return{rootSessionId:u.rootSessionId,fileStem:u.agentId};return{rootSessionId:i,fileStem:i}}class C0{ensureSessionsDir;constructor(i){this.ensureSessionsDir=i}sessionArtifactsDir(i){return tl(this.ensureSessionsDir(),i)}ensureSessionArtifactsDir(i){let l=this.sessionArtifactsDir(i);if(!Wd(l))sq(l,{recursive:!0});return l}sessionMessagesPath(i){return tl(this.sessionArtifactsDir(i),`${i}.messages.json`)}sessionCompactionPath(i){return tl(this.sessionArtifactsDir(i),`${i}.compaction.json`)}sessionManifestPath(i,l=!1){let u=l?this.ensureSessionArtifactsDir(i):this.sessionArtifactsDir(i);return tl(u,`${i}.json`)}removeSessionDirIfEmpty(i){let l=this.sessionArtifactsDir(i),u=this.ensureSessionsDir();while(l.startsWith(u)&&l!==u){if(!Wd(l)){l=Av(l);continue}try{if(iq(l).length>0)break;nq(l)}catch{break}l=Av(l)}}removeSessionDir(i){this.removeDir(this.sessionArtifactsDir(i))}removeDir(i){if(!Wd(i))return;try{oq(i,{recursive:!0,force:!0})}catch{}}subagentArtifactPaths(i,l,u){let{rootSessionId:c,fileStem:g}=lq(i),b=this.sessionArtifactsDir(c);return{messagesPath:tl(b,`${g}.messages.json`)}}}function dq(i){let l=i?.importedFrom;if(typeof l!=="object"||l===null||Array.isArray(l))return;let u=l;if(typeof u.tool!=="string"||typeof u.sourceSessionId!=="string")return;return{tool:u.tool,sourceSessionId:u.sourceSessionId,sourcePath:typeof u.sourcePath==="string"?u.sourcePath:"",importedAt:typeof u.importedAt==="string"?u.importedAt:""}}function uq(i,l,u,c,g){if(u)EA(i.telemetry,{ulid:l,provider:i.providerId,model:i.modelId,...g});else _A(i.telemetry,{ulid:l,provider:i.providerId,model:i.modelId,...g});cq(i.telemetry,{workspacePath:c})}function cq(i,l){let u=Ei("Hooks"),c=f0(l.workspacePath),g=new Map,b=u.replace(/\\/g,"/");for(let I of c){let k=I.hookEventName??"unknown",T=g.get(k)??{global:0,workspace:0},E=I.path.replace(/\\/g,"/");if(E===b||E.startsWith(`${b}/`))T.global+=1;else T.workspace+=1;g.set(k,T)}for(let[I,k]of g.entries())qA(i,I,k.global,k.workspace)}function pq(i,l){for(let u of l.mentions)DA(i,u,l.matchedFiles.includes(u)?1:0,"file",!l.matchedFiles.includes(u));for(let u of l.matchedFiles)$A(i,"file",u.length);for(let u of l.ignoredMentions)LA(i,"file","not_found",u)}var wq="machine-id",xv,Cv=!1;function bq(){if(!Cv)xv=R0(),Cv=!0;return xv??P0()}function ac(i){let l=i?.trim();if(l)return l;let u=R0();if(u)return u;return P0()}function Iq(){let i=vq;return i.machineIdSync??i.default?.machineIdSync}function R0(){try{let i=Iq();if(!i)return;return i().trim()||void 0}catch{return}}function P0(){let i=Ve(),l=yq(i,wq);try{if(mq(l)){let c=fq(l,"utf8").trim();if(c.length>0)return c}}catch{}let u=`cl-${R()}`;try{hq(i,{recursive:!0}),gq(l,u,"utf8")}catch{}return u}function kq(i){return i?JSON.parse(JSON.stringify(i)):void 0}function Sq(i){return i?JSON.parse(JSON.stringify(i)):void 0}function Tq(i){let l=i?.checkpoint&&typeof i.checkpoint==="object"&&!Array.isArray(i.checkpoint)?i.checkpoint:void 0,u=(Array.isArray(l?.history)?l.history:[]).filter((b)=>!!b&&typeof b==="object"&&!Array.isArray(b)).flatMap((b)=>{let I=typeof b.ref==="string"?b.ref.trim():"",k=Number(b.createdAt),T=Number(b.runCount);if(!I||!Number.isFinite(k)||!Number.isInteger(T))return[];return[{ref:I,createdAt:k,runCount:T,...b.kind==="stash"||b.kind==="commit"?{kind:b.kind}:{}}]}),c=u.at(-1),g=i?.checkpointEnabled===!0?!0:void 0;if(!g&&u.length===0)return;return{...g?{enabled:g}:{},...c?{latest:c}:{},history:u}}function Eu(i){let{session:l}=i,u=kq(l.metadata);return{version:1,sessionId:l.sessionId,source:l.source,status:l.status,createdAt:l.startedAt,updatedAt:l.updatedAt,endedAt:l.endedAt??null,exitCode:l.exitCode??null,interactive:l.interactive,workspace:{cwd:l.cwd,root:l.workspaceRoot},model:{providerId:l.provider,modelId:l.model},capabilities:{enableTools:l.enableTools,enableSpawn:l.enableSpawn,enableTeams:l.enableTeams},lineage:{...l.parentSessionId?{parentSessionId:l.parentSessionId}:{},...l.parentAgentId?{parentAgentId:l.parentAgentId}:{},...l.agentId?{agentId:l.agentId}:{},...l.conversationId?{conversationId:l.conversationId}:{},isSubagent:l.isSubagent},...l.teamName?{team:{name:l.teamName}}:{},...l.prompt?{prompt:l.prompt}:{},...u?{metadata:u}:{},...l.messagesPath?{artifacts:{messagesPath:l.messagesPath}}:{},...i.messages?{messages:Sq(i.messages)}:{},...i.usage?{usage:{...i.usage}}:{},...i.aggregateUsage?{aggregateUsage:{...i.aggregateUsage}}:{},...(()=>{let c=Tq(u);return c?{checkpoint:c}:{}})()}}var Ue=Aq(_q);async function Rv(i,l){try{return(await Ue("git",["-C",i,"rev-parse","--verify","--quiet",l],{windowsHide:!0})).stdout.trim()||void 0}catch{return}}async function xq(i){if((await Ue("git",["-C",i,"rev-parse","--is-inside-work-tree"],{windowsHide:!0})).stdout.trim()!=="true")throw Error(`${i} is not a git repository`);let l=(await Ue("git",["-C",i,"rev-parse","--verify","HEAD"],{windowsHide:!0})).stdout.trim(),u=await Rv(i,"refs/stash"),c=Eq(),g=`refs/cline/restore-transactions/${c}`;await Ue("git",["-C",i,"stash","push","--include-untracked","--message",`cline restore transaction ${c}`],{windowsHide:!0});let b=await Rv(i,"refs/stash"),I=b!==void 0&&b!==u;if(I)try{await Ue("git",["-C",i,"update-ref",g,b],{windowsHide:!0}),await Ue("git",["-C",i,"stash","drop","stash@{0}"],{windowsHide:!0})}catch(T){try{await Ue("git",["-C",i,"reset","--hard",l],{windowsHide:!0}),await Ue("git",["-C",i,"clean","-fd"],{windowsHide:!0}),await Ue("git",["-C",i,"stash","apply","--index",b],{windowsHide:!0})}catch(E){throw AggregateError([T,E],"Workspace snapshot and rollback both failed")}throw T}let k=!1;return{async commit(){if(k)return;if(k=!0,!I)return;await Ue("git",["-C",i,"update-ref","-d",g],{windowsHide:!0}).catch(()=>{return})},async rollback(){if(k)return;if(await Ue("git",["-C",i,"reset","--hard",l],{windowsHide:!0}),await Ue("git",["-C",i,"clean","-fd"],{windowsHide:!0}),I)await Ue("git",["-C",i,"stash","apply","--index",g],{windowsHide:!0}),await Ue("git",["-C",i,"update-ref","-d",g],{windowsHide:!0});k=!0}}}function M0(i){let l=i?.metadata?.checkpoint&&typeof i.metadata.checkpoint==="object"&&!Array.isArray(i.metadata.checkpoint)?i.metadata.checkpoint:void 0;return(Array.isArray(l?.history)?l.history:[]).filter((u)=>!!u&&typeof u==="object"&&!Array.isArray(u)).flatMap((u)=>{let c=String(u.ref??"").trim(),g=Number(u.createdAt??0),b=Number(u.runCount??0);if(c.length===0||!Number.isFinite(g)||!Number.isInteger(b)||b<1)return[];let I=u.kind==="stash"||u.kind==="commit"?u.kind:void 0;return[{ref:c,createdAt:g,runCount:b,...I?{kind:I}:{}}]})}function Cq(i,l){let u=M0(i).filter((g)=>g.runCount<=l),c=u.at(-1);return c?{latest:c,history:u}:void 0}function Rq(i,l){return i.reduce((u,c)=>{if(c.runCount>l)return u;if(!u||c.runCount>u.runCount)return c;return u},void 0)}function N0(i,l){let u=0;for(let c=0;c<i.length;c+=1){let g=i[c];if(!g)continue;let b=nd(g);if(b<1)continue;let I=u+1;if(u+=b,u===l)return{index:c,span:b};if(u>l)throw Error(`Run ${l} is folded into a compacted message spanning runs ${I}-${u}`)}throw Error(`Could not find user message for run ${l}`)}function Pq(i,l){let{index:u}=N0(i,l);return i.slice(0,u+1)}function Mq(i,l){let{index:u,span:c}=N0(i,l);if(c!==1)throw Error(`Cannot fork before run ${l} because it is folded into a compacted message`);return i.slice(0,u)}function Nq(i){let l=i.checkpointRunCount;if(!Number.isInteger(l)||l<1)throw Error("checkpointRunCount must be a positive integer");let u=Rq(M0(i.session),l);if(!u)throw Error(`No checkpoint found at or before run ${l} in session ${i.session.sessionId}`);let c=(i.cwd?.trim()||i.session.cwd||i.session.workspaceRoot).trim();if(!c)throw Error("cwd or workspaceRoot is required to restore a checkpoint");return{checkpoint:u,cwd:c,...i.restoreMessages!==!1?{messages:Pq(i.messages??[],l)}:{}}}async function Oq(i,l){if(l.kind)return l.kind;let u=await Ue("git",["-C",i,"show","-s","--format=%P%x00%B",l.ref],{windowsHide:!0}),c=u.stdout.indexOf("\x00"),g=c<0?[]:u.stdout.slice(0,c).trim().split(/\s+/).filter(Boolean),b=c<0?"":u.stdout.slice(c+1);return g.length>=2&&DU(b)?"stash":"commit"}async function $q(i,l){try{return await Ue("git",["-C",i,"cat-file","-e",`${l}^3^{commit}`],{windowsHide:!0}),!0}catch{return!1}}async function Lq(i,l,u){try{let c=await Ue("git",["-C",i,"rev-list","--count",`${l}..${u}`],{windowsHide:!0}),g=Number(c.stdout.trim());return Number.isFinite(g)?g:void 0}catch{return}}async function Dq(i,l){if((await Ue("git",["-C",i,"rev-parse","--is-inside-work-tree"],{windowsHide:!0})).stdout.trim()!=="true")throw Error(`${i} is not a git repository`);await Ue("git",["-C",i,"cat-file","-e",`${l.ref}^{commit}`],{windowsHide:!0});let u=await Oq(i,l),c=u==="commit"?l.ref:`${l.ref}^1`,g=(await Ue("git",["-C",i,"rev-parse","--verify",`${c}^{commit}`],{windowsHide:!0})).stdout.trim(),b=(await Ue("git",["-C",i,"rev-parse","--verify","HEAD"],{windowsHide:!0})).stdout.trim();if(b!==g){let k=await Lq(i,g,b),T=k&&k>0?`${k} commit${k===1?" was":"s were"} added to the current branch after this checkpoint and would be removed by the restore`:"the current branch is no longer on the commit this checkpoint was created from (e.g. after a rebase or branch switch)";throw Error(`Cannot restore the workspace: ${T}. Restore the chat only, or move the branch back to ${g.slice(0,12)} manually (e.g. with git reset) before restoring the workspace.`)}if(u==="stash")await Ue("git",["-C",i,"cat-file","-e",`${l.ref}^2^{commit}`],{windowsHide:!0});let I=await $q(i,l.ref);if(await Ue("git",["-C",i,"update-ref","-m","cline: checkpoint restore","HEAD",g,b],{windowsHide:!0}),await Ue("git",["-C",i,"reset","--hard"],{windowsHide:!0}),I)await Ue("git",["-C",i,"clean","-fd"],{windowsHide:!0});if(u==="commit")return;await Ue("git",["-C",i,"stash","apply",l.ref],{windowsHide:!0})}class Fs extends Error{code;constructor(i,l){super(l);this.code=i,this.name="SessionVersioningError"}}function Uq(i){let l=i.sessionId.trim();if(!l)throw new Fs("invalid_restore","sessionId is required");if(!i.restoreMessages&&!i.restoreWorkspace)throw new Fs("invalid_restore","restore.messages or restore.workspace must be true");if(i.restoreMessages&&i.requiresStart)throw new Fs("invalid_restore","start is required when restore.messages is true");if(!Number.isInteger(i.checkpointRunCount)||i.checkpointRunCount<1)throw new Fs("invalid_restore","checkpointRunCount must be a positive integer");return l}class hf{async restoreCheckpoint(i){let l=i.restore?.messages!==!1,u=i.restore?.workspace!==!1,c=Date.now(),g,b=(H,Q)=>{i.telemetry?.capture({event:"checkpoint.restore",properties:{sessionId:i.sessionId,checkpointRunCount:i.checkpointRunCount,restoreWorkspace:u,restoreMessages:l,checkpointKind:g?.kind??"unknown",outcome:H,durationMs:Date.now()-c,...Q}})},I,k,T;try{let H=Uq({sessionId:i.sessionId,restoreMessages:l,restoreWorkspace:u,requiresStart:i.start===void 0,checkpointRunCount:i.checkpointRunCount}),Q=await i.getSession(H);if(!Q)throw new Fs("session_not_found",`Session ${H} not found`);if(I=Q,k=l?await i.readMessages(H):void 0,l&&k?.length===0)throw new Fs("session_messages_not_found",`No messages found for session ${H}`);T=Nq({session:I,messages:k,checkpointRunCount:i.checkpointRunCount,cwd:i.cwd,restoreMessages:l}),g=T.checkpoint}catch(H){throw b("failed",{phase:"plan"}),H}let E=Eu({session:I,messages:k}),A,C=[],N,O;if(l){let{startSession:H,getStartedSessionId:Q,cleanupStartedSession:z}=i;if(!i.start||!H||!Q||!z)throw new Fs("invalid_restore","startSession, getStartedSessionId, and cleanupStartedSession are required when restore.messages is true");O={startSession:H,getStartedSessionId:Q,cleanupStartedSession:z},A=Cq(I,i.checkpointRunCount),C=i.restore?.omitCheckpointMessageFromSession?Mq(k??[],i.checkpointRunCount):T.messages??[];let W={sourceSession:I,sourceMessages:k,sourceSnapshot:E,plan:T,restoredCheckpointMetadata:A,initialMessages:C,restoreMessages:l,restoreWorkspace:u,checkpointRunCount:i.checkpointRunCount};N=i.buildStartInput?await i.buildStartInput(W,i.start):i.start}let L=i.applyWorkspaceCheckpoint??Dq,D=i.beginWorkspaceRestoreTransaction??(i.applyWorkspaceCheckpoint?void 0:xq),U=u&&D?await D(T.cwd):void 0,F=!1,j;try{if(u)await L(T.cwd,T.checkpoint);if(!O)return await U?.commit(),F=!0,b("success"),{checkpoint:T.checkpoint,sourceSnapshot:E};let H=await O.startSession(N);j={result:H,cleanup:O.cleanupStartedSession};let Q=O.getStartedSessionId(H);if(!Q)throw new Fs("invalid_restore","Restored session did not return a session id");await(i.retainCheckpointRefs??HU)(T.cwd,Q,A?.history??[]);let z=i.readRestoredSession?await i.readRestoredSession(Q):void 0,W=z?Eu({session:z,messages:C}):void 0;return await U?.commit(),F=!0,b("success"),{sessionId:Q,startResult:H,messages:T.messages,checkpoint:T.checkpoint,sourceSnapshot:E,...W?{restoredSnapshot:W}:{}}}catch(H){let Q=[];if(j)try{await j.cleanup(j.result)}catch(z){Q.push(z)}if(U&&!F)try{await U.rollback()}catch(z){Q.push(z)}if(b("failed",{workspaceRolledBack:!!U&&!F,recovered:Q.length===0}),Q.length>0)throw AggregateError([H,...Q],"Checkpoint restore failed and recovery did not complete");throw H}}}var jq=ae({task:e().optional(),systemPrompt:e().optional()});class O0{adapter;manifestStore;toPersistedMessages;heartbeatLogIntervalMs;teamTaskSessionsByAgent=new Map;teamTaskLastHeartbeatBySession=new Map;teamTaskLastProgressLineBySession=new Map;constructor(i,l,u,c){this.adapter=i,this.manifestStore=l,this.toPersistedMessages=u,this.heartbeatLogIntervalMs=c}teamTaskQueueKey(i,l){return`${i}::${l}`}activeTeamTaskSessionId(i,l){return this.teamTaskSessionsByAgent.get(this.teamTaskQueueKey(i,l))?.at(-1)}buildSubsessionRow(i,l){let u=Lo(i.metadata);return{sessionId:l.sessionId,source:i.source,pid:i.pid,startedAt:l.startedAt,endedAt:null,exitCode:null,status:"running",statusLock:0,interactive:!1,provider:i.provider,model:i.model,cwd:i.cwd,workspaceRoot:i.workspaceRoot,teamName:i.teamName??null,enableTools:i.enableTools,enableSpawn:i.enableSpawn,enableTeams:i.enableTeams,parentSessionId:l.parentSessionId,parentAgentId:l.parentAgentId,agentId:l.agentId,conversationId:l.conversationId??null,isSubagent:!0,prompt:l.prompt,metadata:Em({metadata:wn(void 0,{mode:l.mode,version:u?.version}),prompt:l.prompt}),hookPath:"",messagesPath:l.messagesPath,updatedAt:l.startedAt}}async queueSpawnRequest(i){if(i.hookName!=="tool_call"||i.parent_agent_id!==null)return;if(i.tool_call?.name!=="spawn_agent")return;let l=Vn(i.sessionContext);if(!l)return;let u=jq.safeParse(i.tool_call.input);await this.adapter.enqueueSpawnRequest({rootSessionId:l,parentAgentId:i.agent_id,task:u.success?u.data.task:void 0,systemPrompt:u.success?u.data.systemPrompt:void 0})}async upsertSubagentSession(i){let l=i.rootSessionId;if(!l)return;let u=await this.adapter.getSession(l);if(!u)return;let c=Vy(l,i.agentId),g=await this.adapter.getSession(c),b=ct(),I=this.manifestStore.artifacts.subagentArtifactPaths(c,i.agentId,this.activeTeamTaskSessionId(l,i.parentAgentId)),k=i.prompt??g?.prompt??void 0;if(!k)k=await this.adapter.claimSpawnRequest(l,i.parentAgentId)??`Subagent run by ${i.parentAgentId}`;if(!g){let T=this.buildSubsessionRow(u,{sessionId:c,mode:"subagent",parentSessionId:l,parentAgentId:i.parentAgentId,agentId:i.agentId,conversationId:i.conversationId,prompt:k,startedAt:b,...I});return await this.adapter.upsertSession(T),this.manifestStore.initializeMessagesFile(T,I.messagesPath,b),c}return await this.adapter.updateSession({sessionId:c,setRunning:!0,parentSessionId:l,parentAgentId:i.parentAgentId,agentId:i.agentId,conversationId:i.conversationId,prompt:g.prompt??k??null,metadata:Em({metadata:wn(g.metadata,{mode:"subagent",version:Lo(u.metadata)?.version}),prompt:g.prompt??k??null}),expectedStatusLock:g.statusLock}),c}async upsertSubagentSessionFromHook(i){if(!i.parent_agent_id)return;let l=Vn(i.sessionContext);if(!l)return;if(i.hookName==="session_shutdown"){let u=Vy(l,i.agent_id);return await this.adapter.getSession(u)?u:void 0}return await this.upsertSubagentSession({agentId:i.agent_id,parentAgentId:i.parent_agent_id,conversationId:i.taskId,rootSessionId:l})}async applySubagentStatus(i,l){await this.applySubagentStatusBySessionId(i,e1(l))}async applySubagentStatusBySessionId(i,l){let u=await this.adapter.getSession(i);if(!u)return;let c=Qt(l)?null:ct(),g=Qt(l)?null:l==="failed"?1:0;await this.adapter.updateSession({sessionId:i,status:l,endedAt:c,exitCode:g,expectedStatusLock:u.statusLock})}async applyStatusToRunningChildSessions(i,l){if(!i)return;let u=await this.adapter.listSessions({limit:2000,parentSessionId:i,status:"running"});for(let c of u)await this.applySubagentStatusBySessionId(c.sessionId,l)}async onTeamTaskStart(i,l,u){let c=await this.adapter.getSession(i);if(!c)return;let g=ZL(i,l),b=ct(),{messagesPath:I}=this.manifestStore.artifacts.subagentArtifactPaths(g,l),k=this.buildSubsessionRow(c,{sessionId:g,mode:"team",parentSessionId:i,parentAgentId:"lead",agentId:l,prompt:u||`Team task for ${l}`,startedAt:b,messagesPath:I});await this.adapter.upsertSession(k),this.manifestStore.initializeMessagesFile(k,I,b);let T=this.teamTaskQueueKey(i,l),E=this.teamTaskSessionsByAgent.get(T)??[];E.push(g),this.teamTaskSessionsByAgent.set(T,E)}async onTeamTaskEnd(i,l,u,c,g,b){let I=this.teamTaskQueueKey(i,l),k=this.teamTaskSessionsByAgent.get(I);if(!k||k.length===0)return;let T=k.shift();if(k.length===0)this.teamTaskSessionsByAgent.delete(I);if(!T)return;let E=g?.messages??b,A=this.toPersistedMessages(E,g,b);if(A)await this.manifestStore.persistSessionMessages(T,A);await this.applySubagentStatusBySessionId(T,u),this.teamTaskLastHeartbeatBySession.delete(T),this.teamTaskLastProgressLineBySession.delete(T)}async onTeamTaskProgress(i,l,u,c){let g=this.teamTaskQueueKey(i,l),b=this.teamTaskSessionsByAgent.get(g)?.[0];if(!b)return;let I=u.trim();if(!I)return;let k=c?.kind??"progress";if(k==="heartbeat"){let E=Date.now(),A=this.teamTaskLastHeartbeatBySession.get(b)??0;if(E-A<this.heartbeatLogIntervalMs)return;this.teamTaskLastHeartbeatBySession.set(b,E)}let T=k==="heartbeat"?"[progress] heartbeat":k==="text"?`[progress] text: ${I}`:`[progress] ${I}`;if(this.teamTaskLastProgressLineBySession.get(b)===T)return;this.teamTaskLastProgressLineBySession.set(b,T)}async handleSubAgentStart(i,l){let u=await this.upsertSubagentSession({agentId:l.subAgentId,parentAgentId:l.parentAgentId,conversationId:l.conversationId,prompt:l.input.task,rootSessionId:i});if(!u)return;await this.applySubagentStatusBySessionId(u,"running")}async handleSubAgentEnd(i,l){let u=await this.upsertSubagentSession({agentId:l.subAgentId,parentAgentId:l.parentAgentId,conversationId:l.conversationId,prompt:l.input.task,rootSessionId:i});if(!u)return;if(l.error){await this.applySubagentStatusBySessionId(u,"failed");return}let c=this.toPersistedMessages(l.agentResult?.messages,l.agentResult);if(c)await this.manifestStore.persistSessionMessages(u,c);let g=l.result?.finishReason??"completed";await this.applySubagentStatusBySessionId(u,g==="aborted"?"cancelled":"completed")}appendSubagentHookAudit(i){let l=(process.env.CLINE_HOOKS_LOG_PATH?.trim()||void 0)??qq(et(),"hooks.jsonl");Fq(l,`${JSON.stringify({ts:ct(),...i})}
|
|
280
|
+
`,"utf8")}}var $0=t({name:e().trim().min(1),description:e().trim().min(1),tools:p([e(),o(e())]).optional(),skills:p([e(),o(e())]).optional(),providerId:e().trim().min(1).optional(),modelId:e().trim().min(1).optional(),maxIterations:n().int().positive().optional()});function Gq(i){i=he(i);let l=i.match(/^(---)[^\S\r\n]*(?:\r?\n|$)/);if(!l)throw Error("Missing YAML frontmatter block in agent config file.");let u=l[0].length,c=/^---[^\S\r\n]*(?:\r?\n|$)/gm;c.lastIndex=u;let g,b=Array.from(i.matchAll(c)).filter((I)=>I.index>=u);for(let I of b){let k=I.index,T=i.slice(u,k);try{let E=X.parse(T);if(!E||typeof E!=="object"||Array.isArray(E))continue;$0.parse(E);let A=i.slice(k+I[0].length);g={frontmatter:T,body:A}}catch{}}if(g)return g;throw Error("Missing closing YAML frontmatter delimiter in agent config file.")}function Mv(i){if(i===void 0)return;let l=Array.isArray(i)?i:i.split(",");return Array.from(new Set(l.map((u)=>u.trim()).filter((u)=>u.length>0)))}function Xq(i){return i.trim().toLowerCase()}function Jq(i){let l=Wq(i).toLowerCase();return l===".yml"||l===".yaml"}function Vq(i,l={}){let{frontmatter:u,body:c}=Gq(i),g=X.parse(u);if(!g||typeof g!=="object"||Array.isArray(g))throw Error("Agent config frontmatter must be a YAML mapping.");let b=$0.parse(g),I=c.trim();if(!I)throw Error("Missing system prompt body in agent config file.");return{name:b.name,description:b.description,tools:Mv(b.tools),skills:Mv(b.skills),providerId:b.providerId,modelId:b.modelId,maxIterations:b.maxIterations,systemPrompt:I,path:l.path}}function Yq(i){let l=i.searchPaths??Xa(i.workspaceRoot),u=new Map,c=[];for(let g of l.filter(Boolean)){if(!Bq(g))continue;let b;try{b=Hq(g,{withFileTypes:!0})}catch(I){c.push({path:g,error:I instanceof Error?I:Error(String(I))});continue}for(let I of b){if(!I.isFile()||!Jq(I.name))continue;let k=Kq(g,I.name);try{let T=zq(k,"utf8"),E=Vq(T,{path:k}),A=Xq(E.name);if(!u.has(A))u.set(A,E)}catch(T){c.push({path:k,error:T instanceof Error?T:Error(String(T))})}}}return{configs:Array.from(u.values()).sort((g,b)=>(g.path?Pv(g.path):g.name).localeCompare(b.path?Pv(b.path):b.name)),errors:c}}var op="subagent_",Kd=64,Qq=t({prompt:e().trim().min(1).describe("Task for the subagent to perform")});function Zq(i){let l="",u=!0;for(let c of i.trim().toLowerCase()){let g=c.charCodeAt(0);if(!(g>=97&&g<=122||g>=48&&g<=57||c==="_")||c==="_"){if(!u)l+="_",u=!0;continue}l+=c,u=!1}return u?l.slice(0,-1):l}function ej(i){let l=2166136261;for(let u=0;u<i.length;u++)l^=i.charCodeAt(u),l=Math.imul(l,16777619);return(l>>>0).toString(36)}function tj(i){let l=Zq(i)||"agent",u=ej(i).slice(0,6),c=`${op}${l}`;if(c.length<=Kd)return c;let g=Kd-op.length-u.length-1,b=l.slice(0,Math.max(1,g));return`${op}${b}_${u}`.slice(0,Kd)}function rj(i){let l=new Set,u=[];for(let c of[...i].sort((g,b)=>g.name.localeCompare(b.name))){let g=tj(c.name),b=g,I=2;while(l.has(b)){let k=`_${I++}`,T=Math.max(1,Kd-k.length);b=`${g.slice(0,T)}${k}`}l.add(b),u.push({toolName:b,config:c})}return u}function sj(i,l){return{...i,providerId:l.providerId??i.providerId,modelId:l.modelId??i.modelId,maxIterations:l.maxIterations??i.maxIterations}}function ij(i){return rj(i.agents).map(({toolName:l,config:u})=>_({name:l,executionMode:"parallel",description:`Use the "${u.name}" subagent: ${u.description}`,inputSchema:S(Qq),execute:async(c,g)=>{let b=i.configProvider.getRuntimeConfig(),I=ES(sj(b,u)),k=i.createSubAgentTools?await i.createSubAgentTools(u,c,g):[],T=xS({kind:"subagent",prompt:u.systemPrompt,configProvider:I,tools:k,maxIterations:u.maxIterations,parentAgentId:g.agentId,abortSignal:g.signal,onEvent:i.onSubAgentEvent,hookErrorMode:i.hookErrorMode}),E=T.getAgentId(),A=T.getConversationId(),C=g.agentId,N={systemPrompt:u.systemPrompt,task:c.prompt};if(i.onSubAgentStart)try{await i.onSubAgentStart({subAgentId:E,conversationId:A,parentAgentId:C,input:N})}catch{}try{let O=await T.run(c.prompt),L={text:O.text,iterations:O.iterations,finishReason:O.finishReason,usage:{inputTokens:O.usage.inputTokens,outputTokens:O.usage.outputTokens}};if(i.onSubAgentEnd)try{await i.onSubAgentEnd({subAgentId:E,conversationId:A,parentAgentId:C,input:N,result:L,agentResult:O})}catch{}return L}catch(O){if(i.onSubAgentEnd)try{await i.onSubAgentEnd({subAgentId:E,conversationId:A,parentAgentId:C,input:N,error:O instanceof Error?O:Error(String(O))})}catch{}throw O}},timeoutMs:300000,retryable:!1}))}function lc(i){let l=i.type;switch(l){case"agent_event":return!1;case"run_progress":return L0(i);case"task_start":case"task_end":case"teammate_spawned":case"teammate_shutdown":case"team_task_updated":case"team_message":case"team_mission_log":case"run_queued":case"run_started":case"run_completed":case"run_failed":case"run_cancelled":case"run_interrupted":case"outcome_created":case"outcome_fragment_attached":case"outcome_fragment_reviewed":case"outcome_finalized":return!0;default:return Boolean(l)}}function nj(i){switch(i.type){case"teammate_spawned":case"teammate_shutdown":case"run_completed":case"run_failed":case"run_cancelled":case"run_interrupted":return!0;case"run_progress":return L0(i);default:return!1}}function L0(i){return i.type==="run_progress"&&i.run.status==="queued"}var Nv=4000;function Ov(i){return typeof i==="object"&&i!==null}function yd(i,l=0){return typeof i==="number"&&Number.isFinite(i)?i:l}function ap(i){return typeof i==="number"&&Number.isFinite(i)?i:void 0}function oj(i){return i.length>Nv?`${i.slice(0,Nv-3)}...`:i}function Uo(i){if(!Ov(i))return;let l=Ov(i.usage)?i.usage:{},u=i.finishReason;return{text:oj(typeof i.text==="string"?i.text:""),iterations:yd(i.iterations),finishReason:typeof u==="string"?u:"completed",durationMs:yd(i.durationMs),usage:{inputTokens:yd(l.inputTokens),outputTokens:yd(l.outputTokens),cacheReadTokens:ap(l.cacheReadTokens),cacheWriteTokens:ap(l.cacheWriteTokens),totalCost:ap(l.totalCost)}}}function aj(i){if(i.result===void 0)return i;return{...i,result:Uo(i.result)}}function Au(i){switch(i.type){case"task_end":{let{messages:l,result:u,error:c,...g}=i;return{...g,result:Uo(u),error:c?{message:c.message}:void 0}}case"run_queued":case"run_started":case"run_completed":case"run_failed":case"run_cancelled":case"run_interrupted":return{...i,run:aj(i.run)};default:return i}}function $s(){return new Date().toISOString()}function $v(i,l){if(l<=0)return 0;return Math.round(i/l*100)}function lj(i,l){let u=new Set;for(let g of l)if(g.status==="reviewed")u.add(`${g.outcomeId}:${g.section}`);let c=new Set;for(let g of i){if(g.status==="finalized")continue;for(let b of g.requiredSections)if(!u.has(`${g.id}:${b}`))c.add(`${g.id}:${b}`)}return[...c].sort((g,b)=>g.localeCompare(b))}function dj(i,l){let u={idle:0,running:0,stopped:0},c={pending:0,in_progress:0,blocked:0,completed:0},g={queued:0,running:0,completed:0,failed:0,cancelled:0,interrupted:0},b={draft:0,in_review:0,finalized:0},I={draft:0,reviewed:0,rejected:0},k=0,T=0;for(let U of l.members)if(u[U.status]+=1,U.role==="lead")k+=1;else T+=1;let E=[],A=[],C=l.tasks.filter((U)=>U.status==="completed").length,N=new Map(l.tasks.map((U)=>[U.id,U]));for(let U of l.tasks){if(c[U.status]+=1,U.status==="blocked"){E.push(U.id);continue}if(U.status!=="pending")continue;if(U.dependsOn.every((F)=>N.get(F)?.status==="completed"))A.push(U.id)}let O=[],L,D=0;for(let U of l.runs){if(g[U.status]+=1,U.status==="queued"||U.status==="running")O.push(U.id);let F=U.startedAt.getTime();if(F>=D)D=F,L=U.id}for(let U of l.outcomes)b[U.status]+=1;for(let U of l.outcomeFragments)I[U.status]+=1;return{teamName:i,updatedAt:$s(),members:{total:l.members.length,byStatus:u,leadCount:k,teammateCount:T},tasks:{total:l.tasks.length,byStatus:c,blockedTaskIds:E,readyTaskIds:A,completionPct:$v(C,l.tasks.length)},runs:{total:l.runs.length,byStatus:g,activeRunIds:O,latestRunId:L},outcomes:{total:l.outcomes.length,byStatus:b,finalizedPct:$v(b.finalized,l.outcomes.length),missingRequiredSections:lj(l.outcomes,l.outcomeFragments)},fragments:{total:l.outcomeFragments.length,byStatus:I}}}function uj(i){let{event:l}=i;switch(l.type){case"team_task_updated":return{teamName:i.teamName,sessionId:i.sessionId,eventType:l.type,ts:$s(),taskId:l.task.id,agentId:l.task.assignee??l.task.createdBy};case"run_queued":case"run_started":case"run_completed":case"run_failed":case"run_cancelled":case"run_interrupted":return{teamName:i.teamName,sessionId:i.sessionId,eventType:l.type,ts:$s(),runId:l.run.id,taskId:l.run.taskId,agentId:l.run.agentId,message:l.run.error};case"run_progress":return{teamName:i.teamName,sessionId:i.sessionId,eventType:l.type,ts:$s(),runId:l.run.id,taskId:l.run.taskId,agentId:l.run.agentId,message:l.message};case"outcome_created":case"outcome_finalized":return{teamName:i.teamName,sessionId:i.sessionId,eventType:l.type,ts:$s(),outcomeId:l.outcome.id};case"outcome_fragment_attached":case"outcome_fragment_reviewed":return{teamName:i.teamName,sessionId:i.sessionId,eventType:l.type,ts:$s(),outcomeId:l.fragment.outcomeId,fragmentId:l.fragment.id,agentId:l.fragment.sourceAgentId};case"team_message":return{teamName:i.teamName,sessionId:i.sessionId,eventType:l.type,ts:$s(),taskId:l.message.taskId,agentId:l.message.fromAgentId,message:l.message.subject};case"team_mission_log":return{teamName:i.teamName,sessionId:i.sessionId,eventType:l.type,ts:$s(),taskId:l.entry.taskId,agentId:l.entry.agentId,message:l.entry.summary};case"teammate_spawned":case"teammate_shutdown":case"task_start":case"task_end":case"agent_event":return{teamName:i.teamName,sessionId:i.sessionId,eventType:l.type,ts:$s(),agentId:l.agentId}}return{teamName:i.teamName,sessionId:i.sessionId,eventType:l.type,ts:$s()}}function vd(){return{reset:!1,tasks:new Set,mailbox:new Set,missionLog:new Set,runs:new Set,outcomes:new Set,outcomeFragments:new Set}}function Sl(i){if(typeof DOMException<"u"&&i instanceof DOMException&&i.name==="AbortError")return!0;if(!(i instanceof Error))return!1;return i.name==="AbortError"||i.message.toLowerCase().includes("aborted")}function Lv(i,l){return i?.abortRequested===!0||i?.status==="stopped"&&Sl(l)}function cj(i){if(i.finishReason==="aborted")return"cancelled";if(i.finishReason==="error")return"failed";return"completed"}var pj=600000,Dv="recovered_queued";function mj(i){return`This is an automatic recovery of interrupted team run ${i.id}. The previous process stopped before completion. Continue the task safely, inspect the current workspace state before making changes, and avoid duplicating completed work.
|
|
281
|
+
|
|
282
|
+
${i.message}`}class D0{teamId;teamName;onTeamEvent;onStateDirty;members=new Map;tasks=new Map;missionLog=[];mailbox=[];missionStepCounter=0;taskCounter=0;messageCounter=0;missionCounter=0;runCounter=0;outcomeCounter=0;outcomeFragmentCounter=0;runs=new Map;dirty=vd();runQueue=[];queuedRunDispatchTimer;outcomes=new Map;outcomeFragments=new Map;missionLogIntervalSteps;missionLogIntervalMs;maxConcurrentRuns;constructor(i){this.teamName=i.teamName,this.teamId=`t_${mr(R(10))}`,this.onTeamEvent=i.onTeamEvent,this.onStateDirty=i.onStateDirty,this.missionLogIntervalSteps=Math.max(1,i.missionLogIntervalSteps??3),this.missionLogIntervalMs=Math.max(1000,i.missionLogIntervalMs??120000),this.maxConcurrentRuns=Math.max(1,i.maxConcurrentRuns??2);let l=i.leadAgentId??"lead";this.members.set(l,{agentId:l,role:"lead",status:"idle",runningCount:0,lastMissionStep:0,lastMissionAt:Date.now()})}getTeamId(){return this.teamId}getTeamName(){return this.teamName}getMemberRole(i){return this.members.get(i)?.role}getMemberIds(){return Array.from(this.members.keys())}getTeammateIds(){return Array.from(this.members.values()).filter((i)=>i.role==="teammate").map((i)=>i.agentId)}getTask(i){return this.tasks.get(i)}listTasks(){return Array.from(this.tasks.values())}listTaskItems(i){return Array.from(this.tasks.values()).map((l)=>{let u=this.getUnresolvedDependencies(l);return{...l,blockedBy:u,isReady:l.status==="pending"&&!l.assignee&&u.length===0}}).filter((l)=>{if(i?.status&&l.status!==i.status)return!1;if(i?.assignee&&l.assignee!==i.assignee)return!1;return!0})}listMissionLog(i){if(!i||i<=0)return[...this.missionLog];return this.missionLog.slice(Math.max(0,this.missionLog.length-i))}listMailbox(i,l){let u=l?.unreadOnly??!0,c=l?.markRead??!0,g=l?.limit,b=this.mailbox.filter((k)=>k.toAgentId===i&&(!u||!k.readAt)),I=typeof g==="number"&&g>0?b.slice(Math.max(0,b.length-g)):b;if(c){let k=new Date,T=!1;for(let E of I)if(!E.readAt)E.readAt=k,this.dirty.mailbox.add(E.id),T=!0;if(T)this.notifyStateDirty()}return I.map((k)=>({...k}))}getSnapshot(){let i={pending:0,in_progress:0,blocked:0,completed:0};for(let u of this.tasks.values())i[u.status]++;let l={draft:0,in_review:0,finalized:0};for(let u of this.outcomes.values())l[u.status]++;return{teamId:this.teamId,teamName:this.teamName,members:Array.from(this.members.values()).map((u)=>({agentId:u.agentId,role:u.role,description:u.description,status:u.status})),taskCounts:i,unreadMessages:this.mailbox.filter((u)=>!u.readAt).length,missionLogEntries:this.missionLog.length,activeRuns:Array.from(this.runs.values()).filter((u)=>u.status==="running").length,queuedRuns:Array.from(this.runs.values()).filter((u)=>u.status==="queued").length,outcomeCounts:l}}exportState(){return{teamId:this.teamId,teamName:this.teamName,members:Array.from(this.members.values()).map((i)=>({agentId:i.agentId,role:i.role,description:i.description,status:i.status})),tasks:Array.from(this.tasks.values()).map((i)=>({...i})),mailbox:this.mailbox.map((i)=>({...i})),missionLog:this.missionLog.map((i)=>({...i})),runs:Array.from(this.runs.values()).map((i)=>({...i})),outcomes:Array.from(this.outcomes.values()).map((i)=>({...i})),outcomeFragments:Array.from(this.outcomeFragments.values()).map((i)=>({...i}))}}hydrateState(i){this.clearQueuedRunDispatchTimer(),this.dirty=vd(),this.tasks.clear();for(let u of i.tasks)this.tasks.set(u.id,{...u});this.mailbox.length=0,this.mailbox.push(...i.mailbox.map((u)=>({...u}))),this.missionLog.length=0,this.missionLog.push(...i.missionLog.map((u)=>({...u}))),this.runs.clear();for(let u of i.runs??[])this.runs.set(u.id,{...u,result:Uo(u.result)});this.runQueue.length=0,this.runQueue.push(...Array.from(this.runs.values()).filter((u)=>u.status==="queued").map((u)=>u.id)),this.outcomes.clear();for(let u of i.outcomes??[])this.outcomes.set(u.id,{...u});this.outcomeFragments.clear();for(let u of i.outcomeFragments??[])this.outcomeFragments.set(u.id,{...u});let l=Array.from(this.members.values()).filter((u)=>u.role==="lead");this.members.clear();for(let u of l)this.members.set(u.agentId,{...u,status:"idle",runningCount:0,lastMissionStep:this.missionStepCounter,lastMissionAt:Date.now()});for(let u of i.members){if(u.role!=="teammate")continue;this.members.set(u.agentId,{agentId:u.agentId,role:"teammate",description:u.description,status:"stopped",agent:void 0,runningCount:0,lastMissionStep:this.missionStepCounter,lastMissionAt:Date.now()})}this.taskCounter=Math.max(this.taskCounter,Jn(i.tasks.map((u)=>u.id),"task_")),this.messageCounter=Math.max(this.messageCounter,Jn(i.mailbox.map((u)=>u.id),"msg_")),this.missionCounter=Math.max(this.missionCounter,Jn(i.missionLog.map((u)=>u.id),"log_")),this.runCounter=Math.max(this.runCounter,Jn((i.runs??[]).map((u)=>u.id),"run_")),this.outcomeCounter=Math.max(this.outcomeCounter,Jn((i.outcomes??[]).map((u)=>u.id),"out_")),this.outcomeFragmentCounter=Math.max(this.outcomeFragmentCounter,Jn((i.outcomeFragments??[]).map((u)=>u.id),"frag_"))}isTeammateActive(i){let l=this.members.get(i);return!!l&&l.role==="teammate"&&!!l.agent}spawnTeammate({agentId:i,config:l}){let u=this.members.get(i);if(u&&u.role!=="teammate")throw Error(`Team member "${i}" already exists and is not a teammate`);if(u&&u.runningCount>0)throw Error(`Teammate "${i}" is currently running and cannot be respawned`);let c={...l,apiTimeoutMs:pj,consumePendingUserMessage:()=>{let I=this.members.get(i);if(!I||!I.pendingSteerMessage)return;let k=I.pendingSteerMessage;return I.pendingSteerMessage=void 0,k},onEvent:(I)=>{l.onEvent?.(I),this.emitEvent({type:"agent_event",agentId:i,event:I}),this.trackMeaningfulEvent(i,I)}},g=new nc(c);if(c.onEvent)g.subscribeEvents(c.onEvent);let b={agentId:i,role:"teammate",description:l.role,status:"idle",agent:g,runningCount:0,lastMissionStep:0,lastMissionAt:Date.now()};return this.members.set(i,b),this.emitEvent({type:"teammate_spawned",agentId:i,role:l.role,teammate:{rolePrompt:l.systemPrompt,modelId:l.modelId,maxIterations:l.maxIterations,runtimeAgentId:g.getAgentId(),conversationId:g.getConversationId(),parentAgentId:null}}),{agentId:b.agentId,role:b.role,description:b.description,status:b.status}}shutdownTeammate(i,l){let u=this.members.get(i);if(!u||u.role!=="teammate")throw Error(`Teammate "${i}" was not found`);try{u.agent?.abort()}catch(c){if(!Sl(c))throw c}u.status="stopped",this.emitEvent({type:"teammate_shutdown",agentId:i,reason:l})}updateTeammateConnections(i){for(let l of this.members.values()){if(l.role!=="teammate"||!l.agent)continue;l.agent.updateConnection(i)}}createTask(i){let l=`task_${String(++this.taskCounter).padStart(4,"0")}`,u=new Date,c={id:l,title:i.title,description:i.description,status:i.assignee?"in_progress":"pending",createdAt:u,updatedAt:u,createdBy:i.createdBy,assignee:i.assignee,dependsOn:i.dependsOn??[]};return this.tasks.set(l,c),this.emitEvent({type:"team_task_updated",task:{...c}}),{...c}}claimTask(i,l){let u=this.requireTask(i);return this.assertDependenciesResolved(u),u.status="in_progress",u.assignee=l,u.updatedAt=new Date,this.emitEvent({type:"team_task_updated",task:{...u}}),this.appendMissionLog({agentId:l,taskId:i,kind:"progress",summary:`Claimed task "${u.title}"`}),{...u}}blockTask(i,l,u){let c=this.requireTask(i);return c.status="blocked",c.updatedAt=new Date,c.summary=u,this.emitEvent({type:"team_task_updated",task:{...c}}),this.appendMissionLog({agentId:l,taskId:i,kind:"blocked",summary:u}),{...c}}completeTask(i,l,u){let c=this.requireTask(i);if(c.status="completed",c.updatedAt=new Date,c.summary=u,!c.assignee)c.assignee=l;return this.emitEvent({type:"team_task_updated",task:{...c}}),this.appendMissionLog({agentId:l,taskId:i,kind:"done",summary:u}),{...c}}async routeToTeammate(i,l,u){let c=this.members.get(i);if(!c||c.role!=="teammate"||!c.agent)throw Error(`Teammate "${i}" was not found`);if(!c.agent.canStartRun())throw Error("Cannot start a new run while another run is already in progress");c.abortRequested=!1,c.abortReason=void 0,c.runningCount++,c.status="running",this.emitEvent({type:"task_start",agentId:i,message:l});try{let g=this.listMailbox(i,{unreadOnly:!0,markRead:!0}),b=g.length>0?`${this.buildMailboxNotification(g)}
|
|
283
|
+
|
|
284
|
+
${l}`:l,I=u?.continueConversation?await c.agent.continue(b):await c.agent.run(b),k=cj(I);if(this.emitEvent({type:"task_end",agentId:i,status:k,result:I}),k==="completed")this.recordProgressStep(i,`Completed a delegated run (${I.iterations} iterations)`,u?.taskId,!0);else if(k==="failed")this.appendMissionLog({agentId:i,taskId:u?.taskId,kind:"error",summary:I.text||"Teammate run failed"});return I}catch(g){let b=g instanceof Error?g:Error(String(g)),I=Lv(c,b);if(this.emitEvent({type:"task_end",agentId:i,status:I?"cancelled":"failed",error:b,messages:c.agent.getMessages()}),!I)this.appendMissionLog({agentId:i,taskId:u?.taskId,kind:"error",summary:b.message});throw b}finally{if(c.runningCount--,c.runningCount<=0&&this.members.get(i)?.status!=="stopped")c.status="idle"}}startTeammateRun(i,l,u){let c=`run_${String(++this.runCounter).padStart(5,"0")}`,g={id:c,agentId:i,taskId:u?.taskId,status:"queued",message:l,priority:u?.priority??0,retryCount:0,maxRetries:Math.max(0,u?.maxRetries??0),continueConversation:u?.continueConversation,startedAt:new Date(0),leaseOwner:u?.leaseOwner,heartbeatAt:void 0,lastProgressAt:new Date,lastProgressMessage:"queued",currentActivity:"queued"};return this.runs.set(c,g),this.runQueue.push(c),this.emitEvent({type:"run_queued",run:{...g}}),this.dispatchQueuedRuns(),{...g}}dispatchQueuedRuns(){this.clearQueuedRunDispatchTimer();let i;while(this.countActiveRuns()<this.maxConcurrentRuns&&this.runQueue.length>0){let l=this.selectNextDispatchableQueuedRun();i=l.nextDelayedAttemptAt;let u=l.index;if(u<0){this.scheduleQueuedRunDispatch(i);return}let[c]=this.runQueue.splice(u,1),g=c?this.runs.get(c):void 0;if(!g||g.status!=="queued")continue;this.executeQueuedRun(g)}this.scheduleQueuedRunDispatch(i)}selectNextDispatchableQueuedRun(){let i=-1,l=Number.NEGATIVE_INFINITY,u,c=Date.now();for(let g=0;g<this.runQueue.length;g++){let b=this.runs.get(this.runQueue[g]);if(!b||b.status!=="queued")continue;if(b.nextAttemptAt&&b.nextAttemptAt.getTime()>c){if(!u||b.nextAttemptAt<u)u=b.nextAttemptAt;continue}if(b.priority>l)l=b.priority,i=g}return{index:i,nextDelayedAttemptAt:u}}scheduleQueuedRunDispatch(i){if(!i)return;let l=Math.max(0,i.getTime()-Date.now());this.queuedRunDispatchTimer=setTimeout(()=>{this.queuedRunDispatchTimer=void 0,this.dispatchQueuedRuns()},l)}clearQueuedRunDispatchTimer(){if(!this.queuedRunDispatchTimer)return;clearTimeout(this.queuedRunDispatchTimer),this.queuedRunDispatchTimer=void 0}countActiveRuns(){let i=0;for(let l of this.runs.values())if(l.status==="running")i++;return i}async executeQueuedRun(i){let l=i.currentActivity===Dv;i.nextAttemptAt=void 0,i.status="running",i.startedAt=new Date,i.heartbeatAt=new Date,i.currentActivity="run_started",this.emitEvent({type:"run_started",run:{...i}});let u=setInterval(()=>{if(i.status!=="running")return;this.recordRunProgress(i,"heartbeat")},2000);try{let c=l?mj(i):i.message,g=await this.routeToTeammate(i.agentId,c,{taskId:i.taskId,continueConversation:i.continueConversation});if(this.runs.get(i.id)?.status!=="running")return;let b=this.members.get(i.agentId)?.abortReason;if(b!==void 0){this.cancelRun(i.id,b);return}if(g.finishReason==="error")throw Error(g.text||"Teammate run failed");i.status="completed",i.result=Uo(g),i.endedAt=new Date,i.currentActivity="completed",this.emitEvent({type:"run_completed",run:{...i}})}catch(c){let g=c instanceof Error?c.message:String(c??"Unknown error");if(this.runs.get(i.id)?.status!=="running")return;i.error=g,i.endedAt=new Date;let b=this.members.get(i.agentId);if(Sl(c)&&Lv(b,c))this.cancelRun(i.id,b?.abortReason??g);else if(i.retryCount<i.maxRetries)i.retryCount++,i.status="queued",i.nextAttemptAt=new Date(Date.now()+Math.min(30000,1000*2**i.retryCount)),this.runQueue.push(i.id),this.recordRunProgress(i,`retry_scheduled_${i.retryCount}`);else i.status="failed",i.currentActivity="failed",this.emitEvent({type:"run_failed",run:{...i}})}finally{clearInterval(u),this.dispatchQueuedRuns()}}listRuns(i){let l=i?.includeCompleted??!0;return Array.from(this.runs.values()).filter((u)=>{if(!l&&!["running","queued"].includes(u.status))return!1;if(i?.status&&u.status!==i.status)return!1;if(i?.agentId&&u.agentId!==i.agentId)return!1;return!0}).map((u)=>({...u}))}getRun(i){let l=this.runs.get(i);return l?{...l}:void 0}async awaitRun(i,l=250){let u=this.runs.get(i);if(!u)throw Error(`Run "${i}" was not found`);while(u.status==="queued"||u.status==="running")await Uv(l);return{...u}}async awaitAllRuns(i=250){while(Array.from(this.runs.values()).some((l)=>["queued","running"].includes(l.status)))await Uv(i);return this.listRuns()}cancelOutstandingWork(i){let l=typeof i==="string"?i:i instanceof Error?i.message:i===void 0?"parent_session_abort":String(i);this.clearQueuedRunDispatchTimer();let u;for(let c of this.runs.values())if(c.status==="queued"||c.status==="running")this.cancelRun(c.id,l);for(let c of this.members.values()){if(c.role!=="teammate"||!c.agent||c.runningCount<=0||c.abortRequested)continue;c.abortRequested=!0,c.abortReason=l;try{c.agent.abort(Error(l))}catch(g){if(!Sl(g)&&u===void 0)u=g}}if(u!==void 0)throw u}cancelRun(i,l){let u=this.runs.get(i);if(!u)throw Error(`Run "${i}" was not found`);if(u.status==="completed"||u.status==="failed"||u.status==="cancelled"||u.status==="interrupted")return{...u};u.status="cancelled",u.error=l,u.endedAt=new Date,u.currentActivity="cancelled";let c=this.runQueue.indexOf(i);if(c>=0)this.runQueue.splice(c,1);return this.emitEvent({type:"run_cancelled",run:{...u},reason:l}),{...u}}recoverActiveRuns(i="runtime_recovered"){let l=[];for(let u of this.runs.values()){if(!["queued","running"].includes(u.status))continue;let c=this.members.get(u.agentId);if(!c||c.role!=="teammate"||!c.agent){u.status="interrupted",u.error="teammate_unavailable_after_recovery",u.endedAt=new Date,u.currentActivity="interrupted",this.emitEvent({type:"run_interrupted",run:{...u},reason:u.error});continue}let g=new Date;if(u.status="queued",u.error=void 0,u.endedAt=void 0,u.heartbeatAt=g,u.lastProgressAt=g,u.lastProgressMessage=i,u.currentActivity=Dv,!this.runQueue.includes(u.id))this.runQueue.push(u.id);l.push({...u}),this.emitEvent({type:"run_queued",run:{...u}})}return this.dispatchQueuedRuns(),l}markStaleRunsInterrupted(i="runtime_recovered"){let l=[];for(let u of this.runs.values()){if(!["queued","running"].includes(u.status))continue;u.status="interrupted",u.error=i,u.endedAt=new Date,u.currentActivity="interrupted",l.push({...u}),this.emitEvent({type:"run_interrupted",run:{...u},reason:i})}return this.runQueue.length=0,this.clearQueuedRunDispatchTimer(),l}sendMessage(i,l,u,c,g){if(!this.members.has(i))throw Error(`Unknown sender "${i}"`);let b=this.members.get(l);if(!b)throw Error(`Unknown recipient "${l}"`);let I={id:`msg_${String(++this.messageCounter).padStart(5,"0")}`,teamId:this.teamId,fromAgentId:i,toAgentId:l,subject:u,body:c,taskId:g,sentAt:new Date};if(this.mailbox.push(I),this.emitEvent({type:"team_message",message:{...I}}),b.role==="teammate"&&b.runningCount>0&&b.agent)b.pendingSteerMessage=`[MAILBOX] You got a message from ${i}. Subject: "${u}". Use the team_read_mailbox tool to read it at your convenience.`;return{...I}}broadcast(i,l,u,c){let g=[];for(let b of this.members.values()){if(b.agentId===i)continue;if(b.role==="lead")continue;g.push(this.sendMessage(i,b.agentId,l,u,c?.taskId))}return g}appendMissionLog(i){if(!this.members.has(i.agentId))throw Error(`Unknown team member "${i.agentId}"`);let l={id:`log_${String(++this.missionCounter).padStart(6,"0")}`,ts:new Date,teamId:this.teamId,agentId:i.agentId,taskId:i.taskId,kind:i.kind,summary:i.summary,evidence:i.evidence,nextAction:i.nextAction};this.missionLog.push(l);let u=this.members.get(i.agentId);if(u)u.lastMissionAt=Date.now(),u.lastMissionStep=this.missionStepCounter;return this.emitEvent({type:"team_mission_log",entry:{...l}}),{...l}}createOutcome(i){let l={id:`out_${String(++this.outcomeCounter).padStart(4,"0")}`,teamId:this.teamId,title:i.title,status:"draft",requiredSections:[...new Set(i.requiredSections)],createdBy:i.createdBy,createdAt:new Date};return this.outcomes.set(l.id,l),this.emitEvent({type:"outcome_created",outcome:{...l}}),{...l}}listOutcomes(){return Array.from(this.outcomes.values()).map((i)=>({...i}))}attachOutcomeFragment(i){let l=this.outcomes.get(i.outcomeId);if(!l)throw Error(`Outcome "${i.outcomeId}" was not found`);if(!l.requiredSections.includes(i.section))throw Error(`Section "${i.section}" is not part of outcome "${i.outcomeId}"`);let u={id:`frag_${String(++this.outcomeFragmentCounter).padStart(5,"0")}`,teamId:this.teamId,outcomeId:i.outcomeId,section:i.section,sourceAgentId:i.sourceAgentId,sourceRunId:i.sourceRunId,content:i.content,status:"draft",createdAt:new Date};if(this.outcomeFragments.set(u.id,u),l.status==="draft")l.status="in_review",this.dirty.outcomes.add(l.id);return this.emitEvent({type:"outcome_fragment_attached",fragment:{...u}}),{...u}}reviewOutcomeFragment(i){let l=this.outcomeFragments.get(i.fragmentId);if(!l)throw Error(`Fragment "${i.fragmentId}" was not found`);return l.status=i.approved?"reviewed":"rejected",l.reviewedBy=i.reviewedBy,l.reviewedAt=new Date,this.emitEvent({type:"outcome_fragment_reviewed",fragment:{...l}}),{...l}}listOutcomeFragments(i){return Array.from(this.outcomeFragments.values()).filter((l)=>l.outcomeId===i).map((l)=>({...l}))}finalizeOutcome(i){let l=this.outcomes.get(i);if(!l)throw Error(`Outcome "${i}" was not found`);let u=this.listOutcomeFragments(i);for(let c of l.requiredSections)if(!u.some((g)=>g.section===c&&g.status==="reviewed"))throw Error(`Outcome "${i}" cannot be finalized. Section "${c}" is missing a reviewed fragment.`);return l.status="finalized",l.finalizedAt=new Date,this.emitEvent({type:"outcome_finalized",outcome:{...l}}),{...l}}cleanup(){for(let i of this.members.values())if(i.role==="teammate"&&i.runningCount>0)throw Error(`Cannot cleanup team while teammate "${i.agentId}" is still running`);if(Array.from(this.runs.values()).some((i)=>["queued","running"].includes(i.status)))throw Error("Cannot cleanup team while async teammate runs are still active");for(let i of this.members.values())if(i.role==="teammate")try{i.agent?.abort()}catch(l){if(!Sl(l))throw l}this.tasks.clear(),this.mailbox.length=0,this.missionLog.length=0,this.runs.clear(),this.runQueue.length=0,this.clearQueuedRunDispatchTimer(),this.outcomes.clear(),this.outcomeFragments.clear();for(let[i,l]of this.members.entries())if(l.role==="teammate")this.members.delete(i);this.dirty=vd(),this.dirty.reset=!0,this.notifyStateDirty()}requireTask(i){let l=this.tasks.get(i);if(!l)throw Error(`Task "${i}" was not found`);return l}assertDependenciesResolved(i){let l=this.getUnresolvedDependencies(i);if(l.length>0)throw Error(`Task "${i.id}" is blocked by "${l[0]}"`)}getUnresolvedDependencies(i){return i.dependsOn.filter((l)=>{let u=this.tasks.get(l);return!u||u.status!=="completed"})}trackMeaningfulEvent(i,l){if(this.recordRunActivityFromAgentEvent(i,l),l.type==="iteration_end"&&l.hadToolCalls){this.recordProgressStep(i,`Completed iteration ${l.iteration} with ${l.toolCallCount} tool call(s)`);return}if(l.type==="content_end"&&l.contentType==="tool"&&!l.error){this.recordProgressStep(i,`Finished tool "${l.toolName??"unknown"}"`);return}if(l.type==="done"){this.appendMissionLog({agentId:i,kind:"done",summary:`Completed a delegated run (${l.iterations} iterations)`});return}if(l.type==="error")this.appendMissionLog({agentId:i,kind:"error",summary:l.error.message})}recordRunActivityFromAgentEvent(i,l){let u;switch(l.type){case"iteration_start":u=`iteration_${l.iteration}_started`;break;case"content_start":if(l.contentType==="tool")u=`running_tool_${l.toolName??"unknown"}`;break;case"content_end":if(l.contentType==="tool")u=l.error?this.formatProgressErrorActivity(`tool_${l.toolName??"unknown"}_error`,l.error):`finished_tool_${l.toolName??"unknown"}`;break;case"done":u="finalizing_response";break;case"error":u=this.formatProgressErrorActivity("run_error",l.error.message);break;default:break}if(!u)return;for(let c of this.runs.values()){if(c.agentId!==i||c.status!=="running")continue;this.recordRunProgress(c,u)}}recordRunProgress(i,l){let u=new Date;i.heartbeatAt=u,i.lastProgressAt=u,i.lastProgressMessage=l,i.currentActivity=l,this.emitEvent({type:"run_progress",run:{...i},message:l})}formatProgressErrorActivity(i,l){let u=l.replace(/\s+/g," ").trim();if(u.length===0)return i;let c=u.length>240?`${u.slice(0,237).trimEnd()}...`:u;return`${i}: ${c}`}recordProgressStep(i,l,u,c=!1){this.missionStepCounter++;let g=this.members.get(i);if(!g)return;let b=this.missionStepCounter-g.lastMissionStep,I=Date.now()-g.lastMissionAt;if(!c&&b<this.missionLogIntervalSteps&&I<this.missionLogIntervalMs)return;this.appendMissionLog({agentId:i,taskId:u,kind:"progress",summary:l})}buildMailboxNotification(i){if(i.length===0)return"";let l=[`[MAILBOX] You have ${i.length} unread message(s):`];for(let u of i)l.push(`--- Message from ${u.fromAgentId} | subject: ${u.subject} ---`),l.push(u.body);return l.push("---"),l.join(`
|
|
285
|
+
`)}markDirtyFromEvent(i){switch(i.type){case"team_task_updated":this.dirty.tasks.add(i.task.id);break;case"team_message":this.dirty.mailbox.add(i.message.id);break;case"team_mission_log":this.dirty.missionLog.add(i.entry.id);break;case"run_queued":case"run_started":case"run_completed":case"run_failed":case"run_cancelled":case"run_interrupted":case"run_progress":this.dirty.runs.add(i.run.id);break;case"outcome_created":case"outcome_finalized":this.dirty.outcomes.add(i.outcome.id);break;case"outcome_fragment_attached":case"outcome_fragment_reviewed":this.dirty.outcomeFragments.add(i.fragment.id);break;default:break}}hasPendingStateDelta(){let i=this.dirty;return i.reset||i.tasks.size>0||i.mailbox.size>0||i.missionLog.size>0||i.runs.size>0||i.outcomes.size>0||i.outcomeFragments.size>0}drainStateDelta(){let i=this.dirty;this.dirty=vd();let l=(g,b)=>{let I=[];for(let k of g){let T=b(k);if(T!==void 0)I.push({...T})}return I},u=i.mailbox.size>0?new Map(this.mailbox.map((g)=>[g.id,g])):void 0,c=i.missionLog.size>0?new Map(this.missionLog.map((g)=>[g.id,g])):void 0;return{teamId:this.teamId,teamName:this.teamName,reset:i.reset,members:this.exportMembers(),tasks:l(i.tasks,(g)=>this.tasks.get(g)),mailbox:l(i.mailbox,(g)=>u?.get(g)),missionLog:l(i.missionLog,(g)=>c?.get(g)),runs:l(i.runs,(g)=>this.runs.get(g)),outcomes:l(i.outcomes,(g)=>this.outcomes.get(g)),outcomeFragments:l(i.outcomeFragments,(g)=>this.outcomeFragments.get(g))}}requeueStateDelta(i){this.dirty.reset=this.dirty.reset||i.reset;for(let l of i.tasks)this.dirty.tasks.add(l.id);for(let l of i.mailbox)this.dirty.mailbox.add(l.id);for(let l of i.missionLog)this.dirty.missionLog.add(l.id);for(let l of i.runs)this.dirty.runs.add(l.id);for(let l of i.outcomes)this.dirty.outcomes.add(l.id);for(let l of i.outcomeFragments)this.dirty.outcomeFragments.add(l.id)}notifyStateDirty(){try{this.onStateDirty?.()}catch{}}markAllStateDirty(i=!0){this.dirty.reset=this.dirty.reset||i;for(let l of this.tasks.keys())this.dirty.tasks.add(l);for(let l of this.mailbox)this.dirty.mailbox.add(l.id);for(let l of this.missionLog)this.dirty.missionLog.add(l.id);for(let l of this.runs.keys())this.dirty.runs.add(l);for(let l of this.outcomes.keys())this.dirty.outcomes.add(l);for(let l of this.outcomeFragments.keys())this.dirty.outcomeFragments.add(l)}exportMembers(){return Array.from(this.members.values()).map((i)=>({agentId:i.agentId,role:i.role,description:i.description,status:i.status}))}emitEvent(i){this.markDirtyFromEvent(i);try{this.onTeamEvent?.(i)}catch{}}}function Uv(i){return new Promise((l)=>setTimeout(l,i))}function Jn(i,l){let u=0;for(let c of i){if(!c.startsWith(l))continue;let g=Number.parseInt(c.slice(l.length),10);if(Number.isFinite(g))u=Math.max(u,g)}return u}function hj(i,l){switch(l.type){case"run_queued":case"run_started":i.activeTeamRunIds.add(l.run.id);break;case"run_completed":case"run_failed":case"run_cancelled":case"run_interrupted":{let u;if(l.type==="run_failed")u=l.run.error;else if(l.type==="run_cancelled"||l.type==="run_interrupted")u=l.run.error??l.reason;i.activeTeamRunIds.delete(l.run.id),i.pendingTeamRunUpdates.push({runId:l.run.id,agentId:l.run.agentId,taskId:l.run.taskId,status:l.type.replace("run_",""),error:u,iterations:l.run.result?.iterations}),zm(i);break}default:break}}async function fj(i,l,u){switch(l.type){case"run_progress":await u("onTeamTaskProgress",i,l.run.agentId,l.message,{kind:l.message==="heartbeat"?"heartbeat":"progress"});break;case"agent_event":if(l.event.type==="content_start"&&l.event.contentType==="text"&&typeof l.event.text==="string"){let c=l.event.text.replace(/\s+/g," ").trim().slice(0,120);if(c)await u("onTeamTaskProgress",i,l.agentId,c,{kind:"text"})}break;case"task_start":await u("onTeamTaskStart",i,l.agentId,l.message);break;case"task_end":{let c=l.status??(l.error?"failed":l.result?.finishReason==="aborted"?"cancelled":"completed");if(c==="cancelled")await u("onTeamTaskEnd",i,l.agentId,"cancelled","[done] aborted",l.result,l.result?.messages??l.messages);else if(c==="failed"){let g=l.error?.message||l.result?.text||"Teammate task failed";await u("onTeamTaskEnd",i,l.agentId,"failed",`[error] ${g}`,l.result,l.result?.messages??l.messages)}else await u("onTeamTaskEnd",i,l.agentId,"completed",`[done] ${l.result?.finishReason??"completed"}`,l.result,l.result?.messages);break}default:break}}var gj=1000,Fv=new WeakMap;function yj(i,l,u,c,g=Date.now){let b=i.runtime.teamRuntime;if(!b)return;let I=()=>vj(i,l,u,c),k=Fv.get(b);if(!k)k={last:0},Fv.set(b,k);if(lc(u)){k.pending=void 0,I();return}let T=g(),E=gj-(T-k.last);if(E<=0){k.last=T,k.pending=void 0,I();return}if(k.pending=I,!k.timer){let A=k;A.timer=setTimeout(()=>{A.timer=void 0;let C=A.pending;if(A.pending=void 0,C)A.last=g(),C()},E),A.timer.unref?.()}}function vj(i,l,u,c){let g=i.runtime.teamRuntime;if(!g)return;let b=g.getTeamName();c({type:"team_progress",payload:{sessionId:l,teamName:b,lifecycle:uj({teamName:b,sessionId:l,event:u}),summary:dj(b,g.exportState())}})}function Hm(i){return i.activeTeamRunIds.size>0||i.pendingTeamRunUpdates.length>0}function wj(i,l){if(i.aborting)return!1;if(!(l==="completed"||l==="max_iterations"))return!1;return i.config.enableAgentTeams===!0&&Hm(i)}function zm(i){let l=i.teamRunWaiters.splice(0);for(let u of l)u()}async function bj(i){while(!0){if(i.aborting)return[];if(i.pendingTeamRunUpdates.length>0){let l=[...i.pendingTeamRunUpdates];return i.pendingTeamRunUpdates.length=0,l}if(i.activeTeamRunIds.size===0)return[];await new Promise((l)=>{i.teamRunWaiters.push(l)})}}function Ij(i,l){let u=l.map((b)=>{let I=[`- ${b.runId} (${b.agentId}) -> ${b.status}`];if(b.taskId)I.push(` task=${b.taskId}`);if(typeof b.iterations==="number")I.push(` iterations=${b.iterations}`);if(b.error)I.push(` error=${b.error}`);return I.join("")}),c=i.activeTeamRunIds.size,g=c>0?`There are still ${c} teammate run(s) in progress. Continue coordination and decide whether to wait for more updates.`:"No teammate runs are currently in progress. Continue coordination using these updates.";return Wm(`System-delivered teammate async run updates:
|
|
286
|
+
${u.join(`
|
|
287
|
+
`)}
|
|
288
|
+
|
|
289
|
+
${g}`,i.config.mode)}function Wm(i,l){return cr(i,l==="plan"?"plan":l==="yolo"?"yolo":"act")}function xj(i){return kj("sha1").update(i).digest("hex")}function U0(i){return Boolean(i&&typeof i==="object"&&"code"in i)}function qv(i){return U0(i)&&i.code==="ENOENT"}function jv(i){return U0(i)&&(i.code==="EACCES"||i.code==="EPERM")}class F0{definitions;debounceMs;emitParseErrors;listeners=new Set;recordsByType=new Map;watchersByDirectory=new Map;baseTypesByDirectory=new Map;watchedTypesByDirectory=new Map;discoveredDirectoriesByType=new Map;definitionsByType=new Map;pendingTypes=new Set;flushTimer;refreshQueue=Promise.resolve();started=!1;constructor(i,l){if(i.length===0)throw Error("UnifiedConfigFileWatcher requires at least one definition.");this.definitions=i,this.debounceMs=l?.debounceMs??75,this.emitParseErrors=l?.emitParseErrors??!1;for(let u of i){if(this.definitionsByType.has(u.type))throw Error(`Duplicate unified config definition type '${u.type}'.`);this.definitionsByType.set(u.type,u),this.recordsByType.set(u.type,new Map),this.discoveredDirectoriesByType.set(u.type,new Set);for(let c of u.directories){let g=this.baseTypesByDirectory.get(c);if(g)g.add(u.type);else this.baseTypesByDirectory.set(c,new Set([u.type]))}}}subscribe(i){return this.listeners.add(i),()=>{this.listeners.delete(i)}}async start(){if(this.started)return;this.started=!0,await this.refreshAll(),this.startDirectoryWatchers()}stop(){if(this.started=!1,this.flushTimer)clearTimeout(this.flushTimer),this.flushTimer=void 0;this.pendingTypes.clear();for(let i of this.watchersByDirectory.values())i.close();this.watchersByDirectory.clear(),this.watchedTypesByDirectory=new Map}async refreshAll(){await this.enqueueRefresh(async()=>{for(let i of this.definitions)await this.refreshTypeInternal(i)})}async refreshType(i){let l=this.definitionsByType.get(i);if(!l)throw Error(`Unknown unified config type '${i}'.`);await this.enqueueRefresh(async()=>{await this.refreshTypeInternal(l)})}getSnapshot(i){let l=this.recordsByType.get(i);return new Map([...l?.entries()??[]].map(([u,c])=>[u,{...c}]))}getAllSnapshots(){let i=new Map;for(let[l,u]of this.recordsByType.entries())i.set(l,new Map([...u.entries()].map(([c,g])=>[c,{...g}])));return i}emit(i){for(let l of this.listeners)l(i)}enqueueRefresh(i){return this.refreshQueue=this.refreshQueue.then(i,i),this.refreshQueue}startDirectoryWatchers(){this.syncDirectoryWatchers()}syncDirectoryWatchers(){let i=this.buildDesiredTypesByDirectory();for(let[l,u]of this.watchersByDirectory.entries()){if(i.has(l))continue;u.close(),this.watchersByDirectory.delete(l)}this.watchedTypesByDirectory=i;for(let l of i.keys()){if(this.watchersByDirectory.has(l))continue;try{let u=Sj(l,()=>{let c=this.watchedTypesByDirectory.get(l);if(!c)return;for(let g of c)this.pendingTypes.add(g);this.scheduleFlush()});this.watchersByDirectory.set(l,u),u.on("error",(c)=>{let g=this.watchedTypesByDirectory.get(l);if(!g)return;for(let b of g)this.emit({kind:"error",type:b,error:c,filePath:l})})}catch(u){if(!qv(u)&&!jv(u)){let c=i.get(l);if(!c)continue;for(let g of c)this.emit({kind:"error",type:g,error:u,filePath:l})}}}}scheduleFlush(){if(this.flushTimer)clearTimeout(this.flushTimer);this.flushTimer=setTimeout(()=>{this.flushTimer=void 0;let i=[...this.pendingTypes];this.pendingTypes.clear(),this.enqueueRefresh(async()=>{for(let l of i){let u=this.definitionsByType.get(l);if(!u)continue;await this.refreshTypeInternal(u)}})},this.debounceMs)}async refreshTypeInternal(i){let{records:l,discoveredDirectories:u}=await this.loadDefinition(i),c=this.recordsByType.get(i.type)??new Map;for(let[g,b]of c.entries()){if(l.has(g))continue;this.emit({kind:"remove",type:i.type,id:g,filePath:b.filePath})}for(let[g,b]of l.entries()){let I=c.get(g);if(I&&I.filePath===b.filePath&&I.fingerprint===b.fingerprint)continue;this.emit({kind:"upsert",record:{type:b.type,id:g,item:b.item,filePath:b.filePath}})}if(this.recordsByType.set(i.type,l),this.discoveredDirectoriesByType.set(i.type,u),this.started)this.syncDirectoryWatchers()}async loadDefinition(i){let l=new Map,u=new Set;for(let c of i.directories){u.add(c);let g=i.discoverFiles?await i.discoverFiles(c):await this.readDirectoryFileCandidates(c);for(let b of g){let{fileName:I,filePath:k}=b;if(u.add(b.directoryPath),i.includeFile&&!i.includeFile(I,k))continue;try{let T=await _j(k,"utf8"),E={type:i.type,directoryPath:b.directoryPath,fileName:I,filePath:k,content:T},A=i.parseFile(E),C=i.resolveId(A,E).trim();if(!C)continue;l.set(C,{type:i.type,id:C,item:A,filePath:k,fingerprint:xj(T)})}catch(T){if(this.emitParseErrors)this.emit({kind:"error",type:i.type,error:T,filePath:k})}}}return{records:l,discoveredDirectories:u}}buildDesiredTypesByDirectory(){let i=new Map;for(let[l,u]of this.baseTypesByDirectory.entries())i.set(l,new Set(u));for(let[l,u]of this.discoveredDirectoriesByType.entries())for(let c of u){let g=i.get(c);if(g)g.add(l);else i.set(c,new Set([l]))}return i}async readDirectoryFileCandidates(i){try{let l=await Tj(i,{withFileTypes:!0}),u=[];for(let c of l){let g=Aj(i,c.name);if(!(c.isFile()||c.isSymbolicLink()&&await Ej(g).then((b)=>b.isFile()).catch(()=>!1)))continue;u.push({directoryPath:i,fileName:c.name,filePath:g})}return u.sort((c,g)=>c.fileName.localeCompare(g.fileName))}catch(l){if(qv(l)||jv(l))return[];throw l}}}var Nl="SKILL.md",Nj="managed.json",Oj=new Set([".md",".markdown",".txt"]);function Ol(i){return i.trim().toLowerCase()}function In(i){let l=i;return l?.code==="ENOENT"||l?.code==="ENOTDIR"||l?.code==="EACCES"||l?.code==="EPERM"||l?.code==="ELOOP"}function Cu(i){return Oj.has(xu(i).toLowerCase())}function q0(i){let l=[],u=new Set;for(let c of i){let g=zs(c);if(u.has(g))continue;u.add(g),l.push(c)}return l}function $j(i){let l=[...i?.directories??jj(i?.workspacePath)];if(i?.pluginSkillDirectories)l.push(...i.pluginSkillDirectories);else if(i?.includePluginSkills)l.push(...IC({pluginPaths:i.pluginPaths,workspacePath:i.workspacePath,cwd:i.cwd??i.workspacePath}));if(i?.agentPluginSkills)l.push(...i.agentPluginSkills.map((u)=>u.directoryPath));return q0(l)}function Bv(i,l){let u=Mj(i,l);return u===""||!u.startsWith("..")&&!Pj(u)}async function Lj(i){try{let[l,u,c]=await Promise.all([lp(i.pluginRoot),lp(i.directoryPath),lp(i.filePath)]);if(l!==zs(i.pluginRoot)||!Bv(l,u)||!Bv(l,c)||!(await $o(u)).isDirectory()||!(await $o(c)).isFile())return[];return[{directoryPath:i.directoryPath,fileName:Nl,filePath:c}]}catch(l){if(In(l))return[];throw l}}async function gf(i){try{let l=await ff(i,{withFileTypes:!0}),u=[];for(let c of l){if(!c.isDirectory())continue;let g=Pr(i,c.name),b=Pr(g,Nj);try{let I=await Cj(b,"utf8"),k=JSON.parse(I);if(k&&typeof k==="object")u.push(g)}catch(I){if(In(I))continue;if(I?.name==="SyntaxError")continue;throw I}}return u.sort((c,g)=>c.localeCompare(g))}catch(l){if(In(l))return[];throw l}}function yf(i){let l=he(i),u=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/,c=l.match(u);if(!c)return{data:{},body:l,hadFrontmatter:!1};let[,g,b]=c;try{let I=X.parse(g);return{data:I&&typeof I==="object"&&!Array.isArray(I)?I:{},body:b,hadFrontmatter:!0}}catch(I){let k=I instanceof Error?I.message:String(I);return{data:{},body:l,hadFrontmatter:!0,parseError:k}}}function Ru(i,l,u){if(i===void 0||i===null){if(u)throw Error(`Missing required frontmatter field '${l}'.`);return}if(typeof i!=="string")throw Error(`Frontmatter field '${l}' must be a string.`);let c=i.trim();if(!c&&u)throw Error(`Frontmatter field '${l}' cannot be empty.`);return c||void 0}function Fo(i,l){if(i===void 0||i===null)return;if(typeof i!=="boolean")throw Error(`Frontmatter field '${l}' must be a boolean.`);return i}function Dj(i,l){if(Ws(i.filePath).toLowerCase()!==ht.toLowerCase())return Ws(i.filePath,xu(i.filePath));if(l&&zs(i.filePath)===zs(l,ht))return"Workspace AGENTS.md";if(zs(i.filePath)===zs(Qn()))return"Global AGENTS.md";return Ws(i.filePath,xu(i.filePath))}function Uj(i,l){let{data:u,body:c,parseError:g}=yf(i);if(g)throw Error(`Failed to parse YAML frontmatter: ${g}`);let b=c.trim();if(!b)throw Error("Missing instructions body in skill file.");let I=Ru(u.name,"name",!1)??l.trim();if(!I)throw Error("Missing skill name.");return{name:I,description:Ru(u.description,"description",!1),disabled:Fo(u.disabled,"disabled")??(Fo(u.enabled,"enabled")===!1?!0:void 0),instructions:b,frontmatter:u}}function Fj(i,l){let{data:u,body:c,parseError:g}=yf(i);if(g)throw Error(`Failed to parse YAML frontmatter: ${g}`);let b=c.trim();if(!b)throw Error("Missing instructions body in rule file.");let I=Ru(u.name,"name",!1)??l.trim();if(!I)throw Error("Missing rule name.");return{name:I,disabled:Fo(u.disabled,"disabled")??(Fo(u.enabled,"enabled")===!1?!0:void 0),instructions:b,frontmatter:u}}function qj(i,l){let{data:u,body:c,parseError:g}=yf(i);if(g)throw Error(`Failed to parse YAML frontmatter: ${g}`);let b=c.trim();if(!b)throw Error("Missing instructions body in workflow file.");let I=Ru(u.name,"name",!1)??l.trim();if(!I)throw Error("Missing workflow name.");return{name:I,disabled:Fo(u.disabled,"disabled")??(Fo(u.enabled,"enabled")===!1?!0:void 0),instructions:b,frontmatter:u}}function jj(i){return Rr(i)}function Bj(i){return Or(i)}function Hj(i){return Ar(i)}async function j0(i){if(Ws(i)===".cline"){let l=await gf(i);return(await Promise.all(l.map((u)=>j0(Pr(u,Ze))))).flat()}try{let l=await ff(i,{withFileTypes:!0}),u=[];for(let c of l){if(c.isFile()&&c.name===Nl){u.push({directoryPath:i,fileName:c.name,filePath:Pr(i,c.name)});continue}let g=Pr(i,c.name);if(c.isDirectory()||c.isSymbolicLink()&&await $o(g).then((b)=>b.isDirectory()).catch((b)=>{if(In(b))return!1;throw b}))u.push({directoryPath:g,fileName:Nl,filePath:Pr(g,Nl)})}return u}catch(l){if(In(l))return[];throw l}}async function Pu(i){if(Ws(i)===".cline"){let l=await gf(i);return(await Promise.all(l.map((u)=>Pu(Pr(u,"rules.md"))))).flat()}try{if((await $o(i)).isFile())return[{directoryPath:Rj(i),fileName:Ws(i),filePath:i}]}catch(l){if(!In(l))throw l}try{let l=await ff(i,{withFileTypes:!0}),u=[];for(let g of l){if(!Cu(g.name))continue;let b=Pr(i,g.name);if(!(g.isFile()||g.isSymbolicLink()&&await $o(b).then((I)=>I.isFile()).catch(()=>!1)))continue;u.push({directoryPath:i,fileName:g.name,filePath:b})}let c=Pr(i,"AGENTS.md");try{if((await $o(c)).isFile()){if(!u.some((g)=>g.fileName==="AGENTS.md"))u.push({directoryPath:i,fileName:"AGENTS.md",filePath:c})}}catch{}return u}catch(l){if(In(l))return[];throw l}}async function zj(i){if(Ws(i)===".cline"){let l=await gf(i);return(await Promise.all(l.map((u)=>Pu(Pr(u,Yi))))).flat()}return Pu(i)}function Wj(i){let l=$j(i),u=new Map((i?.agentPluginSkills??[]).map((g)=>[zs(g.directoryPath),g])),c=i?.workspacePath?Pr(i.workspacePath,".cline"):void 0;return{type:"skill",directories:c?q0([...l,c]):l,discoverFiles:(g)=>{let b=u.get(zs(g));return b?Lj(b):j0(g)},includeFile:(g)=>g===Nl,parseFile:(g)=>{let b=u.get(zs(g.directoryPath));if(!b)return Uj(g.content,Ws(g.directoryPath));let I=jS(g.content,b.metadata.name);return{name:I.metadata.name,description:I.metadata.description,instructions:I.instructions,frontmatter:I.frontmatter,source:{type:"agent-plugin",pluginName:b.pluginName,pluginRoot:b.pluginRoot,skillRoot:b.directoryPath,filePath:b.filePath}}},resolveId:(g)=>g.source?.type==="agent-plugin"?`${Ol(g.source.pluginName)}:${Ol(g.name)}`:Ol(g.name)}}function Kj(i){let l=i?.directories??Bj(i?.workspacePath),u=i?.workspacePath?Pr(i.workspacePath,".cline"):void 0;return{type:"rule",directories:u?[...l,u]:l,discoverFiles:Pu,includeFile:(c,g)=>c===".clinerules"||Cu(c)||Cu(g),parseFile:(c)=>Fj(c.content,Dj(c,i?.workspacePath)),resolveId:(c)=>Ol(c.name)}}function Gj(i){let l=i?.directories??Hj(i?.workspacePath),u=i?.workspacePath?Pr(i.workspacePath,".cline"):void 0;return{type:"workflow",directories:u?[...l,u]:l,discoverFiles:zj,includeFile:(c)=>Cu(c),parseFile:(c)=>qj(c.content,Ws(c.filePath,xu(c.filePath))),resolveId:(c)=>Ol(c.name)}}function Xj(i){let l=[Wj(i?.skills),Kj(i?.rules),Gj(i?.workflows)];return new F0(l,{debounceMs:i?.debounceMs,emitParseErrors:i?.emitParseErrors})}function Jj(i){return i.disabled!==!0}function B0(i){if(i.length===0)return"";return`
|
|
290
|
+
|
|
291
|
+
# Rules
|
|
292
|
+
${i.map((l)=>`## ${l.name}
|
|
293
|
+
${l.instructions}`).join(`
|
|
294
|
+
|
|
295
|
+
`)}`}function Hv(i,l){let u=i?.trim(),c=l?.trim();if(u&&c)return`${u}
|
|
296
|
+
|
|
297
|
+
${c}`;return u||c||void 0}function H0(i){return i.map((l)=>l.item).filter(Jj).sort((l,u)=>l.name.localeCompare(u.name))}function z0(i){return B0(H0(i))}function Vj(i){let l=i.getSnapshot("rule");return H0([...l.values()].map((u)=>({item:u.item})))}function Yj(i){return B0(Vj(i))}function qo(i){return i.trim().toLowerCase().replace(/\s+/g,"-").replace(/[^\p{L}\p{N}_.:@-]+/gu,"-").replace(/-+/g,"-").replace(/^-/,"").replace(/-$/,"")}function Zj(i){let l=qo(i).replace(/[^a-z0-9_-]+/g,"-").replace(/^-/,"").replace(/-$/,""),u=Qj("sha256").update(i).digest("hex").slice(0,12);return`${l||"command"}-${u}`}function eB(i,l){if(i.description?.trim())return Bn(i.description,".");if(l==="workflow")return;return Bn(i.instructions,".")}function tB(i){return i.disabled!==!0}function rB(i,l){if(l!=="skill"||!("source"in i)||i.source?.type!=="agent-plugin")return i.instructions;return`<skill-root>${i.source.skillRoot.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">")}</skill-root>
|
|
298
|
+
${i.instructions}`}function zv(i,l){return[...i.getSnapshot(l).entries()].map(([u,c])=>({id:u,record:c})).filter(({record:u})=>tB(u.item)).map(({id:u,record:c})=>({id:u,name:qo(c.item.name)||`${l}-${Zj(u)}`,instructions:rB(c.item,l),description:eB(c.item,l),kind:l})).sort((u,c)=>u.name.localeCompare(c.name)||u.id.localeCompare(c.id))}function vf(i){let l=new Map;for(let u of[...zv(i,"skill"),...zv(i,"workflow")])if(!l.has(u.name))l.set(u.name,u);return[...l.values()].sort((u,c)=>u.name.localeCompare(c.name))}function sB(i,l,u){if(!i.startsWith("/")||i.length<2)return i;let c=i.match(/^\/(\S+)/);if(!c)return i;let g=c[1],b=qo(g);if(!b)return i;let I=g.length+1,k=i.slice(I),T=vf(l).find((E)=>E.name===b);if(!T)return i;if(T.kind==="skill"&&u?.expandSkillCommands===!1)return i;return`${T.instructions}${k}`}function iB(i){return i.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">")}function W0(i,l){let u=l?.trim(),c=u?`
|
|
299
|
+
<command-args>${u}</command-args>`:"",g=i.source?.type==="agent-plugin"?`
|
|
300
|
+
<skill-root>${iB(i.source.skillRoot)}</skill-root>`:"",b=i.description?.trim()?`Description: ${i.description.trim()}
|
|
301
|
+
|
|
302
|
+
`:"";return`<command-name>${i.name}</command-name>${c}${g}
|
|
303
|
+
<command-instructions>
|
|
304
|
+
${b}${i.instructions}
|
|
305
|
+
</command-instructions>`}function Mu(i){return i.trim().replace(/^\/+/,"").toLowerCase()}function nB(i){if(!i||i.length===0)return;let l=i.map(Mu).filter((u)=>u.length>0);return l.length>0?new Set(l):void 0}function oB(i,l,u){if(!u)return!0;let c=Mu(i),g=Mu(l),b=c.includes(":")?c.split(":").at(-1)??c:c,I=g.includes(":")?g.split(":").at(-1)??g:g;return u.has(c)||u.has(g)||u.has(b)||u.has(I)}function dc(i,l){let u=nB(l);return[...i.getSnapshot("skill").entries()].map(([c,g])=>{let b=g.item;return{id:c,name:b.name.trim(),description:b.description?.trim(),disabled:b.disabled===!0,skill:b}}).filter((c)=>oB(c.id,c.name,u))}function aB(i,l){return dc(i,l).filter((u)=>!u.disabled).map((u)=>u.name.trim()).filter((u)=>u.length>0).sort((u,c)=>u.localeCompare(c))}function lB(i,l,u){let c=Mu(l);if(!c)return{error:"Missing skill name."};let g=dc(i,u),b=g.find((A)=>A.id===c);if(b){let{skill:A}=b;if(A.disabled===!0)return{error:`Skill "${A.name}" is configured but disabled.`};return{id:b.id,skill:A}}let I=c.includes(":")?c.split(":").at(-1)??c:c,k=g.filter(({id:A})=>{if(A===I)return!0;return A.endsWith(`:${I}`)}),T=k.filter(({skill:A})=>A.disabled!==!0);if(T.length===1){let{id:A,skill:C}=T[0];return{id:A,skill:C}}if(T.length>1)return{error:`Skill "${l}" is ambiguous. Use one of: ${T.map(({id:A})=>A).join(", ")}`};if(k.length===1){let{skill:A}=k[0];return{error:`Skill "${A.name}" is configured but disabled.`}}if(k.length>1)return{error:`Skill "${l}" is ambiguous, and all matches are disabled: ${k.map(({id:A})=>A).join(", ")}`};let E=aB(i,u);return{error:E.length>0?`Skill "${l}" not found. Available skills: ${E.join(", ")}`:"No skills are currently available."}}function K0(i,l=Promise.resolve(),u){let c=new Set,g=async(b,I)=>{await l;let k=lB(i,b,u);if("error"in k)return k.error;let{id:T,skill:E}=k;if(c.has(T))return`Skill "${E.name}" is already running.`;c.add(T);try{return W0(E,I)}finally{c.delete(T)}};return Object.defineProperty(g,"configuredSkills",{get:()=>dc(i,u).map(({skill:b,...I})=>I),enumerable:!0,configurable:!1}),g}function dB(i){let l=i.watcherReady??Promise.resolve();return{name:"cline-user-instructions",manifest:{capabilities:[i.includeRules?"rules":void 0,i.registerSkillsTool?"tools":void 0,i.includeSkills||i.includeWorkflows?"commands":void 0].filter((u)=>Boolean(u))},async setup(u){if(await l,i.includeRules)u.registerRule({id:"cline-user-instructions:rules",source:"user-instruction-watcher",content:()=>Yj(i.watcher)});if(i.registerSkillsTool)u.registerTool(tc(K0(i.watcher,l,i.allowedSkillNames)));for(let c of vf(i.watcher).filter((g)=>g.kind==="skill"&&i.includeSkills||g.kind==="workflow"&&i.includeWorkflows))u.registerCommand({name:c.name,description:c.description,handler:(g)=>{let b=g.trim();return b?`${c.instructions}
|
|
306
|
+
|
|
307
|
+
${b}`:c.instructions}})}}}function wd(i){return i.trim().replace(/^\/+/,"").toLowerCase()}function Wv(i,l){let u=i.map((b)=>b.createSkillsExecutor?.(l)).filter((b)=>b!==void 0),c=()=>u.flatMap((b)=>(b.configuredSkills??[]).map((I)=>({metadata:I,executor:b}))),g=async(b,I,k)=>{let T=wd(b);if(!T)return"Missing skill name.";let E=c(),A=E.filter(({metadata:L})=>wd(L.id)===T),C=A.length>0?A:E.filter(({metadata:L})=>{let D=wd(L.id);return wd(L.name)===T||D.endsWith(`:${T}`)}),N=C.filter(({metadata:L})=>!L.disabled);if(N.length===1)return N[0].executor(N[0].metadata.id,I,k);if(N.length>1)return`Skill "${b}" is ambiguous. Use one of: ${N.map(({metadata:L})=>L.id).join(", ")}`;if(C.length>0)return`Skill "${b}" is configured but disabled.`;let O=E.filter(({metadata:L})=>!L.disabled).map(({metadata:L})=>L.id).sort((L,D)=>L.localeCompare(D));return O.length>0?`Skill "${b}" not found. Available skills: ${O.join(", ")}`:"No skills are currently available."};return Object.defineProperty(g,"configuredSkills",{get:()=>c().map(({metadata:b})=>b),enumerable:!0,configurable:!1}),g}function uB(i){if(i.length===0)throw Error("At least one user instruction service is required.");if(i.length===1)return i[0];let l=(c)=>{let g=new Map;for(let b of i)for(let I of b.listRecords(c))if(!g.has(I.id))g.set(I.id,I);return[...g.values()]},u=()=>{let c=new Map;for(let g of i)for(let b of g.listRuntimeCommands()){let I=qo(b.name);if(I&&!c.has(I))c.set(I,b)}return[...c.values()].sort((g,b)=>g.name.localeCompare(b.name))};return{start:async()=>{await Promise.all(i.map((c)=>c.start()))},stop:()=>{for(let c of i)c.stop()},refreshType:async(c)=>{await Promise.all(i.map((g)=>g.refreshType(c)))},listRecords:l,listRuntimeCommands:u,resolveRuntimeSlashCommand:(c,g)=>{for(let b of i){let I=b.resolveRuntimeSlashCommand(c,g);if(I!==c)return I}return c},hasConfiguredSkills:(c)=>i.some((g)=>g.hasConfiguredSkills(c)),createSkillsExecutor:(c)=>Wv(i,c),createExtension:(c)=>({name:"cline-combined-user-instructions",manifest:{capabilities:[c.includeRules?"rules":void 0,c.registerSkillsTool?"tools":void 0,c.includeSkills||c.includeWorkflows?"commands":void 0].filter((g)=>Boolean(g))},setup(g){if(c.includeRules)g.registerRule({id:"cline-combined-user-instructions:rules",source:"combined-user-instructions",content:()=>z0(l("rule"))});if(c.registerSkillsTool)g.registerTool(tc(Wv(i,c.allowedSkillNames)));for(let b of u().filter((I)=>I.kind==="skill"&&c.includeSkills||I.kind==="workflow"&&c.includeWorkflows))g.registerCommand({name:b.name,description:b.description,handler:(I)=>{let k=I.trim();return k?`${b.instructions}
|
|
308
|
+
|
|
309
|
+
${k}`:b.instructions}})}})}}class G0{watcher;ready;stopped=!1;constructor(i){this.watcher=Xj(i)}start(){if(!this.ready)this.stopped=!1,this.ready=this.watcher.start();return this.ready}stop(){if(this.stopped)return;this.stopped=!0,this.watcher.stop(),this.ready=void 0}async refreshType(i){await this.start(),await this.watcher.refreshType(i)}listRecords(i){return[...this.watcher.getSnapshot(i).entries()].map(([l,u])=>({type:i,id:l,filePath:u.filePath,item:u.item}))}listRuntimeCommands(){return vf(this.watcher)}resolveRuntimeSlashCommand(i,l){return sB(i,this.watcher,l)}hasConfiguredSkills(i){return dc(this.watcher,i).some((l)=>!l.disabled)}createSkillsExecutor(i){return K0(this.watcher,(this.ready??Promise.resolve()).catch(()=>{}),i)}createExtension(i){return dB({...i,watcher:this.watcher,watcherReady:(this.ready??Promise.resolve()).catch(()=>{})})}}function Km(i){return new G0(i)}var cB=["model","app"];function X0(){return{extensions:{["io.modelcontextprotocol/ui"]:{mimeTypes:["text/html;profile=mcp-app"]}}}}function J0(i){try{return new URL(i).protocol==="ui:"}catch{return!1}}function pB(i){return typeof i==="object"&&i!==null&&!Array.isArray(i)}function wf(i){let l=i._meta?.ui;if(!pB(l))return;let u=typeof l.resourceUri==="string"&&J0(l.resourceUri)?l.resourceUri:void 0,c=Array.isArray(l.visibility)?l.visibility.filter((g)=>g==="model"||g==="app"):cB;return{resourceUri:u,visibility:c}}function V0(i){return wf(i)?.visibility.includes("model")??!0}function mB(i){return wf(i)?.visibility.includes("app")??!0}kI();function Q0(i){return Be(i)*1000}function Kv(i,l,u){if(!(i instanceof q)||i.code!==J.RequestTimeout)return i;return new q(i.code,Vi(l,u),i.data)}var yB=new Set([301,302,303,307,308]),Gv=20,vB=new Set(["authorization","cookie","proxy-authorization"]),wB=new Set(["mcp-protocol-version","mcp-session-id"]);function bB(i){if(!i.headers||!i.restrictConfiguredHeadersToOrigin)return i.headers;let l=Object.entries(i.headers).filter(([u])=>{let c=u.toLowerCase();if(wB.has(c))return!1;return c!=="authorization"||!i.oauthProvider});return l.length>0?Object.fromEntries(l):void 0}function IB(i){let l=new URL(i.endpointUrl).origin,u=new Set(Object.keys(i.configuredHeaders).map((b)=>b.toLowerCase())),c=i.baseFetch??globalThis.fetch,g=(b)=>{let I=[];b.forEach((k,T)=>{let E=T.toLowerCase();if(u.has(E)||vB.has(E))I.push(T)});for(let k of I)b.delete(k)};return async(b,I)=>{let k=b instanceof Request?new Request(b,I):new Request(String(b),I),T=new URL(k.url),E=k.method,A=E==="GET"||E==="HEAD"?void 0:await k.clone().arrayBuffer(),C=new Headers(k.headers);if(T.origin!==l)g(C);for(let N=0;;N+=1){let O=await c(T,{method:E,headers:C,body:A,redirect:"manual",signal:k.signal});if(!yB.has(O.status))return O;if(N>=Gv)throw await O.body?.cancel().catch(()=>{return}),Error(`MCP endpoint exceeded ${Gv} redirects.`);let L=O.headers.get("location");if(!L)return O;let D=new URL(L,T);if(await O.body?.cancel().catch(()=>{return}),D.origin!==l)g(C);if(O.status===303&&E!=="GET"&&E!=="HEAD"||(O.status===301||O.status===302)&&E==="POST")E="GET",A=void 0,C.delete("content-length"),C.delete("content-type");T=D}}}function kB(i){return{client_name:"Cline",redirect_uris:[i],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"}}function Xv(i){return i?{client_id:i.clientId,...i.clientSecret?{client_secret:i.clientSecret}:{}}:void 0}function Gd(i,l){return i?.client_id===l?.client_id&&i?.client_secret===l?.client_secret}function il(i,l,u){if(!Gd(l.clientInformation,u))throw new zu(i)}function Jv(i){let l={};try{l=nA(i.serverName,{filePath:i.settingsPath})??{}}catch{l={}}let u,c,g=()=>i.clientInformation??l.clientInformation,b=i.clientInformation?{clientId:i.clientInformation.client_id,...i.clientInformation.client_secret?{clientSecret:i.clientInformation.client_secret}:{}}:null,I=async(k)=>{try{l=await aA(i.serverName,k,{filePath:i.settingsPath,expectedOAuthClient:b})}catch(T){if(i.settingsPath||T instanceof zu)throw T;l=Hu(k(l))??{}}};return{provider:{get redirectUrl(){return l.redirectUrl??i.redirectUrl},get clientMetadata(){return kB(l.redirectUrl??i.redirectUrl)},state:()=>(c=gB(),c),clientInformation:g,saveClientInformation:async(k)=>{let T=l.clientInformation;await I((E)=>{il(i.serverName,E,T);let A=!Gd(E.clientInformation,k);return{...E,clientInformation:k,...A?{tokens:void 0,lastAuthenticatedAt:void 0}:{},redirectUrl:i.redirectUrl,lastError:void 0}})},tokens:()=>g()?.client_id&&Gd(l.clientInformation,g())?l.tokens:void 0,saveTokens:async(k)=>{let T=Date.now(),E=g();if(!E?.client_id)throw Error("Cannot save MCP OAuth tokens without a client ID.");await I((A)=>{if(A.clientInformation||!i.clientInformation)il(i.serverName,A,E);return{...A,tokens:k,clientInformation:E,redirectUrl:i.redirectUrl,lastError:void 0,lastAuthenticatedAt:T}})},redirectToAuthorization:async(k)=>{u=k.toString(),await i.onAuthorizationUrl?.(u)},saveCodeVerifier:async(k)=>{let T=g();await I((E)=>(il(i.serverName,E,T),{...E,codeVerifier:k,redirectUrl:i.redirectUrl}))},codeVerifier:()=>{if(!l.codeVerifier)throw Error(`Missing OAuth code verifier for MCP server "${i.serverName}".`);return l.codeVerifier},invalidateCredentials:async(k)=>{let T=l.clientInformation;await I((E)=>{if(il(i.serverName,E,T),k==="all")return{lastError:E.lastError,redirectUrl:E.redirectUrl};return{...E,...k==="client"?{clientInformation:void 0}:{},...k==="tokens"?{tokens:void 0,lastAuthenticatedAt:void 0}:{},...k==="verifier"?{codeVerifier:void 0}:{},...k==="discovery"?{discoveryState:void 0}:{}}})},saveDiscoveryState:async(k)=>{let T=l.clientInformation;await I((E)=>(il(i.serverName,E,T),{...E,discoveryState:k}))},discoveryState:()=>l.discoveryState},getLastAuthorizationUrl:()=>u,getLastOAuthState:()=>c,resetInteractiveState:async()=>{await I((k)=>{let T=i.clientInformation,E=T!==void 0&&!Gd(k.clientInformation,T);return{...k,...T?{clientInformation:T}:{},...E?{tokens:void 0,lastAuthenticatedAt:void 0}:{},codeVerifier:void 0,discoveryState:void 0,lastError:void 0,redirectUrl:i.redirectUrl}})},markError:async(k)=>{await I((T)=>({...T,lastError:k}))},markConnectionError:async(k)=>{await I((T)=>({...T,lastError:k,authorizationRequired:void 0}))},markAuthorizationRequired:async(k)=>{await I((T)=>({...T,lastError:k,authorizationRequired:!0}))},clearError:async()=>{await I((k)=>({...k,lastError:void 0,authorizationRequired:void 0}))}}}function SB(i){let l=i.registration.transport;if(l.type==="stdio")throw Error(`MCP server "${i.registration.name}" uses stdio transport and does not support OAuth browser flow.`);let u=bB({headers:l.headers,oauthProvider:i.oauthProvider,restrictConfiguredHeadersToOrigin:i.restrictConfiguredHeadersToOrigin}),c=u?{headers:u}:void 0,g=i.restrictConfiguredHeadersToOrigin&&u?IB({endpointUrl:l.url,configuredHeaders:u,baseFetch:i.fetch}):i.fetch,b=i.oauthProvider?g:async(I,k)=>{let T=await(g??globalThis.fetch)(I,k);if(T.status===401)throw await T.body?.cancel().catch(()=>{return}),new at("MCP server requires authorization");return T};if(l.type==="sse")return new zo(new URL(l.url),{authProvider:i.oauthProvider,requestInit:c,eventSourceInit:{fetch:(I,k)=>(g??globalThis.fetch)(I,k)},fetch:b});return new Go(new URL(l.url),{authProvider:i.oauthProvider,requestInit:c,fetch:b})}function Vv(i){return i instanceof at||i instanceof lo&&i.code===401}var TB="2024-11-05",_B=1e4,EB=1e4,Yv="http://127.0.0.1:1456/mcp/oauth/callback",Qv=250,dp=2000;function an(i){return i instanceof Error?i.message:String(i)}async function bd(i,l){return new Promise((u)=>{let c=!1,g=(I)=>{if(c)return;c=!0,clearTimeout(b),u(I)},b=setTimeout(()=>g(!1),l);b.unref(),i.then(()=>g(!0),()=>g(!0))})}function AB(i,l,u){let c=an(l),g=an(u);if(c===g)return l instanceof Error?l:Error(c);return Error(`MCP server "${i}" failed to initialize. Newline-delimited attempt: ${c} Content-Length framed attempt: ${g}`)}function Zv(i){return Buffer.from(`${JSON.stringify(i)}
|
|
310
|
+
`,"utf8")}function ew(i){let l=Buffer.from(JSON.stringify(i),"utf8");return Buffer.concat([Buffer.from(`Content-Length: ${l.byteLength}\r
|
|
311
|
+
\r
|
|
312
|
+
`,"utf8"),l])}class Gm{buffer="";decoder=new Y0("utf8");push(i){this.buffer+=this.decoder.write(i);let l=[];while(!0){let u=this.buffer.indexOf(`\r
|
|
313
|
+
\r
|
|
314
|
+
`);if(u<0)break;let c=this.buffer.slice(0,u).match(/(?:^|\r\n)Content-Length:\s*(\d+)(?:\r\n|$)/i);if(!c)throw Error("Invalid MCP stdio frame: missing Content-Length header.");let g=Number.parseInt(c[1],10),b=u+4,I=b+g;if(this.buffer.length<I)break;l.push(this.buffer.slice(b,I)),this.buffer=this.buffer.slice(I)}return l}}class Xm{buffer="";decoder=new Y0("utf8");push(i){this.buffer+=this.decoder.write(i);let l=[];while(!0){let u=this.buffer.indexOf(`
|
|
315
|
+
`);if(u<0)break;let c=this.buffer.slice(0,u).trim();if(this.buffer=this.buffer.slice(u+1),c.length>0)l.push(c)}return l}}class Z0{registration;process;processClose;nextRequestId=1;pending=new Map;framedParser=new Gm;newlineParser=new Xm;stderrBuffer="";stdinFailure;stdinFailureTimer;connected=!1;protocolMode="newline";requestTimeoutMs;connectAttemptTimeoutMs;mcpApps;constructor(i,l=!1){this.registration=i,this.mcpApps=l,this.requestTimeoutMs=Q0(i.timeoutSeconds),this.connectAttemptTimeoutMs=ze(i.timeoutSeconds)?this.requestTimeoutMs:_B}async connect(){if(this.connected)return;if(this.registration.transport.type!=="stdio")throw Error(`Unsupported MCP transport for "${this.registration.name}": ${this.registration.transport.type}`);let i={protocolVersion:TB,capabilities:this.mcpApps?X0():{},clientInfo:{name:"@cline/core",version:"0.0.0"}};await this.ensureAgentPluginDataDirectory(),this.spawnProcess("newline");try{await this.request("initialize",i,this.connectAttemptTimeoutMs)}catch(l){await this.disconnect().catch(()=>{}),this.spawnProcess("framed");try{await this.request("initialize",i,this.connectAttemptTimeoutMs)}catch(u){throw await this.disconnect().catch(()=>{}),AB(this.registration.name,l,u)}}this.notify("notifications/initialized"),this.connected=!0}async ensureAgentPluginDataDirectory(){if(this.registration.metadata?.source!=="agent-plugin")return;let i=this.registration.metadata.pluginDataPath;if(typeof i!=="string"||i.length===0)return;await fB(i,{recursive:!0})}async disconnect(){let i=this.process,l=this.processClose;if(this.connected=!1,this.process=void 0,this.processClose=void 0,this.clearStdinFailureTimer(),this.failAllPending(Error(`Disconnected from MCP server "${this.registration.name}".`)),!l)return;if(!i){if(!await bd(l,dp))throw Error(`MCP process for "${this.registration.name}" did not close during disconnect.`);return}if(!i.stdin.destroyed)i.stdin.end();if(await bd(l,Qv))return;if(i.kill(),await bd(l,dp))return;if(i.kill("SIGKILL"),!await bd(l,dp))throw Error(`MCP process for "${this.registration.name}" did not exit during disconnect.`)}async listTools(){return((await this.request("tools/list")).tools??[]).filter((i)=>typeof i?.name==="string"&&typeof i.inputSchema==="object"&&i.inputSchema!==null).map((i)=>({name:i.name,description:i.description,inputSchema:i.inputSchema,...i._meta&&typeof i._meta==="object"&&!Array.isArray(i._meta)?{_meta:i._meta}:{}}))}async callTool(i){return this.request("tools/call",{name:i.name,arguments:i.arguments??{}},void 0,i.context?.signal)}async readResource(i){let l=pa.safeParse(await this.request("resources/read",{uri:i.uri},void 0,i.context?.signal));if(!l.success)throw Error(`MCP server "${this.registration.name}" returned an invalid resources/read result: ${l.error.message}`);return l.data}spawnProcess(i){let l=this.registration.transport;if(l.type!=="stdio")throw Error(`Unsupported MCP transport for "${this.registration.name}": ${l.type}`);this.framedParser=new Gm,this.newlineParser=new Xm,this.stderrBuffer="",this.stdinFailure=void 0,this.clearStdinFailureTimer(),this.protocolMode=i;let u=process.platform==="win32"?{windowsHide:!0,shell:!0}:{},c=hB(l.command,l.args??[],{cwd:l.cwd,env:{...process.env,...l.env??{}},stdio:["pipe","pipe","pipe"],...u});this.process=c,this.processClose=new Promise((g)=>{c.once("close",()=>g())}),c.stdout.on("data",(g)=>this.handleStdout(g)),c.stderr.on("data",(g)=>{if(this.process!==c)return;if(this.stderrBuffer+=g.toString("utf8"),this.stderrBuffer.length>16384)this.stderrBuffer=this.stderrBuffer.slice(-16384)}),c.once("error",(g)=>{if(this.process!==c)return;this.failAllPending(Error(`MCP process error: ${an(g)}`))}),c.stdin.on("error",(g)=>{if(this.process!==c)return;if(this.stdinFailure??=an(g),this.stdinFailureTimer!==void 0)return;this.stdinFailureTimer=setTimeout(()=>{if(this.stdinFailureTimer=void 0,this.process!==c)return;this.failAllPending(Error(`MCP server "${this.registration.name}" stopped reading its input before the request was fully delivered (${this.stdinFailure}) and did not exit.`)),this.disconnect().catch(()=>{})},Qv),this.stdinFailureTimer.unref()}),c.once("exit",(g,b)=>{if(this.process!==c)return;this.connected=!1,this.process=void 0,this.clearStdinFailureTimer();let I=this.stderrBuffer.trim()?` stderr: ${this.stderrBuffer.trim()}`:"";this.failAllPending(Error(`MCP process exited for "${this.registration.name}" (code=${g??"null"}, signal=${b??"null"}).${I}${this.describeStdinFailure()}`))})}handleStdout(i){try{let l=this.protocolMode==="framed"?this.framedParser.push(i):this.newlineParser.push(i);for(let u of l){let c=JSON.parse(u);if(typeof c.id!=="number")continue;let g=this.takePending(c.id);if(!g)continue;if(c.error){let b=c.error.message||`MCP request failed with code ${c.error.code??"unknown"}`;g.reject(Error(b));continue}g.resolve(c.result)}}catch(l){this.handleProtocolFailure(l)}}handleProtocolFailure(i){let l=this.process;if(!l)return;this.connected=!1,this.process=void 0;let u=this.stderrBuffer.trim()?` stderr: ${this.stderrBuffer.trim()}`:"";this.failAllPending(Error(`Invalid MCP response from "${this.registration.name}": ${an(i)}.${u}`)),l.kill()}async request(i,l,u=this.requestTimeoutMs,c){let g=this.process;if(!g?.stdin.writable)throw Error(`MCP server "${this.registration.name}" is not connected.`);let b=this.nextRequestId++,I={jsonrpc:"2.0",id:b,method:i,...l?{params:l}:{}},k=new Promise((T,E)=>{let A=setTimeout(()=>{this.takePending(b),E(this.createTimeoutError(i,u))},u),C=c?()=>{let N=this.takePending(b);if(!N)return;let O=c.reason instanceof Error?c.reason:Object.assign(Error(`MCP request aborted for "${this.registration.name}" (${i}).`),{name:"AbortError"});N.reject(O)}:void 0;if(this.pending.set(b,{resolve:T,reject:E,timeout:A,signal:c,onAbort:C}),c&&C){if(c.addEventListener("abort",C,{once:!0}),c.aborted)C()}});if(!this.pending.has(b))return k;try{g.stdin.write(this.protocolMode==="framed"?ew(I):Zv(I))}catch(T){let E=this.takePending(b);if(E)E.reject(T instanceof Error?T:Error(String(T)))}return k}createTimeoutError(i,l){return Error(Vi(this.registration.name,l,i)+this.describeStdinFailure())}clearStdinFailureTimer(){if(this.stdinFailureTimer!==void 0)clearTimeout(this.stdinFailureTimer),this.stdinFailureTimer=void 0}describeStdinFailure(){return this.stdinFailure===void 0?"":` The server stopped reading its input before the request was fully delivered (${this.stdinFailure}).`}notify(i,l){let u=this.process;if(!u?.stdin.writable)return;let c={jsonrpc:"2.0",method:i,...l?{params:l}:{}};u.stdin.write(this.protocolMode==="framed"?ew(c):Zv(c))}failAllPending(i){for(let l of[...this.pending.keys()]){let u=this.takePending(l);if(!u)continue;u.reject(i)}}takePending(i){let l=this.pending.get(i);if(!l)return;if(this.pending.delete(i),clearTimeout(l.timeout),l.signal&&l.onAbort)l.signal.removeEventListener("abort",l.onAbort);return l}}class eT{registration;options;client;authContext;requestTimeoutMs;connectAttemptTimeoutMs;constructor(i,l){this.registration=i,this.options=l,this.requestTimeoutMs=Q0(i.timeoutSeconds),this.connectAttemptTimeoutMs=ze(i.timeoutSeconds)?this.requestTimeoutMs:EB}async connect(){if(this.client)return;if(this.registration.transport.type==="stdio")throw Error(`Unsupported MCP transport for "${this.registration.name}": ${this.registration.transport.type}`);let i=Jv({settingsPath:this.options.settingsPath,serverName:this.registration.name,redirectUrl:this.registration.oauth?.redirectUrl??Yv,clientInformation:Xv(this.registration.oauthClient)});this.authContext=i;let l=await i.provider.tokens()?i.provider:void 0,u;try{u=new cn({name:this.options.clientName?.trim()||"@cline/core",version:this.options.clientVersion?.trim()||"0.0.0"},this.options.mcpApps?{capabilities:X0()}:void 0);let c=SB({registration:this.registration,oauthProvider:l,fetch:this.options.fetch,restrictConfiguredHeadersToOrigin:this.options.restrictConfiguredHeadersToOrigin});await u.connect(c,{timeout:this.connectAttemptTimeoutMs}),await i.clearError(),this.client=u}catch(c){await u?.close().catch(()=>{});let g=Kv(c,this.registration.name,this.connectAttemptTimeoutMs),b=Vv(c),I=b?this.formatUnauthorizedMessage(i.getLastAuthorizationUrl()):an(g);if(b&&!this.hasStaticAuthorizationHeader())await i.markAuthorizationRequired(I);else await i.markConnectionError(I);throw Error(I)}}async disconnect(){let i=this.client;this.client=void 0,await i?.close()}async listTools(){let i=await this.ensureConnectedClient();try{return(await i.listTools(void 0,{timeout:this.requestTimeoutMs})).tools.map((l)=>({name:l.name,description:l.description,inputSchema:l.inputSchema&&typeof l.inputSchema==="object"&&!Array.isArray(l.inputSchema)?l.inputSchema:{},...l._meta?{_meta:l._meta}:{}}))}catch(l){return await this.handleOperationError(l)}}async callTool(i){let l=await this.ensureConnectedClient();try{return await l.callTool({name:i.name,arguments:i.arguments??{}},void 0,{timeout:this.requestTimeoutMs,signal:i.context?.signal})}catch(u){return await this.handleOperationError(u)}}async readResource(i){let l=await this.ensureConnectedClient();try{return await l.readResource({uri:i.uri},{timeout:this.requestTimeoutMs,signal:i.context?.signal})}catch(u){return await this.handleOperationError(u)}}async ensureConnectedClient(){if(!this.client)await this.connect();if(!this.client)throw Error(`MCP server "${this.registration.name}" is not connected.`);return this.client}formatUnauthorizedMessage(i){if(this.hasStaticAuthorizationHeader())return`MCP server "${this.registration.name}" rejected its configured Authorization header. Update or remove that header before connecting with OAuth.`;let l=`MCP server "${this.registration.name}" requires OAuth authorization.`;if(!i)return`${l} Run authorizeMcpServerOAuth for this server.`;return`${l} Run authorizeMcpServerOAuth for this server and complete this URL: ${i}`}hasStaticAuthorizationHeader(){let i=this.registration.transport;if(i.type==="stdio")return!1;return Object.keys(i.headers??{}).some((l)=>l.toLowerCase()==="authorization")}async handleOperationError(i){let l=this.authContext??Jv({settingsPath:this.options.settingsPath,serverName:this.registration.name,redirectUrl:this.registration.oauth?.redirectUrl??Yv,clientInformation:Xv(this.registration.oauthClient)}),u=Kv(i,this.registration.name,this.requestTimeoutMs),c=Vv(i),g=c?this.formatUnauthorizedMessage(l.getLastAuthorizationUrl()):an(u);if(c&&!this.hasStaticAuthorizationHeader())await l.markAuthorizationRequired(g);else await l.markConnectionError(g);throw Error(g)}}function tw(i={}){return(l)=>l.transport.type==="stdio"?new Z0(l,i.mcpApps):new eT(l,i)}kI();var xB=5000;function Kt(){return Date.now()}function CB(i){return i.map((l)=>({name:l.name,description:l.description,inputSchema:l.inputSchema,...l._meta?{_meta:l._meta}:{}}))}class tT{toolsCacheTtlMs;clientFactory;servers=new Map;operationLocks=new Map;constructor(i){this.clientFactory=i.clientFactory,this.toolsCacheTtlMs=i.toolsCacheTtlMs??xB}async registerServer(i){await this.runExclusive(i.name,async()=>{let l=this.servers.get(i.name);if(!l){this.servers.set(i.name,{registration:{...i},status:"disconnected",updatedAt:Kt()});return}let u=JSON.stringify(l.registration.transport)!==JSON.stringify(i.transport),c=ze(l.registration.timeoutSeconds)!==ze(i.timeoutSeconds)||Be(l.registration.timeoutSeconds)!==Be(i.timeoutSeconds);if(l.registration={...i},l.updatedAt=Kt(),u||c)await this.disconnectState(l),l.client=void 0,l.toolCache=void 0,l.toolCacheUpdatedAt=void 0})}async unregisterServer(i){await this.runExclusive(i,async()=>{let l=this.requireServer(i);await this.disconnectState(l),this.servers.delete(i)})}async connectServer(i){await this.runExclusive(i,async()=>{let l=this.requireServer(i);await this.connectState(l)})}async disconnectServer(i){await this.runExclusive(i,async()=>{let l=this.requireServer(i);await this.disconnectState(l)})}async setServerDisabled(i,l){await this.runExclusive(i,async()=>{let u=this.requireServer(i);if(u.registration={...u.registration,disabled:l},u.updatedAt=Kt(),l)await this.disconnectState(u)})}listServers(){return[...this.servers.values()].map((i)=>({name:i.registration.name,status:i.status,disabled:i.registration.disabled===!0,lastError:i.lastError,toolCount:i.toolCache?.length??0,updatedAt:i.updatedAt,metadata:i.registration.metadata})).sort((i,l)=>i.name.localeCompare(l.name))}async listTools(i){let l=this.requireServer(i),u=l.toolCacheUpdatedAt??0;if(l.toolCache&&Kt()-u<=this.toolsCacheTtlMs)return l.toolCache;return this.refreshTools(i)}async refreshTools(i){return this.runExclusive(i,async()=>{let l=this.requireServer(i),u=await(await this.ensureConnectedClient(l)).listTools(),c=CB(u);return l.toolCache=c,l.toolCacheUpdatedAt=Kt(),l.updatedAt=Kt(),c})}async callTool(i){return this.runExclusive(i.serverName,async()=>{let l=this.requireServer(i.serverName),u=await this.ensureConnectedClient(l);return l.updatedAt=Kt(),u.callTool({name:i.toolName,arguments:i.arguments,context:i.context})})}async readResource(i){let l=this.requireServer(i.serverName),u=l.status==="connected"&&l.client&&!l.registration.disabled?l.client:await this.runExclusive(i.serverName,async()=>this.ensureConnectedClient(this.requireServer(i.serverName)));if(this.requireServer(i.serverName).updatedAt=Kt(),!u.readResource)throw Error(`MCP server "${i.serverName}" client does not support reading resources.`);return u.readResource({uri:i.uri,context:i.context})}async dispose(){let i=[...this.servers.keys()],l=[];for(let u of i)try{await this.unregisterServer(u)}catch(c){l.push(c)}if(l.length>0)throw AggregateError(l,"MCP manager dispose failed")}async ensureConnectedClient(i){if(await this.connectState(i),!i.client)throw Error(`MCP server "${i.registration.name}" does not have an initialized client.`);return i.client}async connectState(i){if(i.registration.disabled)throw Error(`MCP server "${i.registration.name}" is disabled and cannot be connected.`);if(i.status==="connected"&&i.client)return;i.status="connecting",i.updatedAt=Kt();let l=i.client;try{l??=await this.clientFactory(i.registration),i.client=l,await l.connect(),i.status="connected",i.lastError=void 0,i.updatedAt=Kt()}catch(u){throw await l?.disconnect().catch(()=>{}),i.status="disconnected",i.lastError=u instanceof Error?u.message:String(u),i.updatedAt=Kt(),u}}async disconnectState(i){if(!i.client){i.status="disconnected",i.updatedAt=Kt();return}try{await i.client.disconnect()}finally{i.status="disconnected",i.updatedAt=Kt()}}requireServer(i){let l=this.servers.get(i);if(!l)throw Error(`Unknown MCP server: ${i}`);return l}async runExclusive(i,l){let u=this.operationLocks.get(i)??Promise.resolve(),c,g=new Promise((I)=>{c=I}),b=u.catch(()=>{return}).then(()=>g);this.operationLocks.set(i,b),await u.catch(()=>{return});try{return await l()}finally{if(c?.(),this.operationLocks.get(i)===b)this.operationLocks.delete(i)}}}function RB(i){let l=new Set(i.serverNames),u=i.nameTransform??Jh,c=new Map;for(let[I,k]of i.agentTools)for(let T of k.filter(V0)){let E=wf(T)?.resourceUri;c.set(u({serverName:I,toolName:T.name}),E?{serverName:I,toolName:T.name,resourceUri:E}:void 0)}function g(I){if(!l.has(I))throw Error(`MCP server "${I}" is not available in this session.`)}async function b(I,k){return(await i.manager.listTools(I)).find((T)=>T.name===k)}return{async resolveTool(I){return c.get(I)},async readResource(I){if(g(I.serverName),!J0(I.uri))throw Error(`MCP Apps can only read ui:// resources, not "${I.uri}".`);if(!i.manager.readResource)throw Error("MCP resource reads are not supported.");return i.manager.readResource({serverName:I.serverName,uri:I.uri})},async callTool(I){g(I.serverName);let k=await b(I.serverName,I.toolName);if(!k)throw Error(`MCP tool "${I.toolName}" was not found on server "${I.serverName}".`);if(!mB(k))throw Error(`MCP tool "${I.toolName}" on server "${I.serverName}" cannot be called by an app.`);if(i.isToolEnabled&&!i.isToolEnabled(u({serverName:I.serverName,toolName:I.toolName})))throw Error(`MCP tool "${I.toolName}" on server "${I.serverName}" is disabled for this session.`);return i.manager.callTool({serverName:I.serverName,toolName:I.toolName,arguments:I.arguments})}}}function PB(i,l){let u=l.description?.trim();if(u)return u;return`Execute MCP tool "${l.name}" from server "${i}".`}async function MB(i){let l=await i.provider.listTools(i.serverName),u=i.nameTransform??Jh;return l.filter(V0).map((c)=>{let g=u({serverName:i.serverName,toolName:c.name});return _({name:g,resultPolicy:"cache-oversized",description:PB(i.serverName,c),inputSchema:c.inputSchema,timeoutMs:i.timeoutMs,retryable:i.retryable,maxRetries:i.maxRetries,execute:async(b,I)=>i.provider.callTool({serverName:i.serverName,toolName:c.name,arguments:b&&typeof b==="object"&&!Array.isArray(b)?b:void 0,context:I})})})}function FB(){return xe()}function qB(i){let l=$t(i);if(!Array.isArray(l))return[];let u=[];for(let c of l){if(!c||typeof c!=="object")continue;let g=c,{agentId:b,rolePrompt:I}=g;if(typeof b!=="string"||!b.trim())continue;if(typeof I!=="string"||!I.trim())continue;let k={agentId:b.trim(),rolePrompt:I};if(typeof g.modelId==="string"&&g.modelId.trim())k.modelId=g.modelId.trim();if(typeof g.maxIterations==="number"&&Number.isFinite(g.maxIterations))k.maxIterations=Math.max(1,Math.floor(g.maxIterations));u.push(k)}return u}function nw(i){return{...i,tasks:i.tasks.map((l)=>({...l,createdAt:new Date(l.createdAt),updatedAt:new Date(l.updatedAt)})),mailbox:i.mailbox.map((l)=>({...l,sentAt:new Date(l.sentAt),readAt:l.readAt?new Date(l.readAt):void 0})),missionLog:i.missionLog.map((l)=>({...l,ts:new Date(l.ts)})),runs:(i.runs??[]).map((l)=>({...l,startedAt:new Date(l.startedAt),endedAt:l.endedAt?new Date(l.endedAt):void 0,nextAttemptAt:l.nextAttemptAt?new Date(l.nextAttemptAt):void 0,heartbeatAt:l.heartbeatAt?new Date(l.heartbeatAt):void 0,lastProgressAt:l.lastProgressAt?new Date(l.lastProgressAt):void 0})),outcomes:(i.outcomes??[]).map((l)=>({...l,createdAt:new Date(l.createdAt),finalizedAt:l.finalizedAt?new Date(l.finalizedAt):void 0})),outcomeFragments:(i.outcomeFragments??[]).map((l)=>({...l,createdAt:new Date(l.createdAt),reviewedAt:l.reviewedAt?new Date(l.reviewedAt):void 0}))}}var rT=2000,jB=2592000000,ow=["agent_event","run_progress"],aw=2,BB=["team_tasks","team_runs","team_outcomes","team_outcome_fragments","team_mailbox","team_mission_log"];function to(i){if(i===void 0||i===null)return null;let l=i instanceof Date?i:new Date(i);return Number.isNaN(l.getTime())?null:l.toISOString()}function nl(i,l){if(typeof i!=="string"||i.length===0)return l;return $t(i)??l}var ol=(i)=>typeof i==="string"?i:"";function lw(i){return{teamId:i.teamId,teamName:i.teamName,reset:!0,members:i.members,tasks:i.tasks,mailbox:i.mailbox,missionLog:i.missionLog,runs:i.runs,outcomes:i.outcomes,outcomeFragments:i.outcomeFragments}}class sT{teamDirPath;db;retentionPerTeam;retentionMs;constructor(i={}){this.teamDirPath=i.teamDir??FB(),this.retentionPerTeam=i.eventRetentionPerTeam??rT,this.retentionMs=i.eventRetentionMs??jB}init(){this.getRawDb()}close(){this.db?.close?.(),this.db=void 0}ensureTeamDir(){if(!LB(this.teamDirPath))DB(this.teamDirPath,{recursive:!0});return this.teamDirPath}dbPath(){return UB(this.ensureTeamDir(),"teams.db")}getRawDb(){if(this.db)return this.db;let i=V(this.dbPath());return this.ensureSchema(i),this.db=i,i}ensureSchema(i){if(i.exec("PRAGMA journal_mode = WAL;"),i.exec("PRAGMA busy_timeout = 5000;"),i.exec(`
|
|
316
|
+
CREATE TABLE IF NOT EXISTS team_store_schema_version (
|
|
317
|
+
lock INTEGER PRIMARY KEY CHECK (lock = 1),
|
|
318
|
+
version INTEGER NOT NULL
|
|
319
|
+
);
|
|
320
|
+
`),!i.prepare("SELECT version FROM team_store_schema_version WHERE lock = 1").get())i.prepare("INSERT INTO team_store_schema_version (lock, version) VALUES (1, 1)").run();if(i.exec(`
|
|
321
|
+
CREATE TABLE IF NOT EXISTS team_events (
|
|
322
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
323
|
+
team_name TEXT NOT NULL,
|
|
324
|
+
ts TEXT NOT NULL,
|
|
325
|
+
event_type TEXT NOT NULL,
|
|
326
|
+
payload_json TEXT NOT NULL,
|
|
327
|
+
causation_id TEXT,
|
|
328
|
+
correlation_id TEXT
|
|
329
|
+
);
|
|
330
|
+
`),i.exec(`
|
|
331
|
+
CREATE INDEX IF NOT EXISTS idx_team_events_name_ts
|
|
332
|
+
ON team_events(team_name, ts DESC);
|
|
333
|
+
`),i.exec(`
|
|
334
|
+
CREATE TABLE IF NOT EXISTS team_runtime_snapshot (
|
|
335
|
+
team_name TEXT PRIMARY KEY,
|
|
336
|
+
state_json TEXT NOT NULL,
|
|
337
|
+
teammates_json TEXT NOT NULL,
|
|
338
|
+
updated_at TEXT NOT NULL
|
|
339
|
+
);
|
|
340
|
+
`),i.exec(`
|
|
341
|
+
CREATE TABLE IF NOT EXISTS team_tasks (
|
|
342
|
+
team_name TEXT NOT NULL,
|
|
343
|
+
task_id TEXT NOT NULL,
|
|
344
|
+
title TEXT NOT NULL,
|
|
345
|
+
description TEXT NOT NULL,
|
|
346
|
+
status TEXT NOT NULL,
|
|
347
|
+
assignee TEXT,
|
|
348
|
+
depends_on_json TEXT NOT NULL,
|
|
349
|
+
summary TEXT,
|
|
350
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
351
|
+
updated_at TEXT NOT NULL,
|
|
352
|
+
PRIMARY KEY(team_name, task_id)
|
|
353
|
+
);
|
|
354
|
+
`),i.exec(`
|
|
355
|
+
CREATE TABLE IF NOT EXISTS team_runs (
|
|
356
|
+
team_name TEXT NOT NULL,
|
|
357
|
+
run_id TEXT NOT NULL,
|
|
358
|
+
agent_id TEXT NOT NULL,
|
|
359
|
+
task_id TEXT,
|
|
360
|
+
status TEXT NOT NULL,
|
|
361
|
+
message TEXT NOT NULL,
|
|
362
|
+
started_at TEXT,
|
|
363
|
+
ended_at TEXT,
|
|
364
|
+
error TEXT,
|
|
365
|
+
lease_owner TEXT,
|
|
366
|
+
heartbeat_at TEXT,
|
|
367
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
368
|
+
PRIMARY KEY(team_name, run_id)
|
|
369
|
+
);
|
|
370
|
+
`),i.exec(`
|
|
371
|
+
CREATE INDEX IF NOT EXISTS idx_team_runs_status
|
|
372
|
+
ON team_runs(team_name, status);
|
|
373
|
+
`),i.exec(`
|
|
374
|
+
CREATE TABLE IF NOT EXISTS team_outcomes (
|
|
375
|
+
team_name TEXT NOT NULL,
|
|
376
|
+
outcome_id TEXT NOT NULL,
|
|
377
|
+
title TEXT NOT NULL,
|
|
378
|
+
status TEXT NOT NULL,
|
|
379
|
+
schema_json TEXT NOT NULL,
|
|
380
|
+
finalized_at TEXT,
|
|
381
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
382
|
+
PRIMARY KEY(team_name, outcome_id)
|
|
383
|
+
);
|
|
384
|
+
`),i.exec(`
|
|
385
|
+
CREATE TABLE IF NOT EXISTS team_outcome_fragments (
|
|
386
|
+
team_name TEXT NOT NULL,
|
|
387
|
+
outcome_id TEXT NOT NULL,
|
|
388
|
+
fragment_id TEXT NOT NULL,
|
|
389
|
+
section TEXT NOT NULL,
|
|
390
|
+
source_agent_id TEXT NOT NULL,
|
|
391
|
+
source_run_id TEXT,
|
|
392
|
+
content TEXT NOT NULL,
|
|
393
|
+
status TEXT NOT NULL,
|
|
394
|
+
reviewed_by TEXT,
|
|
395
|
+
reviewed_at TEXT,
|
|
396
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
397
|
+
PRIMARY KEY(team_name, fragment_id)
|
|
398
|
+
);
|
|
399
|
+
`),(i.prepare("SELECT version FROM team_store_schema_version WHERE lock = 1").get()?.version??1)<aw)this.migrateToV2(i);else if(i.prepare("SELECT 1 FROM team_runtime_snapshot WHERE state_json != '' LIMIT 1").get()){i.exec("BEGIN IMMEDIATE;");try{this.importLegacySnapshots(i),i.exec("COMMIT;")}catch(l){try{i.exec("ROLLBACK;")}catch{}throw l}}}importLegacySnapshots(i){let l=i.prepare("SELECT team_name FROM team_runtime_snapshot WHERE state_json != ''").all().map((u)=>ol(u.team_name));for(let u of l){let c=i.prepare("SELECT state_json FROM team_runtime_snapshot WHERE team_name = ?").get(u),g=nl(c?.state_json,void 0);if(g)this.writeDelta(i,u,lw(nw(g)));i.prepare("UPDATE team_runtime_snapshot SET state_json = '' WHERE team_name = ?").run(u)}}migrateToV2(i){let l=(c,g)=>{if(!i.prepare(`PRAGMA table_info(${c})`).all().some((b)=>b.name===g))i.exec(`ALTER TABLE ${c} ADD COLUMN ${g} TEXT`)};i.exec("BEGIN IMMEDIATE;");try{for(let I of["team_tasks","team_runs","team_outcomes","team_outcome_fragments"])l(I,"data_json");i.exec(`
|
|
400
|
+
CREATE TABLE IF NOT EXISTS team_members (
|
|
401
|
+
team_name TEXT PRIMARY KEY,
|
|
402
|
+
team_id TEXT NOT NULL,
|
|
403
|
+
members_json TEXT NOT NULL,
|
|
404
|
+
updated_at TEXT NOT NULL
|
|
405
|
+
);
|
|
406
|
+
`),i.exec(`
|
|
407
|
+
CREATE TABLE IF NOT EXISTS team_mailbox (
|
|
408
|
+
team_name TEXT NOT NULL,
|
|
409
|
+
message_id TEXT NOT NULL,
|
|
410
|
+
data_json TEXT NOT NULL,
|
|
411
|
+
PRIMARY KEY(team_name, message_id)
|
|
412
|
+
);
|
|
413
|
+
`),i.exec(`
|
|
414
|
+
CREATE TABLE IF NOT EXISTS team_mission_log (
|
|
415
|
+
team_name TEXT NOT NULL,
|
|
416
|
+
entry_id TEXT NOT NULL,
|
|
417
|
+
data_json TEXT NOT NULL,
|
|
418
|
+
PRIMARY KEY(team_name, entry_id)
|
|
419
|
+
);
|
|
420
|
+
`),this.importLegacySnapshots(i),i.prepare(`DELETE FROM team_events WHERE event_type IN (${ow.map(()=>"?").join(",")})`).run(...ow);let c=i.prepare("SELECT id FROM team_events WHERE event_type = 'task_end' OR event_type LIKE 'run_%'").all().map((I)=>I.id),g=i.prepare("SELECT payload_json FROM team_events WHERE id = ?"),b=i.prepare("UPDATE team_events SET payload_json = ? WHERE id = ?");for(let I of c){let k=nl(g.get(I)?.payload_json,void 0);if(k&&typeof k==="object")b.run(JSON.stringify(Au(k)),I)}i.prepare("UPDATE team_store_schema_version SET version = ? WHERE lock = 1").run(aw),i.exec("COMMIT;")}catch(c){try{i.exec("ROLLBACK;")}catch{}throw c}let u=i.prepare("SELECT DISTINCT team_name FROM team_events").all().map((c)=>ol(c.team_name));for(let c of u)this.pruneTeamEvents(i,c)}run(i,l=[]){return this.getRawDb().prepare(i).run(...l)}queryOne(i,l=[]){return this.getRawDb().prepare(i).get(...l)??void 0}queryAll(i,l=[]){return this.getRawDb().prepare(i).all(...l)}withTransaction(i){let l=this.getRawDb();l.exec("BEGIN IMMEDIATE;");try{i(),l.exec("COMMIT;")}catch(u){try{l.exec("ROLLBACK;")}catch{}throw u}}listTeamNames(){return this.queryAll("SELECT team_name FROM team_members ORDER BY team_name ASC").map((i)=>i.team_name)}readState(i){let l=Zr(i),u=this.queryOne("SELECT team_id, members_json FROM team_members WHERE team_name = ?",[l]);if(!u)return;let c=(g,b)=>this.queryAll(`SELECT data_json FROM ${g} WHERE team_name = ? AND data_json IS NOT NULL ORDER BY ${b}`,[l]).flatMap((I)=>{let k=nl(I.data_json,void 0);return k===void 0?[]:[k]});try{return nw({teamId:ol(u.team_id),teamName:l,members:nl(u.members_json,[]),tasks:c("team_tasks","task_id"),mailbox:c("team_mailbox","message_id"),missionLog:c("team_mission_log","entry_id"),runs:c("team_runs","run_id"),outcomes:c("team_outcomes","outcome_id"),outcomeFragments:c("team_outcome_fragments","fragment_id")})}catch{return}}readHistory(i,l=200){return this.queryAll("SELECT event_type, payload_json, ts FROM team_events WHERE team_name = ? ORDER BY id DESC LIMIT ?",[Zr(i),l]).flatMap((u)=>{try{return[{eventType:u.event_type,payload:JSON.parse(u.payload_json),ts:u.ts}]}catch{return[]}})}loadRuntime(i){let l=Zr(i),u=this.readState(l),c=this.queryOne("SELECT team_name, state_json, teammates_json, updated_at FROM team_runtime_snapshot WHERE team_name = ?",[l]),g=c?qB(c.teammates_json):[];return{state:u,teammates:g,interruptedRunIds:[]}}appendTeamEvent(i,l,u,c){this.run(`INSERT INTO team_events (team_name, ts, event_type, payload_json, causation_id, correlation_id)
|
|
421
|
+
VALUES (?, ?, ?, ?, NULL, ?)`,[Zr(i),x(),l,JSON.stringify(u),c??null])}persistBatch(i,l){let u=Zr(i),c=this.getRawDb();if(this.withTransaction(()=>{let g=x(),b=c.prepare(`INSERT INTO team_events (team_name, ts, event_type, payload_json, causation_id, correlation_id)
|
|
422
|
+
VALUES (?, ?, ?, ?, NULL, NULL)`);for(let I of l.events)b.run(u,g,I.type,JSON.stringify(I.payload));this.writeDelta(c,u,l.delta),this.writeTeammates(c,u,l.teammates)}),l.events.length>0)try{this.pruneTeamEvents(c,u)}catch{}}persistRuntime(i,l,u){let c=Zr(i),g=this.getRawDb();this.withTransaction(()=>{this.writeDelta(g,c,lw(l)),this.writeTeammates(g,c,u)})}writeTeammates(i,l,u){i.prepare(`INSERT INTO team_runtime_snapshot (team_name, state_json, teammates_json, updated_at)
|
|
423
|
+
VALUES (?, '', ?, ?)
|
|
424
|
+
ON CONFLICT(team_name) DO UPDATE SET
|
|
425
|
+
state_json = '',
|
|
426
|
+
teammates_json = excluded.teammates_json,
|
|
427
|
+
updated_at = excluded.updated_at`).run(l,JSON.stringify(u),x())}writeDelta(i,l,u){if(u.reset)for(let g of BB)i.prepare(`DELETE FROM ${g} WHERE team_name = ?`).run(l);if(i.prepare(`INSERT INTO team_members (team_name, team_id, members_json, updated_at)
|
|
428
|
+
VALUES (?, ?, ?, ?)
|
|
429
|
+
ON CONFLICT(team_name) DO UPDATE SET
|
|
430
|
+
team_id = excluded.team_id,
|
|
431
|
+
members_json = excluded.members_json,
|
|
432
|
+
updated_at = excluded.updated_at`).run(l,u.teamId,JSON.stringify(u.members),x()),u.tasks.length>0){let g=i.prepare(`INSERT INTO team_tasks (team_name, task_id, title, description, status, assignee, depends_on_json, summary, version, updated_at, data_json)
|
|
433
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1, ?, ?)
|
|
434
|
+
ON CONFLICT(team_name, task_id) DO UPDATE SET
|
|
435
|
+
title = excluded.title,
|
|
436
|
+
description = excluded.description,
|
|
437
|
+
status = excluded.status,
|
|
438
|
+
assignee = excluded.assignee,
|
|
439
|
+
depends_on_json = excluded.depends_on_json,
|
|
440
|
+
summary = excluded.summary,
|
|
441
|
+
version = team_tasks.version + 1,
|
|
442
|
+
updated_at = excluded.updated_at,
|
|
443
|
+
data_json = excluded.data_json`);for(let b of u.tasks)g.run(l,b.id,b.title,b.description,b.status,b.assignee??null,JSON.stringify(b.dependsOn??[]),b.summary??null,to(b.updatedAt)??x(),JSON.stringify(b))}if(u.runs.length>0){let g=i.prepare(`INSERT INTO team_runs (team_name, run_id, agent_id, task_id, status, message, started_at, ended_at, error, lease_owner, heartbeat_at, version, data_json)
|
|
444
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?)
|
|
445
|
+
ON CONFLICT(team_name, run_id) DO UPDATE SET
|
|
446
|
+
agent_id = excluded.agent_id,
|
|
447
|
+
task_id = excluded.task_id,
|
|
448
|
+
status = excluded.status,
|
|
449
|
+
message = excluded.message,
|
|
450
|
+
started_at = excluded.started_at,
|
|
451
|
+
ended_at = excluded.ended_at,
|
|
452
|
+
error = excluded.error,
|
|
453
|
+
lease_owner = excluded.lease_owner,
|
|
454
|
+
heartbeat_at = excluded.heartbeat_at,
|
|
455
|
+
version = team_runs.version + 1,
|
|
456
|
+
data_json = excluded.data_json`);for(let b of u.runs){let I={...b,result:Uo(b.result)};g.run(l,I.id,I.agentId,I.taskId??null,I.status,I.message,to(I.startedAt),to(I.endedAt),I.error??null,I.leaseOwner??null,to(I.heartbeatAt),JSON.stringify(I))}}if(u.outcomes.length>0){let g=i.prepare(`INSERT INTO team_outcomes (team_name, outcome_id, title, status, schema_json, finalized_at, version, data_json)
|
|
457
|
+
VALUES (?, ?, ?, ?, ?, ?, 1, ?)
|
|
458
|
+
ON CONFLICT(team_name, outcome_id) DO UPDATE SET
|
|
459
|
+
title = excluded.title,
|
|
460
|
+
status = excluded.status,
|
|
461
|
+
schema_json = excluded.schema_json,
|
|
462
|
+
finalized_at = excluded.finalized_at,
|
|
463
|
+
version = team_outcomes.version + 1,
|
|
464
|
+
data_json = excluded.data_json`);for(let b of u.outcomes)g.run(l,b.id,b.title,b.status,JSON.stringify({requiredSections:b.requiredSections}),to(b.finalizedAt),JSON.stringify(b))}if(u.outcomeFragments.length>0){let g=i.prepare(`INSERT INTO team_outcome_fragments (team_name, outcome_id, fragment_id, section, source_agent_id, source_run_id, content, status, reviewed_by, reviewed_at, version, data_json)
|
|
465
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?)
|
|
466
|
+
ON CONFLICT(team_name, fragment_id) DO UPDATE SET
|
|
467
|
+
outcome_id = excluded.outcome_id,
|
|
468
|
+
section = excluded.section,
|
|
469
|
+
source_agent_id = excluded.source_agent_id,
|
|
470
|
+
source_run_id = excluded.source_run_id,
|
|
471
|
+
content = excluded.content,
|
|
472
|
+
status = excluded.status,
|
|
473
|
+
reviewed_by = excluded.reviewed_by,
|
|
474
|
+
reviewed_at = excluded.reviewed_at,
|
|
475
|
+
version = team_outcome_fragments.version + 1,
|
|
476
|
+
data_json = excluded.data_json`);for(let b of u.outcomeFragments)g.run(l,b.outcomeId,b.id,b.section,b.sourceAgentId,b.sourceRunId??null,b.content,b.status,b.reviewedBy??null,to(b.reviewedAt),JSON.stringify(b))}let c=(g,b)=>i.prepare(`INSERT INTO ${g} (team_name, ${b}, data_json) VALUES (?, ?, ?)
|
|
477
|
+
ON CONFLICT(team_name, ${b}) DO UPDATE SET data_json = excluded.data_json`);if(u.mailbox.length>0){let g=c("team_mailbox","message_id");for(let b of u.mailbox)g.run(l,b.id,JSON.stringify(b))}if(u.missionLog.length>0){let g=c("team_mission_log","entry_id");for(let b of u.missionLog)g.run(l,b.id,JSON.stringify(b))}}pruneTeamEvents(i,l){let u=new Date(Date.now()-this.retentionMs).toISOString();i.prepare("DELETE FROM team_events WHERE team_name = ? AND ts < ?").run(l,u);let c=i.prepare("SELECT id FROM team_events WHERE team_name = ? ORDER BY id DESC LIMIT 1 OFFSET ?").get(l,this.retentionPerTeam);if(c&&typeof c.id==="number")i.prepare("DELETE FROM team_events WHERE team_name = ? AND id <= ?").run(l,c.id)}vacuum(){this.getRawDb().exec("VACUUM;")}markInProgressRunsInterrupted(i,l){let u=Zr(i),c=this.queryAll("SELECT run_id, data_json FROM team_runs WHERE team_name = ? AND status IN ('queued', 'running')",[u]);if(c.length===0)return[];let g=x();return this.withTransaction(()=>{for(let b of c){let I=nl(b.data_json,void 0),k=I?JSON.stringify({...I,status:"interrupted",error:l,endedAt:g}):null;this.run(`UPDATE team_runs SET status = 'interrupted', error = ?, ended_at = ?, version = version + 1,
|
|
478
|
+
data_json = COALESCE(?, data_json)
|
|
479
|
+
WHERE team_name = ? AND run_id = ?`,[l,g,k,u,ol(b.run_id)])}}),c.map((b)=>ol(b.run_id))}handleTeamEvent(i,l){if(!lc(l))return;this.appendTeamEvent(i,l.type,Au(l)),this.pruneTeamEvents(this.getRawDb(),Zr(i))}}var dw=4194304;function uw(){return new Date().toISOString()}function cw(i){return{...i,tasks:i.tasks.map((l)=>({...l,createdAt:new Date(l.createdAt),updatedAt:new Date(l.updatedAt)})),mailbox:i.mailbox.map((l)=>({...l,sentAt:new Date(l.sentAt),readAt:l.readAt?new Date(l.readAt):void 0})),missionLog:i.missionLog.map((l)=>({...l,ts:new Date(l.ts)})),runs:(i.runs??[]).map((l)=>({...l,startedAt:new Date(l.startedAt),endedAt:l.endedAt?new Date(l.endedAt):void 0,nextAttemptAt:l.nextAttemptAt?new Date(l.nextAttemptAt):void 0,heartbeatAt:l.heartbeatAt?new Date(l.heartbeatAt):void 0,lastProgressAt:l.lastProgressAt?new Date(l.lastProgressAt):void 0})),outcomes:(i.outcomes??[]).map((l)=>({...l,createdAt:new Date(l.createdAt),finalizedAt:l.finalizedAt?new Date(l.finalizedAt):void 0})),outcomeFragments:(i.outcomeFragments??[]).map((l)=>({...l,createdAt:new Date(l.createdAt),reviewedAt:l.reviewedAt?new Date(l.reviewedAt):void 0}))}}class iT{teamDirPath;constructor(i={}){this.teamDirPath=i.teamDir??fn()}init(){this.ensureTeamDir()}listTeamNames(){if(!Zn(this.teamDirPath))return[];return OB(this.teamDirPath,{withFileTypes:!0}).filter((i)=>i.isDirectory()).filter((i)=>Zn(this.statePath(i.name))).map((i)=>i.name).sort()}readState(i){let l=this.readEnvelope(i);return l?.teamState?cw(l.teamState):void 0}readHistory(i,l=200){let u=this.historyPath(i);if(!Zn(u))return[];return up(u,"utf8").split(`
|
|
480
|
+
`).map((c)=>c.trim()).filter(Boolean).map((c)=>{try{return JSON.parse(c)}catch{return}}).filter((c)=>c!==void 0).reverse().slice(0,l)}loadRuntime(i){let l=this.readEnvelope(i);return{state:l?.teamState?cw(l.teamState):void 0,teammates:l?.teammates??[],interruptedRunIds:[]}}handleTeamEvent(i,l){if(!lc(l))return;this.appendHistory(i,[{type:l.type,payload:Au(l)}])}persistBatch(i,l){if(this.persistRuntime(i,l.getFullState(),l.teammates),l.events.length>0)this.appendHistory(i,l.events)}appendHistory(i,l){this.ensureTeamSubdir(i);let u=uw(),c=this.historyPath(i);NB(c,l.map((g)=>`${JSON.stringify({ts:u,eventType:g.type,payload:g.payload})}
|
|
481
|
+
`).join(""),"utf8");try{this.compactHistoryIfNeeded(c)}catch{}}compactHistoryIfNeeded(i){let l=0;try{l=$B(i).size}catch{return}if(l<dw)return;let u=up(i,"utf8").split(`
|
|
482
|
+
`).filter(Boolean),c=[],g=0;for(let I=u.length-1;I>=0&&c.length<rT;I--){let k=u[I];if(g+=Buffer.byteLength(k,"utf8")+1,g>dw/2&&c.length>0)break;c.push(k)}c.reverse();let b=`${i}.tmp`;iw(b,`${c.join(`
|
|
483
|
+
`)}
|
|
484
|
+
`,"utf8"),sw(b,i)}persistRuntime(i,l,u){this.ensureTeamSubdir(i);let c={version:1,updatedAt:uw(),teamState:{...l,runs:l.runs.map((I)=>({...I,result:Uo(I.result)}))},teammates:u},g=this.statePath(i),b=`${g}.tmp`;iw(b,`${JSON.stringify(c,null,2)}
|
|
485
|
+
`,"utf8"),sw(b,g)}markInProgressRunsInterrupted(i,l){let u=this.readEnvelope(i);if(!u?.teamState?.runs?.length)return[];let c=u.teamState.runs.filter((b)=>b.status==="queued"||b.status==="running").map((b)=>b.id);if(c.length===0)return[];let g=new Date;return u.teamState={...u.teamState,runs:u.teamState.runs.map((b)=>b.status==="queued"||b.status==="running"?{...b,status:"interrupted",error:l,endedAt:g}:b)},this.persistRuntime(i,u.teamState,u.teammates),c}ensureTeamDir(){if(!Zn(this.teamDirPath))rw(this.teamDirPath,{recursive:!0});return this.teamDirPath}ensureTeamSubdir(i){let l=cp(this.ensureTeamDir(),Zr(i));if(!Zn(l))rw(l,{recursive:!0});return l}statePath(i){return cp(this.ensureTeamDir(),Zr(i),"state.json")}historyPath(i){return cp(this.ensureTeamDir(),Zr(i),"task-history.jsonl")}readEnvelope(i){let l=this.statePath(i);if(!Zn(l))return;try{let u=JSON.parse(up(l,"utf8"));if(u?.version===1&&u.teamState)return u}catch{}return}}function HB(i={}){try{let l=new sT(i);return l.init(),l}catch{let l=new iT({teamDir:i.teamDir});return l.init(),l}}var zB=300,WB=60000,pw=5000;class nT{opts;pendingEvents=[];teammatesDirty=!1;timer;lastFlushAt=0;disposed=!1;constructor(i){this.opts={batchMs:zB,telemetryFlushMs:WB,now:Date.now,...i}}onEvent(i){if(this.disposed)return;if(!lc(i)){if(this.opts.now()-this.lastFlushAt>=this.opts.telemetryFlushMs)this.schedule();return}if(this.pendingEvents.push({type:i.type,payload:Au(i)}),nj(i)){this.flush();return}this.schedule()}markTeammatesDirty(){this.teammatesDirty=!0}markStateDirty(){if(this.disposed)return;this.schedule()}flush(){this.clearTimer();let i=this.opts.source();if(!i)return;if(!i.hasPendingStateDelta()&&this.pendingEvents.length===0&&!this.teammatesDirty)return;let l=this.pendingEvents,u=this.teammatesDirty;this.pendingEvents=[],this.teammatesDirty=!1;let c=i.drainStateDelta();try{this.opts.store.persistBatch(this.opts.teamKey,{events:l,delta:c,teammates:this.opts.teammates(),getFullState:()=>i.exportState()}),this.lastFlushAt=this.opts.now()}catch(g){i.requeueStateDelta(c);let b=l.concat(this.pendingEvents);if(this.pendingEvents=b.length>pw?b.slice(-pw):b,this.teammatesDirty=this.teammatesDirty||u,!this.disposed)this.schedule();try{this.opts.onError?.(g)}catch{}}}dispose(){if(this.disposed)return;this.disposed=!0,this.flush()}schedule(){if(this.timer)return;this.timer=setTimeout(()=>{this.timer=void 0,this.flush()},this.opts.batchMs),this.timer.unref?.()}clearTimer(){if(this.timer)clearTimeout(this.timer),this.timer=void 0}}function Id(i,l){return _i(i,l)}function oT(i,l){let u=l?.["*"]??{},c=l?.[i]??{};return{...u,...c}.enabled!==!1}function KB(i,l){return i.filter((u)=>oT(u.name,l))}function Jm(i,l){return Xu(KB(i,l))}var GB={apply_diff:"editor",attempt_completion:"submit_and_exit",bash:"run_commands",execute_command:"run_commands",list_code_definition_names:"search_codebase",list_files:"run_commands",read_file:"read_files",replace_in_file:"editor",search_files:"search_codebase",use_skill:"skills",write_to_file:"editor"};function XB(i){let l=i.trim().toLowerCase();return GB[l]??l}function JB(i,l){if(l.tools===void 0)return i;let u=new Set(l.tools.map(XB));if(l.skills!==void 0)u.add("skills");return i.filter((c)=>u.has(c.name))}function VB(){return`team-${R(5)}`}function Xd(i,l,u,c,g,b,I,k,T,E){let A=tf[rf({mode:u})],C=M$(l,c,u,g??R$);return Jm(MS({cwd:i,telemetry:T,executorOptions:{bash:{executionController:E}},...A,enableSkills:!!I,...C,executors:{...I?{skills:I}:{},...k??{}}}),b)}function YB(i){return Xd(i.cwd,i.providerId,i.mode,i.modelId,i.toolRoutingRules,i.toolPolicies,QB,i.toolExecutors).some((l)=>l.name==="skills")}var QB=async()=>"";async function ZB(i){let l=vn(),u=i.includeSettings&&vI({filePath:l});if(!u&&!i.agentPluginServers?.length)return{tools:[]};let c=tw({settingsPath:l,mcpApps:i.mcpApps}),g=tw({restrictConfiguredHeadersToOrigin:!0,mcpApps:i.mcpApps}),b=new tT({clientFactory:(N)=>N.metadata?.source==="agent-plugin"?g(N):c(N)}),I=[];if(u)try{I=await lA(b,{filePath:l})}catch(N){let O=N instanceof Error?N.message:String(N);i.logger?.log(`[mcp] Failed to load MCP settings, skipping settings-backed MCP tools: ${O}`)}let k=new Set(I.map((N)=>N.name));for(let N of i.agentPluginServers??[]){let O=N.registration;if(k.has(O.name)){i.logger?.log(`[agent-plugins] MCP server '${O.name}' conflicts with an existing server and was skipped.`,{severity:"error"});continue}try{await b.registerServer(O),I.push(O),k.add(O.name)}catch(L){let D=L instanceof Error?L.message:String(L);i.logger?.log(`[agent-plugins] Failed to register MCP server '${O.name}', skipping: ${D}`,{severity:"error"})}}if(I.length===0)return await b.dispose().catch(()=>{}),{tools:[]};let T=I.filter((N)=>N.disabled!==!0),E=await Promise.allSettled(T.map(async(N)=>{let O=await b.listTools(N.name),L=await MB({serverName:N.name,provider:{listTools:async()=>O,callTool:(D)=>b.callTool(D)},timeoutMs:Be(N.timeoutSeconds)*1000});return{descriptors:O,tools:L}})),A=[],C=new Map;for(let[N,O]of E.entries())if(O.status==="fulfilled")A.push(...O.value.tools),C.set(T[N].name,O.value.descriptors);else{let L=O.reason instanceof Error?O.reason.message:String(O.reason);i.logger?.log(`[mcp] Failed to load tools from MCP server "${T[N].name}", skipping: ${L}`)}return{tools:A,...i.mcpApps?{mcpApps:RB({manager:b,serverNames:T.map((N)=>N.name),agentTools:C,isToolEnabled:(N)=>oT(N,i.toolPolicies)&&!i.disabledToolNames?.has(N)})}:{},shutdown:async()=>{await b.dispose()}}}function eH(i,l){if(!i)return;for(let u of i.getTeammateIds())try{i.shutdownTeammate(u,l)}catch{}}function tH(i){if(i===void 0)return!0;switch(i){case"session_stop":case"session_complete":case"session_error":case"session_manager_dispose":case"cli_run_shutdown":case"cli_interactive_shutdown":case"cli_interactive_startup_cancelled":case"provider_change":case"acp_shutdown":case"hub_server_stop":case"vscode_webview_dispose":return!0;default:return!1}}function rH(i){let l=tf[rf({mode:i.mode})];return{sessionId:i.sessionId||"",mode:i.mode==="plan"?"plan":i.mode==="yolo"?"yolo":"act",enableTools:i.enableTools!==!1,enableSpawnAgent:i.enableSpawnAgent??l.enableSpawnAgent??!0,enableAgentTeams:i.enableAgentTeams??l.enableAgentTeams??!0,disableMcpSettingsTools:i.disableMcpSettingsTools===!0,mcpApps:i.mcpApps===!0,yolo:i.yolo===!0,missionLogIntervalSteps:typeof i.missionLogIntervalSteps==="number"&&Number.isFinite(i.missionLogIntervalSteps)?i.missionLogIntervalSteps:3,missionLogIntervalMs:typeof i.missionLogIntervalMs==="number"&&Number.isFinite(i.missionLogIntervalMs)?i.missionLogIntervalMs:120000}}class aT{teamRuntimeEntries=new Map;async build(i){let{config:l,hooks:u,extensions:c,logger:g,telemetry:b,createSpawnTool:I,onTeamRestored:k,userInstructionService:T,configExtensions:E,toolExecutors:A}=i,C=i.onTeamEvent??(()=>{}),N=rH(l),O=[];if(N.enableTools&&N.mode!=="yolo"&&xI("web_search")&&Xt({providerId:l.providerId,modelId:l.modelId},"web_search"))O.push({name:"web_search"});if(N.enableTools&&Xt({providerId:l.providerId,modelId:l.modelId},"image_generation"))O.push({name:"image_generation",outputFormat:"png"});let L=l.workspaceRoot??l.cwd,D=i.toolPolicies??l.toolPolicies,U=ed(),F=[],j=l.teamName?.trim()||VB(),H=l.sessionId?.trim()||j,Q=N.enableSpawnAgent?Yq({workspaceRoot:L}):{configs:[],errors:[]},z=Q.configs.some((be)=>be.skills!==void 0),W=Id(E,"rules"),ee=Id(E,"skills"),te=ee||z,oe=Id(E,"workflows"),G=Id(E,"plugins"),se=W||ee||oe,Pe=!1,Le=[],Te=T,le,Ie;for(let be of Q.errors)(g??l.logger)?.log?.(`[agents] Failed to load agent config at ${be.path}: ${be.error.message}`);if(!Te&&(se||z))Te=Km({skills:te?{workspacePath:L,includePluginSkills:G,pluginSkillDirectories:G?i.pluginSkillDirectories:void 0,pluginPaths:l.pluginPaths,cwd:l.cwd,agentPluginSkills:G?i.agentPluginSkills:void 0}:{workspacePath:L},rules:{workspacePath:l.cwd},workflows:{workspacePath:l.cwd}}),Le.push(Te);else if(Te&&G&&i.agentPluginSkills?.length&&(se||z)){let be=Km({skills:{directories:[],agentPluginSkills:i.agentPluginSkills},rules:{directories:[]},workflows:{directories:[]}});Le.push(be),Te=uB([Te,be])}if(Te)await Te.start().catch(()=>{});let we=N.enableTools&&ee&&Boolean(Te)&&Te?.hasConfiguredSkills(l.skills)===!0&&YB({cwd:l.cwd,providerId:l.providerId,mode:N.mode,modelId:l.modelId,toolRoutingRules:l.toolRoutingRules,toolPolicies:D,toolExecutors:A}),He=Te&&se?Te.createExtension({includeRules:W,includeSkills:ee,includeWorkflows:oe,registerSkillsTool:we,allowedSkillNames:l.skills}):void 0,ce=N.mode==="plan"&&N.enableTools?yN({telemetry:b??l.telemetry}):void 0,Se=[He,ce].filter((be)=>be!==void 0),_e=Se.length>0?[...c??l.extensions??[],...Se]:c??l.extensions;if(N.enableTools){F.push(...Xd(l.cwd,l.providerId,N.mode,l.modelId,l.toolRoutingRules,D,void 0,A,b??l.telemetry,i.runCommandExecutionController));let be=G?i.agentPluginMcpServers:void 0;if(!N.disableMcpSettingsTools||be?.length){let $e=await ZB({logger:l.logger,includeSettings:!N.disableMcpSettingsTools,mcpApps:N.mcpApps,toolPolicies:D,disabledToolNames:U,agentPluginServers:be});F.push(...$e.tools),le=$e.shutdown,Ie=$e.mcpApps}}let Ee,Fe=N.enableAgentTeams?HB():void 0,Ke=Fe?.loadRuntime(H),Et=Ke?.state,yt=Ke?.teammates??[],$r=new Map(yt.map((be)=>[be.agentId,be])),vt=Fe?new nT({teamKey:H,store:Fe,source:()=>Ee,teammates:()=>Array.from($r.values()),onError:(be)=>(g??l.logger)?.log?.(`[team] failed to persist team state: ${be instanceof Error?be.message:String(be)}`)}):void 0,At=l.sessionId||j,Gr,Lr=[],us=!1,Ce=ES({providerId:l.providerId,modelId:l.modelId,distinctId:i.distinctId,sessionId:l.sessionId,cwd:l.cwd,apiKey:l.apiKey??"",baseUrl:l.baseUrl,headers:l.headers,providerConfig:l.providerConfig,knownModels:l.knownModels,thinking:l.thinking,reasoningEffort:l.reasoningEffort,thinkingBudgetTokens:l.thinkingBudgetTokens,maxTokensPerTurn:l.maxTokensPerTurn,temperature:l.temperature,maxIterations:l.maxIterations,hooks:u,extensions:_e,logger:g??l.logger,telemetry:i.telemetry??l.telemetry,workspaceMetadata:l.workspaceMetadata});if(N.enableSpawnAgent){if(Q.configs.length>0)F.push(...Jm(ij({configProvider:Ce,agents:Q.configs,createSubAgentTools:(be)=>N.enableTools?JB(Xd(l.cwd,be.providerId??l.providerId,N.mode,be.modelId??l.modelId,l.toolRoutingRules,D,be.skills!==void 0&&Te?.createSkillsExecutor?Te.createSkillsExecutor(be.skills):void 0,A,b??l.telemetry,i.runCommandExecutionController),be):[],hookErrorMode:l.hookErrorMode,onSubAgentEvent:i.onSubAgentEvent,onSubAgentStart:i.onSubAgentStart,onSubAgentEnd:i.onSubAgentEnd}),D))}if(!this.teamRuntimeEntries.has(At))this.teamRuntimeEntries.set(At,{delegatedAgentConfigProvider:Ce});let xt=()=>{if(!N.enableAgentTeams)return;let be=this.teamRuntimeEntries.get(At)??{delegatedAgentConfigProvider:Ce};if(this.teamRuntimeEntries.set(At,be),Ee=be.runtime,!Ee){if(Ee=new D0({teamName:j,leadAgentId:l.sessionId||"lead",missionLogIntervalSteps:N.missionLogIntervalSteps,missionLogIntervalMs:N.missionLogIntervalMs,onStateDirty:()=>vt?.markStateDirty(),onTeamEvent:($e)=>{if(C($e),vt){if($e.type==="teammate_spawned"&&$e.teammate?.rolePrompt){let Vr={agentId:$e.agentId,rolePrompt:$e.teammate.rolePrompt,modelId:$e.teammate.modelId,maxIterations:$e.teammate.maxIterations};$r.set(Vr.agentId,Vr),vt.markTeammatesDirty()}if($e.type==="teammate_shutdown"&&!tH($e.reason))$r.delete($e.agentId),vt.markTeammatesDirty();vt.onEvent($e)}}}),Et)Ee.hydrateState(Et),us=!0;be.runtime=Ee}if(!Pe){if(!Ee)return;Pe=!0;let $e=BL({runtime:Ee,leadAgentId:l.sessionId||"lead",restoredFromPersistence:Boolean(Et),restoredTeammates:yt,includeLeadSpawnTool:!0,includeLeadManagementTools:!0,onLeadToolsUnlocked:(Vr)=>{Lr=Vr,Gr?.addTools(Vr)},createBaseTools:N.enableTools?()=>Xd(l.cwd,l.providerId,N.mode,l.modelId,l.toolRoutingRules,D,void 0,A,b??l.telemetry,i.runCommandExecutionController):void 0,teammateConfigProvider:Ce});if(us)Ee.recoverActiveRuns("runtime_recovered");if($e.restoredFromPersistence)k?.();F.push(...$e.tools)}return Ee};if(N.enableSpawnAgent&&I){let be=I();F.push({...be,execute:async($e,Vr)=>(xt(),be.execute($e,Vr))})}if(N.enableAgentTeams)xt();let Xr=Jm(F,D),de=Xr.some((be)=>be.name==="submit_and_exit"&&be.lifecycle?.completesRun===!0),De=N.enableAgentTeams?()=>{let be=this.teamRuntimeEntries.get(At)?.runtime;if(!be)return;let $e=be.listTasks(),Vr=$e.some((Ye)=>Ye.status==="in_progress"||Ye.status==="pending"),_n=be.listRuns({}),vc=_n.some((Ye)=>Ye.status==="running"||Ye.status==="queued");if(Vr||vc){let Ye=$e.filter((Dr)=>Dr.status==="in_progress"||Dr.status==="pending").map((Dr)=>`${Dr.id} (${Dr.status}): ${Dr.title}`).join(", "),Ks=_n.filter((Dr)=>Dr.status==="running"||Dr.status==="queued").map((Dr)=>`${Dr.id} (${Dr.status})`).join(", "),wc=[];if(Ye)wc.push(`Unfinished tasks: ${Ye}`);if(Ks)wc.push(`Active runs: ${Ks}`);return`[SYSTEM] You still have team obligations. ${wc.join(". ")}. Use team_run_task to delegate work, or team_task with action=complete to mark tasks done, or team_await_runs to wait for active runs. Do NOT stop until all tasks are completed.`}return}:void 0,pt=de?{requireCompletionTool:!0,...De?{completionGuard:De}:{}}:De?{completionGuard:De}:void 0;return{tools:Xr,modelTools:O,logger:g??l.logger,telemetry:b??l.telemetry,teamRuntime:Ee,teamRestoredFromPersistence:Boolean(Et),delegatedAgentConfigProvider:this.teamRuntimeEntries.get(At)?.delegatedAgentConfigProvider??Ce,extensions:_e,completionPolicy:pt,mcpApps:Ie,registerLeadAgent:(be)=>{if(Gr=be,Lr.length>0)be.addTools(Xu(Lr,[...U]))},shutdown:async(be)=>{eH(Ee,be),vt?.dispose(),this.teamRuntimeEntries.delete(At),await le?.();for(let $e of Le)$e.stop()}}}}class lT{list(i){return i?Fr(i):[]}update(i,l){if(!i)return{sessionId:l.sessionId,prompts:[],updated:!1};let u=l.promptId.trim(),c=i.pendingPrompts.findIndex((T)=>T.id===u);if(c<0)return{sessionId:l.sessionId,prompts:Fr(i),updated:!1};let g=i.pendingPrompts[c];if(!g)return{sessionId:l.sessionId,prompts:Fr(i),updated:!1};let b=l.prompt===void 0?g.prompt:ye(l.prompt).trim();if(!b)throw Error("prompt cannot be empty");let I=l.delivery??g.delivery,k={...g,prompt:b,mode:l.mode??g.mode,delivery:I};return i.pendingPrompts.splice(c,1),iH(i,k,c,g.delivery),{sessionId:l.sessionId,prompts:Fr(i),prompt:Nu(k),updated:!0}}delete(i,l){if(!i)return{sessionId:l.sessionId,prompts:[],removed:!1};let u=l.promptId.trim(),c=i.pendingPrompts.findIndex((b)=>b.id===u);if(c<0)return{sessionId:l.sessionId,prompts:Fr(i),removed:!1};let[g]=i.pendingPrompts.splice(c,1);return{sessionId:l.sessionId,prompts:Fr(i),prompt:g?Nu(g):void 0,removed:!0}}enqueue(i,l){let{prompt:u,mode:c,delivery:g,userImages:b,userFiles:I}=l,k=i.pendingPrompts.findIndex((T)=>T.prompt===u);if(k>=0){let[T]=i.pendingPrompts.splice(k,1),E={...T,prompt:u,mode:c??T.mode,userImages:b??T.userImages,userFiles:I??T.userFiles};if(g==="steer"||T.delivery==="steer")i.pendingPrompts.unshift({...E,delivery:"steer"});else i.pendingPrompts.push(E)}else{let T={id:`pending_${Date.now()}_${R(5)}`,prompt:u,mode:c,delivery:g,userImages:b,userFiles:I};if(g==="steer")i.pendingPrompts.unshift(T);else i.pendingPrompts.push(T)}return Fr(i)}consumeSteer(i){let l=i.pendingPrompts.findIndex((c)=>c.delivery==="steer");if(l<0)return{prompts:Fr(i)};let[u]=i.pendingPrompts.splice(l,1);return{entry:u,prompts:Fr(i)}}shiftNext(i){return{entry:i.pendingPrompts.shift(),prompts:Fr(i)}}requeueFront(i,l){return i.pendingPrompts.unshift(l),Fr(i)}clear(i){return i.pendingPrompts.length=0,[]}}class dT{deps;service=new lT;constructor(i){this.deps=i}list(i){return this.service.list(this.deps.getSession(i))}steerFirst(i){let l=this.deps.getSession(i),u=l?.pendingPrompts[0];if(!u||u.delivery==="steer")return{sessionId:i,prompts:this.service.list(l),updated:!1};return this.update({sessionId:i,promptId:u.id,delivery:"steer"})}update(i){let l=this.deps.getSession(i.sessionId);if(!l)return{sessionId:i.sessionId,prompts:[],updated:!1};let u=this.service.update(l,i);if(this.emitPrompts(l),u.updated&&u.prompt?.delivery==="steer"&&!l.aborting)l.agent.notifyPendingUserMessage();return this.scheduleDrain(i.sessionId,l),u}delete(i){let l=this.deps.getSession(i.sessionId);if(!l)return{sessionId:i.sessionId,prompts:[],removed:!1};let u=this.service.delete(l,i);return this.emitPrompts(l),this.scheduleDrain(i.sessionId,l),u}enqueue(i,l){let u=this.deps.getSession(i);if(!u)return;if(this.service.enqueue(u,l),this.emitPrompts(u),l.delivery==="steer"&&!u.aborting)u.agent.notifyPendingUserMessage();this.scheduleDrain(i,u)}consumeSteer(i){let l=this.deps.getSession(i);if(!l)return;let{entry:u}=this.service.consumeSteer(l);if(!u)return;return this.emitPrompts(l),this.emitSubmitted(l,u),u}discardQueue(i){if(i.pendingPrompts.length===0)return;this.service.clear(i),this.emitPrompts(i)}emitPrompts(i){this.deps.emit({type:"pending_prompts",payload:{sessionId:i.sessionId,prompts:Fr(i)}})}scheduleDrain(i,l){if(l.pendingPrompts.length===0||l.aborting||l.drainingPendingPrompts||!l.agent.canStartRun())return;queueMicrotask(()=>{this.drain(i)})}async drain(i){let l=this.deps.getSession(i);if(!l)return;if(l.aborting||l.drainingPendingPrompts)return;if(!l.agent.canStartRun())return;let{entry:u}=this.service.shiftNext(l);if(!u)return;this.emitPrompts(l),this.emitSubmitted(l,u),l.drainingPendingPrompts=!0;let c=!0;try{l.replayingQueuedPrompt=!0;let g=await this.deps.send({sessionId:i,prompt:u.prompt,...u.mode?{mode:u.mode}:{},userImages:u.userImages,userFiles:u.userFiles});if(sH(g))c=!1}catch{c=!1,this.service.requeueFront(l,u),this.emitPrompts(l)}finally{if(l.drainingPendingPrompts=!1,c&&l.pendingPrompts.length>0&&l.status!=="failed"&&l.status!=="cancelled")queueMicrotask(()=>{this.drain(i)})}}emitSubmitted(i,l){let u=Nu(l);this.deps.emit({type:"pending_prompt_submitted",payload:{sessionId:i.sessionId,id:u.id,prompt:u.prompt,delivery:u.delivery,attachmentCount:u.attachmentCount,userImages:u.userImages,userFiles:u.userFiles}})}}function sH(i){return typeof i==="object"&&i!==null&&"finishReason"in i&&i.finishReason==="error"}function Nu(i){return{id:i.id,prompt:i.prompt,delivery:i.delivery,attachmentCount:(i.userImages?.length??0)+(i.userFiles?.length??0),userImages:i.userImages,userFiles:i.userFiles}}function Fr(i){return i.pendingPrompts.map(Nu)}function iH(i,l,u,c){if(l.delivery==="steer")i.pendingPrompts.unshift(l);else if(c==="steer")i.pendingPrompts.push(l);else i.pendingPrompts.splice(u,0,l)}class uT{listeners=new Set;subscribe(i,l){let u={listener:i,sessionId:l?.sessionId?.trim()||void 0};return this.listeners.add(u),()=>{this.listeners.delete(u)}}emit(i){let l=i.payload.sessionId?.trim();for(let u of this.listeners){if(u.sessionId&&u.sessionId!==l)continue;u.listener(i)}}get size(){return this.listeners.size}}async function Jd(i){let l=i?.trim();if(!l||!nH(l))return[];try{let u=(await oH(l,"utf8")).trim();if(!u)return[];let c=JSON.parse(u);if(Array.isArray(c))return c;if(c&&typeof c==="object"&&!Array.isArray(c)){let g=c.messages;if(Array.isArray(g))return g}return[]}catch{return[]}}function mw(i){return i?{...i}:void 0}async function aH(i,l){if(!(i.hookName==="tool_call"||!!i.parent_agent_id))return;await l.queueSpawnRequest(i);let u=await l.upsertSubagentSessionFromHook(i);if(!u)return;await l.appendSubagentHookAudit(u,i),await l.applySubagentStatus(u,i)}function lH(i){return{sessionId:i.session_id,source:i.source,pid:i.pid,startedAt:i.started_at,endedAt:i.ended_at??null,exitCode:i.exit_code??null,status:i.status,interactive:i.interactive,provider:i.provider,model:i.model,cwd:i.cwd,workspaceRoot:i.workspace_root,teamName:i.team_name,enableTools:i.enable_tools,enableSpawn:i.enable_spawn,enableTeams:i.enable_teams,isSubagent:!1,prompt:i.prompt,metadata:i.metadata,messagesPath:i.messages_path,updatedAt:i.ended_at??i.started_at}}class bf{deps;constructor(i){this.deps=i}lastKnownIdentityBySession=new Map;static MAX_IDENTITY_SNAPSHOTS=512;dispatchAgentEvent(i,l,u){let c=this.deps.getSession(i),g={sessionId:i,config:l,liveSession:c,usageBySession:this.deps.usageBySession,aggregateUsageBySession:this.deps.aggregateUsageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit},b=FS(u);if(!!c&&(!b.agentId||b.agentId===pp(c.agent))){let I={agentId:pp(c.agent),conversationId:c.agent.getConversationId(),...c?.runtime.teamRuntime?{teamRole:"lead"}:{}};this.rememberSessionIdentity(i,I),Kc(g,u,{...I,isPrimaryAgentEvent:!0});return}Kc(g,u,{...c?{}:this.lastKnownIdentityBySession.get(i),isPrimaryAgentEvent:!1})}rememberSessionIdentity(i,l){if(this.lastKnownIdentityBySession.delete(i),this.lastKnownIdentityBySession.set(i,l),this.lastKnownIdentityBySession.size>bf.MAX_IDENTITY_SNAPSHOTS){let u=this.lastKnownIdentityBySession.keys().next().value;if(u!==void 0)this.lastKnownIdentityBySession.delete(u)}}async handleTeamEvent(i,l){let u=this.deps.getSession(i);if(u){if(hj(u,l),l.type==="agent_event"){let c={sessionId:i,config:u.config,liveSession:u,usageBySession:this.deps.usageBySession,aggregateUsageBySession:this.deps.aggregateUsageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit};Kc(c,l.event,{agentId:l.agentId,teamRole:"teammate",teamAgentId:l.agentId,isPrimaryAgentEvent:!1})}if(l.type==="teammate_spawned"){let c=Do({agentId:l.teammate.runtimeAgentId??l.agentId,conversationId:l.teammate.conversationId,parentAgentId:l.teammate.parentAgentId,createdByAgentId:pp(u.agent),teamId:u.runtime.teamRuntime?.getTeamId(),teamName:u.runtime.teamRuntime?.getTeamName(),teamRole:"teammate",teamAgentId:l.agentId});if(c)Ah(u.config.telemetry,{ulid:i,modelId:l.teammate.modelId??u.config.modelId,provider:u.config.providerId,...c})}}if(await fj(i,l,this.deps.invokeBackendOptional),u)yj(u,i,l,this.deps.emit)}async handlePluginEvent(i,l,u,c){if(l.name==="plugin_log"){this.handlePluginLog(i,l.payload);return}if(l.name==="plugin_telemetry"){this.handlePluginTelemetry(i,l.payload,c);return}if(l.name==="automation_event"){let T=this.deps.getSession(i)?.config.extensionContext?.automation??u;if(!T)return;let E=l.payload&&typeof l.payload==="object"?l.payload:void 0;if(!E)return;await T.ingestEvent(E);return}if(l.name!=="steer_message"&&l.name!=="queue_message"&&l.name!=="pending_prompt")return;let g=l.payload&&typeof l.payload==="object"?l.payload:void 0,b=typeof g?.sessionId==="string"&&g.sessionId.trim().length>0?g.sessionId.trim():i,I=typeof g?.prompt==="string"?g.prompt.trim():"";if(!I)return;let k=l.name==="steer_message"?"steer":l.name==="queue_message"?"queue":g?.delivery==="steer"?"steer":"queue";this.deps.enqueuePendingPrompt(b,{prompt:I,delivery:k})}handlePluginTelemetry(i,l,u){let c=this.deps.getSession(i)?.config.telemetry??u;if(!c||!l||typeof l!=="object")return;let g=l,b=typeof g.pluginName==="string"&&g.pluginName?g.pluginName:"unknown";if(g.kind==="event"){let I=typeof g.event==="string"?g.event.trim():"";if(!I)return;let k={...g.properties&&typeof g.properties==="object"?g.properties:{},plugin_name:b,session_id:i};if(g.required===!0)c.captureRequired(`plugin.${I}`,k);else c.capture({event:`plugin.${I}`,properties:k});return}if(g.kind==="metric"){let I=typeof g.name==="string"?g.name.trim():"",k=typeof g.value==="number"?g.value:NaN;if(!I||Number.isNaN(k))return;let T={...g.attributes&&typeof g.attributes==="object"?g.attributes:{},plugin_name:b},E=typeof g.description==="string"?g.description:void 0,A=g.required===!0,C=`plugin.${I}`;if(g.metric==="counter")c.recordCounter(C,k,T,E,A);else if(g.metric==="histogram")c.recordHistogram(C,k,T,E,A);else if(g.metric==="gauge")c.recordGauge(C,k,T,E,A)}}handlePluginLog(i,l,u){let c=this.deps.getSession(i),g=u??c?.config.extensionContext?.logger??c?.config.logger;if(!g||!l||typeof l!=="object")return;let b=l,I=typeof b.message==="string"?b.message:"";if(!I)return;let k=b.metadata&&typeof b.metadata==="object"?{...b.metadata}:{};if(k.sessionId??=i,typeof b.pluginName==="string"&&b.pluginName)k.pluginName=b.pluginName;if(b.level==="debug"){g.debug(I,k);return}if(b.level==="error"){if(g.error)g.error(I,k);else g.log(I,{...k,severity:"error"});return}g.log(I,k)}}function pp(i){return i.getAgentId()}function hw(i){return{sessionId:i.sessionId,source:i.source,pid:process.pid,startedAt:i.startedAt,endedAt:i.endedAt??null,exitCode:i.exitCode??null,status:i.status,interactive:i.interactive,provider:i.config.providerId,model:i.config.modelId,cwd:i.config.cwd,workspaceRoot:Hs(i.config),teamName:i.config.teamName?.trim()||void 0,enableTools:i.config.enableTools,enableSpawn:i.config.enableSpawnAgent,enableTeams:i.config.enableAgentTeams,parentSessionId:typeof i.sessionMetadata?.parentSessionId==="string"?i.sessionMetadata.parentSessionId:void 0,parentAgentId:typeof i.sessionMetadata?.parentAgentId==="string"?i.sessionMetadata.parentAgentId:void 0,agentId:typeof i.sessionMetadata?.agentId==="string"?i.sessionMetadata.agentId:void 0,conversationId:typeof i.sessionMetadata?.conversationId==="string"?i.sessionMetadata.conversationId:void 0,isSubagent:typeof i.sessionMetadata?.isSubagent==="boolean"?i.sessionMetadata.isSubagent:!1,prompt:i.pendingPrompt,metadata:i.sessionMetadata,messagesPath:i.artifacts?.messagesPath,updatedAt:i.updatedAt??i.endedAt??i.startedAt}}function If(i,l){let u=i[l];return typeof u==="function"?u:null}async function dH(i,l,...u){let c=If(i,l);if(!c)throw Error(`session service method not available: ${l}`);return Promise.resolve(c.apply(i,u))}async function uH(i,l,...u){let c=If(i,l);if(!c)return;await Promise.resolve(c.apply(i,u))}async function cH(i,l,...u){let c=If(i,l);if(!c)return;return await Promise.resolve(c.apply(i,u))}function cT(i,l,u){return{onSubAgentEvent:(c)=>i.onAgentEvent(u,l,c),onSubAgentStart:(c)=>{let g=i.getSession(u)?.runtime.teamRuntime;i.subAgentStarts.set(c.subAgentId,{startedAt:Date.now(),rootSessionId:u});let b=Do({agentId:c.subAgentId,conversationId:c.conversationId,parentAgentId:c.parentAgentId,teamId:g?.getTeamId(),teamName:g?.getTeamName(),createdByAgentId:c.parentAgentId});if(b)Ah(l.telemetry,{ulid:u,modelId:l.modelId,provider:l.providerId,...b});yg(l.telemetry,{event:"started",ulid:u,durationMs:0,parentId:c.parentAgentId,agentId:c.subAgentId,...b}),i.invokeBackendOptional("handleSubAgentStart",u,c)},onSubAgentEnd:(c)=>{let g=i.getSession(u)?.runtime.teamRuntime,b=i.subAgentStarts.get(c.subAgentId),I=b?Date.now()-b.startedAt:0,k=c.result?.text?c.result.text.split(`
|
|
486
|
+
`).length:0;yg(l.telemetry,{event:"ended",ulid:u,durationMs:I,outputLines:k,errorMessage:c.error?String(c.error):void 0,agentId:c.subAgentId,parentId:c.parentAgentId,...Do({agentId:c.subAgentId,conversationId:c.conversationId,parentAgentId:c.parentAgentId,teamId:g?.getTeamId(),teamName:g?.getTeamName(),createdByAgentId:c.parentAgentId})}),i.subAgentStarts.delete(c.subAgentId),i.invokeBackendOptional("handleSubAgentEnd",u,c)}}}function pT(i,l,u,c){let g=cT(i,l,u);return CS({configProvider:{getRuntimeConfig:()=>i.getSession(u)?.runtime.delegatedAgentConfigProvider?.getRuntimeConfig()??{providerId:l.providerId,modelId:l.modelId,cwd:l.cwd,apiKey:l.apiKey,baseUrl:l.baseUrl,headers:l.headers,providerConfig:l.providerConfig,knownModels:l.knownModels,thinking:l.thinking,maxIterations:l.maxIterations,hooks:l.hooks,extensions:l.extensions,logger:l.logger,telemetry:l.telemetry},getConnectionConfig:()=>i.getSession(u)?.runtime.delegatedAgentConfigProvider?.getConnectionConfig()??{providerId:l.providerId,modelId:l.modelId,apiKey:l.apiKey,baseUrl:l.baseUrl,headers:l.headers,providerConfig:l.providerConfig,knownModels:l.knownModels,thinking:l.thinking},updateConnectionDefaults:()=>{}},createSubAgentTools:()=>{let b=l.enableTools?MS({cwd:l.cwd,telemetry:l.telemetry,...tf[rf({mode:l.mode})],executors:c}):[];if(l.enableSpawnAgent)b.push(pT(i,l,u,c));return Xu(b)},...g})}var hH=20480000;async function fH(i){let l=await mH(i);if(!l.isFile())throw Error("Path is not a file");if(l.size>hH)throw Error("File is too large to read into context.");let u=await pH(i,"utf8");if(u.includes("\x00"))throw Error("Cannot read binary file into context.");return u}var kf="session_not_found";class uc extends Error{sessionId;code="session_not_found";constructor(i,l){super(l??(i?`session not found: ${i}`:"session not found"));this.sessionId=i,this.name="SessionNotFoundError"}}function Ou(i){return i instanceof uc||typeof i==="object"&&i!==null&&"code"in i&&i.code==="session_not_found"}var fw=5000,mp;function gH(i,l){if(mp)return;mp=UN().then(()=>{return}).catch((u)=>{mp=void 0,i?.error?.("Detached command log recovery failed",{error:u}),B(l,{component:"core",operation:"command.detached_log_recovery",error:u,severity:"warn",handled:!0})})}function al(i){return typeof i==="number"&&Number.isFinite(i)?i:void 0}function yH(i){if(!i||typeof i!=="object"||Array.isArray(i))return;let l=i,u=al(l.inputTokens),c=al(l.outputTokens),g=al(l.cacheReadTokens),b=al(l.cacheWriteTokens),I=al(l.totalCost);if(u===void 0||c===void 0||g===void 0||b===void 0||I===void 0)return;return{inputTokens:u,outputTokens:c,cacheReadTokens:g,cacheWriteTokens:b,totalCost:I}}function vH(i,l){return{inputTokens:Math.max(i.inputTokens,l.inputTokens),outputTokens:Math.max(i.outputTokens,l.outputTokens),cacheReadTokens:Math.max(i.cacheReadTokens,l.cacheReadTokens),cacheWriteTokens:Math.max(i.cacheWriteTokens,l.cacheWriteTokens),totalCost:Math.max(i.totalCost,l.totalCost)}}function gw(i,l){if(!l)return!1;if(i.source_message_count!==l.source_message_count)return i.source_message_count<l.source_message_count;return Date.parse(i.updated_at)<Date.parse(l.updated_at)}function wH(i){return i==="steer_message"||i==="queue_message"||i==="pending_prompt"}class Sf{runtimeAddress=void 0;pendingPrompts;pluginCommands;pluginCommandManager;sessionService;runtimeBuilder;createAgentInstance;toolExecutors;defaultCapabilities;defaultToolPolicies;providerSettingsManager;oauthTokenManager;defaultTelemetry;distinctId;defaultLogger;defaultFetch;connectorsRequest;events=new uT;sessions=new Map;manifestMutationQueues=new Map;usageBySession=new Map;aggregateUsageBySession=new Map;subAgentStarts=new Map;pendingPromptsController;eventBridge;sessionVersioning=new hf;runCommandExecutionController=new gS;constructor(i){let l=GC();if(l)Ga(l);let u=ac(i.distinctId);if(this.distinctId=u,this.sessionService=i.sessionService,this.runtimeBuilder=i.runtimeBuilder??new aT,this.createAgentInstance=i.createAgent??((c)=>new nc(c)),this.defaultCapabilities=Bm(i.capabilities),this.toolExecutors=this.defaultCapabilities?.toolExecutors,this.defaultToolPolicies=i.toolPolicies,this.providerSettingsManager=i.providerSettingsManager??new ci,this.oauthTokenManager=i.oauthTokenManager??new oc({providerSettingsManager:this.providerSettingsManager,telemetry:i.telemetry}),this.defaultTelemetry=i.telemetry,this.defaultLogger=i.logger,this.pluginCommandManager=new x0({logger:i.logger,telemetry:i.telemetry}),this.pluginCommands={list:async(c)=>{if(!c.sessionId)return this.pluginCommandManager.list(c);let g=this.sessions.get(c.sessionId);if(!g)return this.pluginCommandManager.list(c);if(hi(c.workspacePath)!==hi(Hs(g.config)))throw Error("Plugin command workspace does not match the session");return this.withSessionPluginCommands(g,()=>({workspacePath:Hs(g.config),sessionId:c.sessionId,status:g.pluginCommandError?"error":"ready",error:g.pluginCommandError,commands:E0(g.agent.getExtensionRegistry().commands.filter(wg))}))},run:async(c)=>{if(!c.sessionId)return this.pluginCommandManager.run(c);let g=this.sessions.get(c.sessionId);if(!g)return this.pluginCommandManager.run(c);if(hi(c.workspacePath)!==hi(Hs(g.config)))throw Error("Plugin command workspace does not match the session");return this.withSessionPluginCommands(g,()=>A0(g.agent.getExtensionRegistry().commands.filter(wg),c.prompt,{telemetry:g.config.telemetry??this.defaultTelemetry,sessionId:g.sessionId,modelId:g.config.modelId,provider:g.config.providerId,agentIdentity:this.getSessionAgentTelemetryIdentity(g)}))}},i.distinctId!==void 0)this.defaultTelemetry?.setDistinctId(u);this.defaultFetch=i.fetch,this.connectorsRequest=i.connectorsRequest,gH(this.defaultLogger,this.defaultTelemetry),this.pendingPromptsController=new dT({getSession:(c)=>this.sessions.get(c),emit:(c)=>this.emit(c),send:(c)=>this.runTurn(c)}),this.pendingPrompts={steerFirst:async(c)=>this.pendingPromptsController.steerFirst(c.sessionId),list:async(c)=>this.pendingPromptsController.list(c.sessionId),update:async(c)=>this.pendingPromptsController.update(c),delete:async(c)=>this.pendingPromptsController.delete(c)},this.eventBridge=new bf({getSession:(c)=>this.sessions.get(c),usageBySession:this.usageBySession,aggregateUsageBySession:this.aggregateUsageBySession,emit:(c)=>this.emit(c),persistMessages:(c,g,b)=>{this.invoke("persistSessionMessages",c,g,b).catch((I)=>{let k=this.sessions.get(c);(k?.config.logger??this.defaultLogger)?.error?.("Failed to persist session messages from agent event",{sessionId:c,error:I}),B(k?.config.telemetry??this.defaultTelemetry,{component:"core",operation:"session.persist_messages_on_agent_event",error:I,severity:"warn",handled:!0,context:{sessionId:c,providerId:k?.config.providerId,modelId:k?.config.modelId}})})},enqueuePendingPrompt:(c,g)=>this.pendingPromptsController.enqueue(c,g),invokeBackendOptional:(c,...g)=>this.invokeOptional(c,...g)})}async applyInitialOAuthCredentials(i){if(i.config.apiKey?.trim())return i;let l=await this.oauthTokenManager.resolveProviderApiKey({providerId:i.config.providerId});if(!l?.apiKey)return i;return{...i,config:{...i.config,apiKey:l.apiKey}}}async startSession(i){let l=i.config.sessionId?.trim()??"",u=l||P(),c=this.sessions.get(u);if(c&&!c.agent.canStartRun()){if(i.prompt?.trim())throw Error(`Session ${u} already has a run in progress; queue the prompt instead.`);return await this.liveSessionStartResult(c)}let g=l.length>0&&(i.initialMessages?.length??0)>0&&!i.prompt?.trim(),b=Boolean(i.config.cwd?.trim()||i.config.workspaceRoot?.trim()),I=g&&!b?await this.invokeOptionalValue("readSessionManifest",u):void 0,k=I?{...i.config,cwd:I.cwd,workspaceRoot:I.workspace_root}:await GO(i.config);return await this.startResolvedSession({...i,config:k},u,l.length>0,I)}async liveSessionStartResult(i){let l=i.artifacts;if(!l)throw Error(`Session ${i.sessionId} is running but was never persisted`);let u=await this.invokeOptionalValue("readSessionManifest",i.sessionId)??l.manifest;return{sessionId:i.sessionId,manifest:u,manifestPath:l.manifestPath,messagesPath:l.messagesPath}}async startResolvedSession(i,l,u,c){let g=i.source??jr.CLI,b=ct(),I=await this.applyInitialOAuthCredentials(i),k=I.initialMessages??[],T=k.length>0?ev(k):zr(),E=await this.invokeOptionalValue("ensureSessionsDir")??"";if(!E)throw Error("session service method not available: ensureSessionsDir");let A=Pc(E,l),C=Pc(A,`${l}.messages.json`),N=Pc(A,`${l}.json`),O=Hs(i.config),L=i.interactive===!0&&!I.prompt?.trim(),D=vu.parse({version:1,session_id:l,source:g,pid:process.pid,started_at:b,status:L?"idle":"running",interactive:i.interactive===!0,provider:I.config.providerId,model:I.config.modelId,cwd:I.config.cwd,workspace_root:O,team_name:I.config.teamName,enable_tools:I.config.enableTools,enable_spawn:I.config.enableSpawnAgent,enable_teams:I.config.enableAgentTeams,prompt:I.prompt?.trim()||void 0,messages_path:C}),U,F,j=u&&k.length>0&&!I.prompt?.trim();if(j){let de=c??await this.invokeOptionalValue("readSessionManifest",l);if(de)D=de,U={manifestPath:N,messagesPath:de.messages_path||C,compactionPath:de.compaction_path,manifest:de},F=await this.invokeOptionalValue("readSessionCompactionState",l)}let H=await this.seedAggregateUsageFromArtifacts({initialUsage:T,sessionDir:A,rootMessagesPath:U?.messagesPath??C,manifest:D});this.usageBySession.set(l,T),this.aggregateUsageBySession.set(l,H);let Q=Bm(this.defaultCapabilities,i.capabilities),z=Q?.toolExecutors??this.toolExecutors,W=i.localRuntime,ee=W?.extensionContext?.logger??W?.logger,te=W?.extensionContext?.automation,oe=W?.extensionContext?.telemetry??W?.telemetry??this.defaultTelemetry,G,se=[],Pe={getSession:(de)=>this.sessions.get(de),subAgentStarts:this.subAgentStarts,onAgentEvent:(de,De,pt)=>this.eventBridge.dispatchAgentEvent(de,De,pt),invokeBackendOptional:(de,...De)=>this.invokeOptional(de,...De)},Le=Lo(U?.manifest.metadata),Te=Lo(wn(I.sessionMetadata,{mode:I.mode??Le?.mode,trigger:I.mode?void 0:Le?.trigger}));G=await VF({input:I,localRuntime:i.localRuntime,sessionId:l,sessionOrigin:Te,providerSettingsManager:this.providerSettingsManager,defaultTelemetry:this.defaultTelemetry,defaultLogger:this.defaultLogger,defaultCapabilities:Q,defaultToolPolicies:this.defaultToolPolicies,defaultFetch:this.defaultFetch,connectorsRequest:this.connectorsRequest,onPluginEvent:(de)=>{if(de.name==="plugin_log"){this.eventBridge.handlePluginLog(l,de.payload,ee);return}if(se&&wH(de.name)){se.push(de);return}this.eventBridge.handlePluginEvent(l,de,te,oe)},onPluginIssue:(de)=>{if(!G)return;this.eventBridge.dispatchAgentEvent(l,G.config,{type:"notice",noticeType:"status",displayRole:"status",message:mC(de),metadata:{pluginIssue:de}})},onTeamEvent:(de)=>{this.eventBridge.handleTeamEvent(l,de),G.config.onTeamEvent?.(de)},createSpawnTool:()=>pT(Pe,G.config,l,z),createSubAgentLifecycleCallbacks:(de)=>cT(Pe,de,l),readSessionMetadata:async()=>(await this.getSession(l))?.metadata,writeSessionMetadata:async(de)=>{await this.persistSessionMetadata(l,()=>de)}});let le=wn(Sv({...U?.manifest.metadata??{},...I.sessionMetadata??{}},G.gitState),{mode:Te?.mode,trigger:Te?.trigger,version:G.config.extensionContext?.client?.version});if(!U)D.metadata=le;let Ie;try{Ie=await this.runtimeBuilder.build({...G.runtimeBuilderInput,distinctId:this.distinctId,runCommandExecutionController:this.runCommandExecutionController})}catch(de){throw await G.pluginSandboxShutdown?.().catch(()=>{return}),de}let we=G.config,He=G.providerConfig;if(Ie.teamRuntime&&!we.teamName?.trim())we.teamName=Ie.teamRuntime.getTeamName();let ce=async()=>{let de=this.sessions.get(l);if(!de||!qg(de.config.providerId))return!1;try{return await this.syncOAuthCredentials(de,{forceRefresh:!0}),!0}catch{return!1}};Ie.delegatedAgentConfigProvider?.updateConnectionDefaults({onAuthError:ce});let Se=[...Ie.tools,...we.extraTools??[]],_e=Ie.extensions??G.extensions,Ee=I.initialCompactionState,Fe,Ke=Ee??F,Et=Lk(we),yt=j?dq(D.metadata):void 0,$r=yt?PM({config:we,importedFrom:yt.tool,next:Et}):Et,vt=Ke?{...Ke,conversation_id:Ke.conversation_id?.trim()||l}:void 0,At=MM({compact:$r,getState:()=>Fe?.compactionState,prepareApiMessages:(de)=>{let De=Fe?.agent;if(!De)throw Error("Compaction prepareTurn ran before the session runtime was created");return De.prepareProviderMessagesForApi(de)},saveState:async(de,De)=>{let pt=Fe;if(!pt)return;let be={...de,conversation_id:pt.sessionId};try{if(!(await this.persistActiveSessionCompactionState(pt,be,De)).updated)we.logger?.debug?.("Skipped stale session compaction state",{sessionId:pt.sessionId,sourceMessageCount:be.source_message_count})}catch($e){we.logger?.error?.("Failed to persist session compaction state",{sessionId:pt.sessionId,error:$e}),B(we.telemetry,{component:"core",operation:"session.persist_compaction_state",severity:"warn",handled:!0,error:$e,context:{sessionId:pt.sessionId,providerId:we.providerId,modelId:we.modelId}})}}}),Gr={distinctId:this.distinctId,sessionId:l,providerId:He.providerId,modelId:He.modelId,apiKey:He.apiKey,baseUrl:He.baseUrl,headers:He.headers,onAuthError:ce,knownModels:He.knownModels,providerConfig:He,thinking:we.thinking,reasoningEffort:we.reasoningEffort??He.reasoningEffort,thinkingBudgetTokens:we.thinkingBudgetTokens,maxTokensPerTurn:we.maxTokensPerTurn,temperature:we.temperature,systemPrompt:we.systemPrompt,maxIterations:we.maxIterations,execution:we.execution,prepareTurn:At,tools:Se,modelTools:Ie.modelTools,hooks:G.hooks,extensions:_e,hookErrorMode:we.hookErrorMode,initialMessages:G.effectiveInput.initialMessages,userFileContentLoader:fH,toolPolicies:G.toolPolicies,requestToolApproval:G.requestToolApproval?async(de)=>{let De=G.requestToolApproval,pt=this.sessions.get(l);if(pt)await this.markTurnPending(pt);try{if(!De)return{approved:!1,reason:"Tool approval callback is not configured."};return await De(de)}finally{let be=this.sessions.get(l);if(be?.status==="pending")await this.markTurnRunning(be)}}:void 0,telemetry:we.telemetry,onConsecutiveMistakeLimitReached:we.onConsecutiveMistakeLimitReached,completionPolicy:Ie.completionPolicy,consumePendingUserMessage:()=>{let de=this.pendingPromptsController.consumeSteer(l);return de?Wm(de.prompt,de.mode??we.mode):void 0},logger:Ie.logger??we.logger,extensionContext:we.extensionContext,onEvent:(de)=>this.eventBridge.dispatchAgentEvent(l,we,de)};Gr.hooks={...Gr.hooks,onEvent:async(de)=>{if(await G.hooks?.onEvent?.(de),de.type!=="assistant-message")return;let De=this.sessions.get(l);if(!De)return;let pt=De.agent.getMessages();try{await this.invoke("persistSessionMessages",l,pt,we.systemPrompt)}catch(be){we.logger?.error?.("Failed to persist session messages after assistant response",{sessionId:l,error:be}),B(we.telemetry,{component:"core",operation:"session.persist_messages_after_assistant_response",error:be,severity:"warn",handled:!0,context:{sessionId:l,providerId:we.providerId,modelId:we.modelId}})}}};let Lr=this.createAgentInstance(Gr);if(Gr.onEvent)Lr.subscribeEvents(Gr.onEvent);Ie.registerLeadAgent?.(Lr);let us=Do({agentId:Lr.getAgentId(),conversationId:Lr.getConversationId(),teamId:Ie.teamRuntime?.getTeamId(),teamName:Ie.teamRuntime?.getTeamName(),teamRole:Ie.teamRuntime?"lead":void 0});if(uq(we,l,u,O,us),us)Ah(we.telemetry,{ulid:l,modelId:we.modelId,provider:we.providerId,...us});if(Ie.teamRuntime)UA(we.telemetry,{ulid:l,teamId:Ie.teamRuntime.getTeamId(),teamName:Ie.teamRuntime.getTeamName(),leadAgentId:Lr.getAgentId(),restoredFromPersistence:Ie.teamRestoredFromPersistence===!0});let Ce={sessionId:l,config:we,sessionMetadata:le,...U?{artifacts:U}:{},source:g,startedAt:U?.manifest.started_at??b,updatedAt:U?.manifest.ended_at??U?.manifest.started_at??b,pendingPrompt:D.prompt,runtime:Ie,agent:Lr,started:!1,status:U?.manifest.status??(L?"idle":"running"),aborting:!1,interactive:i.interactive===!0,persistedMessages:k,compactionState:vt,activeTeamRunIds:new Set,pendingTeamRunUpdates:[],teamRunWaiters:[],pendingPrompts:[],drainingPendingPrompts:!1,pluginSandboxShutdown:G.pluginSandboxShutdown,pluginCommandError:G.pluginCommandError,submitAndExitObserved:!1,taskCompletedEmitted:!1,lastInteractiveTurnFinishReason:void 0};if(Fe=Ce,Ce.compactionState&&!this.isCompactionStateForSession(Ce.sessionId,Ce.compactionState,Ce))Ce.config.logger?.log?.("Ignoring session compaction state for a different conversation",{severity:"warn",sessionId:Ce.sessionId,conversationId:Ce.compactionState.conversation_id}),Ce.compactionState=void 0;this.sessions.set(l,Ce);let xt=se??[];se=null;for(let de of xt)this.eventBridge.handlePluginEvent(l,de,te,oe);if(U)await this.refreshActiveSessionGitMetadata(Ce,G.gitState);if(k.length>0&&!U)try{await this.ensureSessionPersisted(Ce),await this.invoke("persistSessionMessages",l,k,Ce.config.systemPrompt)}catch(de){Ce.config.logger?.error?.("Failed to persist seeded session messages at start",{sessionId:l,error:de}),B(Ce.config.telemetry,{component:"core",operation:"session.persist_seeded_messages",error:de,severity:"warn",handled:!0,context:{sessionId:l,providerId:Ce.config.providerId,modelId:Ce.config.modelId}})}this.emitStatus(l,Ce.status);let Xr;try{if(I.prompt?.trim())if(Xr=await this.executeTurn(Ce,{prompt:I.prompt,userImages:I.userImages,userFiles:I.userFiles}),!Ce.interactive)await this.finalizeSingleRun(Ce,Xr.finishReason);else await this.completeInteractiveTurn(Ce,Xr.finishReason)}catch(de){if(Ce.interactive&&Ce.aborting)Xr=await this.completeAbortedInteractiveTurn(Ce);else{B(Ce.config.telemetry,{component:"core",operation:"session.start",error:de,severity:"error",handled:!1,context:{sessionId:Ce.sessionId,providerId:Ce.config.providerId,modelId:Ce.config.modelId}});try{await this.failSession(Ce)}catch(De){Ce.config.logger?.error?.("Session failure cleanup threw",{sessionId:Ce.sessionId,error:De})}throw de}}return{sessionId:l,manifest:D,manifestPath:N,messagesPath:C,result:Xr,...G.pluginIssues.length>0?{pluginIssues:G.pluginIssues}:{}}}async restoreSession(i){return this.sessionVersioning.restoreCheckpoint({...i,telemetry:this.defaultTelemetry,getSession:(l)=>this.getSession(l),readMessages:(l)=>this.readSessionMessages(l),buildStartInput:(l,u)=>{let c=l.restoredCheckpointMetadata?{...u.sessionMetadata??{},checkpoint:l.restoredCheckpointMetadata}:u.sessionMetadata;return{...u,...c?{sessionMetadata:c}:{},initialMessages:l.initialMessages}},startSession:(l)=>this.startSession(l),getStartedSessionId:(l)=>l.sessionId,cleanupStartedSession:async(l)=>{if(!await this.deleteSession(l.sessionId))throw Error(`Failed to clean up restored session ${l.sessionId}`)},readRestoredSession:(l)=>this.getSession(l)})}async runTurn(i){let l=this.getSessionOrThrow(i.sessionId),u=l.replayingQueuedPrompt===!0;l.replayingQueuedPrompt=!1;let c=l.agent.canStartRun(),g=i.delivery??(l.interactive&&!c?"queue":void 0);if(l.config.telemetry?.capture({event:"session.input_sent",properties:{sessionId:i.sessionId,promptLength:i.prompt.length,userImageCount:i.userImages?.length??0,userFileCount:i.userFiles?.length??0,delivery:g??"immediate",...u?{}:{agentBusy:!c,bumpKind:W$(i.prompt),...l.lastTurnEndedAt===void 0?{}:{msSinceTurnEnd:Date.now()-l.lastTurnEndedAt}}}}),g==="queue"||g==="steer"){this.pendingPromptsController.enqueue(i.sessionId,{prompt:i.prompt,mode:i.mode,delivery:g,userImages:i.userImages,userFiles:i.userFiles});return}try{let b=await this.executeTurn(l,{prompt:i.prompt,mode:i.mode,userImages:i.userImages,userFiles:i.userFiles});if(!l.interactive)await this.finalizeSingleRun(l,b.finishReason);else await this.completeInteractiveTurn(l,b.finishReason);if(b.finishReason!=="error")queueMicrotask(()=>{this.pendingPromptsController.drain(i.sessionId)});return b}catch(b){if(l.interactive&&l.aborting)return await this.completeAbortedInteractiveTurn(l);throw B(l.config.telemetry,{component:"core",operation:"session.submit",error:b,severity:"error",handled:!1,context:{sessionId:l.sessionId,providerId:l.config.providerId,modelId:l.config.modelId}}),await this.failSession(l),b}}async getAccumulatedUsage(i){let l=mw(this.usageBySession.get(i)),u=mw(this.aggregateUsageBySession.get(i));return l||u?{usage:l,aggregateUsage:u}:void 0}async abort(i,l){let u=this.sessions.get(i);if(!u)return;if(u.config.telemetry?.capture({event:"session.aborted",properties:{sessionId:i}}),u.aborting=!0,u.drainingPendingPrompts)this.pendingPromptsController.discardQueue(u);let c=u.runtime.teamRuntime;try{c?.cancelOutstandingWork(l)}finally{if(c)u.activeTeamRunIds.clear(),u.pendingTeamRunUpdates.length=0,zm(u);u.agent.abort(l)}}async resolveMcpAppTool(i,l){return this.getSessionOrThrow(i).runtime.mcpApps?.resolveTool(l)}async readMcpAppResource(i,l){return this.requireMcpApps(i).readResource(l)}async callMcpAppTool(i,l){let u=this.requireMcpApps(i),c=this.getSessionOrThrow(i).config,g=!1;try{let b=await u.callTool(l);return g=!0,b}finally{Ko(c.telemetry??this.defaultTelemetry,{ulid:i,tool:Jh({serverName:l.serverName,toolName:l.toolName}),success:g,modelId:c.modelId,provider:c.providerId})}}requireMcpApps(i){let l=this.getSessionOrThrow(i),u=l.runtime.mcpApps;if(!u)throw Error(l.config.mcpApps?`Session "${i}" has no MCP servers available to MCP Apps.`:`MCP Apps is not enabled for session "${i}".`);return u}async proceedWhileRunning(i,l){return this.runCommandExecutionController.proceedWhileRunning(i,l)}async stopSession(i){let l=this.sessions.get(i);if(!l)return;if(l.config.telemetry?.capture({event:"session.stopped",properties:{sessionId:i}}),l.interactive&&!Qt(l.status)){await this.releaseSessionRuntime(l,"session_stop");return}if(l.interactive&&l.agent.canStartRun()){await this.shutdownSession(l,{status:this.resolveInteractiveStopStatus(l),exitCode:this.resolveInteractiveStopExitCode(l),shutdownReason:"session_stop",endReason:"stopped"});return}l.aborting=!0,l.agent.abort(Error("session_stop")),await this.shutdownSession(l,{status:"cancelled",exitCode:0,shutdownReason:"session_stop",endReason:"stopped"})}async dispose(i="session_manager_dispose"){let l=[...this.sessions.values()];if(await this.pluginCommandManager.dispose(),l.length===0)return;await Promise.allSettled(l.map((u)=>u.interactive&&!Qt(u.status)?this.releaseSessionRuntime(u,i):u.interactive&&u.agent.canStartRun()?this.shutdownSession(u,{status:this.resolveInteractiveStopStatus(u),exitCode:this.resolveInteractiveStopExitCode(u),shutdownReason:i,endReason:"disposed"}):this.shutdownSession(u,{status:"cancelled",exitCode:0,shutdownReason:i,endReason:"disposed"}))),this.usageBySession.clear(),this.aggregateUsageBySession.clear()}async getSession(i){let l=this.sessions.get(i);if(l)return hw(l);let u=i.trim();if(!u)return;let c=await this.getRow(u);if(c)return Qy(c);let g=await this.readManifest(u);return g?lH(g):void 0}async listSessions(i=200,l={}){let u=(await this.listRows(i,l)).map(Qy),c=new Set(u.map((g)=>g.sessionId));for(let g of this.sessions.values()){if(c.has(g.sessionId))continue;u.unshift(hw(g))}return u.slice(0,i)}async deleteSession(i){if(this.sessions.has(i))await this.stopSession(i);let l=await this.invoke("deleteSession",i);if(l.deleted)this.usageBySession.delete(i),this.aggregateUsageBySession.delete(i);return l.deleted}async updateSession(i,l){let u=await this.invokeOptionalValue("updateSession",{sessionId:i,prompt:l.prompt,metadata:l.metadata,title:l.title}),c=u?.updated===!0;if(c&&u.metadata!==void 0){let g=this.sessions.get(i.trim());if(g){if(g.sessionMetadata=u.metadata??void 0,g.artifacts)g.artifacts.manifest.metadata=g.sessionMetadata}}return{updated:c}}async updateSessionCompactionState(i,l){let u=i.trim();if(!u)return{updated:!1};let c=this.sessions.get(u),g=c?void 0:await this.getSession(u);if(!(c??g))return{updated:!1};if(c){let I=await this.readSessionMessages(u),k=l.source_message_count>0&&I.length>=l.source_message_count,T=k?I:void 0;if(k){if(!await this.canPersistCompactionState(u,l,c,void 0,I))return{updated:!1};c.agent.restore(I)}return await this.persistActiveSessionCompactionState(c,l,T)}if(!await this.canPersistCompactionState(u,l,void 0,g))return{updated:!1};let b=await this.invokeOptionalValue("readSessionCompactionState",u);if(gw(l,b))return{updated:!1};return await this.invoke("persistSessionCompactionState",u,l),{updated:!0}}async readSessionCompactionState(i){let l=i.trim();if(!l)return;let u=this.sessions.get(l);if(u)for(;;){let c=u.compactionStateWriteQueue;if(!c)return u.compactionState;await c.catch(()=>{return})}return await this.invokeOptionalValue("readSessionCompactionState",l)}isCompactionStateForSession(i,l,u,c){let g=l.conversation_id?.trim();if(!g)return!0;if(g===i)return!0;let b=u?.agent.getConversationId()?.trim()||c?.conversationId?.trim();return b?g===b:!1}async canPersistCompactionState(i,l,u,c,g){if(!l.conversation_id?.trim())return!1;if(!this.isCompactionStateForSession(i,l,u,c))return!1;let b=g??u?.agent.getMessages()??await this.readSessionMessages(i);return hm(l,b)!==void 0}async persistActiveSessionCompactionState(i,l,u){if(!await this.canPersistCompactionState(i.sessionId,l,i,void 0,u))return{updated:!1};return await this.enqueueCompactionStateWrite(i,async()=>{let c=i.compactionState,g=c!==void 0&&hm(c,u??i.agent.getMessages())!==void 0;if(c&&(g?gw(l,c):Date.parse(l.updated_at)<Date.parse(c.updated_at)))return{updated:!1};return await this.invoke("persistSessionCompactionState",i.sessionId,l),i.compactionState=l,{updated:!0}})}async enqueueCompactionStateWrite(i,l){let u=(i.compactionStateWriteQueue??Promise.resolve()).catch(()=>{return}).then(l),c=u.then(()=>{return},()=>{return});i.compactionStateWriteQueue=c;try{return await u}finally{if(i.compactionStateWriteQueue===c)i.compactionStateWriteQueue=void 0}}async readLiveSessionMessages(i){let l=i.trim();if(!l)return[];let u=this.sessions.get(l);if(u){let c=u.agent.getMessages();if(c.length>0)return c}return this.readSessionMessages(l)}async readSessionMessages(i){let l=i.trim();if(!l)return[];let u=await this.getRow(l);if(u?.messagesPath)return Jd(u.messagesPath);let c=await this.readManifest(l);return Jd(c?.messages_path)}async dispatchHookEvent(i){await aH(i,{queueSpawnRequest:(l)=>this.invokeOptional("queueSpawnRequest",l),upsertSubagentSessionFromHook:(l)=>this.invokeOptionalValue("upsertSubagentSessionFromHook",l),appendSubagentHookAudit:(l,u)=>this.invokeOptional("appendSubagentHookAudit",l,u),applySubagentStatus:(l,u)=>this.invokeOptional("applySubagentStatus",l,u)})}subscribe(i,l){return this.events.subscribe(i,l)}async updateSessionModel(i,l){await this.updateSessionConnection(i,{modelId:l})}async updateSessionConnection(i,l){let u=nf(l),c=this.getSessionOrThrow(i);if(u.providerId!==void 0)c.config.providerId=u.providerId;if(u.modelId!==void 0)c.config.modelId=u.modelId;if(u.apiKey!==void 0)c.config.apiKey=u.apiKey;if(u.baseUrl!==void 0)c.config.baseUrl=u.baseUrl;if(u.headers!==void 0)c.config.headers=u.headers;if(u.providerConfig!==void 0)c.config.providerConfig=u.providerConfig;if(Object.hasOwn(u,"reasoningEffort"))c.config.reasoningEffort=u.reasoningEffort??void 0;if(Object.hasOwn(u,"thinkingBudgetTokens"))c.config.thinkingBudgetTokens=u.thinkingBudgetTokens??void 0;if(Object.hasOwn(u,"thinking")){if(c.config.thinking=u.thinking??void 0,u.thinking===!1||u.thinking===null)c.config.reasoningEffort=void 0,c.config.thinkingBudgetTokens=void 0}let g={...u.providerId!==void 0?{providerId:u.providerId}:{},...u.modelId!==void 0?{modelId:u.modelId}:{},...u.apiKey!==void 0?{apiKey:u.apiKey}:{},...u.baseUrl!==void 0?{baseUrl:u.baseUrl}:{},...u.headers!==void 0?{headers:u.headers}:{},...u.providerConfig!==void 0?{providerConfig:u.providerConfig}:{},...Object.hasOwn(u,"reasoningEffort")?{reasoningEffort:u.reasoningEffort??void 0}:{},...Object.hasOwn(u,"thinking")?{thinking:u.thinking??void 0}:{},...Object.hasOwn(u,"thinkingBudgetTokens")?{thinkingBudgetTokens:u.thinkingBudgetTokens??void 0}:{}};if(u.thinking===!1||u.thinking===null)g.reasoningEffort=void 0,g.thinkingBudgetTokens=void 0;let b={...u.apiKey!==void 0?{apiKey:u.apiKey}:{},...u.baseUrl!==void 0?{baseUrl:u.baseUrl}:{},...u.headers!==void 0?{headers:u.headers}:{}};if(c.runtime.delegatedAgentConfigProvider?.updateConnectionDefaults(g),c.agent.updateConnection(u),c.runtime.teamRuntime?.updateTeammateConnections(b),u.providerId||u.modelId)await this.mutateSessionManifest(c,(I)=>{if(u.providerId)I.provider=u.providerId;if(u.modelId)I.model=u.modelId})}async mutateSessionManifest(i,l){let u=i.artifacts;if(!u)return;let c=i.sessionId,g=(this.manifestMutationQueues.get(c)??Promise.resolve()).then(async()=>{let I=await this.invokeOptionalValue("readSessionManifest",c)??u.manifest;return l(I),u.manifest=I,await this.invoke("writeSessionManifest",u.manifestPath,I),I}),b=g.then(()=>{return},()=>{return});this.manifestMutationQueues.set(c,b);try{return await g}finally{if(this.manifestMutationQueues.get(c)===b)this.manifestMutationQueues.delete(c)}}handlePluginEvent(i,l,u){return this.eventBridge.handlePluginEvent(i,l,u)}async executeTurn(i,l){i.aborting=!1;let u=await this.prepareTurnInput(i,l),c=u.prompt.trim(),g=u?.userImages?.length,b=u?.userFiles?.length;if(!c&&!g&&!b)throw Error("prompt cannot be empty");if(!i.artifacts&&!i.pendingPrompt)i.pendingPrompt=c;if(await this.ensureSessionPersisted(i),!i.pendingPrompt){i.pendingPrompt=c;try{await this.invokeOptionalValue("updateSession",{sessionId:i.sessionId,prompt:c})}catch(I){i.config.logger?.log?.("Failed to backfill seeded session prompt",{severity:"warn",sessionId:i.sessionId,error:I})}}await this.refreshActiveSessionGitMetadata(i),await this.syncOAuthCredentials(i),await this.markTurnRunning(i);try{let I=await this.executeAgentTurn(i,c,u.userImages,u.userFiles);while(wj(i,I.finishReason)){let k=await bj(i);if(k.length===0)break;let T=Ij(i,k);I=await this.executeAgentTurn(i,T)}return I}finally{i.lastTurnEndedAt=Date.now(),await this.refreshActiveSessionGitMetadata(i)}}async completeInteractiveTurn(i,l){if(Hm(i))return;i.lastInteractiveTurnFinishReason=l,await this.markTurnIdle(i),i.aborting=!1}resolveInteractiveStopStatus(i){let l=i.lastInteractiveTurnFinishReason;if(!l)return"cancelled";switch(l){case"completed":return"completed";case"error":return"failed";case"aborted":case"max_iterations":case"mistake_limit":return"cancelled"}return l}resolveInteractiveStopExitCode(i){return i.lastInteractiveTurnFinishReason==="error"?1:0}async completeAbortedInteractiveTurn(i){let l=new Date,u=i.agent.getMessages(),c=zr();if(i.persistedMessages=u,i.started=i.started||u.length>0,u.length>0)try{await this.ensureSessionPersisted(i),await this.invoke("persistSessionMessages",i.sessionId,u,i.config.systemPrompt)}catch(g){i.config.logger?.error?.("Failed to persist session messages after abort",{sessionId:i.sessionId,error:g}),B(i.config.telemetry,{component:"core",operation:"session.persist_messages_after_abort",error:g,severity:"warn",handled:!0,context:{sessionId:i.sessionId,providerId:i.config.providerId,modelId:i.config.modelId}})}return this.eventBridge.dispatchAgentEvent(i.sessionId,i.config,{type:"done",reason:"aborted",text:"",iterations:0,usage:c}),await this.completeInteractiveTurn(i,"aborted"),queueMicrotask(()=>{this.pendingPromptsController.drain(i.sessionId)}),{text:"",usage:c,messages:u,toolCalls:[],iterations:0,finishReason:"aborted",model:{id:i.config.modelId,provider:i.config.providerId},startedAt:l,endedAt:l,durationMs:0}}async executeAgentTurn(i,l,u,c){let g=i.started||i.agent.getMessages().length>0,b=i.persistedMessages??i.agent.getMessages(),I=this.usageBySession.get(i.sessionId)??zr(),k=this.aggregateUsageBySession.get(i.sessionId)??I;i.turnUsageBaseline=I,i.turnAggregateUsageBaseline=k,i.turnPrimaryUsage=zr(),i.turnUsageByAgent=new Map,xA(i.config.telemetry,i.sessionId,i.config.mode),TI(i.config.telemetry,{ulid:i.sessionId,provider:i.config.providerId,model:i.config.modelId,source:"user",mode:i.config.mode,...this.getSessionAgentTelemetryIdentity(i)});try{let T=()=>{let D=g?i.agent.continue(l,u,c):i.agent.run(l,u,c);if(i.aborting)i.agent.abort(Error("Run aborted before it started"));return D},E=await this.runWithAuthRetry(i,T,b);i.started=!0;let A=$S(E.messages,E,b);i.persistedMessages=A;let C=US(i.turnUsageByAgent?.values()??[]),N=Yt(I,E.usage),O=Yt(Yt(zr(),E.usage),C),L=Yt(k,O);return this.usageBySession.set(i.sessionId,N),this.aggregateUsageBySession.set(i.sessionId,L),await this.persistSessionMetadata(i.sessionId,(D)=>({...D??{},totalCost:N.totalCost,aggregatedAgentsCost:L.totalCost,usage:N,aggregateUsage:L})),await this.invoke("persistSessionMessages",i.sessionId,A,i.config.systemPrompt),this.observeTaskCompletionTool(i,E),E}catch(T){B(i.config.telemetry,{component:"core",operation:"session.turn",error:T,severity:"error",handled:!1,context:{sessionId:i.sessionId,providerId:i.config.providerId,modelId:i.config.modelId}});try{await this.invoke("persistSessionMessages",i.sessionId,i.agent.getMessages(),i.config.systemPrompt)}catch(E){i.config.logger?.error?.("Failed to persist session messages after turn error",{sessionId:i.sessionId,error:E})}throw T}finally{i.turnUsageBaseline=void 0,i.turnAggregateUsageBaseline=void 0,i.turnPrimaryUsage=void 0,i.turnUsageByAgent=void 0}}observeTaskCompletionTool(i,l){if(i.submitAndExitObserved)return;if(!l.toolCalls.some((u)=>u.name===Ht.SUBMIT_AND_EXIT&&u.error===void 0))return;i.submitAndExitObserved=!0,i.taskCompletedEmitted=!0,fg(i.config.telemetry,{ulid:i.sessionId,provider:i.config.providerId,model:i.config.modelId,mode:i.config.mode,durationMs:Date.now()-Date.parse(i.startedAt),source:"submit_and_exit",...this.getSessionAgentTelemetryIdentity(i)})}emitTaskCompletedOnTeardown(i,l){if(i.taskCompletedEmitted||i.submitAndExitObserved)return;if(!(i.interactive?i.lastInteractiveTurnFinishReason==="completed"&&!i.aborting&&i.agent.canStartRun():l==="completed"))return;i.taskCompletedEmitted=!0,fg(i.config.telemetry,{ulid:i.sessionId,provider:i.config.providerId,model:i.config.modelId,mode:i.config.mode,durationMs:Date.now()-Date.parse(i.startedAt),source:"shutdown",...this.getSessionAgentTelemetryIdentity(i)})}async prepareTurnInput(i,l){let u=Hs(i.config),c=ye(l.prompt).trim();if(!c)return{prompt:"",userImages:l.userImages,userFiles:this.resolveAbsoluteFilePaths(i.config.cwd,l.userFiles)};let g=await y$(c,u);pq(i.config.telemetry,g);let b=Wm(g.prompt,l.mode??i.config.mode),I=this.resolveAbsoluteFilePaths(i.config.cwd,l.userFiles),k=this.resolveAbsoluteFilePaths(u,g.matchedFiles),T=Array.from(new Set([...I,...k]));return{prompt:b,userImages:l.userImages,userFiles:T.length>0?T:void 0}}async ensureSessionPersisted(i){if(i.artifacts)return;let l=Hs(i.config);if(i.artifacts=await this.invoke("createRootSessionWithArtifacts",{sessionId:i.sessionId,source:i.source,pid:process.pid,status:i.status,interactive:i.interactive,provider:i.config.providerId,model:i.config.modelId,cwd:i.config.cwd,workspaceRoot:l,teamName:i.config.teamName,enableTools:i.config.enableTools,enableSpawn:i.config.enableSpawnAgent,enableTeams:i.config.enableAgentTeams,prompt:i.pendingPrompt,metadata:i.sessionMetadata,startedAt:i.startedAt}),i.compactionState){if(!(await this.persistActiveSessionCompactionState(i,i.compactionState)).updated)i.compactionState=void 0}}async markTurnRunning(i){if(i.status==="running")return;await this.updateStatus(i,"running",null)}async refreshActiveSessionGitMetadata(i,l){try{let u=l??await LF(Hs(i.config));if(!u||!i.artifacts)return;if($F(i.artifacts.manifest.metadata,u))return;await this.persistSessionMetadata(i.sessionId,(c)=>Sv({...c??{},...i.sessionMetadata??{}},u))}catch(u){i.config.logger?.debug?.("Failed to refresh session git metadata",{sessionId:i.sessionId,error:u})}}async markTurnPending(i){if(i.status==="pending")return;await this.updateStatus(i,"pending",null)}async markTurnIdle(i){if(i.status==="idle")return;await this.updateStatus(i,"idle",null)}async persistSessionMetadata(i,l){let u=this.sessions.get(i),c=await this.invokeOptionalValue("readSessionManifest",i)??u?.artifacts?.manifest,g=l(c?.metadata);if(!u?.artifacts)return;if((await this.invokeOptionalValue("updateSession",{sessionId:i,metadata:g}))?.updated===!1)return;u.sessionMetadata=g,u.artifacts.manifest.metadata=g}async finalizeSingleRun(i,l){if(Hm(i))return;let u=l==="aborted"||i.aborting,c=l==="error";await this.shutdownSession(i,{status:u?"cancelled":c?"failed":"completed",exitCode:c?1:0,shutdownReason:c?"session_error":"session_complete",endReason:l})}async failSession(i){i.lastInteractiveTurnFinishReason="error",await this.shutdownSession(i,{status:"failed",exitCode:1,shutdownReason:"session_error",endReason:"error"})}async shutdownSession(i,l){if(i.pluginCommandsClosing=!0,this.emitTaskCompletedOnTeardown(i,l.status),zm(i),!i.aborting&&!i.agent.canStartRun())i.aborting=!0,i.agent.abort(Error(l.shutdownReason));let u=[],c=(g,b)=>{u.push(b),i.config.logger?.log("Session shutdown cleanup failed",{sessionId:i.sessionId,stage:g,error:b,severity:"warn"}),B(i.config.telemetry,{component:"core",operation:"session.shutdown_cleanup",error:b,severity:"warn",handled:!0,context:{sessionId:i.sessionId,stage:g,status:l.status,shutdownReason:l.shutdownReason,providerId:i.config.providerId,modelId:i.config.modelId}})};if(i.artifacts){await this.refreshActiveSessionGitMetadata(i);try{await this.updateStatus(i,l.status,l.exitCode)}catch(g){c("update_status",g)}}try{await i.pluginCommandTail,await i.agent.shutdown(l.shutdownReason)}catch(g){c("agent_shutdown",g)}try{await Promise.resolve(i.runtime.shutdown(l.shutdownReason))}catch(g){c("runtime_shutdown",g)}try{await i.pluginSandboxShutdown?.()}catch(g){c("plugin_sandbox_shutdown",g)}if(this.sessions.delete(i.sessionId),this.emit({type:"ended",payload:{sessionId:i.sessionId,reason:l.endReason,ts:Date.now()}}),u.length>0&&l.status==="failed")throw u[0]}async releaseSessionRuntime(i,l){i.pluginCommandsClosing=!0,this.emitTaskCompletedOnTeardown(i);let u=[],c=(g,b)=>{u.push(b),i.config.logger?.log("Session runtime cleanup failed",{sessionId:i.sessionId,stage:g,error:b,severity:"warn"}),B(i.config.telemetry,{component:"core",operation:"session.runtime_cleanup",error:b,severity:"warn",handled:!0,context:{sessionId:i.sessionId,stage:g,reason:l,providerId:i.config.providerId,modelId:i.config.modelId}})};if(!i.aborting&&!i.agent.canStartRun())i.aborting=!0,i.agent.abort(Error(l));try{await i.pluginCommandTail,await i.agent.shutdown(l)}catch(g){c("agent_shutdown",g)}try{await Promise.resolve(i.runtime.shutdown(l))}catch(g){c("runtime_shutdown",g)}try{await i.pluginSandboxShutdown?.()}catch(g){c("plugin_sandbox_shutdown",g)}if(this.sessions.delete(i.sessionId),u.length>0)throw u[0]}async updateStatus(i,l,u){if(!i.artifacts)return;let c=await this.invoke("updateSessionStatus",i.sessionId,l,u);if(!c.updated)return;let g=await this.mutateSessionManifest(i,(b)=>{if(b.status=l,Qt(l))delete b.ended_at,b.exit_code=null;else b.ended_at=c.endedAt??ct(),b.exit_code=typeof u==="number"?u:null});if(!g)return;i.status=l,i.updatedAt=c.endedAt??ct(),i.endedAt=Qt(l)?null:g.ended_at,i.exitCode=g.exit_code,this.emitStatus(i.sessionId,l)}async runWithAuthRetry(i,l,u){try{return await l()}catch(c){if(!qg(i.config.providerId)||!Si(c))throw c;return await this.syncOAuthCredentials(i,{forceRefresh:!0}),i.agent.restore(u),l()}}async syncOAuthCredentials(i,l){let u=null;try{u=await this.oauthTokenManager.resolveProviderApiKey({providerId:i.config.providerId,forceRefresh:l?.forceRefresh})}catch(c){if(c instanceof od)throw Error(`${c.providerId} requires re-authentication.`);throw c}if(!u?.apiKey||i.config.apiKey===u.apiKey)return;i.config.apiKey=u.apiKey,i.agent.updateConnection({apiKey:u.apiKey}),i.runtime.delegatedAgentConfigProvider?.updateConnectionDefaults({apiKey:u.apiKey}),i.runtime.teamRuntime?.updateTeammateConnections({apiKey:u.apiKey})}withSessionPluginCommands(i,l){if(i.pluginCommandsClosing)return Promise.reject(Error("Session plugin commands are shutting down"));let u=(i.pluginCommandTail??Promise.resolve()).then(async()=>(await i.agent.initializeExtensions(),l()));return i.pluginCommandTail=u.catch(()=>{}),u}getSessionOrThrow(i){let l=this.sessions.get(i);if(!l){let u=new uc(i);throw B(this.defaultTelemetry,{component:"core",operation:"session.active_lookup",error:u,severity:"warn",handled:!0,context:{sessionId:i,activeSessionCount:this.sessions.size}}),u}return l}resolveAbsoluteFilePaths(i,l){if(!l||l.length===0)return[];let u=l.map((c)=>c.trim()).filter((c)=>c.length>0).map((c)=>XC(c)?c:hi(i,c));return Array.from(new Set(u))}getSessionAgentTelemetryIdentity(i){return Do({agentId:i.agent.getAgentId(),conversationId:i.agent.getConversationId(),teamId:i.runtime.teamRuntime?.getTeamId(),teamName:i.runtime.teamRuntime?.getTeamName(),teamRole:i.runtime.teamRuntime?"lead":void 0})}async seedAggregateUsageFromArtifacts(i){let l=await this.summarizePersistedTeammateUsage(i.sessionDir,i.rootMessagesPath,i.manifest.session_id),u=Yt(i.initialUsage,l);return this.withPersistedAggregateUsageFloor(u,i.manifest)}async summarizePersistedTeammateUsage(i,l,u){let c=hi(l),g=`${u}.messages.json`,b;try{b=KC(i)}catch{return zr()}let I=zr();for(let k of b){if(!k.endsWith(".messages.json"))continue;if(k===g)continue;let T=hi(i,k);if(T===c)continue;let E=await Jd(T);if(E.length===0)continue;I=Yt(I,ev(E))}return I}withPersistedAggregateUsageFloor(i,l){let u=yH(l.metadata?.aggregateUsage);if(u)return vH(i,u);let c=l.metadata?.aggregatedAgentsCost;if(typeof c!=="number"||!Number.isFinite(c)||c<=i.totalCost)return i;return{...i,totalCost:c}}emitStatus(i,l){this.emitSessionSnapshot(i),this.emit({type:"status",payload:{sessionId:i,status:l}})}async emitSessionSnapshot(i){let l=await this.getSession(i);if(!l)return;this.emit({type:"session_snapshot",payload:{sessionId:i,snapshot:Eu({session:l,usage:this.usageBySession.get(i),aggregateUsage:this.aggregateUsageBySession.get(i)})}})}emit(i){this.events.emit(i)}async listRows(i,l={}){return this.invoke("listSessions",Math.min(Math.max(1,Math.floor(i)),fw),l)}async getRow(i){let l=i.trim();if(!l)return;return(await this.listRows(fw)).find((u)=>u.sessionId===l)}async readManifest(i){let l=i.trim();if(!l)return;return await this.invokeOptionalValue("readSessionManifest",l)}invoke(i,...l){return dH(this.sessionService,i,...l)}invokeOptional(i,...l){return uH(this.sessionService,i,...l)}invokeOptionalValue(i,...l){return cH(this.sessionService,i,...l)}}class Tf{sessionsDirPath;db;constructor(i={}){this.sessionsDirPath=i.sessionsDir??xe()}init(){this.getRawDb()}ensureSessionsDir(){if(!bH(this.sessionsDirPath))IH(this.sessionsDirPath,{recursive:!0});return this.sessionsDirPath}sessionDbPath(){return kH(this.ensureSessionsDir(),"sessions.db")}getRawDb(){if(this.db)return this.db;let i=V(this.sessionDbPath());return Vo(i,{includeLegacyMigrations:!0}),this.db=i,i}close(){this.db?.close?.(),this.db=void 0}run(i,l=[]){return this.getRawDb().prepare(i).run(...l)}queryOne(i,l=[]){return this.getRawDb().prepare(i).get(...l)??void 0}queryAll(i,l=[]){return this.getRawDb().prepare(i).all(...l)}create(i){let l=x();this.run(`INSERT OR REPLACE INTO sessions (
|
|
487
|
+
session_id, source, pid, started_at, ended_at, exit_code, status, status_lock, interactive,
|
|
488
|
+
provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
|
|
489
|
+
parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
|
|
490
|
+
metadata_json, transcript_path, hook_path, messages_path, updated_at
|
|
491
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[i.sessionId,i.source,i.pid,i.startedAt,i.endedAt??null,i.exitCode??null,i.status,0,ot(i.interactive),i.provider,i.model,i.cwd,i.workspaceRoot,i.teamName??null,ot(i.enableTools),ot(i.enableSpawn),ot(i.enableTeams),i.parentSessionId??null,i.parentAgentId??null,i.agentId??null,i.conversationId??null,ot(i.isSubagent),i.prompt??null,i.metadata?JSON.stringify(i.metadata):null,"",i.hookPath??"",i.messagesPath??null,l])}update(i){let l=[],u=[];if(i.endedAt!==void 0)l.push("ended_at = ?"),u.push(i.endedAt);if(i.exitCode!==void 0)l.push("exit_code = ?"),u.push(i.exitCode);if(i.status!==void 0)l.push("status = ?"),u.push(i.status);if(i.prompt!==void 0)l.push("prompt = ?"),u.push(i.prompt);if(i.metadata!==void 0)l.push("metadata_json = ?"),u.push(i.metadata?JSON.stringify(i.metadata):null);if(i.parentSessionId!==void 0)l.push("parent_session_id = ?"),u.push(i.parentSessionId);if(i.parentAgentId!==void 0)l.push("parent_agent_id = ?"),u.push(i.parentAgentId);if(i.agentId!==void 0)l.push("agent_id = ?"),u.push(i.agentId);if(i.conversationId!==void 0)l.push("conversation_id = ?"),u.push(i.conversationId);if(l.length===0)return;l.push("updated_at = ?"),u.push(x()),u.push(i.sessionId),this.run(`UPDATE sessions SET ${l.join(", ")} WHERE session_id = ?`,u)}updateStatus(i,l,u){this.update({sessionId:i,status:l,endedAt:Qt(l)?null:x(),exitCode:Qt(l)?null:u??(l==="failed"?1:0)})}get(i){let l=this.queryOne(`SELECT session_id, source, pid, started_at, ended_at, exit_code, status, interactive,
|
|
492
|
+
provider, model, cwd, workspace_root, team_name,
|
|
493
|
+
enable_tools, enable_spawn, enable_teams,
|
|
494
|
+
parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent,
|
|
495
|
+
prompt, metadata_json, hook_path, messages_path, updated_at
|
|
496
|
+
FROM sessions WHERE session_id = ?`,[i]);if(!l)return;return{sessionId:f(l.session_id),source:f(l.source),pid:Number(l.pid??0),startedAt:f(l.started_at),endedAt:l.ended_at??null,exitCode:l.exit_code??null,status:f(l.status),interactive:wt(l.interactive),provider:f(l.provider),model:f(l.model),cwd:f(l.cwd),workspaceRoot:f(l.workspace_root),teamName:h(l.team_name),enableTools:wt(l.enable_tools),enableSpawn:wt(l.enable_spawn),enableTeams:wt(l.enable_teams),parentSessionId:h(l.parent_session_id),parentAgentId:h(l.parent_agent_id),agentId:h(l.agent_id),conversationId:h(l.conversation_id),isSubagent:wt(l.is_subagent),prompt:h(l.prompt),metadata:(()=>{let u=h(l.metadata_json);if(!u)return;try{let c=JSON.parse(u);if(c&&typeof c==="object"&&!Array.isArray(c))return c}catch{}return})(),hookPath:h(l.hook_path),messagesPath:h(l.messages_path),updatedAt:h(l.updated_at)??x()}}list(i=200){let l=this.queryAll("SELECT session_id FROM sessions ORDER BY started_at DESC LIMIT ?",[i]),u=[];for(let c of l){let g=this.get(f(c.session_id));if(g)u.push(g)}return u}listChildren(i,l=200){let u=this.queryAll(`SELECT session_id FROM sessions WHERE parent_session_id = ?
|
|
497
|
+
ORDER BY started_at ASC LIMIT ?`,[i,l]),c=[];for(let g of u){let b=this.get(f(g.session_id));if(b)c.push(b)}return c}delete(i,l=!1){let u=this.run("DELETE FROM sessions WHERE session_id = ?",[i]).changes??0;if(l)this.run("DELETE FROM sessions WHERE parent_session_id = ?",[i]);return u>0}}var yw=`
|
|
498
|
+
session_id AS sessionId,
|
|
499
|
+
source,
|
|
500
|
+
pid,
|
|
501
|
+
started_at AS startedAt,
|
|
502
|
+
ended_at AS endedAt,
|
|
503
|
+
exit_code AS exitCode,
|
|
504
|
+
status,
|
|
505
|
+
status_lock AS statusLock,
|
|
506
|
+
interactive,
|
|
507
|
+
provider,
|
|
508
|
+
model,
|
|
509
|
+
cwd,
|
|
510
|
+
workspace_root AS workspaceRoot,
|
|
511
|
+
team_name AS teamName,
|
|
512
|
+
enable_tools AS enableTools,
|
|
513
|
+
enable_spawn AS enableSpawn,
|
|
514
|
+
enable_teams AS enableTeams,
|
|
515
|
+
parent_session_id AS parentSessionId,
|
|
516
|
+
parent_agent_id AS parentAgentId,
|
|
517
|
+
agent_id AS agentId,
|
|
518
|
+
conversation_id AS conversationId,
|
|
519
|
+
is_subagent AS isSubagent,
|
|
520
|
+
prompt,
|
|
521
|
+
metadata_json AS metadata,
|
|
522
|
+
hook_path AS hookPath,
|
|
523
|
+
messages_path AS messagesPath,
|
|
524
|
+
updated_at AS updatedAt`;function vw(i){i.interactive=i.interactive===1,i.enableTools=i.enableTools===1,i.enableSpawn=i.enableSpawn===1,i.enableTeams=i.enableTeams===1,i.isSubagent=i.isSubagent===1;let l=i.metadata;if(typeof l==="string"&&l.trim())try{let u=JSON.parse(l);i.metadata=u&&typeof u==="object"&&!Array.isArray(u)?u:null}catch{i.metadata=null}else i.metadata=null;return i}function hp(i){if(!i||Object.keys(i).length===0)return null;return JSON.stringify(i)}async function $H(i){let l;try{l=await mT(i,"r"),await l.sync()}catch{}finally{if(l!==void 0)try{await l.close()}catch{}}}async function LH(i,l){await MH(Sw(i),{recursive:!0});let u=`${i}.${process.pid}.${PH()}.tmp`,c;try{c=await mT(u,"wx"),await c.writeFile(l,"utf8"),await c.sync(),await c.close(),c=void 0,await NH(u,i),await $H(Sw(i))}catch(g){if(c!==void 0)try{await c.close()}catch{}try{await OH(u,{force:!0})}catch{}throw g}}function DH(i){return typeof i==="object"&&i!==null&&"code"in i&&i.code==="ENOENT"}function UH(i){return i!=="."&&i!==".."&&!i.includes("/")&&!i.includes("\\")}function FH(i,l){return{sessionId:i.session_id,source:i.source,pid:i.pid,startedAt:i.started_at,endedAt:i.ended_at??null,exitCode:i.exit_code??null,status:i.status,statusLock:0,interactive:i.interactive,provider:i.provider,model:i.model,cwd:i.cwd,workspaceRoot:i.workspace_root,teamName:i.team_name??null,enableTools:i.enable_tools,enableSpawn:i.enable_spawn,enableTeams:i.enable_teams,parentSessionId:null,parentAgentId:null,agentId:null,conversationId:null,isSubagent:!1,prompt:i.prompt??null,metadata:i.metadata??null,hookPath:"",messagesPath:l,updatedAt:ct()}}class hT{adapter;messagesArtifactUploader;logger;artifacts;constructor(i,l,u){this.adapter=i,this.messagesArtifactUploader=l,this.logger=u,this.artifacts=new C0(()=>this.ensureSessionsDir())}ensureSessionsDir(){return this.adapter.ensureSessionsDir()}initializeMessagesFile(i,l,u){n1(l,u,Zy(i))}writeSessionManifest(i,l){ww(kw(i),{recursive:!0}),bw(i,`${JSON.stringify(vu.parse(l),null,2)}
|
|
525
|
+
`,"utf8")}readSessionManifest(i){return this.readManifestFile(i).manifest}async readSessionManifestTitle(i){let l=this.artifacts.sessionManifestPath(i,!1),u;try{u=await Iw(l,"utf8")}catch{return}try{let c=JSON.parse(u);if(!c||typeof c!=="object"||Array.isArray(c))return;let g=c.metadata;if(!g||typeof g!=="object"||Array.isArray(g))return;let b=g.title;return typeof b==="string"?b:void 0}catch{return}}readManifestFile(i){let l=this.artifacts.sessionManifestPath(i,!1);if(!AH(l))return{path:l};try{return{path:l,manifest:vu.parse(JSON.parse(xH(l,"utf8")))}}catch{return{path:l}}}readSessionRowFromManifest(i){if(!UH(i))return;let{manifest:l}=this.readManifestFile(i);if(!l||l.session_id!==i)return;return FH(l,this.artifacts.sessionMessagesPath(i))}async resolveSessionRow(i){let l=await this.adapter.getSession(i);if(l)return l;let u=this.readSessionRowFromManifest(i);if(!u)throw Error(`Cannot persist messages for unknown session: ${i}`);return await this.adapter.upsertSession(u),this.logger?.debug("Re-adopted session row from manifest",{sessionId:i}),u}async persistSessionMessages(i,l,u){let c=await this.resolveSessionRow(i),g=typeof c.messagesPath==="string"&&c.messagesPath.trim().length>0?c.messagesPath:this.artifacts.sessionMessagesPath(i),b=DS({updatedAt:ct(),context:Zy(c),messages:l,systemPrompt:u}),I=`${JSON.stringify(b,null,2)}
|
|
526
|
+
`;if(ww(kw(g),{recursive:!0}),bw(g,I,"utf8"),!this.messagesArtifactUploader)return;try{await this.messagesArtifactUploader.uploadMessagesFile({sessionId:i,path:g,contents:I,row:c})}catch(k){this.logger?.debug("Failed to upload persisted session messages",{sessionId:i,error:k})}}resolveCompactionPath(i){let{manifest:l}=this.readManifestFile(i);return l?.compaction_path?.trim()||this.artifacts.sessionCompactionPath(i)}updateCompactionPath(i,l){let u=this.readManifestFile(i);if(!u.manifest)return;if(u.manifest.compaction_path===l)return;this.writeSessionManifest(u.path,{...u.manifest,compaction_path:l})}async readSessionCompactionState(i){let l=this.resolveCompactionPath(i);try{return Zu(JSON.parse(await Iw(l,"utf8")))}catch(u){if(DH(u))return;this.logger?.debug("Ignoring invalid session compaction state",{sessionId:i,path:l,error:u,recovery:"Canonical history is unchanged; deleting the sidecar is safe."});return}}async persistSessionCompactionState(i,l){let u=this.resolveCompactionPath(i),c=Kh.parse(l);await LH(u,`${JSON.stringify(c,null,2)}
|
|
527
|
+
`),this.updateCompactionPath(i,u)}async deleteSessionCompactionState(i){await CH(this.resolveCompactionPath(i),{force:!0}),this.updateCompactionPath(i,void 0)}appendStaleSessionHookLog(i,l,u,c,g){let b=(process.env.CLINE_HOOKS_LOG_PATH?.trim()||void 0)??RH(et(),"hooks.jsonl");EH(b,`${JSON.stringify({ts:i,hookName:"session_shutdown",reason:c,sessionId:l,pid:u,source:g})}
|
|
528
|
+
`,"utf8")}}var fp=4;class ao{adapter;manifestStore;teamChildren;static STALE_REASON="failed_external_process_exit";static STALE_SOURCE="stale_session_reconciler";static TEAM_HEARTBEAT_LOG_INTERVAL_MS=30000;constructor(i,l={}){this.adapter=i,this.manifestStore=new hT(i,l.messagesArtifactUploader,l.logger),this.teamChildren=new O0(i,this.manifestStore,(u,c,g)=>this.toPersistedMessages(u,c,g),ao.TEAM_HEARTBEAT_LOG_INTERVAL_MS)}toPersistedMessages(i,l,u){if(!i)return;return l?$S(l.messages,l,u):_m(i)}ensureSessionsDir(){return this.manifestStore.ensureSessionsDir()}writeSessionManifest(i,l){this.manifestStore.writeSessionManifest(i,l)}readSessionManifest(i){return this.manifestStore.readSessionManifest(i)}async createRootSessionWithArtifacts(i){let l=i.startedAt??ct(),u=i.sessionId.trim(),c=u.length>0?u:`${Date.now()}_${R(5)}`,g=this.manifestStore.artifacts.sessionMessagesPath(c),b=this.manifestStore.artifacts.sessionCompactionPath(c),I=this.manifestStore.artifacts.sessionManifestPath(c),k=Em({metadata:wn(i.metadata,{mode:i.mode,version:i.version}),prompt:i.prompt}),T=i.status??"running",E=!Qt(T),A=E?i.endedAt??ct():void 0,C=E?i.exitCode??0:void 0,N={version:1,session_id:c,source:i.source,pid:i.pid,started_at:l,...A?{ended_at:A}:{},...C!==void 0?{exit_code:C}:{},status:T,interactive:i.interactive,provider:i.provider,model:i.model,cwd:i.cwd,workspace_root:i.workspaceRoot,team_name:i.teamName,enable_tools:i.enableTools,enable_spawn:i.enableSpawn,enable_teams:i.enableTeams,prompt:i.prompt?.trim()||void 0,metadata:k,messages_path:g},O={sessionId:c,source:i.source,pid:i.pid,startedAt:l,endedAt:A??null,exitCode:C??null,status:T,statusLock:0,interactive:i.interactive,provider:i.provider,model:i.model,cwd:i.cwd,workspaceRoot:i.workspaceRoot,teamName:i.teamName??null,enableTools:i.enableTools,enableSpawn:i.enableSpawn,enableTeams:i.enableTeams,parentSessionId:null,parentAgentId:null,agentId:null,conversationId:null,isSubagent:!1,prompt:N.prompt??null,metadata:Vs(N.metadata),hookPath:"",messagesPath:g,updatedAt:ct()};return await this.adapter.upsertSession(O),this.manifestStore.initializeMessagesFile(O,g,l),this.manifestStore.writeSessionManifest(I,N),{manifestPath:I,messagesPath:g,compactionPath:b,manifest:N}}async updateSessionStatus(i,l,u){let c;if((await a1(()=>this.adapter.getSession(i),async(g)=>(c=Qt(l)?void 0:ct(),this.adapter.updateSession({sessionId:i,status:l,endedAt:c??null,exitCode:Qt(l)?null:typeof u==="number"?u:null,expectedStatusLock:g.statusLock})),fp)).updated){if(l==="cancelled")await this.teamChildren.applyStatusToRunningChildSessions(i,"cancelled");return{updated:!0,endedAt:c}}return{updated:!1}}async updateSession(i){for(let l=0;l<fp;l++){let u=await this.adapter.getSession(i.sessionId);if(!u)return{updated:!1};let c=u.metadata??void 0,g=i.metadata!==void 0?Vs(i.metadata)??{}:Vs(c)??{},b=Oo(typeof c?.title==="string"?c.title:void 0),I=i.title!==void 0?Oo(i.title):b??LS(i.prompt);if(I)g.title=I;else delete g.title;let k=i.metadata!==void 0||i.prompt!==void 0||i.title!==void 0;if(!(await this.adapter.updateSession({sessionId:i.sessionId,prompt:i.prompt,metadata:k?Object.keys(g).length>0?g:null:void 0,title:I,expectedStatusLock:u.statusLock})).updated)continue;let{path:T,manifest:E}=this.manifestStore.readManifestFile(i.sessionId);if(E){if(i.prompt!==void 0)E.prompt=i.prompt??void 0;let A=i.metadata!==void 0?Vs(i.metadata)??{}:Vs(E.metadata)??{};if(I)A.title=I;return E.metadata=Object.keys(A).length>0?JSON.parse(JSON.stringify(A)):void 0,this.manifestStore.writeSessionManifest(T,E),{updated:!0,metadata:E.metadata??null}}return{updated:!0}}return{updated:!1}}queueSpawnRequest(i){return this.teamChildren.queueSpawnRequest(i)}upsertSubagentSession(i){return this.teamChildren.upsertSubagentSession(i)}upsertSubagentSessionFromHook(i){return this.teamChildren.upsertSubagentSessionFromHook(i)}appendSubagentHookAudit(i,l){return this.teamChildren.appendSubagentHookAudit(l),Promise.resolve()}persistSessionMessages(i,l,u){let c=_m(l);return this.manifestStore.persistSessionMessages(i,c,u)}async readSessionCompactionState(i){return await this.manifestStore.readSessionCompactionState(i)}async persistSessionCompactionState(i,l){await this.manifestStore.persistSessionCompactionState(i,l)}async deleteSessionCompactionState(i){await this.manifestStore.deleteSessionCompactionState(i)}applySubagentStatus(i,l){return this.teamChildren.applySubagentStatus(i,l)}applySubagentStatusBySessionId(i,l){return this.teamChildren.applySubagentStatusBySessionId(i,l)}applyStatusToRunningChildSessions(i,l){return this.teamChildren.applyStatusToRunningChildSessions(i,l)}onTeamTaskStart(i,l,u){return this.teamChildren.onTeamTaskStart(i,l,u)}onTeamTaskEnd(i,l,u,c,g,b){return this.teamChildren.onTeamTaskEnd(i,l,u,c,g,b)}onTeamTaskProgress(i,l,u,c){return this.teamChildren.onTeamTaskProgress(i,l,u,c)}handleSubAgentStart(i,l){return this.teamChildren.handleSubAgentStart(i,l)}handleSubAgentEnd(i,l){return this.teamChildren.handleSubAgentEnd(i,l)}isPidAlive(i){if(!Number.isFinite(i)||i<=0)return!1;try{return process.kill(Math.floor(i),0),!0}catch(l){return typeof l==="object"&&l!==null&&"code"in l&&l.code==="EPERM"}}async reconcileDeadRunningSession(i){if(Qt(i.status)===!1||this.isPidAlive(i.pid))return i;let l=ct(),u=ao.STALE_REASON;for(let c=0;c<fp;c++){let g=await this.adapter.getSession(i.sessionId);if(!g)return;if(Qt(g.status)===!1)return g;let b={...g.metadata??{},terminal_marker:u,terminal_marker_at:l,terminal_marker_pid:g.pid,terminal_marker_source:ao.STALE_SOURCE},I=await this.adapter.updateSession({sessionId:g.sessionId,status:"failed",endedAt:l,exitCode:1,metadata:b,expectedStatusLock:g.statusLock});if(!I.updated)continue;await this.teamChildren.applyStatusToRunningChildSessions(g.sessionId,"failed");let k=o1(g,{status:"failed",endedAt:l,exitCode:1,metadata:b}),{path:T}=this.manifestStore.readManifestFile(g.sessionId);return this.manifestStore.writeSessionManifest(T,k),this.manifestStore.appendStaleSessionHookLog(l,g.sessionId,g.pid,u,ao.STALE_SOURCE),{...g,status:"failed",endedAt:l,exitCode:1,metadata:b,statusLock:I.statusLock,updatedAt:l}}return await this.adapter.getSession(i.sessionId)}async listSessions(i=200,l={}){let u=Math.max(1,Math.floor(i)),c=Math.min(u*5,2000);await this.reconcileDeadSessions(c);let g=(await this.adapter.listSessions({limit:c,rootOnly:l.rootOnly})).slice(0,u),b=await Promise.all(g.map((I)=>this.manifestStore.readSessionManifestTitle(I.sessionId)));return g.map((I,k)=>{let T=Vs(I.metadata??void 0),E=Oo(b[k]),A=E?{...T??{},title:E}:T;return{...I,metadata:A}})}async listSessionMetadata(i=Number.MAX_SAFE_INTEGER){return(await this.adapter.listSessions({limit:Math.max(1,Math.floor(i))})).map((l)=>({sessionId:l.sessionId,metadata:Vs(l.metadata??void 0)}))}async reconcileDeadSessions(i=2000){let l=Math.max(1,Math.floor(i)),u=(await Promise.all(["idle","running","pending"].map((g)=>this.adapter.listSessions({limit:l,status:g})))).flat(),c=0;for(let g of u){let b=await this.reconcileDeadRunningSession(g);if(b&&b.status!==g.status)c++}return c}async deleteSession(i){let l=i.trim();if(!l)throw Error("session id is required");let u=await this.adapter.getSession(l),c=u??this.manifestStore.readSessionRowFromManifest(l);if(!c)return{deleted:!1};if(await this.adapter.deleteSession(l,!1),!c.isSubagent){let g=await this.adapter.listSessions({limit:2000,parentSessionId:l});await this.adapter.deleteSession(l,!0),await Promise.allSettled(g.map(async(b)=>{await yv(b.cwd,b.sessionId),gd(b.messagesPath),await this.deleteSessionCompactionStateIfExists(b.sessionId),gd(this.manifestStore.artifacts.sessionManifestPath(b.sessionId,!1)),this.manifestStore.artifacts.removeSessionDirIfEmpty(b.sessionId)}))}if(!u)return this.manifestStore.artifacts.removeSessionDir(l),{deleted:!0};if(await yv(c.cwd,l),gd(c.messagesPath),await this.deleteSessionCompactionStateIfExists(l),gd(this.manifestStore.artifacts.sessionManifestPath(l,!1)),c.isSubagent)this.manifestStore.artifacts.removeSessionDirIfEmpty(l);else{let g=new Set([this.manifestStore.artifacts.sessionArtifactsDir(l)]);for(let b of[c.messagesPath])if(typeof b==="string"&&b.trim().length>0)g.add(_H(b));for(let b of g)this.manifestStore.artifacts.removeDir(b)}return{deleted:!0}}async deleteSessionCompactionStateIfExists(i){try{await this.manifestStore.deleteSessionCompactionState(i)}catch{}}}class fT{store;sessionsDirPath;constructor(i,l=Ve()){this.store=i,this.sessionsDirPath=l}ensureSessionsDir(){if(!SH(this.sessionsDirPath))TH(this.sessionsDirPath,{recursive:!0});return this.sessionsDirPath}async upsertSession(i){this.store.run(`INSERT OR REPLACE INTO sessions (
|
|
529
|
+
session_id, source, pid, started_at, ended_at, exit_code, status, status_lock, interactive,
|
|
530
|
+
provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
|
|
531
|
+
parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
|
|
532
|
+
metadata_json, transcript_path, hook_path, messages_path, updated_at
|
|
533
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[i.sessionId,i.source,i.pid,i.startedAt,i.endedAt??null,i.exitCode??null,i.status,i.statusLock,i.interactive?1:0,i.provider,i.model,i.cwd,i.workspaceRoot,i.teamName??null,i.enableTools?1:0,i.enableSpawn?1:0,i.enableTeams?1:0,i.parentSessionId??null,i.parentAgentId??null,i.agentId??null,i.conversationId??null,i.isSubagent?1:0,i.prompt??null,hp(i.metadata),"",i.hookPath??"",i.messagesPath??null,i.updatedAt])}async getSession(i){let l=this.store.queryOne(`SELECT ${yw} FROM sessions WHERE session_id = ?`,[i]);return l?vw(l):void 0}async listSessions(i){let l=[],u=[];if(i.parentSessionId)l.push("parent_session_id = ?"),u.push(i.parentSessionId);if(i.rootOnly)l.push("is_subagent = 0 AND (parent_session_id IS NULL OR parent_session_id = '')");if(i.status)l.push("status = ?"),u.push(i.status);let c=l.length>0?`WHERE ${l.join(" AND ")}`:"";return this.store.queryAll(`SELECT ${yw}
|
|
534
|
+
FROM sessions
|
|
535
|
+
${c}
|
|
536
|
+
ORDER BY started_at DESC
|
|
537
|
+
LIMIT ?`,[...u,i.limit]).map(vw)}async updateSession(i){if(i.setRunning){if(i.expectedStatusLock===void 0)return{updated:!1,statusLock:0};return{updated:(this.store.run(`UPDATE sessions
|
|
538
|
+
SET status = 'running', ended_at = NULL, exit_code = NULL, updated_at = ?, status_lock = ?,
|
|
539
|
+
parent_session_id = ?, parent_agent_id = ?, agent_id = ?, conversation_id = ?, is_subagent = 1,
|
|
540
|
+
prompt = COALESCE(prompt, ?), metadata_json = ?
|
|
541
|
+
WHERE session_id = ? AND status_lock = ?`,[ct(),i.expectedStatusLock+1,i.parentSessionId??null,i.parentAgentId??null,i.agentId??null,i.conversationId??null,i.prompt??null,hp(i.metadata),i.sessionId,i.expectedStatusLock]).changes??0)>0,statusLock:i.expectedStatusLock+1}}let l=[],u=[];if(i.status!==void 0)l.push("status = ?"),u.push(i.status);if(i.endedAt!==void 0)l.push("ended_at = ?"),u.push(i.endedAt);if(i.exitCode!==void 0)l.push("exit_code = ?"),u.push(i.exitCode);if(i.prompt!==void 0)l.push("prompt = ?"),u.push(i.prompt??null);if(i.metadata!==void 0)l.push("metadata_json = ?"),u.push(hp(i.metadata));if(i.parentSessionId!==void 0)l.push("parent_session_id = ?"),u.push(i.parentSessionId??null);if(i.parentAgentId!==void 0)l.push("parent_agent_id = ?"),u.push(i.parentAgentId??null);if(i.agentId!==void 0)l.push("agent_id = ?"),u.push(i.agentId??null);if(i.conversationId!==void 0)l.push("conversation_id = ?"),u.push(i.conversationId??null);if(l.length===0){let b=await this.getSession(i.sessionId);return{updated:!!b,statusLock:b?.statusLock??0}}let c=0;if(i.expectedStatusLock!==void 0)c=i.expectedStatusLock+1,l.push("status_lock = ?"),u.push(c);l.push("updated_at = ?"),u.push(ct());let g=`UPDATE sessions SET ${l.join(", ")} WHERE session_id = ?`;if(u.push(i.sessionId),i.expectedStatusLock!==void 0)g+=" AND status_lock = ?",u.push(i.expectedStatusLock);if((this.store.run(g,u).changes??0)===0)return{updated:!1,statusLock:0};if(i.expectedStatusLock===void 0)c=(await this.getSession(i.sessionId))?.statusLock??0;return{updated:!0,statusLock:c}}async deleteSession(i,l){let u=this.store.run("DELETE FROM sessions WHERE session_id = ?",[i]).changes??0;if(l)this.store.run("DELETE FROM sessions WHERE parent_session_id = ?",[i]);return u>0}async enqueueSpawnRequest(i){this.store.run(`INSERT INTO subagent_spawn_queue (root_session_id, parent_agent_id, task, system_prompt, created_at, consumed_at)
|
|
542
|
+
VALUES (?, ?, ?, ?, ?, NULL)`,[i.rootSessionId,i.parentAgentId,i.task??null,i.systemPrompt??null,ct()])}async claimSpawnRequest(i,l){let u=this.store.queryOne(`SELECT id, task FROM subagent_spawn_queue
|
|
543
|
+
WHERE root_session_id = ? AND parent_agent_id = ? AND consumed_at IS NULL
|
|
544
|
+
ORDER BY id ASC LIMIT 1`,[i,l]);if(!u||typeof u.id!=="number")return;return this.store.run("UPDATE subagent_spawn_queue SET consumed_at = ? WHERE id = ?",[ct(),u.id]),u.task??void 0}}class _f extends ao{store;constructor(i,l={}){super(new fT(i,l.sessionArtifactsDir),l);this.store=i}createRootSession(i){this.store.run(`INSERT OR REPLACE INTO sessions (
|
|
545
|
+
session_id, source, pid, started_at, ended_at, exit_code, status, status_lock, interactive,
|
|
546
|
+
provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
|
|
547
|
+
parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
|
|
548
|
+
metadata_json, transcript_path, hook_path, messages_path, updated_at
|
|
549
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[i.sessionId,i.source,i.pid,i.startedAt,null,null,"running",0,i.interactive?1:0,i.provider,i.model,i.cwd,i.workspaceRoot,i.teamName??null,i.enableTools?1:0,i.enableSpawn?1:0,i.enableTeams?1:0,null,null,null,null,0,i.prompt??null,i.metadata?JSON.stringify(i.metadata):null,"","",i.messagesPath,ct()])}}function qH(i){return{text:i.text,usage:i.usage,inputTokens:i.usage.inputTokens,outputTokens:i.usage.outputTokens,iterations:i.iterations,finishReason:i.finishReason,toolCalls:i.toolCalls.map((l)=>({name:l.name,input:l.input,output:l.output,error:l.error,durationMs:l.durationMs}))}}function jH(i){return i.mode==="plan"?"plan":i.mode==="yolo"?"yolo":"act"}function BH(i={}){let l=async(c)=>c,u=new Sf({sessionService:new _f(new Tf),capabilities:{toolExecutors:{submit:l}},fetch:i.fetch,connectorsRequest:i.connectorsRequest,telemetry:i.telemetry});return{async startSession(c,g){let b=(c.cwd?.trim()||c.workspaceRoot).trim(),I=await u.startSession({source:jr.CORE,mode:"automation",sessionMetadata:wn(g?.sessionMetadata,{mode:"automation",trigger:c.source}),interactive:!1,config:{providerId:K(c.provider),modelId:c.model,apiKey:c.apiKey?.trim()||void 0,cwd:b,workspaceRoot:c.workspaceRoot,systemPrompt:c.systemPrompt??"",mode:jH(c),maxIterations:c.maxIterations,enableTools:c.enableTools!==!1,enableSpawnAgent:c.enableSpawn!==!1,enableAgentTeams:c.enableTeams!==!1,disableMcpSettingsTools:c.disableMcpSettingsTools,agentPluginPaths:c.agentPluginPaths,missionLogIntervalSteps:c.missionStepInterval,missionLogIntervalMs:c.missionTimeIntervalMs},toolPolicies:c.toolPolicies??{"*":{autoApprove:c.autoApproveTools!==!1}},localRuntime:{configExtensions:c.configExtensions}});return{sessionId:I.sessionId,startResult:{sessionId:I.sessionId,manifestPath:I.manifestPath,messagesPath:I.messagesPath}}},async sendSession(c,g){let b=await u.runTurn({sessionId:c,prompt:g.prompt,userImages:g.attachments?.userImages,userFiles:g.attachments?.userFiles?.map((I)=>I.content)});if(!b)throw Error("local hub schedule runtime returned no turn result");return{result:qH(b)}},async abortSession(c){return await u.abort(c,Error("hub schedule abort")),{applied:!0}},async stopSession(c){return await u.stopSession(c),{applied:!0}}}}var HH="CLINE_HUB_HOST",zH="CLINE_HUB_PORT",WH="CLINE_HUB_PATHNAME",KH="127.0.0.1",GH=Fn,XH="/hub";function Tw(i){return re(i)==="development"?jn:GH}function JH(i={}){return(i.env??process.env)[HH]?.trim()||KH}function gT(i={}){let l=(i.env??process.env)[zH]?.trim();if(!l)return Tw(i);let u=Number.parseInt(l,10);if(!Number.isInteger(u)||u<1||u>65535)return Tw(i);return u}function VH(i={}){return(i.env??process.env)[WH]?.trim()||XH}function yT(i={},l={}){return{host:i.host??JH(l),port:i.port??gT(l),pathname:i.pathname??VH(l)}}var tz=3;class vT extends Error{lockFile;constructor(i){super(`Hub instance lock is held by a live Hub: ${i}. Connect to the running Hub or diagnose it; never replace it.`);this.name="HubLockHeldError",this.lockFile=i}}function Ef(i){return i instanceof Error&&i.name==="HubLockHeldError"}function rz(i){return`${i}.instance.lock`}class $l{db;lockFile;constructor(i,l){this.lockFile=i,this.db=l}get held(){return this.db!==void 0}release(){let i=this.db;if(!i)return;this.db=void 0;try{i.exec("ROLLBACK;")}catch{}i.close?.()}static acquire(i){let l=!1,u;try{ZH(ez(i),{recursive:!0}),l=QH(i),u=V(i)}catch{return new $l(i,void 0)}try{u.exec("PRAGMA busy_timeout = 0;"),u.exec("BEGIN EXCLUSIVE;")}catch(c){if(u.close?.(),sz(c))throw new vT(i);return new $l(i,void 0)}if(!l)try{YH(i,384)}catch{}return new $l(i,u)}}function sz(i){let l=i instanceof Error?i.message:String(i),u=i?.code;return u==="SQLITE_BUSY"||u==="SQLITE_LOCKED"||l.includes("SQLITE_BUSY")||l.includes("SQLITE_LOCKED")||l.includes("database is locked")}var lz="CLINE_HUB_DISCOVERY_PATH",dz="CLINE_HUB_BUILD_ID",uz="CLINE_HUB_BUILD_EPOCH_MS",cz=30000,pz=15000,Ew=100;function mz(i){return i.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function hz(i){return nz("sha256").update(i).digest("hex").slice(0,12)}function fz(i){if(!Number.isInteger(i)||!i||i<=0)return!1;try{return process.kill(i,0),!0}catch(l){return l instanceof Error&&"code"in l?String(l.code)==="EPERM":!1}}function gz(){return wT(32).toString("hex")}function Aw(i){return new Promise((l)=>setTimeout(l,i))}function yz(i){return`${i}.lock`}async function vz(i){try{let l=JSON.parse(await bT(Af(i,"owner.json"),"utf8"));if(typeof l.pid!=="number"||typeof l.acquiredAt!=="string")return;return{pid:l.pid,acquiredAt:l.acquiredAt}}catch{return}}async function gp(i){await pc(i,{recursive:!0,force:!0}).catch(()=>{return})}function Qo(){let i=process.env[dz]?.trim();if(i)return i;return"sdk-v1-2575e46ceecd35cbe25f0581cea02b42a151c34df1a966c1737aaaf88a5350c7".trim()||`source-${String(zl.version)}`}function kT(){let i=Number(process.env[uz]);if(Number.isFinite(i)&&i>0)return i;return Number.isFinite(1792985554353)?1792985554353:void 0}function ST(i,l=Qo()){let u=Mt(i);if(!u.compatible)return u;let c=i.buildId?.trim();if(!c)return{compatible:!1,reason:"missing_build"};if(c!==l)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function xw(i){return typeof i==="number"&&Number.isFinite(i)&&i>0?i:void 0}function Cw(i){let l=i?.trim().split(/[-+]/,1)[0];if(!l)return;let u=l.split(".").map((c)=>Number(c));if(u.length===0||u.some((c)=>!Number.isInteger(c)||c<0))return;return u}function wz(i,l){for(let u=0;u<Math.max(i.length,l.length);u++){let c=i[u]??0,g=l[u]??0;if(c!==g)return c<g?-1:1}return 0}function bz(i,l){let u=i.buildId?.trim(),c=l.buildId?.trim();if(u&&c&&u===c)return 0;let g=xw(i.buildEpochMs),b=xw(l.buildEpochMs);if(g!==void 0&&b!==void 0&&g!==b)return g<b?-1:1;let I=Cw(i.coreVersion),k=Cw(l.coreVersion);if(I&&k){let T=wz(I,k);if(T!==0)return T}if(u&&c&&u!==c)return u<c?-1:1;return 0}function Iz(){return{buildId:Qo(),buildEpochMs:kT(),coreVersion:String(zl.version)}}function TT(i,l){let u=l?.self??Iz(),c=ST(i,u.buildId??"");if(c.compatible)return!0;if(c.reason!=="build_mismatch"&&c.reason!=="missing_build")return!1;return bz(u,i)<=0}function _T(i=process.argv[1]?.trim()||process.cwd()){let l=`hub-${hz(i)}`,u=process.env[lz]?.trim()||Af(Z(),"locks","hub","owners",`${mz(l)}.json`);return{ownerId:l,discoveryPath:u}}async function jo(i,l={}){try{let u;try{u=await bT(i,"utf8")}catch(g){if(g.code==="ENOENT")return;throw g}let c;try{c=JSON.parse(u)}catch{throw Error(`Invalid JSON in Hub discovery record: ${i}`)}if(!c||typeof c.hubId!=="string"||typeof c.protocolVersion!=="string"||typeof c.authToken!=="string"||typeof c.host!=="string"||typeof c.port!=="number"||typeof c.url!=="string"||typeof c.startedAt!=="string"||typeof c.updatedAt!=="string")throw Error(`Invalid Hub discovery record: ${i}`);return{hubId:c.hubId,protocolVersion:c.protocolVersion,minClientProtocolVersion:typeof c.minClientProtocolVersion==="string"?c.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof c.maxClientProtocolVersion==="string"?c.maxClientProtocolVersion:void 0,capabilities:Array.isArray(c.capabilities)?c.capabilities.filter((g)=>typeof g==="string"):void 0,coreVersion:typeof c.coreVersion==="string"?c.coreVersion:void 0,buildId:typeof c.buildId==="string"?c.buildId:void 0,buildEpochMs:typeof c.buildEpochMs==="number"?c.buildEpochMs:void 0,authToken:c.authToken,host:c.host,port:c.port,url:c.url,pid:typeof c.pid==="number"?c.pid:void 0,startedAt:c.startedAt,updatedAt:c.updatedAt}}catch(u){if(l.onError==="throw")throw u;return}}async function ET(i,l){await xf(i,async()=>{let u=IT(i);await Vm(u,{recursive:!0});let c=`${i}.${process.pid}.${wT(6).toString("hex")}.tmp`,g;try{g=await _w(c,"wx",384),await g.writeFile(`${JSON.stringify(l,null,2)}
|
|
550
|
+
`,{encoding:"utf8"}),await g.sync(),await g.close(),g=void 0,await oz(c,i);let b;try{b=await _w(u,"r"),await b.sync()}catch{}finally{await b?.close().catch(()=>{return})}}catch(b){throw await g?.close().catch(()=>{return}),await pc(c,{force:!0}).catch(()=>{return}),b}})}async function mc(i){await xf(i,async()=>{await pc(i,{force:!0}).catch(()=>{return})})}async function kz(i,l){return await xf(i,async()=>{if((await jo(i))?.hubId!==l)return!1;return await pc(i,{force:!0}),!0})}async function AT(i,l,u){let c=yz(i);await Vm(IT(c),{recursive:!0});let g=Date.now()+pz;while(!0){try{await Vm(c,{recursive:!1})}catch(b){if((b instanceof Error&&"code"in b?String(b.code):"")!=="EEXIST")throw b;let I=await vz(c);if(!I){if(Date.now()>=g){await gp(c);continue}await Aw(Ew);continue}let k=Date.now()-Date.parse(I.acquiredAt);if(!fz(I.pid)||k>cz){await gp(c);continue}if(Date.now()>=g)throw Error(`Timed out waiting for hub ${l} lock ${c}`);await Aw(Ew);continue}try{return await az(Af(c,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
|
|
551
|
+
`,"utf8"),await u()}finally{await gp(c)}}}function xf(i,l){return AT(`${i}.mutation`,"discovery mutation",l)}function Sz(i,l){return AT(i,"startup",l)}async function Cf(i,l){Xe();try{let u=await fetch(l?.authToken?Tz(i):xT(i),{headers:l?.authToken?{authorization:`Bearer ${l.authToken}`}:void 0,signal:l?.signal});if(!u.ok)return;let c=await u.json();if(typeof c.protocolVersion!=="string"||typeof c.host!=="string"||typeof c.port!=="number"||typeof c.url!=="string")return;return{protocolVersion:c.protocolVersion,minClientProtocolVersion:typeof c.minClientProtocolVersion==="string"?c.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof c.maxClientProtocolVersion==="string"?c.maxClientProtocolVersion:void 0,capabilities:Array.isArray(c.capabilities)?c.capabilities.filter((g)=>typeof g==="string"):void 0,coreVersion:typeof c.coreVersion==="string"?c.coreVersion:void 0,buildId:typeof c.buildId==="string"?c.buildId:void 0,buildEpochMs:typeof c.buildEpochMs==="number"?c.buildEpochMs:void 0,host:c.host,port:c.port,url:c.url,hubId:typeof c.hubId==="string"?c.hubId:void 0,authToken:typeof c.authToken==="string"?c.authToken:void 0,pid:typeof c.pid==="number"?c.pid:void 0,startedAt:typeof c.startedAt==="string"?c.startedAt:void 0,updatedAt:typeof c.updatedAt==="string"?c.updatedAt:void 0}}catch{return}}function $u(i,l,u="/hub"){return new URL(`ws://${i}:${l}${u}`).toString()}function xT(i){let l=new URL(i);return l.protocol=l.protocol==="wss:"?"https:":"http:",l.pathname="/health",l.search="",l.toString()}function Tz(i){let l=new URL(xT(i));return l.pathname="/status",l.toString()}var _z="shared:cline",Ez="CLINE_HUB_DISCOVERY_PATH",Az="hub-production";function hc(i=_z){return _T(`${i}@${Qo()}`)}function Rf(){return{ownerId:Az,discoveryPath:process.env[Ez]?.trim()||iz(Z(),"locks","hub","production.json")}}function xz(i){if(typeof i==="string")return i.trim()||void 0;if(!Array.isArray(i))return;return i.map((l)=>{if(l&&typeof l==="object"&&"type"in l&&l.type==="text"&&"text"in l&&typeof l.text==="string")return l.text.trim();return""}).filter(Boolean).join(`
|
|
552
|
+
`).trim()||void 0}var Rw=120,yp="...";function Cz(i){let l=i.trim();if(!l)return"";if(Buffer.byteLength(l,"utf8")<=Rw)return l;let u=Rw-Buffer.byteLength(yp,"utf8");if(u<=0)return yp;let c="";for(let g of l){if(Buffer.byteLength(c+g,"utf8")>u)break;c+=g}return`${c}${yp}`}async function Rz(i){let l=i?.sessionId?.trim()||"unknown",u=typeof i?.metadata?.messagesPath==="string"?i.metadata.messagesPath:void 0,c=[...await Jd(u)].reverse().find((k)=>k.role==="assistant"),g=c?xz(c.content):void 0,b=i?.workspaceRoot?.trim()||"workspace",I=typeof i?.metadata?.prompt==="string"?i.metadata.prompt.trim():b;return{title:`Task completed (${l})`,body:Cz(g&&g.length>0?g:I.length>0?I:b),severity:"info"}}function Gl(i){return!!i&&typeof i==="object"&&!Array.isArray(i)}function wp(i){let l=i?.trim();return l?l:void 0}function Pz(i,l){let u=i?.trim();if(!u)return l;let c=Date.parse(u);if(!Number.isFinite(c))return l;return new Date(c).toISOString()}function Pw(i,l){return new Date(new Date(i).getTime()+Math.max(0,Math.floor(l))*1000).toISOString()}function Mw(i,l){return new Date(new Date(i).getTime()-Math.max(0,Math.floor(l))*1000).toISOString()}function Mz(i,l){if(!i)return l;return new Date(i).getTime()>=new Date(l).getTime()?i:l}function Nz(i,l){let u=i.eventId.trim(),c=i.eventType.trim(),g=i.source.trim(),b=wp(i.subject),I=wp(i.dedupeKey)??`${c}:${g}:${b??u}`;return{eventId:u,eventType:c,source:g,subject:b,occurredAt:Pz(i.occurredAt,l),workspaceRoot:wp(i.workspaceRoot),payload:Gl(i.payload)?i.payload:void 0,attributes:Gl(i.attributes)?i.attributes:void 0,dedupeKey:I}}function bp(i,l){if(!l)return;let u=l.split("."),c=i;for(let g of u){if(!Gl(c))return;c=c[g]}return c}function Oz(i,l){if(i.attributes&&Object.hasOwn(i.attributes,l))return i.attributes[l];if(i.payload&&Object.hasOwn(i.payload,l))return i.payload[l];let u={eventId:i.eventId,eventType:i.eventType,source:i.source,subject:i.subject,occurredAt:i.occurredAt,workspaceRoot:i.workspaceRoot,dedupeKey:i.dedupeKey,attributes:i.attributes,payload:i.payload},c=bp(u,l);if(c!==void 0)return c;if(i.attributes){let g=bp(i.attributes,l);if(g!==void 0)return g}if(i.payload)return bp(i.payload,l);return}function Vd(i,l){if(Array.isArray(l))return l.some((u)=>Vd(i,u));if(Array.isArray(i))return i.some((u)=>Vd(u,l));if(Gl(l)){if(!Gl(i))return!1;return Object.entries(l).every(([u,c])=>Vd(i[u],c))}return Object.is(i,l)}function $z(i,l){if(!l||Object.keys(l).length===0)return!0;return Object.entries(l).every(([u,c])=>Vd(Oz(i,u),c))}class CT{store;nowFn;logger;constructor(i){this.store=i.store,this.nowFn=i.now??(()=>Date.now()),this.logger=i.logger}ingestEvent(i){let l=new Date(this.nowFn()).toISOString(),u=Nz(i,l);try{let c=this.store.eventTransaction(()=>this.materializeEvent(u,l));return this.logger?.debug(c.duplicate?"cron.event.duplicate":"cron.event.processed",{eventId:c.event.eventId,eventType:c.event.eventType,source:c.event.source,status:c.event.processingStatus,matchedSpecCount:c.event.matchedSpecCount,queuedRunCount:c.event.queuedRunCount}),c}catch(c){throw this.logger?.error?.("cron.event.failed",{eventId:u.eventId,eventType:u.eventType,error:c}),c}}materializeEvent(i,l){let u=this.store.insertEventLog(i,{receivedAtIso:l});if(!u.created)return{event:u.record,duplicate:!0,matchedSpecs:[],queuedRuns:[],suppressions:[{reason:"duplicate_event",dedupeKey:u.record.dedupeKey}]};let c=this.store.listEventSpecsForType(i.eventType),g=[],b=[],I=[];for(let T of c){if(!$z(i,T.filters)){g.push({specId:T.specId,externalId:T.externalId,reason:"filter_mismatch",dedupeKey:i.dedupeKey});continue}b.push(T);let E=this.materializeForSpec(T,i,u.record.receivedAt);if(E.run)I.push(E.run);else g.push({specId:T.specId,externalId:T.externalId,reason:E.reason,dedupeKey:i.dedupeKey})}let k=b.length===0?"unmatched":I.length>0?"queued":"suppressed";return this.store.updateEventLogProcessing(u.record.eventId,{status:k,matchedSpecCount:b.length,queuedRunCount:I.length,suppressedCount:g.filter((T)=>T.reason!=="filter_mismatch").length}),{event:this.store.getEventLog(u.record.eventId)??u.record,duplicate:!1,matchedSpecs:b,queuedRuns:I,suppressions:g}}materializeForSpec(i,l,u){let c=l.dedupeKey??l.eventId,g=i.debounceSeconds??0;if(g>0){let k=this.store.findQueuedEventRunForDedupe({specId:i.specId,dedupeKey:c});if(k){let T=Mz(k.scheduledFor,Pw(u,g)),E=this.store.updateQueuedEventRunForDebounce({runId:k.runId,triggerEventId:l.eventId,scheduledFor:T});if(E)return{run:E,reason:"dedupe_window"}}}let b=i.dedupeWindowSeconds??0;if(b>0&&this.store.hasRecentEventRunForDedupe({specId:i.specId,dedupeKey:c,sinceIso:Mw(u,b)}))return{reason:"dedupe_window"};let I=i.cooldownSeconds??0;if(I>0&&this.store.hasRecentEventRunForSpec({specId:i.specId,sinceIso:Mw(u,I)}))return{reason:"cooldown"};return{run:this.store.enqueueRun({specId:i.specId,specRevision:i.revision,triggerKind:"event",triggerEventId:l.eventId,scheduledFor:g>0?Pw(u,g):u}),reason:"dedupe_window"}}}class Pf{store;nowFn;constructor(i){this.store=i.store,this.nowFn=i.now??(()=>Date.now())}materializeAll(){let i={oneOffQueued:0,scheduleQueued:0},l=this.store.listSpecs({triggerKind:"one_off",enabled:!0,parseStatus:"valid"});for(let c of l)if(this.materializeOneOff(c))i.oneOffQueued+=1;let u=this.store.listSpecs({triggerKind:"schedule",enabled:!0,parseStatus:"valid"});for(let c of u)try{if(this.materializeSchedule(c))i.scheduleQueued+=1}catch{}return i}materializeOneOff(i){if(i.triggerKind!=="one_off")return!1;if(!i.enabled||i.removed)return!1;if(this.store.hasConsumedOneOffRevision(i.specId,i.revision))return!1;return this.store.enqueueRun({specId:i.specId,specRevision:i.revision,triggerKind:"one_off",scheduledFor:i.nextRunAt??new Date(this.nowFn()).toISOString()}),!0}materializeSchedule(i){if(i.triggerKind!=="schedule")return!1;if(!i.enabled||i.removed)return!1;if(!i.scheduleExpr)return!1;return this.store.materializeDueScheduleRun({specId:i.specId,nowMs:this.nowFn()}).queued}}function Ys(i){if(/[:#\n]/.test(i)||i.includes('"'))return JSON.stringify(i);return i}function Ur(i,l){if(l===void 0||l===null)return;return`${i}: ${Ys(l)}`}function PT(i){let l=0;for(let c of i.matchAll(/`+/g))l=Math.max(l,c[0].length);let u="`".repeat(Math.max(3,l+1));return`${u}
|
|
553
|
+
${i}
|
|
554
|
+
${u}`}function qz(i){return i.replace(/[\r\n\u2028\u2029]+/g," ").replace(/[\\`*_[\]{}()#+\-.!<>|]/g,"\\$&")}function jz(i,l){if(i.source==="hub-schedule")return{kind:"database",label:`managed schedule \`${i.externalId}\` stored in cron.db (edit via the schedule tools/UI, not a file)`};let u=Fz(i.sourcePath)?i.sourcePath:RT(Nt(l),i.sourcePath);return{kind:"file",path:u,label:u}}function Ym(i){if(i<1000)return`${i}ms`;let l=i/1000;if(l<60)return`${l.toFixed(1)}s`;let u=Math.round(l),c=Math.floor(u/60),g=u%60;return`${c}m ${g}s`}function Nw(i){if(i.triggerKind==="one_off")return"one-time run";if(i.scheduleExpr)return i.timezone?`\`${i.scheduleExpr}\` (${i.timezone})`:`\`${i.scheduleExpr}\``;if(i.eventType)return`on event \`${i.eventType}\``;return}function Bz(i,l,u,c){let g=[`runId: ${Ys(i.runId)}`,`specId: ${Ys(l.specId)}`,`scheduleId: ${Ys(l.externalId)}`,`title: ${Ys(l.title)}`,`triggerKind: ${Ys(i.triggerKind)}`,`status: ${Ys(i.status)}`,`definitionSource: ${Ys(u.kind)}`],b=[Ur("sourcePath",u.path),Ur("workspaceRoot",l.workspaceRoot),Ur("schedule",l.scheduleExpr),Ur("timezone",l.timezone),Ur("model",l.providerId||l.modelId?[l.providerId,l.modelId].filter(Boolean).join("/"):void 0),Ur("sessionId",i.sessionId),Ur("startedAt",i.startedAt),Ur("completedAt",i.completedAt),Ur("triggerEventId",i.triggerEventId),Ur("triggerEventType",c?.eventType),Ur("triggerEventSource",c?.source),Ur("triggerEventSubject",c?.subject)];for(let I of b)if(I)g.push(I);return`---
|
|
555
|
+
${g.join(`
|
|
556
|
+
`)}
|
|
557
|
+
---
|
|
558
|
+
`}function Hz(i,l,u,c){let g=qz(l.title),b=i.status==="done"?"completed":i.status==="failed"?"FAILED":i.status,I=i.triggerKind==="manual"?"triggered manually":i.triggerKind==="event"?"triggered by an event":i.triggerKind==="one_off"?"one-time run":"triggered by its schedule",k=i.startedAt?` at ${i.startedAt}`:"",T=c.durationMs!==void 0?` in ${Ym(c.durationMs)}`:"",E=[`# ${g} — ${b}`,"",`Run of schedule **${g}** (${I})${k}, ${b}${T}.`,"","## Job",""],A=[`- **Definition**: ${u.label}`,l.workspaceRoot?`- **Workspace**: ${l.workspaceRoot}`:"",Nw(l)?`- **Schedule**: ${Nw(l)}`:"",l.providerId||l.modelId?`- **Model**: ${[l.providerId,l.modelId].filter(Boolean).join("/")}`:"",i.sessionId?`- **Session**: ${i.sessionId}`:""].filter((N)=>N.length>0);E.push(...A,"");let C=l.prompt?.trim();if(C)E.push("### Prompt","",PT(C),"");return E.join(`
|
|
559
|
+
`)}function zz(i){let l=[];if(i.triggerEvent){let u=i.triggerEvent,c=[`- eventId: ${u.eventId}`,`- eventType: ${u.eventType}`,`- source: ${u.source}`,u.subject?`- subject: ${u.subject}`:"",`- occurredAt: ${u.occurredAt}`,u.dedupeKey?`- dedupeKey: ${u.dedupeKey}`:"",u.attributes?`- attributes: ${JSON.stringify(u.attributes)}`:""].filter((g)=>g.length>0);l.push(`## Trigger Event
|
|
560
|
+
|
|
561
|
+
${c.join(`
|
|
562
|
+
`)}
|
|
563
|
+
`)}if(i.error){let u=i.errorContext?`${i.errorContext}
|
|
564
|
+
|
|
565
|
+
`:`The run failed with the following error:
|
|
566
|
+
|
|
567
|
+
`;l.push(`## Error
|
|
568
|
+
|
|
569
|
+
${u}${PT(i.error)}
|
|
570
|
+
`)}if(i.finalText&&i.finalText.trim().length>0)l.push(`## Summary
|
|
571
|
+
|
|
572
|
+
${i.finalText.trim()}
|
|
573
|
+
`);if(i.usage){let u=i.usage,c=[u.inputTokens!==void 0?`- Input tokens: ${u.inputTokens}`:"",u.outputTokens!==void 0?`- Output tokens: ${u.outputTokens}`:"",u.cacheReadTokens!==void 0?`- Cache read tokens: ${u.cacheReadTokens}`:"",u.cacheWriteTokens!==void 0?`- Cache write tokens: ${u.cacheWriteTokens}`:"",u.totalCost!==void 0?`- Total cost: $${u.totalCost.toFixed(2)}`:"",i.durationMs!==void 0?`- Duration: ${Ym(i.durationMs)}`:""].filter((g)=>g.length>0);if(c.length>0)l.push(`## Usage
|
|
574
|
+
|
|
575
|
+
${c.join(`
|
|
576
|
+
`)}
|
|
577
|
+
`)}if(i.toolCalls&&i.toolCalls.length>0){let u=i.toolCalls.map((c)=>{let g=[`- ${c.name}`];if(c.durationMs!==void 0)g.push(`(${Ym(c.durationMs)})`);if(c.error)g.push(`error: ${c.error}`);return g.join(" ")});l.push(`## Tool Calls
|
|
578
|
+
|
|
579
|
+
${u.join(`
|
|
580
|
+
`)}
|
|
581
|
+
`)}return l.join(`
|
|
582
|
+
`)}function Wz(i){let l=Ja(i.specs);Dz(l,{recursive:!0});let u=RT(l,`${i.run.runId}.md`),c=jz(i.spec,i.specs),g=`${Bz(i.run,i.spec,c,i.data.triggerEvent)}
|
|
583
|
+
${Hz(i.run,i.spec,c,i.data)}
|
|
584
|
+
${zz(i.data)}`;return Uz(u,g,"utf8"),u}var Kz=5000;class Oi extends Error{}async function Ip(i,l){let u=()=>{},c=new Promise((g,b)=>{if(u=()=>b(l.reason),l.aborted)u();else l.addEventListener("abort",u,{once:!0})});try{return await Promise.race([i,c])}finally{l.removeEventListener("abort",u)}}var Gz=15000,Xz=90,MT=["rules","skills","plugins"];function Jz(i,l){return new Set(i.extensions??MT).has(l)}function Vz(i,l){let u=i.tools===void 0?{"*":{autoApprove:!0}}:{"*":{enabled:!1,autoApprove:!0}};for(let c of i.tools??[])u[c]={enabled:!0,autoApprove:!0};if(u[Ht.ASK]={...u[Ht.ASK],enabled:!1,autoApprove:!0},l==="yolo")u[Ht.SUBMIT_AND_EXIT]={enabled:!0,autoApprove:!0};return u}function Yz(i){let l=i?.trim();if(!l)return;return["# Notes Directory",`Use ${l} for durable notes related to this automation.`,"Before starting, inspect relevant existing notes there when useful. During or after the run, write concise notes there when they would help future runs continue with context."].join(`
|
|
585
|
+
`)}class Ll extends Error{constructor(i){super(i);this.name="TimeoutError"}}async function Qz(i,l){if(l<=0)return i;let u,c=new Promise((g,b)=>{u=setTimeout(()=>{b(new Ll("cron run timed out"))},l)});try{return await Promise.race([i,c])}finally{if(u)clearTimeout(u)}}var kd={scheduleId:"scheduleId",scheduleName:"scheduleName",scheduleExecutionId:"scheduleExecutionId",scheduleRunNumber:"scheduleRunNumber"};function Zz(i,l,u){return{[kd.scheduleId]:i.externalId,[kd.scheduleName]:i.title,[kd.scheduleExecutionId]:l.runId,...u!==void 0?{[kd.scheduleRunNumber]:u}:{}}}class Mf{store;materializer;options;claimLeaseMs;timer;started=!1;ticking=!1;disposed=!1;stopping=!1;activeRuns=new Map;executions=new Set;constructor(i){this.store=i.store,this.materializer=i.materializer,this.options=i,this.claimLeaseMs=Math.max(5000,(i.claimLeaseSeconds??Xz)*1000)}async start(){if(this.disposed)throw Error("CronRunner disposed");if(this.started)return;this.stopping=!1,this.started=!0;let i=Math.max(2000,this.options.pollIntervalMs??Gz);this.timer=setInterval(()=>void this.tick(),i),this.tick()}async stop(){if(this.started=!1,this.stopping=!0,this.timer)clearInterval(this.timer),this.timer=void 0;for(let i of this.activeRuns.values())i.controller.abort(new Oi("runner stopped before completion"));await Promise.allSettled([...this.executions])}async dispose(){if(this.disposed)return;this.disposed=!0,await this.stop()}async tick(){if(this.ticking||this.stopping||this.disposed)return;this.ticking=!0;let i=[];try{let l=new Date(Date.now()+this.claimLeaseMs).toISOString();for(let[u,c]of this.activeRuns)if(!this.store.renewClaim(u,c.claimToken,l))c.controller.abort(new Oi("run lease lost"));this.materializer.materializeAll(),this.store.cancelSupersededScheduleRuns(),i=this.store.claimDueRuns({nowIso:x(),leaseMs:this.claimLeaseMs,maxConcurrency:this.options.globalMaxConcurrency??10}).map((u)=>{let c=this.executeClaim(u).catch((g)=>{this.options.logger?.error?.("cron.runner.execution.failed",{error:g})});return this.executions.add(c),c.then(()=>this.executions.delete(c)),c})}catch(l){let u=this.options.logger;if(u)if(u.error)u.error("cron.runner.tick.failed",{error:l});else u.log("cron.runner.tick.failed",{error:l})}finally{this.ticking=!1}await Promise.allSettled(i)}getActiveRuns(){return[...this.activeRuns.entries()].flatMap(([i,l])=>{let u=this.store.getRun(i);return u?[{...u,claimToken:l.claimToken,sessionId:l.sessionId}]:[]})}async executeClaim(i){let l=i.run,u=this.store.getSpec(l.specId);if(!u){this.store.completeRun(l.runId,{status:"failed",error:"spec not found",claimToken:i.claimToken});return}if(!u.enabled||u.removed){this.store.completeRun(l.runId,{status:"cancelled",error:"spec disabled or removed",claimToken:i.claimToken});return}if(this.stopping){this.store.requeueRun({runId:l.runId,claimToken:i.claimToken,releaseAttempt:!0});return}let c=new AbortController,{signal:g}=c;this.activeRuns.set(l.runId,{claimToken:i.claimToken,controller:c});let b=l.triggerEventId?this.store.getEventLog(l.triggerEventId):void 0,I,k=!1,T,E=Date.now(),A={triggerKind:l.triggerKind,attemptCount:l.attemptCount,startDelayMs:Math.max(0,E-new Date(l.scheduledFor??l.createdAt).getTime())};sa(this.options.telemetry,{...A,phase:"started"});let C=u.timeoutSeconds&&u.timeoutSeconds>0?E+u.timeoutSeconds*1000:void 0,N=()=>{if(C!==void 0&&Date.now()>=C)c.abort(new Ll("cron run timed out"));g.throwIfAborted()},O;if(u.timeoutSeconds&&u.timeoutSeconds>0)O=setTimeout(()=>c.abort(new Ll("cron run timed out")),u.timeoutSeconds*1000);let L="preparing the session request",D;try{T=this.startClaimLeaseHeartbeat(i);let U=await Ip(this.buildStartRequest(u),g);N(),L="starting the agent session";let F=this.options.runtimeHandlers.startSession(U,{sessionMetadata:Zz(u,l,this.store.getRunOrdinal(l.runId))}).then(async(ee)=>{if(g.aborted)await this.cleanupSession(ee.sessionId,!0);else I=ee.sessionId.trim()});if(await Ip(F,g),N(),!I)throw Error("runtime returned empty sessionId");if(this.activeRuns.set(l.runId,{claimToken:i.claimToken,controller:c,sessionId:I}),!this.store.attachSessionIdToRun(l.runId,I,i.claimToken))c.abort(new Oi("run lease lost")),N();L="running the agent turn";let j={config:U,prompt:this.buildPrompt(u,b)},H=this.options.runtimeHandlers.sendSession(I,j),Q=await Ip(H,g);if(N(),D=Q.result,D.finishReason==="error")throw Error(D.text||"agent turn ended with an error");let z=Date.now();if(!this.store.completeRun(l.runId,{status:"done",sessionId:I,claimToken:i.claimToken})){sa(this.options.telemetry,{...A,phase:"finished",outcome:"superseded",durationMs:Math.max(0,z-E)});return}if(l.triggerKind==="one_off")this.store.updateSpecNextRunAt(u.specId,void 0);let W=this.writeReport({specs:this.options.specs,workspaceRoot:this.options.workspaceRoot,run:{...l,sessionId:I,status:"done"},spec:u,data:{finalText:D.text,usage:D.usage,toolCalls:D.toolCalls,durationMs:z-E,triggerEvent:b}});if(W)this.store.attachReportPathToRun(l.runId,W);sa(this.options.telemetry,{...A,phase:"finished",outcome:"success",durationMs:Math.max(0,z-E)}),this.publishScheduleExecutionEvent("schedule.execution.completed",u,l.runId),this.store.updateSpecLastRunAt(u.specId,x())}catch(U){let F=U instanceof Ll;if(I&&g.aborted)await this.cleanupSession(I,!0),k=!0;let j=U instanceof Error?U.message:String(U),H=Date.now(),Q=F?`The run exceeded its ${u.timeoutSeconds}s timeout while ${L} and was cancelled:`:U instanceof Oi?`The run was cancelled while ${L}:`:`The run failed while ${L}:`,z=U instanceof Oi?"cancelled":"failed";if(!this.store.completeRun(l.runId,{status:z,sessionId:I,error:j,claimToken:i.claimToken})){sa(this.options.telemetry,{...A,phase:"finished",outcome:"superseded",durationMs:Math.max(0,H-E)});return}if(l.triggerKind==="one_off")this.store.updateSpecNextRunAt(u.specId,void 0);let W=this.writeReport({specs:this.options.specs,workspaceRoot:this.options.workspaceRoot,run:{...l,sessionId:I,status:z},spec:u,data:{error:j,errorContext:Q,usage:D?.usage,toolCalls:D?.toolCalls,durationMs:H-E,triggerEvent:b}});if(W)this.store.attachReportPathToRun(l.runId,W);sa(this.options.telemetry,{...A,phase:"finished",outcome:z==="cancelled"?"cancelled":F?"timeout":"failed",durationMs:Math.max(0,H-E)}),this.publishScheduleExecutionEvent("schedule.execution.failed",u,l.runId)}finally{if(O)clearTimeout(O);if(T?.(),I&&!k)await this.cleanupSession(I,g.aborted);this.activeRuns.delete(l.runId)}}writeReport(i){try{return Wz(i)}catch(l){this.options.logger?.error?.("cron.runner.report.failed",{runId:i.run.runId,error:l});return}}async cleanupSession(i,l){for(let u of l?["abortSession","stopSession"]:["stopSession"])try{await Qz(this.options.runtimeHandlers[u](i),Kz)}catch(c){this.options.logger?.error?.("cron.runner.cleanup.failed",{sessionId:i,action:u,error:c})}}publishScheduleExecutionEvent(i,l,u){if(l.source!=="hub-schedule"||!this.options.eventPublisher)return;let c=this.store.getRun(u);if(!c)return;let g=c.status==="done"?"success":c.status==="cancelled"?"aborted":c.status==="running"?"running":c.status==="queued"?"pending":"failed";this.options.eventPublisher(i,{scheduleId:l.externalId,executionId:c.runId,sessionId:c.sessionId,triggeredAt:new Date(c.scheduledFor??c.createdAt).getTime(),startedAt:c.startedAt?new Date(c.startedAt).getTime():void 0,endedAt:c.completedAt?new Date(c.completedAt).getTime():void 0,status:g,errorMessage:c.error})}buildPrompt(i,l){let u=i.prompt??"";if(!l)return u;let c={eventId:l.eventId,eventType:l.eventType,source:l.source,subject:l.subject,occurredAt:l.occurredAt,workspaceRoot:l.workspaceRoot,dedupeKey:l.dedupeKey,attributes:l.attributes,payload:l.payload};return`${u}
|
|
586
|
+
|
|
587
|
+
Trigger event:
|
|
588
|
+
${JSON.stringify(c,null,2)}`}startClaimLeaseHeartbeat(i){let l=Math.max(1000,Math.floor(this.claimLeaseMs/2)),u=setInterval(()=>{let c=new Date(Date.now()+this.claimLeaseMs).toISOString();if(!this.store.renewClaim(i.run.runId,i.claimToken,c))clearInterval(u),this.activeRuns.get(i.run.runId)?.controller.abort(new Oi("run lease lost"))},l);return()=>clearInterval(u)}async buildSystemPrompt(i,l,u,c){let g=Yz(i.notesDirectory),b=Hv(void 0,g),I=await DF(l),k=Ge({ide:"Cline Cron",workspaceRoot:l,workspaceName:Lz(l),metadata:I,rules:i.systemPrompt?void 0:b,mode:u,providerId:c,overridePrompt:i.systemPrompt,platform:typeof process<"u"&&process?.platform||"unknown"});return i.systemPrompt?Hv(k,b)??k:k}async buildStartRequest(i){let l=(i.workspaceRoot??"").trim(),u=(i.providerId??"").trim(),c=(i.modelId??"").trim(),g=i.metadata?.__hubRuntimeOptions&&typeof i.metadata.__hubRuntimeOptions==="object"&&!Array.isArray(i.metadata.__hubRuntimeOptions)?i.metadata.__hubRuntimeOptions:void 0,b=typeof i.metadata?.__hubScheduleCwd==="string"&&i.metadata.__hubScheduleCwd.trim()?i.metadata.__hubScheduleCwd.trim():l;if(!l)throw Error("cron spec requires workspaceRoot");let I=i.mode==="plan"?"plan":i.mode==="act"?"act":"yolo";return{workspaceRoot:l,cwd:b,provider:u,model:c,mode:I,source:i.source?.trim()||"user",systemPrompt:await this.buildSystemPrompt(i,l,I,u),maxIterations:i.maxIterations,enableTools:g?.enableTools??!0,enableSpawn:g?.enableSpawn??!0,enableTeams:g?.enableTeams??!0,autoApproveTools:g?.autoApproveTools??!0,toolPolicies:Vz(i,I),configExtensions:MT.filter((k)=>Jz(i,k))}}}function ll(i,l,u,c){let g=new Set;function b(I){let k=I.toLowerCase();if(c){let E=c.indexOf(k);if(E!==-1)return E+l}let T=Number(I);if(!Number.isInteger(T)||T<l||T>u)throw Error(`Invalid cron value "${I}" for range [${l}-${u}]`);return T}for(let I of i.split(",")){if(I==="*"){for(let E=l;E<=u;E+=1)g.add(E);continue}let k=I.indexOf("/");if(k!==-1){let E=I.slice(0,k),A=Number(I.slice(k+1));if(!Number.isInteger(A)||A<1)throw Error(`Invalid step "${I.slice(k+1)}"`);let C=l,N=u;if(E!=="*"){let O=E.indexOf("-");if(O!==-1)C=b(E.slice(0,O)),N=b(E.slice(O+1));else C=b(E)}if(C>N)throw Error(`Invalid cron range "${E}"`);for(let O=C;O<=N;O+=A)g.add(O);continue}let T=I.indexOf("-");if(T!==-1){let E=b(I.slice(0,T)),A=b(I.slice(T+1));if(E>A)throw Error(`Invalid cron range "${I}"`);for(let C=E;C<=A;C+=1)g.add(C);continue}g.add(b(I))}return[...g].sort((I,k)=>I-k)}var nW=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"],NT=["sun","mon","tue","wed","thu","fri","sat"];function dl(i,l,u){let c=i[l];if(typeof c!=="string")throw Error(`Invalid cron pattern "${u}": missing field ${l+1}`);return c}function kp(i,l){let u=i[0];if(typeof u!=="number")throw Error(`Invalid cron pattern: no values parsed for ${l}`);return u}function Nf(i){let l=i.trim().split(/\s+/);if(l.length!==5)throw Error(`Invalid cron pattern "${i}": expected 5 fields, got ${l.length}`);return{minutes:ll(dl(l,0,i),0,59),hours:ll(dl(l,1,i),0,23),daysOfMonth:ll(dl(l,2,i),1,31),months:ll(dl(l,3,i),1,12,nW),daysOfWeek:ll(dl(l,4,i),0,6,NT)}}function oW(i){Nf(i)}function aW(i,l,u=Date.now()){Dl(i,u,l)}var Ow=new Map,lW=new Map(NT.map((i,l)=>[i,l]));function OT(i){let l=i?.trim();return l?l:void 0}function $T(i){let l=Ow.get(i);if(l)return l;let u=new Intl.DateTimeFormat("en-US",{timeZone:i,calendar:"gregory",numberingSystem:"latn",year:"numeric",month:"2-digit",day:"2-digit",weekday:"short",hour:"2-digit",minute:"2-digit",hourCycle:"h23"});return Ow.set(i,u),u}function LT(i){let l=OT(i);if(!l)return;$T(l).format(new Date)}function dW(i,l){let u=$T(l).formatToParts(new Date(i)),c=new Map(u.map((I)=>[I.type,I.value])),g=c.get("weekday")?.toLowerCase().slice(0,3)??"",b=lW.get(g);if(b===void 0)throw Error(`Unable to resolve weekday for timezone "${l}"`);return{month:Number(c.get("month")),dayOfMonth:Number(c.get("day")),dayOfWeek:b,hour:Number(c.get("hour")),minute:Number(c.get("minute"))}}function uW(i){let l=new Date(i);return{month:l.getMonth()+1,dayOfMonth:l.getDate(),dayOfWeek:l.getDay(),hour:l.getHours(),minute:l.getMinutes()}}function cW(i,l){return i.months.includes(l.month)&&i.daysOfMonth.includes(l.dayOfMonth)&&i.daysOfWeek.includes(l.dayOfWeek)&&i.hours.includes(l.hour)&&i.minutes.includes(l.minute)}function pW(i,l,u){let c=Nf(i),g=new Date(l);g.setSeconds(0,0);let b=g.getTime()+60000,I=new Date(l);I.setFullYear(I.getFullYear()+4);let k=I.getTime();while(b<=k){if(cW(c,dW(b,u)))return b;b+=60000}throw Error(`No cron occurrence found within 4 years for pattern "${i}" in timezone "${u}"`)}function Dl(i,l,u){let c=OT(u);if(c)return LT(c),pW(i,l,c);let g=Nf(i),b=new Date(l);b.setSeconds(0,0),b=new Date(b.getTime()+60000);let I=new Date(l);I.setFullYear(I.getFullYear()+4);while(b<=I){let{month:k,dayOfMonth:T,dayOfWeek:E,hour:A,minute:C}=uW(b.getTime());if(!g.months.includes(k)){let N=g.months.find((L)=>L>k)??kp(g.months,"months"),O=N<=k?1:0;b=new Date(b.getFullYear()+O,N-1,1,0,0,0,0);continue}if(!g.daysOfMonth.includes(T)||!g.daysOfWeek.includes(E)){b=new Date(b.getFullYear(),b.getMonth(),T+1,0,0,0,0);continue}if(!g.hours.includes(A)){let N=g.hours.find((L)=>L>A)??kp(g.hours,"hours"),O=N<=A?1:0;b=new Date(b.getFullYear(),b.getMonth(),b.getDate()+O,N,0,0,0);continue}if(!g.minutes.includes(C)){let N=g.minutes.find((L)=>L>C)??kp(g.minutes,"minutes"),O=N<=C?1:0;b=new Date(b.getFullYear(),b.getMonth(),b.getDate(),b.getHours()+O,N,0,0);continue}return b.getTime()}throw Error(`No cron occurrence found within 4 years for pattern "${i}"`)}var mW=[`CREATE TABLE IF NOT EXISTS cron_specs (
|
|
589
|
+
spec_id TEXT PRIMARY KEY,
|
|
590
|
+
external_id TEXT NOT NULL,
|
|
591
|
+
source_path TEXT NOT NULL UNIQUE,
|
|
592
|
+
trigger_kind TEXT NOT NULL CHECK (trigger_kind IN ('one_off', 'schedule', 'event')),
|
|
593
|
+
source_mtime_ms INTEGER,
|
|
594
|
+
source_hash TEXT,
|
|
595
|
+
parse_status TEXT NOT NULL CHECK (parse_status IN ('valid', 'invalid')),
|
|
596
|
+
parse_error TEXT,
|
|
597
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
598
|
+
removed INTEGER NOT NULL DEFAULT 0,
|
|
599
|
+
title TEXT NOT NULL,
|
|
600
|
+
prompt TEXT,
|
|
601
|
+
workspace_root TEXT,
|
|
602
|
+
schedule_expr TEXT,
|
|
603
|
+
timezone TEXT,
|
|
604
|
+
event_type TEXT,
|
|
605
|
+
filters_json TEXT,
|
|
606
|
+
debounce_seconds INTEGER,
|
|
607
|
+
dedupe_window_seconds INTEGER,
|
|
608
|
+
cooldown_seconds INTEGER,
|
|
609
|
+
mode TEXT,
|
|
610
|
+
system_prompt TEXT,
|
|
611
|
+
provider_id TEXT,
|
|
612
|
+
model_id TEXT,
|
|
613
|
+
max_iterations INTEGER,
|
|
614
|
+
timeout_seconds INTEGER,
|
|
615
|
+
max_parallel INTEGER,
|
|
616
|
+
tools_json TEXT,
|
|
617
|
+
notes_directory TEXT,
|
|
618
|
+
extensions_json TEXT,
|
|
619
|
+
source TEXT,
|
|
620
|
+
tags_json TEXT,
|
|
621
|
+
metadata_json TEXT,
|
|
622
|
+
revision INTEGER NOT NULL DEFAULT 1,
|
|
623
|
+
last_materialized_run_id TEXT,
|
|
624
|
+
last_run_at TEXT,
|
|
625
|
+
next_run_at TEXT,
|
|
626
|
+
created_at TEXT NOT NULL,
|
|
627
|
+
updated_at TEXT NOT NULL
|
|
628
|
+
);`,`CREATE TABLE IF NOT EXISTS cron_runs (
|
|
629
|
+
run_id TEXT PRIMARY KEY,
|
|
630
|
+
spec_id TEXT NOT NULL REFERENCES cron_specs(spec_id) ON DELETE CASCADE,
|
|
631
|
+
spec_revision INTEGER NOT NULL,
|
|
632
|
+
trigger_kind TEXT NOT NULL CHECK (trigger_kind IN ('one_off', 'schedule', 'event', 'manual', 'retry')),
|
|
633
|
+
status TEXT NOT NULL CHECK (status IN ('queued', 'running', 'done', 'failed', 'cancelled')),
|
|
634
|
+
claim_token TEXT,
|
|
635
|
+
claim_started_at TEXT,
|
|
636
|
+
claim_until_at TEXT,
|
|
637
|
+
scheduled_for TEXT,
|
|
638
|
+
trigger_event_id TEXT,
|
|
639
|
+
started_at TEXT,
|
|
640
|
+
completed_at TEXT,
|
|
641
|
+
session_id TEXT,
|
|
642
|
+
report_path TEXT,
|
|
643
|
+
error TEXT,
|
|
644
|
+
attempt_count INTEGER NOT NULL DEFAULT 0,
|
|
645
|
+
created_at TEXT NOT NULL,
|
|
646
|
+
updated_at TEXT NOT NULL
|
|
647
|
+
);`,`CREATE TABLE IF NOT EXISTS cron_event_log (
|
|
648
|
+
event_id TEXT PRIMARY KEY,
|
|
649
|
+
event_type TEXT NOT NULL,
|
|
650
|
+
source TEXT NOT NULL,
|
|
651
|
+
subject TEXT,
|
|
652
|
+
occurred_at TEXT NOT NULL,
|
|
653
|
+
received_at TEXT NOT NULL,
|
|
654
|
+
workspace_root TEXT,
|
|
655
|
+
dedupe_key TEXT,
|
|
656
|
+
payload_json TEXT,
|
|
657
|
+
attributes_json TEXT,
|
|
658
|
+
processing_status TEXT NOT NULL DEFAULT 'received'
|
|
659
|
+
CHECK (processing_status IN ('received', 'unmatched', 'queued', 'suppressed', 'failed')),
|
|
660
|
+
matched_spec_count INTEGER NOT NULL DEFAULT 0,
|
|
661
|
+
queued_run_count INTEGER NOT NULL DEFAULT 0,
|
|
662
|
+
suppressed_count INTEGER NOT NULL DEFAULT 0,
|
|
663
|
+
error TEXT,
|
|
664
|
+
created_at TEXT NOT NULL,
|
|
665
|
+
updated_at TEXT NOT NULL
|
|
666
|
+
);`,"DROP INDEX IF EXISTS cron_runs_one_off_active_idx;",`CREATE UNIQUE INDEX IF NOT EXISTS cron_runs_one_off_active_idx
|
|
667
|
+
ON cron_runs(spec_id, spec_revision)
|
|
668
|
+
WHERE trigger_kind = 'one_off';`,`CREATE INDEX IF NOT EXISTS cron_runs_claimable_idx
|
|
669
|
+
ON cron_runs(status, scheduled_for, claim_until_at);`,`CREATE INDEX IF NOT EXISTS cron_runs_spec_idx
|
|
670
|
+
ON cron_runs(spec_id, created_at DESC);`,`CREATE INDEX IF NOT EXISTS cron_runs_trigger_event_idx
|
|
671
|
+
ON cron_runs(trigger_event_id);`,`CREATE INDEX IF NOT EXISTS cron_runs_event_spec_status_idx
|
|
672
|
+
ON cron_runs(spec_id, trigger_kind, status, scheduled_for);`,`CREATE INDEX IF NOT EXISTS cron_event_log_type_idx
|
|
673
|
+
ON cron_event_log(event_type, received_at DESC);`,`CREATE INDEX IF NOT EXISTS cron_event_log_received_idx
|
|
674
|
+
ON cron_event_log(received_at DESC);`,`CREATE INDEX IF NOT EXISTS cron_event_log_dedupe_idx
|
|
675
|
+
ON cron_event_log(event_type, source, dedupe_key, received_at DESC);`,`CREATE INDEX IF NOT EXISTS cron_specs_next_run_idx
|
|
676
|
+
ON cron_specs(trigger_kind, enabled, next_run_at);`,`CREATE INDEX IF NOT EXISTS cron_specs_event_match_idx
|
|
677
|
+
ON cron_specs(trigger_kind, event_type, enabled);`,`CREATE INDEX IF NOT EXISTS cron_specs_parse_status_idx
|
|
678
|
+
ON cron_specs(parse_status, updated_at DESC);`,`CREATE INDEX IF NOT EXISTS cron_specs_source_path_idx
|
|
679
|
+
ON cron_specs(source_path);`];function hW(i){i.exec("PRAGMA journal_mode = WAL;"),i.exec("PRAGMA busy_timeout = 5000;"),i.exec("PRAGMA foreign_keys = ON;");for(let l of mW)i.exec(l)}function Lu(i){if(!i)return;try{let l=JSON.parse(i);if(l&&typeof l==="object"&&!Array.isArray(l))return l}catch{}return}function Sp(i,l={}){if(!i)return;try{let u=JSON.parse(i);if(!Array.isArray(u))return;let c=u.map((g)=>typeof g==="string"?g.trim():"").filter((g)=>g.length>0);if(l.preserveEmpty)return c;return c.length>0?c:void 0}catch{return}}function Ci(i){if(typeof i==="number"&&Number.isFinite(i))return i;if(typeof i==="bigint")return Number(i);return}function Xs(i){return{specId:f(i.spec_id),externalId:f(i.external_id),sourcePath:f(i.source_path),triggerKind:f(i.trigger_kind),sourceMtimeMs:Ci(i.source_mtime_ms),sourceHash:h(i.source_hash),parseStatus:f(i.parse_status)==="invalid"?"invalid":"valid",parseError:h(i.parse_error),enabled:Number(i.enabled??0)===1,removed:Number(i.removed??0)===1,title:f(i.title),prompt:h(i.prompt),workspaceRoot:h(i.workspace_root),scheduleExpr:h(i.schedule_expr),timezone:h(i.timezone),eventType:h(i.event_type),filters:Lu(h(i.filters_json)),debounceSeconds:Ci(i.debounce_seconds),dedupeWindowSeconds:Ci(i.dedupe_window_seconds),cooldownSeconds:Ci(i.cooldown_seconds),mode:h(i.mode),systemPrompt:h(i.system_prompt),providerId:h(i.provider_id),modelId:h(i.model_id),maxIterations:Ci(i.max_iterations),timeoutSeconds:Ci(i.timeout_seconds),maxParallel:Ci(i.max_parallel),tools:Sp(h(i.tools_json),{preserveEmpty:!0}),notesDirectory:h(i.notes_directory),extensions:Sp(h(i.extensions_json),{preserveEmpty:!0}),source:h(i.source),tags:Sp(h(i.tags_json)),metadata:Lu(h(i.metadata_json)),revision:Number(i.revision??1),lastMaterializedRunId:h(i.last_materialized_run_id),lastRunAt:h(i.last_run_at),nextRunAt:h(i.next_run_at),createdAt:f(i.created_at),updatedAt:f(i.updated_at)}}function Sd(i){return{runId:f(i.run_id),specId:f(i.spec_id),specRevision:Number(i.spec_revision??1),triggerKind:f(i.trigger_kind),status:f(i.status),claimToken:h(i.claim_token),claimStartedAt:h(i.claim_started_at),claimUntilAt:h(i.claim_until_at),scheduledFor:h(i.scheduled_for),triggerEventId:h(i.trigger_event_id),startedAt:h(i.started_at),completedAt:h(i.completed_at),sessionId:h(i.session_id),reportPath:h(i.report_path),error:h(i.error),attemptCount:Number(i.attempt_count??0),createdAt:f(i.created_at),updatedAt:f(i.updated_at)}}function $w(i){return{eventId:f(i.event_id),eventType:f(i.event_type),source:f(i.source),subject:h(i.subject),occurredAt:f(i.occurred_at),receivedAt:f(i.received_at),workspaceRoot:h(i.workspace_root),dedupeKey:h(i.dedupe_key),payload:Lu(h(i.payload_json)),attributes:Lu(h(i.attributes_json)),processingStatus:f(i.processing_status),matchedSpecCount:Number(i.matched_spec_count??0),queuedRunCount:Number(i.queued_run_count??0),suppressedCount:Number(i.suppressed_count??0),error:h(i.error),createdAt:f(i.created_at),updatedAt:f(i.updated_at)}}function Lw(i){return i?JSON.stringify(i):null}var fW=["triggerKind","prompt","workspaceRoot","mode","systemPrompt","providerId","modelId","maxIterations","timeoutSeconds","maxParallel","tools","notesDirectory","extensions","source","scheduleExpr","timezone","eventType","filters","debounceSeconds","dedupeWindowSeconds","cooldownSeconds"];function Td(i){if(i===void 0)return null;if(i&&typeof i==="object")return JSON.stringify(i);return i}function gW(i,l,u,c){for(let I of fW){let k=i[I],T=l[I];if(Td(k)!==Td(T))return!0}let g=i.triggerKind==="one_off"||l.triggerKind==="one_off",b=l.metadata;if(g&&Td(i.metadata?.[fe])!==Td(b?.[fe]))return!0;if(u===!1&&c===!0)return!0;return!1}function yW(i){return(i.split("/").pop()??i).replace(/\.event\.md$/,"").replace(/\.cron\.md$/,"").replace(/\.md$/,"")}var DT="hub/schedules/";function vW(i){return`${DT}${i}.cron.md`}function wW(i){return i.source==="hub-schedule"&&i.sourcePath.startsWith(DT)&&i.sourceMtimeMs===void 0}function bW(i){let l={...i.metadata??{},...i.createdBy?{__hubScheduleCreatedBy:i.createdBy}:{},...i.cwd?{__hubScheduleCwd:i.cwd}:{},...i.runtimeOptions?{__hubRuntimeOptions:i.runtimeOptions}:{}};if(i.cronPattern.trim()!==pe)delete l[fe];return Object.keys(l).length>0?l:void 0}function Qm(i){let l=i.cronPattern.trim()===pe,u={title:i.name.trim(),prompt:i.prompt,workspaceRoot:i.workspaceRoot.trim(),mode:i.mode??"yolo",systemPrompt:i.systemPrompt,modelSelection:i.modelSelection?JSON.parse(JSON.stringify(i.modelSelection)):void 0,maxIterations:typeof i.maxIterations==="number"?Math.floor(i.maxIterations):void 0,timeoutSeconds:typeof i.timeoutSeconds==="number"?Math.floor(i.timeoutSeconds):void 0,maxParallel:typeof i.maxParallel==="number"?Math.max(1,Math.floor(i.maxParallel)):1,source:"hub-schedule",tags:i.tags?.filter((c)=>c.trim().length>0),enabled:i.enabled!==!1,metadata:bW(i)};return l?{...u,triggerKind:"one_off"}:{...u,triggerKind:"schedule",schedule:i.cronPattern.trim(),timezone:i.timezone?.trim()||void 0}}function Dw(i){return JSON.stringify(Qm(i))}function IW(i,l){let u=i.metadata?{...i.metadata}:{},c=l.createdBy===null?void 0:l.createdBy!==void 0?l.createdBy:typeof u.__hubScheduleCreatedBy==="string"?u.__hubScheduleCreatedBy:void 0,g=l.cwd!==void 0?l.cwd:typeof u.__hubScheduleCwd==="string"?u.__hubScheduleCwd:void 0,b=l.runtimeOptions!==void 0?l.runtimeOptions:u.__hubRuntimeOptions&&typeof u.__hubRuntimeOptions==="object"&&!Array.isArray(u.__hubRuntimeOptions)?u.__hubRuntimeOptions:void 0;delete u.__hubScheduleCreatedBy,delete u.__hubScheduleCwd,delete u.__hubRuntimeOptions;let I=l.cronPattern??(i.triggerKind==="one_off"?pe:i.scheduleExpr??""),k={...u,...l.metadata??{}};if(I.trim()!==pe)delete k[fe];return{name:l.name??i.title,cronPattern:I,timezone:l.timezone===null?void 0:l.timezone!==void 0?l.timezone:i.timezone,prompt:l.prompt??i.prompt??"",workspaceRoot:l.workspaceRoot??i.workspaceRoot??"",cwd:g,modelSelection:l.modelSelection!==void 0?l.modelSelection:i.providerId||i.modelId?{providerId:i.providerId??"",modelId:i.modelId??""}:void 0,enabled:l.enabled??i.enabled,mode:l.mode??(i.mode==="plan"?"plan":i.mode==="act"?"act":"yolo"),systemPrompt:l.systemPrompt===null?void 0:l.systemPrompt!==void 0?l.systemPrompt:i.systemPrompt,maxIterations:l.maxIterations===null?void 0:l.maxIterations!==void 0?l.maxIterations:i.maxIterations,timeoutSeconds:l.timeoutSeconds===null?void 0:l.timeoutSeconds!==void 0?l.timeoutSeconds:i.timeoutSeconds,maxParallel:l.maxParallel??i.maxParallel??1,createdBy:c,tags:l.tags??i.tags,runtimeOptions:b,metadata:Object.keys(k).length>0?k:void 0}}class Of{db;constructor(i={}){let l=i.dbPath??Va();this.db=V(l),hW(this.db)}close(){this.db.close?.()}getSpecBySourcePath(i){let l=this.db.prepare("SELECT * FROM cron_specs WHERE source_path = ?").get(i);return l?Xs(l):void 0}getSpec(i){let l=this.db.prepare("SELECT * FROM cron_specs WHERE spec_id = ?").get(i);return l?Xs(l):void 0}getSpecByExternalId(i){let l=this.db.prepare("SELECT * FROM cron_specs WHERE external_id = ? ORDER BY created_at ASC LIMIT 1").get(i);return l?Xs(l):void 0}listSpecs(i={}){let l=[],u=[];if(i.triggerKind)l.push("trigger_kind = ?"),u.push(i.triggerKind);if(typeof i.enabled==="boolean")l.push("enabled = ?"),u.push(i.enabled?1:0);if(i.parseStatus)l.push("parse_status = ?"),u.push(i.parseStatus);if(!i.includeRemoved)l.push("removed = 0");let c=l.length>0?`WHERE ${l.join(" AND ")}`:"",g=Math.max(1,Math.floor(i.limit??500));return this.db.prepare(`SELECT * FROM cron_specs ${c} ORDER BY created_at DESC LIMIT ?`).all(...u,g).map((b)=>Xs(b))}createHubSchedule(i){let l=`sched_${ul()}`,u=Qm(i),c=this.upsertSpec({externalId:l,sourcePath:vW(l),triggerKind:u.triggerKind,sourceHash:Dw(i),parseStatus:"valid",spec:u});this.initializeHubScheduleNextRun(c.record.specId,i);let g=this.getSpec(c.record.specId);if(!g)throw Error("failed to create hub schedule");return g}getHubSchedule(i){let l=this.db.prepare(`SELECT * FROM cron_specs
|
|
680
|
+
WHERE external_id = ? AND source = 'hub-schedule' AND removed = 0
|
|
681
|
+
ORDER BY created_at ASC LIMIT 1`).get(i);return l?Xs(l):void 0}listHubSchedules(i={}){let l=["source = 'hub-schedule'","trigger_kind IN ('schedule', 'one_off')","removed = 0"],u=[];if(typeof i.enabled==="boolean")l.push("enabled = ?"),u.push(i.enabled?1:0);if(i.workspaceRoot?.trim())l.push("workspace_root = ?"),u.push(i.workspaceRoot.trim());if(i.tags&&i.tags.length>0)for(let g of i.tags)l.push("tags_json LIKE ?"),u.push(`%"${g.trim()}"%`);let c=Math.max(1,Math.floor(i.limit??200));return this.db.prepare(`SELECT * FROM cron_specs
|
|
682
|
+
WHERE ${l.join(" AND ")}
|
|
683
|
+
ORDER BY created_at DESC LIMIT ?`).all(...u,c).map((g)=>Xs(g))}updateHubSchedule(i,l){this.db.exec("BEGIN IMMEDIATE;");try{let u=this.getHubSchedule(i);if(!u){this.db.exec("COMMIT;");return}let c=IW(u,l),g=Qm(c),b=this.upsertSpec({externalId:i,sourcePath:u.sourcePath,triggerKind:g.triggerKind,sourceHash:Dw(c),parseStatus:"valid",spec:g}),I=u.enabled!==b.record.enabled;if((u.triggerKind==="one_off"||b.record.triggerKind==="one_off")&&(b.revisionChanged||I))this.cancelQueuedOneOffRunsForSpec(b.record.specId);if(l.cronPattern!==void 0||l.timezone!==void 0||l.metadata?.[fe]!==void 0||l.enabled!==void 0)this.initializeHubScheduleNextRun(b.record.specId,c);let k=this.getSpec(b.record.specId);return this.db.exec("COMMIT;"),k}catch(u){throw this.db.exec("ROLLBACK;"),u}}initializeHubScheduleNextRun(i,l){if(l.enabled===!1){this.updateSpecNextRunAt(i,void 0);return}if(l.cronPattern.trim()===pe){let u=l.metadata?.[fe];if(typeof u!=="number"||!Number.isFinite(u))throw Error("runAt metadata is required for one-time schedules");this.updateSpecNextRunAt(i,new Date(u).toISOString());return}this.initializeScheduleNextRun(i)}deleteHubSchedule(i){let l=this.getHubSchedule(i);if(!l)return!1;return this.markSpecRemoved(l.specId),this.cancelQueuedRunsForSpec(l.specId),!0}enqueueHubScheduleRun(i,l="manual"){let u=this.getHubSchedule(i);if(!u||!u.enabled||u.removed||u.parseStatus!=="valid")return;if(u.triggerKind==="one_off"&&l==="manual")return this.consumeOneOffWithManualRun(u);return this.enqueueRun({specId:u.specId,specRevision:u.revision,triggerKind:l,scheduledFor:x()})}consumeOneOffWithManualRun(i){this.db.exec("BEGIN IMMEDIATE;");try{let l=this.getSpec(i.specId);if(!l||l.revision!==i.revision||l.triggerKind!=="one_off"||!l.enabled||l.removed||l.parseStatus!=="valid"){this.db.exec("COMMIT;");return}let u=x();this.db.prepare(`UPDATE cron_specs SET next_run_at = NULL, updated_at = ?
|
|
684
|
+
WHERE spec_id = ? AND revision = ?`).run(u,l.specId,l.revision);let c=this.db.prepare(`SELECT * FROM cron_runs
|
|
685
|
+
WHERE spec_id = ? AND spec_revision = ?
|
|
686
|
+
AND trigger_kind IN ('one_off', 'manual')
|
|
687
|
+
AND status != 'cancelled'
|
|
688
|
+
ORDER BY CASE trigger_kind WHEN 'manual' THEN 0 ELSE 1 END,
|
|
689
|
+
created_at ASC
|
|
690
|
+
LIMIT 1`).get(l.specId,l.revision),g=c?Sd(c):void 0;if(g&&g.status!=="queued")return this.db.exec("COMMIT;"),g;if(g?.triggerKind==="manual")return this.db.exec("COMMIT;"),g;this.db.prepare(`UPDATE cron_runs SET status = 'cancelled', updated_at = ?
|
|
691
|
+
WHERE spec_id = ? AND spec_revision = ?
|
|
692
|
+
AND trigger_kind = 'one_off' AND status = 'queued'`).run(u,l.specId,l.revision);let b=this.enqueueRun({specId:l.specId,specRevision:l.revision,triggerKind:"manual",scheduledFor:u});return this.db.exec("COMMIT;"),b}catch(l){throw this.db.exec("ROLLBACK;"),l}}listEventSpecsForType(i){return this.db.prepare(`SELECT * FROM cron_specs
|
|
693
|
+
WHERE trigger_kind = 'event'
|
|
694
|
+
AND event_type = ?
|
|
695
|
+
AND enabled = 1
|
|
696
|
+
AND removed = 0
|
|
697
|
+
AND parse_status = 'valid'
|
|
698
|
+
ORDER BY created_at ASC`).all(i).map((l)=>Xs(l))}upsertSpec(i){let l=x(),u=this.getSpecBySourcePath(i.sourcePath),c=i.spec,g={triggerKind:c?.triggerKind??i.triggerKind,title:c?.title??u?.title??yW(i.sourcePath),prompt:c?.prompt,workspaceRoot:c?.workspaceRoot,scheduleExpr:c?.triggerKind==="schedule"?c.schedule:void 0,timezone:c?.triggerKind==="schedule"?c.timezone:void 0,eventType:c?.triggerKind==="event"?c.event:void 0,filters:c?.triggerKind==="event"?c.filters:void 0,debounceSeconds:c?.triggerKind==="event"?c.debounceSeconds:void 0,dedupeWindowSeconds:c?.triggerKind==="event"?c.dedupeWindowSeconds:void 0,cooldownSeconds:c?.triggerKind==="event"?c.cooldownSeconds:void 0,mode:c?.mode,systemPrompt:c?.systemPrompt,providerId:c?.modelSelection?.providerId,modelId:c?.modelSelection?.modelId,maxIterations:c?.maxIterations,timeoutSeconds:c?.timeoutSeconds,maxParallel:c&&"maxParallel"in c?c.maxParallel:void 0,tools:c?.tools,notesDirectory:c?.notesDirectory,extensions:c?.extensions,source:c?.source,metadata:c?.metadata},b=i.parseStatus==="valid"&&(c?.enabled??!0);if(!u){let E=`cspec_${ul()}`;this.insertSpecRow(E,i,g,b,l);let A=this.getSpec(E);if(!A)throw Error("failed to insert cron_spec row");return{record:A,created:!0,revisionChanged:!0}}let I=u.sourceHash!==i.sourceHash&&gW(u,g,u.enabled,b),k=I?u.revision+1:u.revision;this.updateSpecRow(u.specId,i,g,b,k,l);let T=this.getSpec(u.specId);if(!T)throw Error("failed to reload cron_spec after update");return{record:T,created:!1,revisionChanged:I}}insertSpecRow(i,l,u,c,g){let b=l.spec;this.db.prepare(`INSERT INTO cron_specs (
|
|
699
|
+
spec_id, external_id, source_path, trigger_kind,
|
|
700
|
+
source_mtime_ms, source_hash, parse_status, parse_error,
|
|
701
|
+
enabled, removed, title, prompt, workspace_root,
|
|
702
|
+
schedule_expr, timezone, event_type, filters_json,
|
|
703
|
+
debounce_seconds, dedupe_window_seconds, cooldown_seconds,
|
|
704
|
+
mode, system_prompt, provider_id, model_id,
|
|
705
|
+
max_iterations, timeout_seconds, max_parallel,
|
|
706
|
+
tools_json, notes_directory, extensions_json, source,
|
|
707
|
+
tags_json, metadata_json, revision,
|
|
708
|
+
created_at, updated_at
|
|
709
|
+
) VALUES (${Array.from({length:36},()=>"?").join(",")})`).run(i,l.externalId,l.sourcePath,l.triggerKind,l.sourceMtimeMs??null,l.sourceHash,l.parseStatus,l.parseError??null,c?1:0,0,u.title??"",u.prompt??null,u.workspaceRoot??null,u.scheduleExpr??null,u.timezone??null,u.eventType??null,u.filters?JSON.stringify(u.filters):null,u.debounceSeconds??null,u.dedupeWindowSeconds??null,u.cooldownSeconds??null,u.mode??null,u.systemPrompt??null,u.providerId??null,u.modelId??null,u.maxIterations??null,u.timeoutSeconds??null,u.maxParallel??null,u.tools?JSON.stringify(u.tools):null,u.notesDirectory??null,u.extensions?JSON.stringify(u.extensions):null,u.source??null,b?.tags?JSON.stringify(b.tags):null,b?.metadata?JSON.stringify(b.metadata):null,1,g,g)}updateSpecRow(i,l,u,c,g,b){let I=l.spec;this.db.prepare(`UPDATE cron_specs SET
|
|
710
|
+
external_id = ?, trigger_kind = ?,
|
|
711
|
+
source_mtime_ms = ?, source_hash = ?, parse_status = ?, parse_error = ?,
|
|
712
|
+
enabled = ?, removed = 0, title = ?, prompt = ?,
|
|
713
|
+
workspace_root = ?, schedule_expr = ?, timezone = ?,
|
|
714
|
+
event_type = ?, filters_json = ?,
|
|
715
|
+
debounce_seconds = ?, dedupe_window_seconds = ?, cooldown_seconds = ?,
|
|
716
|
+
mode = ?, system_prompt = ?, provider_id = ?, model_id = ?,
|
|
717
|
+
max_iterations = ?, timeout_seconds = ?, max_parallel = ?,
|
|
718
|
+
tools_json = ?, notes_directory = ?, extensions_json = ?, source = ?,
|
|
719
|
+
tags_json = ?, metadata_json = ?,
|
|
720
|
+
revision = ?, updated_at = ?
|
|
721
|
+
WHERE spec_id = ?`).run(l.externalId,l.triggerKind,l.sourceMtimeMs??null,l.sourceHash,l.parseStatus,l.parseError??null,c?1:0,u.title??"",u.prompt??null,u.workspaceRoot??null,u.scheduleExpr??null,u.timezone??null,u.eventType??null,u.filters?JSON.stringify(u.filters):null,u.debounceSeconds??null,u.dedupeWindowSeconds??null,u.cooldownSeconds??null,u.mode??null,u.systemPrompt??null,u.providerId??null,u.modelId??null,u.maxIterations??null,u.timeoutSeconds??null,u.maxParallel??null,u.tools?JSON.stringify(u.tools):null,u.notesDirectory??null,u.extensions?JSON.stringify(u.extensions):null,u.source??null,I?.tags?JSON.stringify(I.tags):null,I?.metadata?JSON.stringify(I.metadata):null,g,b,i)}markSpecRemoved(i){this.db.prepare("UPDATE cron_specs SET removed = 1, enabled = 0, updated_at = ? WHERE spec_id = ?").run(x(),i)}updateSpecNextRunAt(i,l){this.db.prepare("UPDATE cron_specs SET next_run_at = ?, updated_at = ? WHERE spec_id = ?").run(l??null,x(),i)}updateSpecLastRunAt(i,l){this.db.prepare("UPDATE cron_specs SET last_run_at = ?, updated_at = ? WHERE spec_id = ?").run(l,x(),i)}updateLastMaterializedRunId(i,l){this.db.prepare("UPDATE cron_specs SET last_materialized_run_id = ?, updated_at = ? WHERE spec_id = ?").run(l,x(),i)}initializeScheduleNextRun(i){let l=this.getSpec(i);if(!l||l.triggerKind!=="schedule"||!l.enabled||!l.scheduleExpr){this.updateSpecNextRunAt(i,void 0);return}let u=new Date(Dl(l.scheduleExpr,Date.now(),l.timezone)).toISOString();this.updateSpecNextRunAt(i,u)}materializeDueScheduleRun(i){let l=i.nowMs,u=new Date(l).toISOString();this.db.exec("BEGIN IMMEDIATE;");try{let c=this.db.prepare("SELECT * FROM cron_specs WHERE spec_id = ?").get(i.specId);if(!c)return this.db.exec("COMMIT;"),{queued:!1};let g=Xs(c);if(g.triggerKind!=="schedule"||!g.enabled||g.removed||g.parseStatus!=="valid"||!g.scheduleExpr)return this.db.exec("COMMIT;"),{queued:!1};let b=g.nextRunAt;if(!b){let T=new Date(Dl(g.scheduleExpr,l,g.timezone)).toISOString();return this.db.prepare("UPDATE cron_specs SET next_run_at = ?, updated_at = ? WHERE spec_id = ?").run(T,u,g.specId),this.db.exec("COMMIT;"),{queued:!1,nextRunAt:T}}if(new Date(b).getTime()>l)return this.db.exec("COMMIT;"),{queued:!1,nextRunAt:b};let I=`crun_${ul()}`,k;try{k=new Date(Dl(g.scheduleExpr,l,g.timezone)).toISOString()}catch{k=void 0}return this.db.prepare(`INSERT INTO cron_runs (
|
|
722
|
+
run_id, spec_id, spec_revision, trigger_kind, status,
|
|
723
|
+
scheduled_for, trigger_event_id, attempt_count,
|
|
724
|
+
created_at, updated_at
|
|
725
|
+
) VALUES (?,?,?,?,?, ?,?,?, ?,?)`).run(I,g.specId,g.revision,"schedule","queued",b,null,0,u,u),this.db.prepare(`UPDATE cron_specs SET
|
|
726
|
+
last_materialized_run_id = ?,
|
|
727
|
+
last_run_at = ?,
|
|
728
|
+
next_run_at = ?,
|
|
729
|
+
updated_at = ?
|
|
730
|
+
WHERE spec_id = ?`).run(I,u,k??null,u,g.specId),this.db.exec("COMMIT;"),{queued:!0,run:this.getRun(I),nextRunAt:k}}catch(c){throw this.db.exec("ROLLBACK;"),c}}getRun(i){let l=this.db.prepare("SELECT * FROM cron_runs WHERE run_id = ?").get(i);return l?Sd(l):void 0}getRunOrdinal(i){let l=this.db.prepare(`SELECT COUNT(*) AS count
|
|
731
|
+
FROM cron_runs r
|
|
732
|
+
INNER JOIN cron_runs target ON target.run_id = ?
|
|
733
|
+
WHERE r.spec_id = target.spec_id
|
|
734
|
+
AND (
|
|
735
|
+
r.created_at < target.created_at
|
|
736
|
+
OR (r.created_at = target.created_at AND r.rowid <= target.rowid)
|
|
737
|
+
)`).get(i),u=Number(l?.count??0);return u>0?u:void 0}eventTransaction(i){this.db.exec("BEGIN IMMEDIATE;");try{let l=i();return this.db.exec("COMMIT;"),l}catch(l){throw this.db.exec("ROLLBACK;"),l}}insertEventLog(i,l={}){let u=x(),c=l.receivedAtIso??u,g=i.eventId.trim();if(!g)throw Error("automation event requires eventId");let b=i.eventType.trim();if(!b)throw Error("automation event requires eventType");let I=i.source.trim();if(!I)throw Error("automation event requires source");let k=i.occurredAt.trim()||c,T=this.db.prepare(`INSERT OR IGNORE INTO cron_event_log (
|
|
738
|
+
event_id, event_type, source, subject,
|
|
739
|
+
occurred_at, received_at, workspace_root, dedupe_key,
|
|
740
|
+
payload_json, attributes_json, processing_status,
|
|
741
|
+
matched_spec_count, queued_run_count, suppressed_count,
|
|
742
|
+
error, created_at, updated_at
|
|
743
|
+
) VALUES (?,?,?,?, ?,?,?,?, ?,?,?, ?,?,?, ?,?,?)`).run(g,b,I,i.subject?.trim()||null,k,c,i.workspaceRoot?.trim()||null,i.dedupeKey?.trim()||null,Lw(i.payload),Lw(i.attributes),"received",0,0,0,null,u,u).changes??0,E=this.getEventLog(g);if(!E)throw Error("failed to insert cron_event_log row");return{record:E,created:T===1}}getEventLog(i){let l=this.db.prepare("SELECT * FROM cron_event_log WHERE event_id = ?").get(i);return l?$w(l):void 0}listEventLogs(i={}){let l=[],u=[];if(i.eventType)l.push("event_type = ?"),u.push(i.eventType);if(i.source)l.push("source = ?"),u.push(i.source);if(i.processingStatus)l.push("processing_status = ?"),u.push(i.processingStatus);let c=l.length>0?`WHERE ${l.join(" AND ")}`:"",g=Math.max(1,Math.floor(i.limit??200));return this.db.prepare(`SELECT * FROM cron_event_log ${c}
|
|
744
|
+
ORDER BY received_at DESC, created_at DESC
|
|
745
|
+
LIMIT ?`).all(...u,g).map((b)=>$w(b))}updateEventLogProcessing(i,l){return(this.db.prepare(`UPDATE cron_event_log SET
|
|
746
|
+
processing_status = ?,
|
|
747
|
+
matched_spec_count = COALESCE(?, matched_spec_count),
|
|
748
|
+
queued_run_count = COALESCE(?, queued_run_count),
|
|
749
|
+
suppressed_count = COALESCE(?, suppressed_count),
|
|
750
|
+
error = ?,
|
|
751
|
+
updated_at = ?
|
|
752
|
+
WHERE event_id = ?`).run(l.status,l.matchedSpecCount??null,l.queuedRunCount??null,l.suppressedCount??null,l.error??null,x(),i).changes??0)===1}listRuns(i={}){let l=[],u=[];if(i.specId)l.push("spec_id = ?"),u.push(i.specId);if(i.status){let b=Array.isArray(i.status)?i.status:[i.status];if(b.length>0){let I=b.map(()=>"?").join(",");l.push(`status IN (${I})`);for(let k of b)u.push(k)}}let c=l.length>0?`WHERE ${l.join(" AND ")}`:"",g=Math.max(1,Math.floor(i.limit??200));return this.db.prepare(`SELECT * FROM cron_runs ${c} ORDER BY created_at DESC LIMIT ?`).all(...u,g).map((b)=>Sd(b))}hasRecentEventRunForDedupe(i){return!!this.db.prepare(`SELECT r.run_id FROM cron_runs r
|
|
753
|
+
INNER JOIN cron_event_log e ON e.event_id = r.trigger_event_id
|
|
754
|
+
WHERE r.spec_id = ?
|
|
755
|
+
AND r.trigger_kind = 'event'
|
|
756
|
+
AND e.dedupe_key = ?
|
|
757
|
+
AND e.received_at >= ?
|
|
758
|
+
LIMIT 1`).get(i.specId,i.dedupeKey,i.sinceIso)}hasRecentEventRunForSpec(i){return!!this.db.prepare(`SELECT r.run_id FROM cron_runs r
|
|
759
|
+
INNER JOIN cron_event_log e ON e.event_id = r.trigger_event_id
|
|
760
|
+
WHERE r.spec_id = ?
|
|
761
|
+
AND r.trigger_kind = 'event'
|
|
762
|
+
AND e.received_at >= ?
|
|
763
|
+
LIMIT 1`).get(i.specId,i.sinceIso)}findQueuedEventRunForDedupe(i){let l=this.db.prepare(`SELECT r.* FROM cron_runs r
|
|
764
|
+
INNER JOIN cron_event_log e ON e.event_id = r.trigger_event_id
|
|
765
|
+
WHERE r.spec_id = ?
|
|
766
|
+
AND r.trigger_kind = 'event'
|
|
767
|
+
AND r.status = 'queued'
|
|
768
|
+
AND e.dedupe_key = ?
|
|
769
|
+
ORDER BY COALESCE(r.scheduled_for, r.created_at) DESC
|
|
770
|
+
LIMIT 1`).get(i.specId,i.dedupeKey);return l?Sd(l):void 0}updateQueuedEventRunForDebounce(i){let l=x();if((this.db.prepare(`UPDATE cron_runs SET
|
|
771
|
+
trigger_event_id = ?,
|
|
772
|
+
scheduled_for = ?,
|
|
773
|
+
updated_at = ?
|
|
774
|
+
WHERE run_id = ?
|
|
775
|
+
AND trigger_kind = 'event'
|
|
776
|
+
AND status = 'queued'`).run(i.triggerEventId,i.scheduledFor,l,i.runId).changes??0)!==1)return;return this.getRun(i.runId)}hasConsumedOneOffRevision(i,l){return!!this.db.prepare(`SELECT run_id FROM cron_runs
|
|
777
|
+
WHERE spec_id = ? AND spec_revision = ?
|
|
778
|
+
AND trigger_kind IN ('one_off', 'manual')
|
|
779
|
+
LIMIT 1`).get(i,l)}enqueueRun(i){let l=`crun_${ul()}`,u=x();this.db.prepare(`INSERT INTO cron_runs (
|
|
780
|
+
run_id, spec_id, spec_revision, trigger_kind, status,
|
|
781
|
+
scheduled_for, trigger_event_id, attempt_count,
|
|
782
|
+
created_at, updated_at
|
|
783
|
+
) VALUES (?,?,?,?,?, ?,?,?, ?,?)`).run(l,i.specId,i.specRevision,i.triggerKind,"queued",i.scheduledFor??null,i.triggerEventId??null,0,u,u),this.updateLastMaterializedRunId(i.specId,l);let c=this.getRun(l);if(!c)throw Error("failed to insert cron_run row");return c}cancelQueuedRunsForSpec(i){return this.db.prepare(`UPDATE cron_runs SET status = 'cancelled', updated_at = ?
|
|
784
|
+
WHERE spec_id = ? AND status = 'queued'`).run(x(),i).changes??0}cancelSupersededScheduleRuns(){let i=x();return this.db.prepare(`UPDATE cron_runs SET status = 'cancelled', error = ?, completed_at = ?, updated_at = ?
|
|
785
|
+
WHERE status = 'queued' AND trigger_kind = 'schedule'
|
|
786
|
+
AND scheduled_for IS NOT NULL
|
|
787
|
+
AND EXISTS (
|
|
788
|
+
SELECT 1 FROM cron_runs newer
|
|
789
|
+
WHERE newer.spec_id = cron_runs.spec_id
|
|
790
|
+
AND newer.status = 'queued'
|
|
791
|
+
AND newer.trigger_kind = 'schedule'
|
|
792
|
+
AND newer.scheduled_for > cron_runs.scheduled_for
|
|
793
|
+
)`).run("Skipped: superseded by a newer scheduled run",i,i).changes??0}cancelQueuedOneOffRunsForSpec(i){return this.db.prepare(`UPDATE cron_runs SET status = 'cancelled', updated_at = ?
|
|
794
|
+
WHERE spec_id = ? AND trigger_kind = 'one_off'
|
|
795
|
+
AND status = 'queued'`).run(x(),i).changes??0}claimDueRuns(i){let l=i.nowIso,u=Math.max(1000,Math.floor(i.leaseMs)),c=new Date(new Date(l).getTime()+u).toISOString(),g=Math.max(1,Math.floor(i.limit??25)),b=[];this.db.exec("BEGIN IMMEDIATE;");try{let I=this.db.prepare(`
|
|
796
|
+
SELECT * FROM cron_runs
|
|
797
|
+
WHERE (
|
|
798
|
+
status = 'queued'
|
|
799
|
+
OR (status = 'running' AND claim_until_at <= ? AND completed_at IS NULL)
|
|
800
|
+
)
|
|
801
|
+
AND (scheduled_for IS NULL OR scheduled_for <= ?)
|
|
802
|
+
AND (
|
|
803
|
+
SELECT COUNT(*) FROM cron_runs active
|
|
804
|
+
WHERE active.status = 'running' AND active.claim_until_at > ?
|
|
805
|
+
) < ?
|
|
806
|
+
AND (
|
|
807
|
+
SELECT COUNT(*) FROM cron_runs active
|
|
808
|
+
WHERE active.spec_id = cron_runs.spec_id
|
|
809
|
+
AND active.status = 'running' AND active.claim_until_at > ?
|
|
810
|
+
) < COALESCE((
|
|
811
|
+
SELECT MAX(1, max_parallel) FROM cron_specs WHERE spec_id = cron_runs.spec_id
|
|
812
|
+
), 1)
|
|
813
|
+
ORDER BY COALESCE(scheduled_for, created_at) ASC, rowid ASC
|
|
814
|
+
LIMIT 1
|
|
815
|
+
`),k=Math.max(1,Math.floor(i.maxConcurrency??10));while(b.length<g){let T=I.get(l,l,l,k,l);if(!T)break;let E=f(T.run_id);if(!E)continue;let A=`cclaim_${ul()}`;if((this.db.prepare(`UPDATE cron_runs SET
|
|
816
|
+
status = 'running',
|
|
817
|
+
claim_token = ?,
|
|
818
|
+
claim_started_at = ?,
|
|
819
|
+
claim_until_at = ?,
|
|
820
|
+
started_at = ?,
|
|
821
|
+
completed_at = NULL,
|
|
822
|
+
session_id = NULL,
|
|
823
|
+
report_path = NULL,
|
|
824
|
+
error = NULL,
|
|
825
|
+
attempt_count = attempt_count + 1,
|
|
826
|
+
updated_at = ?
|
|
827
|
+
WHERE run_id = ?
|
|
828
|
+
AND (
|
|
829
|
+
status = 'queued'
|
|
830
|
+
OR (
|
|
831
|
+
status = 'running'
|
|
832
|
+
AND claim_until_at IS NOT NULL
|
|
833
|
+
AND claim_until_at <= ?
|
|
834
|
+
AND completed_at IS NULL
|
|
835
|
+
)
|
|
836
|
+
)`).run(A,l,c,l,l,E,l).changes??0)!==1)continue;let C=this.getRun(E);if(!C)continue;b.push({run:C,claimToken:A,claimUntilAt:c})}this.db.exec("COMMIT;")}catch(I){throw this.db.exec("ROLLBACK;"),I}return b}renewClaim(i,l,u){return(this.db.prepare(`UPDATE cron_runs SET claim_until_at = ?, updated_at = ?
|
|
837
|
+
WHERE run_id = ? AND claim_token = ?`).run(u,x(),i,l).changes??0)===1}completeRun(i,l){let u=l.completedAtIso??x(),c=l.claimToken?"WHERE run_id = ? AND claim_token = ?":"WHERE run_id = ?";return(this.db.prepare(`UPDATE cron_runs SET
|
|
838
|
+
status = ?,
|
|
839
|
+
session_id = COALESCE(?, session_id),
|
|
840
|
+
report_path = COALESCE(?, report_path),
|
|
841
|
+
error = ?,
|
|
842
|
+
completed_at = ?,
|
|
843
|
+
claim_started_at = NULL,
|
|
844
|
+
claim_token = NULL,
|
|
845
|
+
claim_until_at = NULL,
|
|
846
|
+
updated_at = ?
|
|
847
|
+
${c}`).run(l.status,l.sessionId??null,l.reportPath??null,l.error??null,u,u,i,...l.claimToken?[l.claimToken]:[]).changes??0)>0}requeueRun(i){let l=x();return(this.db.prepare(`UPDATE cron_runs SET
|
|
848
|
+
status = 'queued',
|
|
849
|
+
attempt_count = MAX(0, attempt_count - ?),
|
|
850
|
+
claim_started_at = NULL,
|
|
851
|
+
claim_token = NULL,
|
|
852
|
+
claim_until_at = NULL,
|
|
853
|
+
started_at = NULL,
|
|
854
|
+
completed_at = NULL,
|
|
855
|
+
session_id = NULL,
|
|
856
|
+
report_path = NULL,
|
|
857
|
+
error = ?,
|
|
858
|
+
scheduled_for = COALESCE(?, scheduled_for),
|
|
859
|
+
updated_at = ?
|
|
860
|
+
WHERE run_id = ? AND claim_token = ?`).run(i.releaseAttempt?1:0,i.error??null,i.scheduledFor??null,l,i.runId,i.claimToken).changes??0)>0}attachSessionIdToRun(i,l,u){return(this.db.prepare("UPDATE cron_runs SET session_id = ?, updated_at = ? WHERE run_id = ? AND claim_token = ? AND status = 'running'").run(l,x(),i,u).changes??0)===1}attachReportPathToRun(i,l){this.db.prepare("UPDATE cron_runs SET report_path = ?, updated_at = ? WHERE run_id = ?").run(l,x(),i)}}function SW(i){let l=i.replace(/\\/g,"/");if(l.startsWith("events/")&&l.endsWith(".event.md"))return"event";if(l.endsWith(".cron.md"))return"schedule";return"one_off"}function TW(i){let l=he(i).replace(/\r\n/g,`
|
|
861
|
+
`);if(!l.startsWith(`---
|
|
862
|
+
`))return{frontmatter:void 0,body:i};let u=l.slice(4),c=u.indexOf(`
|
|
863
|
+
---`);if(c===-1)return{frontmatter:void 0,body:i};let g=u.slice(0,c),b=u.slice(c+4);if(b.startsWith(`
|
|
864
|
+
`))b=b.slice(1);return{frontmatter:g,body:b}}function qr(i){if(typeof i!=="string")return;let l=i.trim();return l.length>0?l:void 0}function _W(i){if(!Array.isArray(i))return;let l=i.map((u)=>typeof u==="string"?u.trim():"").filter((u)=>u.length>0);return l.length>0?l:void 0}function Zm(i){if(!i||typeof i!=="object"||Array.isArray(i))return;return i}function EW(i){let l=Zm(i);if(!l)return;let u=qr(l.providerId),c=qr(l.modelId);if(u===void 0&&c===void 0)return;return{providerId:u,modelId:c}}function AW(i){if(typeof i!=="string")return;let l=i.trim().toLowerCase();if(l==="act"||l==="plan"||l==="yolo")return l;return}function UT(i,l={}){let u=Array.isArray(i)?i:typeof i==="string"?i.split(","):void 0;if(!u)return;let c=[...new Set(u.map((g)=>typeof g==="string"?g.trim():"").filter((g)=>g.length>0))];if(Array.isArray(i)&&l.preserveEmptyArray)return c;return c.length>0?c:void 0}var xW=new Set(tN);function CW(i){let l=UT(i,{preserveEmptyArray:!0});if(!l)return;let u=l.filter((c)=>!xW.has(c));if(u.length>0)throw Error(`unknown tool(s): ${u.join(", ")}`);return l}var RW=new Set(["rules","skills","plugins"]);function PW(i){let l=UT(i,{preserveEmptyArray:!0});if(!l)return;let u=l.filter((c)=>!RW.has(c));if(u.length>0)throw Error(`unknown extension(s): ${u.join(", ")}`);return l}function Tp(i){if(typeof i!=="number"||!Number.isFinite(i)||i<=0)return;return Math.floor(i)}function _p(i){if(typeof i!=="number"||!Number.isFinite(i)||i<0)return;return Math.floor(i)}function eh(i){if(i===null||typeof i!=="object")return JSON.stringify(i??null);if(Array.isArray(i))return`[${i.map((u)=>eh(u)).join(",")}]`;let l=Object.entries(i).filter(([,u])=>u!==void 0);return l.sort(([u],[c])=>u<c?-1:u>c?1:0),`{${l.map(([u,c])=>`${JSON.stringify(u)}:${eh(c)}`).join(",")}}`}function FT(i,l){let u=kW("sha256");return u.update(eh(i)),u.update(`
|
|
865
|
+
`),u.update(l),u.digest("hex")}function MW(i){return(i.split("/").pop()??i).replace(/\.event\.md$/,"").replace(/\.cron\.md$/,"").replace(/\.md$/,"")}var NW=["schedule","timezone"],OW=["event","filters","debounceSeconds","dedupeWindowSeconds","cooldownSeconds","maxParallel"],$W=["cwd"];function Uw(i,l,u,c,g){return{externalId:i,relativePath:i,triggerKind:l,body:u,contentHash:FT(c,u),error:g}}function ps(i,l,u,c,g,b){return{externalId:i,relativePath:l,triggerKind:u,body:c,contentHash:g,error:b}}function LW(i){let l=i.relativePath.replace(/\\/g,"/"),u=SW(l),{frontmatter:c,body:g}=TW(i.raw),b={};if(c!==void 0&&c.trim().length>0)try{let j=X.parse(c);if(j&&typeof j==="object"&&!Array.isArray(j))b=j;else if(j!==null&&j!==void 0)return Uw(l,u,g,{},"frontmatter must be a YAML mapping")}catch(j){return Uw(l,u,g,{},j instanceof Error?`failed to parse frontmatter: ${j.message}`:"failed to parse frontmatter")}let I=FT(b,g),k=qr(b.id),T=k??l;if(u!=="schedule"){for(let j of NW)if(b[j]!==void 0)return ps(T,l,u,g,I,`field "${j}" is only allowed on *.cron.md specs`)}for(let j of $W)if(b[j]!==void 0)return ps(T,l,u,g,I,`field "${j}" is no longer supported; cron specs use workspaceRoot as cwd`);if(u!=="event"){for(let j of OW)if(b[j]!==void 0)return ps(T,l,u,g,I,`field "${j}" is only allowed on .event.md specs`)}let E=qr(b.prompt),A=g.trim(),C=E??(A.length>0?A:void 0);if(!C)return ps(T,l,u,g,I,"prompt is required (frontmatter `prompt` or markdown body)");let N=qr(b.workspaceRoot);if(!N)return ps(T,l,u,g,I,"workspaceRoot is required");let O,L;try{O=CW(b.tools),L=PW(b.extensions)}catch(j){return ps(T,l,u,g,I,j instanceof Error?j.message:String(j))}let D=AW(b.mode);if(b.mode!==void 0&&D===void 0)return ps(T,l,u,g,I,"mode must be one of: act, plan, yolo");let U={id:k,title:qr(b.title)??k??MW(l),prompt:C,workspaceRoot:N,mode:D??"yolo",systemPrompt:qr(b.systemPrompt),modelSelection:EW(b.modelSelection),maxIterations:Tp(b.maxIterations),timeoutSeconds:Tp(b.timeoutSeconds),tools:O,notesDirectory:qr(b.notesDirectory),extensions:L,source:qr(b.source)??"user",tags:_W(b.tags),enabled:typeof b.enabled==="boolean"?b.enabled:!0,metadata:Zm(b.metadata)},F;if(u==="schedule"){let j=qr(b.schedule);if(!j)return ps(T,l,u,g,I,"schedule is required for *.cron.md specs");let H=qr(b.timezone);try{aW(j,H)}catch(Q){return ps(T,l,u,g,I,Q instanceof Error?Q.message:String(Q))}F={...U,triggerKind:"schedule",schedule:j,timezone:H}}else if(u==="event"){let j=qr(b.event);if(!j)return ps(T,l,u,g,I,"event is required for .event.md specs");F={...U,triggerKind:"event",event:j,filters:Zm(b.filters),debounceSeconds:_p(b.debounceSeconds),dedupeWindowSeconds:_p(b.dedupeWindowSeconds),cooldownSeconds:_p(b.cooldownSeconds),maxParallel:Tp(b.maxParallel)}}else F={...U,triggerKind:"one_off"};return{externalId:T,relativePath:l,triggerKind:u,body:g,contentHash:I,spec:F}}function DW(i,l){return iW(i,l).replace(/\\/g,"/")}function UW(i){if(!eW(i))return[];let l=[],u=[i];while(u.length>0){let c=u.pop();if(!c)continue;let g;try{g=tW(c,{withFileTypes:!0})}catch{continue}for(let b of g){let I=`${c}/${b.name}`;if(b.isDirectory()){if(b.name==="reports")continue;u.push(I);continue}if(!b.isFile())continue;if(!b.name.endsWith(".md"))continue;l.push(I)}}return l}class qT{store;cronDir;constructor(i){this.store=i.store,this.cronDir=Nt(i.specs??(i.workspaceRoot?{scope:"workspace",workspaceRoot:i.workspaceRoot}:void 0))}getCronDir(){return this.cronDir}async reconcileAll(){let i={scanned:0,upserted:0,invalidParses:0,removed:0,changes:[]},l=UW(this.cronDir),u=new Set;for(let g of l){let b=DW(this.cronDir,g);u.add(b),i.scanned+=1;let I=await this.reconcileFile(b,g);if(I){if(i.changes.push(I),i.upserted+=1,I.parse.error)i.invalidParses+=1}}let c=this.store.listSpecs({includeRemoved:!1,limit:1e4});for(let g of c){if(wW(g))continue;if(!u.has(g.sourcePath))this.handleFileDeleted(g),i.removed+=1}return this.refreshScheduleNextRunAt(),i}async reconcileFile(i,l){let u=this.store.getSpecBySourcePath(i),c,g;try{c=rW(l,"utf8"),g=sW(l).mtimeMs}catch{return}let b=LW({relativePath:i,raw:c}),I=this.store.upsertSpec({externalId:b.externalId,sourcePath:i,triggerKind:b.triggerKind,sourceMtimeMs:g,sourceHash:b.contentHash,parseStatus:b.error?"invalid":"valid",parseError:b.error,spec:b.spec});if(!b.error&&b.triggerKind==="schedule"&&I.record.enabled)this.applyScheduleNextRunAt(I.record,{forceReset:!u||u.removed||!u.enabled||u.scheduleExpr!==I.record.scheduleExpr||u.timezone!==I.record.timezone});return{relativePath:i,result:I,parse:b}}handleFileDeleted(i){this.store.markSpecRemoved(i.specId),this.store.cancelQueuedRunsForSpec(i.specId)}refreshScheduleNextRunAt(){let i=this.store.listSpecs({triggerKind:"schedule",enabled:!0,parseStatus:"valid"});for(let l of i)this.applyScheduleNextRunAt(l,{forceReset:!1})}applyScheduleNextRunAt(i,l){if(!i.scheduleExpr)return;if(!l.forceReset&&i.nextRunAt)return;try{let u=Date.now(),c=i.lastRunAt?Math.max(u,new Date(i.lastRunAt).getTime()):u,g=Dl(i.scheduleExpr,c,i.timezone),b=new Date(g).toISOString();if(i.nextRunAt!==b)this.store.updateSpecNextRunAt(i.specId,b)}catch{}}}var WW=250;class jT{reconciler;debounceMs;onError;onReconciled;watcher;pending=new Map;disposed=!1;constructor(i){this.reconciler=i.reconciler,this.debounceMs=Math.max(0,i.debounceMs??WW),this.onError=i.onError??(()=>{}),this.onReconciled=i.onReconciled??(()=>{})}start(){if(this.disposed)throw Error("CronWatcher disposed");if(this.watcher)return;let i=this.reconciler.getCronDir();try{qW(i,{recursive:!0});let l=jW.native(i);this.watcher=BW(l,{recursive:!0},(u,c)=>{if(!c)return;let g=String(c).replace(/\\/g,"/");if(!g.endsWith(".md"))return;if(g.startsWith("reports/"))return;this.scheduleReconcile(g)}),this.watcher.on("error",this.onError)}catch(l){this.onError(l)}}stop(){for(let i of this.pending.values())clearTimeout(i);this.pending.clear(),this.watcher?.close(),this.watcher=void 0}dispose(){this.disposed=!0,this.stop()}scheduleReconcile(i){let l=this.pending.get(i);if(l)clearTimeout(l);let u=setTimeout(()=>{this.pending.delete(i),this.reconcileNow(i)},this.debounceMs);this.pending.set(i,u)}async reconcileNow(i){try{let l=zW(this.reconciler.getCronDir(),i);if(!FW(l)){await this.reconciler.reconcileAll(),await this.onReconciled();return}let u=HW(this.reconciler.getCronDir(),l).replace(/\\/g,"/");await this.reconciler.reconcileFile(u,l),await this.onReconciled()}catch(l){this.onError(l)}}}class BT{store;reconciler;watcher;eventIngress;materializer;runner;started=!1;disposed=!1;constructor(i){this.store=new Of({dbPath:i.dbPath});let l=i.specs;this.reconciler=new qT({store:this.store,specs:l}),this.materializer=new Pf({store:this.store}),this.eventIngress=new CT({store:this.store,logger:i.logger}),this.runner=new Mf({store:this.store,materializer:this.materializer,runtimeHandlers:i.runtimeHandlers,workspaceRoot:i.workspaceRoot,specs:l,logger:i.logger,telemetry:i.telemetry,pollIntervalMs:i.pollIntervalMs,claimLeaseSeconds:i.claimLeaseSeconds,globalMaxConcurrency:i.globalMaxConcurrency}),this.watcher=new jT({reconciler:this.reconciler,debounceMs:i.watcherDebounceMs,onReconciled:()=>{this.materializer.materializeAll()},onError:(u)=>{let c=i.logger;if(c)if(c.error)c.error("cron.watcher.failed",{error:u});else c.log("cron.watcher.failed",{error:u})}})}async start(){if(this.disposed)throw Error("CronService disposed");if(this.started)return;this.started=!0,await this.reconciler.reconcileAll(),this.materializer.materializeAll(),this.watcher.start(),await this.runner.start()}async stop(){this.watcher.stop(),await this.runner.stop(),this.started=!1}async dispose(){if(this.disposed)return;this.disposed=!0,this.watcher.dispose(),await this.runner.dispose(),this.store.close()}listSpecs(i){return this.store.listSpecs(i)}getSpec(i){return this.store.getSpec(i)}listRuns(i){return this.store.listRuns(i)}getRun(i){return this.store.getRun(i)}listActiveRuns(){return this.store.listRuns({status:"running",limit:200})}listUpcomingRuns(i=20){return this.store.listRuns({status:"queued",limit:i})}async reconcileNow(){await this.reconciler.reconcileAll(),this.materializer.materializeAll()}ingestEvent(i){return this.eventIngress.ingestEvent(i)}listEventLogs(i){return this.store.listEventLogs(i)}getEventLog(i){return this.store.getEventLog(i)}}function Ri(i,l){return l.crossWorkspace&&i.payload?.allWorkspaces===!0}function Fw(i,l){if(typeof l!=="string"||!l.trim())return;let u=uo(i,l);if(!HT(i,u))throw Error("schedule cwd is outside the client workspace scope");return u}function qw(i){return typeof i.workspaceRoot==="string"&&i.workspaceRoot.trim()?uo(i.workspaceRoot.trim()):void 0}function HT(i,l){let u=GW(i,l);return u!==".."&&!u.startsWith(`..${XW}`)&&!KW(u)}function Pt(i,l){return{version:i.version,requestId:i.requestId,ok:!0,payload:l}}function jw(i,l,u){return{version:i.version,requestId:i.requestId??P("hubreq_"),ok:!1,error:{code:l,message:u}}}class zT{schedules;constructor(i){this.schedules=i}async handleCommand(i,l){try{let u=this.resolveScope(l);switch(i.command){case"schedule.create":return Pt(i,{schedule:this.schedules.createSchedule(this.toCreateInput(i.payload??{},u,Ri(i,u)))});case"schedule.list":return Pt(i,{schedules:this.schedules.listSchedules({enabled:typeof i.payload?.enabled==="boolean"?i.payload.enabled:void 0,limit:typeof i.payload?.limit==="number"?i.payload.limit:void 0,tags:Array.isArray(i.payload?.tags)?i.payload?.tags:void 0,workspaceRoot:Ri(i,u)?void 0:u.workspaceRoot})});case"schedule.get":return Pt(i,{schedule:this.requireScopedSchedule(i,u)});case"schedule.update":{let c=this.requireScopedSchedule(i,u);return Pt(i,{schedule:this.schedules.updateSchedule(c.scheduleId,this.toUpdateInput(i.payload??{},u,c,Ri(i,u)))})}case"schedule.delete":return Pt(i,{deleted:this.schedules.deleteSchedule(this.requireScopedSchedule(i,u).scheduleId)});case"schedule.enable":return Pt(i,{schedule:this.schedules.resumeSchedule(this.requireScopedSchedule(i,u).scheduleId)});case"schedule.disable":return Pt(i,{schedule:this.schedules.pauseSchedule(this.requireScopedSchedule(i,u).scheduleId)});case"schedule.trigger":return Pt(i,{execution:i.payload?.wait===!1?this.schedules.triggerScheduleNowDetached(this.requireScopedSchedule(i,u).scheduleId):await this.schedules.triggerScheduleNow(this.requireScopedSchedule(i,u).scheduleId)});case"schedule.list_executions":return Pt(i,{executions:this.listScopedExecutions(i,u)});case"schedule.stats":return Pt(i,{stats:this.schedules.getScheduleStats(this.requireScopedSchedule(i,u).scheduleId)});case"schedule.active":{let c=this.schedules.getActiveExecutions();if(Ri(i,u))return Pt(i,{executions:c});let g=this.scopedScheduleIds(u);return Pt(i,{executions:c.filter((b)=>g.has(b.scheduleId))})}case"schedule.upcoming":{let c=this.schedules.getUpcomingRuns(typeof i.payload?.limit==="number"?i.payload.limit:void 0);if(Ri(i,u))return Pt(i,{runs:c});let g=this.scopedScheduleIds(u);return Pt(i,{runs:c.filter((b)=>g.has(b.scheduleId))})}default:return jw(i,"unsupported_command",`Unsupported hub schedule command: ${i.command}`)}}catch(u){return jw(i,"schedule_command_failed",u instanceof Error?u.message:String(u))}}resolveScope(i){let l=i?.workspaceContext;if(!i?.clientId||!l?.workspaceRoot?.trim())throw Error("schedule commands require a registered workspace client");let u=uo(l.workspaceRoot),c=uo(l.cwd?.trim()||u);if(!HT(u,c))throw Error("client cwd is outside its workspace scope");return{workspaceRoot:u,cwd:c,crossWorkspace:i.crossWorkspace===!0}}requireScopedSchedule(i,l){let u=String(i.payload?.scheduleId??"").trim(),c=u?this.schedules.getSchedule(u):void 0;if(!c||!Ri(i,l)&&uo(c.workspaceRoot)!==l.workspaceRoot)throw Error("schedule does not exist in this workspace");return c}scopedScheduleIds(i){return new Set(this.schedules.listSchedules({workspaceRoot:i.workspaceRoot}).map((l)=>l.scheduleId))}listScopedExecutions(i,l){let u=typeof i.payload?.scheduleId==="string"?i.payload.scheduleId.trim():void 0;if(u)this.requireScopedSchedule(i,l);let c=this.schedules.listScheduleExecutions({scheduleId:u,status:typeof i.payload?.status==="string"?i.payload.status:void 0,limit:typeof i.payload?.limit==="number"?i.payload.limit:void 0});if(Ri(i,l))return c;let g=this.scopedScheduleIds(l);return c.filter((b)=>g.has(b.scheduleId))}toCreateInput(i,l,u){let c=ka(i,"yolo"),g=i.modelSelection&&typeof i.modelSelection==="object"&&!Array.isArray(i.modelSelection)?i.modelSelection:i.provider&&i.model?{providerId:String(i.provider),modelId:String(i.model)}:void 0,b=(u?qw(i):void 0)??l.workspaceRoot,{allWorkspaces:I,...k}=i;return{...k,modelSelection:g,mode:c,workspaceRoot:b,cwd:Fw(b,i.cwd)??(b===l.workspaceRoot?l.cwd:b)}}toUpdateInput(i,l,u,c){let g=ka(i),b=i.modelSelection&&typeof i.modelSelection==="object"&&!Array.isArray(i.modelSelection)?i.modelSelection:i.provider||i.model?{providerId:typeof i.provider==="string"?i.provider:"",modelId:typeof i.model==="string"?i.model:""}:void 0,I=c?qw(i)??uo(u.workspaceRoot):l.workspaceRoot,{allWorkspaces:k,...T}=i;return{...T,modelSelection:b,...g===void 0?{}:{mode:g},workspaceRoot:I,...Object.hasOwn(i,"cwd")?{cwd:i.cwd===null?I:Fw(I,i.cwd)??(I===l.workspaceRoot?l.cwd:I)}:{}}}}function Du(i){return i?new Date(i).getTime():void 0}function JW(i){let l=i.metadata?{...i.metadata}:void 0;if(l)delete l.__hubScheduleCreatedBy,delete l.__hubScheduleCwd,delete l.__hubRuntimeOptions;return l}function cl(i){let l=i.metadata;return{scheduleId:i.externalId,name:i.title,cronPattern:i.triggerKind==="one_off"?pe:i.scheduleExpr??"",timezone:i.triggerKind==="schedule"?i.timezone:void 0,prompt:i.prompt??"",workspaceRoot:i.workspaceRoot??"",cwd:typeof l?.__hubScheduleCwd==="string"?l.__hubScheduleCwd:void 0,modelSelection:i.providerId||i.modelId?{providerId:i.providerId??"",modelId:i.modelId??""}:void 0,enabled:i.enabled&&!i.removed&&i.parseStatus==="valid",mode:i.mode==="plan"?"plan":i.mode==="act"?"act":"yolo",systemPrompt:i.systemPrompt,maxIterations:i.maxIterations,timeoutSeconds:i.timeoutSeconds,maxParallel:i.maxParallel??1,createdAt:new Date(i.createdAt).getTime(),updatedAt:new Date(i.updatedAt).getTime(),nextRunAt:Du(i.nextRunAt),lastRunAt:Du(i.lastRunAt),createdBy:typeof l?.__hubScheduleCreatedBy==="string"?l.__hubScheduleCreatedBy:void 0,tags:i.tags,runtimeOptions:l?.__hubRuntimeOptions&&typeof l.__hubRuntimeOptions==="object"&&!Array.isArray(l.__hubRuntimeOptions)?l.__hubRuntimeOptions:void 0,metadata:JW(i)}}function VW(i){switch(i){case"done":return"success";case"cancelled":return"aborted";case"running":return"running";case"queued":return"pending";default:return"failed"}}function Ep(i,l){return{executionId:i.runId,scheduleId:l,sessionId:i.sessionId,triggeredAt:new Date(i.scheduledFor??i.createdAt).getTime(),startedAt:Du(i.startedAt),endedAt:Du(i.completedAt),status:VW(i.status),errorMessage:i.error}}class WT{store;materializer;runner;started=!1;disposed=!1;constructor(i){this.store=new Of({dbPath:i.dbPath}),this.materializer=new Pf({store:this.store}),this.runner=new Mf({store:this.store,materializer:this.materializer,runtimeHandlers:i.runtimeHandlers,eventPublisher:i.eventPublisher,workspaceRoot:"",specs:i.specs,logger:i.logger,telemetry:i.telemetry,pollIntervalMs:i.pollIntervalMs,claimLeaseSeconds:i.claimLeaseSeconds,globalMaxConcurrency:i.globalMaxConcurrency})}async start(){if(this.disposed)throw Error("HubScheduleService has been disposed");if(this.started)return;this.started=!0,await this.runner.start()}async stop(){await this.runner.stop(),this.started=!1}async dispose(){if(this.disposed)return;this.disposed=!0,await this.runner.dispose(),this.store.close()}createSchedule(i){let l=i.cronPattern===pe?i.timezone:i.timezone?.trim()||Intl.DateTimeFormat().resolvedOptions().timeZone;if(this.validateScheduleTiming(i.cronPattern,l,i.metadata,!0),!i.workspaceRoot?.trim())throw Error("workspaceRoot is required for schedules");return cl(this.store.createHubSchedule({...i,timezone:l}))}getSchedule(i){let l=this.store.getHubSchedule(i);return l?cl(l):void 0}listSchedules(i={}){return this.store.listHubSchedules(i).map((l)=>cl(l))}updateSchedule(i,l){let u=this.store.getHubSchedule(i);if(!u)return;let c=l.workspaceRoot!==void 0?l.workspaceRoot.trim():u.workspaceRoot,g=l.enabled??u.enabled,b=cl(u),I=l.cronPattern??b.cronPattern;if(I.trim()===pe&&typeof l.timezone==="string"&&l.timezone.trim())throw Error("timezone is only supported for recurring schedules");if(this.validateScheduleTiming(I,I.trim()===pe?void 0:l.timezone===null?void 0:l.timezone??b.timezone,l.metadata??b.metadata,g),g&&!c)throw Error("workspaceRoot is required for enabled schedules");let k=this.store.updateHubSchedule(i,{...l,scheduleId:i});return k?cl(k):void 0}validateScheduleTiming(i,l,u,c){if(i.trim()!==pe){oW(i),LT(l);return}if(l?.trim())throw Error("timezone is only supported for recurring schedules");let g=u?.[fe];if(typeof g!=="number"||!Number.isFinite(g)||c&&g<=Date.now())throw Error("runAt must be a future timestamp")}deleteSchedule(i){return this.store.deleteHubSchedule(i)}pauseSchedule(i){return this.updateSchedule(i,{scheduleId:i,enabled:!1})}resumeSchedule(i){return this.updateSchedule(i,{scheduleId:i,enabled:!0})}async triggerScheduleNow(i){let l=this.store.enqueueHubScheduleRun(i,"manual");if(!l)return;await this.runner.tick();let u=this.store.getRun(l.runId)??l;return Ep(u,i)}triggerScheduleNowDetached(i){let l=this.store.enqueueHubScheduleRun(i,"manual");if(!l)return;return this.runner.tick().catch(()=>{return}),Ep(l,i)}listScheduleExecutions(i){let l=i.scheduleId?this.store.getHubSchedule(i.scheduleId):void 0,u={specId:l?.specId,limit:i.limit};return this.store.listRuns(u).map((c)=>{let g=l??this.store.getSpec(c.specId);if(!g||g.source!=="hub-schedule")return;return Ep(c,g.externalId)}).filter((c)=>{if(!c)return!1;return!i.status||c.status===i.status})}getScheduleStats(i){let l=this.listScheduleExecutions({scheduleId:i,limit:1e4});if(l.length===0)return{totalRuns:0,successRate:0,avgDurationSeconds:0};let u=0,c=0,g=0,b;for(let I of l){if(I.status==="success"||I.status==="completed")u+=1;if(!b&&I.status!=="success"&&I.status!=="completed")b=I;if(I.startedAt&&I.endedAt)g+=I.endedAt-I.startedAt,c+=1}return{totalRuns:l.length,successRate:u/l.length,avgDurationSeconds:c>0?g/c/1000:0,lastFailure:b}}getActiveExecutions(){return this.runner.getActiveRuns().flatMap((i)=>{let l=this.store.getSpec(i.specId);if(!l||l.source!=="hub-schedule"||!i.sessionId)return[];return[{executionId:i.runId,scheduleId:l.externalId,sessionId:i.sessionId,startedAt:i.startedAt??new Date().toISOString(),timeoutAt:l.timeoutSeconds&&i.startedAt?new Date(new Date(i.startedAt).getTime()+l.timeoutSeconds*1000).toISOString():void 0}]})}getUpcomingRuns(i=20){let l={triggerKind:"schedule",enabled:!0,limit:i};return this.store.listSpecs(l).flatMap((u)=>u.source==="hub-schedule"&&u.nextRunAt?[{spec:u,nextRunAt:u.nextRunAt}]:[]).sort((u,c)=>String(u.nextRunAt).localeCompare(String(c.nextRunAt))).slice(0,i).map(({spec:u,nextRunAt:c})=>({scheduleId:u.externalId,name:u.title,nextRunAt:c}))}}var Bw=2,ZW=300000,Hw=131072,eK=1e5,tK=2000,rK="bm25(0, 0, 0, 0, 0, 0.5, 8.0, 1.0)";function $f(i){return i!==null&&typeof i==="object"&&!Array.isArray(i)?i:void 0}function th(i,l){if(l.length>=Hw)return;if(typeof i==="string"){let c=l.parts.length>0?1:0,g=Hw-l.length-c;if(g<=0)return;let b=i.slice(0,g);if(!b)return;l.parts.push(b),l.length+=c+b.length;return}if(Array.isArray(i)){for(let c of i)th(c,l);return}let u=$f(i);if(!u)return;for(let[c,g]of Object.entries(u)){if(c==="data"||c==="image"||c==="images"||c==="reasoning"||c==="thinking"||c==="metadata")continue;th(g,l)}}function sK(i){let l=$f(i),u={length:0,parts:[]};return th(l?.content??i,u),u.parts.join(`
|
|
866
|
+
`).trim()}function iK(i){let l=$f(i)?.role;return typeof l==="string"?l:"unknown"}function nK(i){let l=i.metadata?.title,u=typeof l==="string"&&l.trim()?l:i.prompt||i.sessionId;return Wn(u)||i.sessionId}function oK(i){return i.trim().split(/\s+/u).filter(Boolean).map((l)=>`"${l.replaceAll('"','""')}"*`).join(" AND ")}function aK(i){if(i.exec("PRAGMA journal_mode = WAL;"),i.exec("PRAGMA busy_timeout = 5000;"),i.exec(`CREATE TABLE IF NOT EXISTS indexed_sessions (
|
|
867
|
+
session_id TEXT PRIMARY KEY,
|
|
868
|
+
source_revision TEXT NOT NULL,
|
|
869
|
+
indexed_at TEXT NOT NULL,
|
|
870
|
+
document_count INTEGER NOT NULL,
|
|
871
|
+
index_version INTEGER NOT NULL,
|
|
872
|
+
title TEXT NOT NULL DEFAULT ''
|
|
873
|
+
);`),!new Set(i.prepare("PRAGMA table_info(indexed_sessions)").all().map((l)=>l.name)).has("title"))i.exec("ALTER TABLE indexed_sessions ADD COLUMN title TEXT NOT NULL DEFAULT '';");i.exec(`CREATE VIRTUAL TABLE IF NOT EXISTS session_search USING fts5(
|
|
874
|
+
session_id UNINDEXED,
|
|
875
|
+
document_id UNINDEXED,
|
|
876
|
+
ordinal UNINDEXED,
|
|
877
|
+
role UNINDEXED,
|
|
878
|
+
started_at UNINDEXED,
|
|
879
|
+
workspace_root,
|
|
880
|
+
title,
|
|
881
|
+
content,
|
|
882
|
+
tokenize='unicode61 remove_diacritics 2 tokenchars ''_-@'''
|
|
883
|
+
);`)}function lK(i){let l;try{return l=V(i),aK(l),{db:l}}catch(u){try{l?.close?.()}catch{}return{error:u??Error("Session search database initialization failed")}}}class KT{host;db;initializationError;intervalMs;removedDuringRefresh=new Set;failedEvictionSessionIds=new Set;timer;refreshPromise;readyPromise=Promise.resolve();constructor(i,l={}){this.host=i;let u=lK(l.dbPath??QW(xe(),"session-search.db"));this.db=u.db,this.initializationError=u.error,this.intervalMs=l.reconcileIntervalMs??ZW}start(){if(!this.db)return;this.readyPromise=this.refreshNow(),this.readyPromise.catch((i)=>console.warn("[hub] session search indexing failed",i)),this.timer=setInterval(()=>{this.refreshNow().catch((i)=>console.warn("[hub] session search reconciliation failed",i))},this.intervalMs),this.timer.unref?.()}async dispose(){if(this.timer)clearInterval(this.timer);this.timer=void 0,await this.refreshPromise?.catch(()=>{return}),this.db?.close?.()}refreshNow(){let i=this.db;if(!i)return Promise.resolve();if(!this.refreshPromise)this.refreshPromise=this.reconcile(i).finally(()=>{this.removedDuringRefresh.clear(),this.refreshPromise=void 0});return this.refreshPromise}removeSession(i){let l=this.db;if(!l)return;let u=i.trim();if(!u)return;if(this.refreshPromise)this.removedDuringRefresh.add(u);try{this.deleteIndexedSession(l,u),this.failedEvictionSessionIds.delete(u)}catch(c){throw this.failedEvictionSessionIds.add(u),c}}async waitUntilReady(){await this.readyPromise}isAvailable(){return this.db!==void 0}getInitializationError(){return this.initializationError}search(i){let l=this.db;if(!l)return[];let u=oK(i.query);if(!u)return[];let c=Math.min(Math.max(Math.trunc(i.limit??50),1),200),g=Math.min(Math.max(c*20,200),tK),b=i.workspaceRoot?.trim(),I=l.prepare(`WITH matches AS MATERIALIZED (
|
|
884
|
+
SELECT session_search.session_id, document_id, ordinal, role, started_at,
|
|
885
|
+
workspace_root, indexed_sessions.title,
|
|
886
|
+
snippet(session_search, 7, '[', ']', '…', 24) AS snippet,
|
|
887
|
+
session_search.rank AS score
|
|
888
|
+
FROM session_search
|
|
889
|
+
JOIN indexed_sessions
|
|
890
|
+
ON indexed_sessions.session_id = session_search.session_id
|
|
891
|
+
WHERE session_search MATCH ?
|
|
892
|
+
AND session_search.rank MATCH ?
|
|
893
|
+
AND (? IS NULL OR workspace_root = ?)
|
|
894
|
+
ORDER BY score, started_at DESC
|
|
895
|
+
LIMIT ?
|
|
896
|
+
), ranked AS (
|
|
897
|
+
SELECT *, ROW_NUMBER() OVER (
|
|
898
|
+
PARTITION BY session_id ORDER BY score, ordinal
|
|
899
|
+
) AS session_rank
|
|
900
|
+
FROM matches
|
|
901
|
+
)
|
|
902
|
+
SELECT session_id, document_id, ordinal, role, started_at,
|
|
903
|
+
workspace_root, title, snippet, score
|
|
904
|
+
FROM ranked
|
|
905
|
+
WHERE session_rank = 1
|
|
906
|
+
ORDER BY score, started_at DESC
|
|
907
|
+
LIMIT ?`).all(u,rK,b??null,b??null,g,c);return(this.removedDuringRefresh.size===0&&this.failedEvictionSessionIds.size===0?I:I.filter((k)=>!this.isSessionSuppressed(String(k.session_id)))).map((k)=>{let T=String(k.role);return{sessionId:String(k.session_id),documentId:String(k.document_id),ordinal:Number(k.ordinal),role:T,startedAt:String(k.started_at),workspaceRoot:String(k.workspace_root),title:Wn(String(k.title)),snippet:lr(T,String(k.snippet??"")),score:Number(k.score)}})}isSessionSuppressed(i){return this.removedDuringRefresh.has(i)||this.failedEvictionSessionIds.has(i)}async reconcile(i){let l=await this.host.listSessions(eK),u=new Set(l.map((I)=>I.sessionId)),c=i.prepare("SELECT session_id, source_revision, index_version FROM indexed_sessions").all(),g=new Map(c.map((I)=>[String(I.session_id),I]));for(let I of l){if(this.isSessionSuppressed(I.sessionId))continue;let k=await this.sourceRevision(I);if(this.isSessionSuppressed(I.sessionId))continue;let T=g.get(I.sessionId);if(T?.source_revision===k&&Number(T.index_version)===Bw)continue;await this.indexSession(i,I,k)}for(let I of c){let k=String(I.session_id);if(!u.has(k)||this.isSessionSuppressed(k))this.deleteIndexedSession(i,k),this.failedEvictionSessionIds.delete(k)}let b=i.prepare("SELECT 1 FROM indexed_sessions WHERE session_id = ? LIMIT 1");for(let I of this.failedEvictionSessionIds)if(!b.get(I))this.failedEvictionSessionIds.delete(I)}async sourceRevision(i){if(!i.messagesPath)return`${i.updatedAt}:missing`;let l=await YW(i.messagesPath).catch(()=>{return});return`${i.updatedAt}:${l?.size??0}:${l?.mtimeMs??0}`}async indexSession(i,l,u){let c=await this.host.readSessionMessages(l.sessionId).catch(()=>[]);if(this.removedDuringRefresh.has(l.sessionId))return;let g=nK(l),b=i.prepare(`INSERT INTO session_search (
|
|
908
|
+
session_id, document_id, ordinal, role, started_at,
|
|
909
|
+
workspace_root, title, content
|
|
910
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`);i.exec("BEGIN IMMEDIATE;");try{i.prepare("DELETE FROM session_search WHERE session_id = ?").run(l.sessionId),b.run(l.sessionId,`${l.sessionId}:metadata`,-1,"session",l.startedAt,l.workspaceRoot,g,l.prompt?.trim()??"");let I=1;for(let[k,T]of c.entries()){let E=sK(T);if(!E)continue;b.run(l.sessionId,`${l.sessionId}:${k}`,k,iK(T),l.startedAt,l.workspaceRoot,"",E),I+=1}i.prepare(`INSERT INTO indexed_sessions (
|
|
911
|
+
session_id, source_revision, indexed_at, document_count, index_version, title
|
|
912
|
+
) VALUES (?, ?, ?, ?, ?, ?)
|
|
913
|
+
ON CONFLICT(session_id) DO UPDATE SET
|
|
914
|
+
source_revision = excluded.source_revision,
|
|
915
|
+
indexed_at = excluded.indexed_at,
|
|
916
|
+
document_count = excluded.document_count,
|
|
917
|
+
index_version = excluded.index_version,
|
|
918
|
+
title = excluded.title`).run(l.sessionId,u,x(),I,Bw,g),i.exec("COMMIT;")}catch(I){throw i.exec("ROLLBACK;"),I}}deleteIndexedSession(i,l){i.exec("BEGIN IMMEDIATE;");try{i.prepare("DELETE FROM session_search WHERE session_id = ?").run(l),i.prepare("DELETE FROM indexed_sessions WHERE session_id = ?").run(l),i.exec("COMMIT;")}catch(u){throw i.exec("ROLLBACK;"),u}}}function mK(i){let l=he(i),u=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/,c=l.match(u);if(!c)return{data:{},body:l,hadFrontmatter:!1};let[,g,b]=c,I=X.parse(g);return{data:I&&typeof I==="object"&&!Array.isArray(I)?I:{},body:b,hadFrontmatter:!0}}function zw(i,l){return`---
|
|
919
|
+
${X.stringify(i).trimEnd()}
|
|
920
|
+
---
|
|
921
|
+
${l}`}function hK(i,l){let{data:u,body:c,hadFrontmatter:g}=mK(i);if(!g&&l)return i;if(l){if(delete u.disabled,u.enabled===!1)delete u.enabled;if(Object.keys(u).length===0)return c;return zw(u,c)}return u.disabled=!0,zw(u,c)}async function fK({filePath:i,enabled:l}){let u=await cK(i,"utf8"),c=hK(u,l);return await pK(i,c),{filePath:i,enabled:l,disabled:!l}}function JT(i){return{api:{registerTool:(l)=>i.tools.push(l),registerCommand:(l)=>i.commands.push(l),registerMessageBuilder:()=>{},registerRule:(l)=>i.rules.push(l),registerProvider:(l)=>i.providers.push(l),registerAutomationEventType:()=>{},registerMcpServer:(l)=>i.mcpServers.push(l)}}}function VT(i,l){return{pluginName:i.name,pluginPath:l,extension:i,tools:[],rules:[],commands:[],mcpServers:[],providers:[]}}async function vK(i){if(Vu(i.mode)==="sandbox")return wK(i);let l=i.registry??rd(),u=i.workspacePath?{rootPath:i.workspacePath}:void 0,c=new Map,g=await l.loadForSession({pluginPaths:i.pluginPaths,disabledPluginPaths:i.disabledPluginPaths,discoveryFailures:i.discoveryFailures,providerId:i.providerId,modelId:i.modelId,cwd:i.cwd,setupContext:{workspaceInfo:u},onIssue:(T)=>{if(T.lastError?.phase==="setup")c.set(T.pluginPath,T)}}),b=[],I=[...g.failures],k=g.issues.flatMap((T)=>T.state==="failed"?l.get(T.pluginPath):[]);try{for(let T of g.extensions){let E=T.__clinePluginPath;if(!E)continue;let A=VT(T,E);try{await T.setup?.(JT(A).api,{workspaceInfo:u})}catch{}let C=c.get(E);if(C){k.push({...l.get(E)[0]??{name:C.name,pluginPath:E,errorCount:1,timeoutCount:0,sessionIds:[],updatedAt:Date.now()},state:"failed",...C.lastError?{lastError:C.lastError}:{}}),I.push({pluginPath:E,pluginName:T.name,phase:"setup",message:C.lastError?.message??"Plugin setup failed",stack:C.lastError?.stack});continue}b.push(A)}}finally{await g.release()}return{plugins:b,failed:k,failures:I,warnings:g.warnings}}async function wK(i){if(i.pluginPaths.length===0)return{plugins:[],failed:[],failures:[],warnings:[]};let l=i.workspacePath?{rootPath:i.workspacePath}:void 0,u=await Mh({pluginPaths:[...i.pluginPaths],transport:"subprocess",cwd:i.cwd,providerId:i.providerId,modelId:i.modelId,workspaceInfo:l}),c=[...u.failures],g=[];try{for(let I of u.extensions??[]){let k=I.__clinePluginPath;if(!k)continue;let T=VT(I,k);try{await I.setup?.(JT(T).api,{workspaceInfo:l})}catch(E){c.push({pluginPath:k,pluginName:I.name,phase:"setup",message:E instanceof Error?E.message:String(E),stack:E instanceof Error?E.stack:void 0});continue}g.push(T)}}finally{await u.shutdown().catch(()=>{})}let b=c.map((I)=>({name:I.pluginName??uC(I.pluginPath),pluginPath:I.pluginPath,state:"failed",lastError:{phase:I.phase==="setup"?"setup":"import",message:I.message,...I.stack?{stack:I.stack}:{},pluginPath:I.pluginPath,timestamp:Date.now()},errorCount:1,timeoutCount:0,sessionIds:[],updatedAt:Date.now()}));return{plugins:g,failed:b,failures:c,warnings:u.warnings}}function bK(i,l){let u=yK(Ww(i),Ww(l));return u===""||!u.startsWith("..")&&!gK(u)}var IK=32,oo=new Map;function kK(i,l){if(!oo.has(i)&&oo.size>=IK){let u=oo.keys().next().value;if(u)oo.delete(u)}oo.set(i,l)}async function SK(i){let l=i.pluginPaths.map((g)=>`${g}:${Rh(g)}`),u=rd(),c=i.pluginPaths.map((g)=>{let b=u.get(g)[0];return b?`${b.state}:${b.updatedAt}`:"unknown"});return JSON.stringify({workspacePath:i.workspacePath,cwd:i.cwd,providerId:i.providerId,modelId:i.modelId,mode:Vu(),pathStats:l,statuses:c})}function Kw(i,l){return i.map((u)=>({...u,enabled:!l.has(u.name)}))}function TK(i){return i.sort((l,u)=>{let c=l.name.localeCompare(u.name);if(c!==0)return c;return l.path.localeCompare(u.path)})}async function _K(i){let l=Dh({workspacePath:i.workspacePath,cwd:i.cwd}),u=l.paths,c=ed(i.disabledToolNames);if(u.length===0&&l.discoveryFailures.length===0)return{tools:[],plugins:[],failures:[],warnings:[]};let g=await SK({pluginPaths:u,workspacePath:i.workspacePath,cwd:i.cwd,providerId:i.providerId,modelId:i.modelId}),b=oo.get(g);if(b)return{tools:Kw(b.tools,c),plugins:b.plugins,failures:b.failures,warnings:b.warnings};let I=[],k=[],T=await vK({pluginPaths:u,discoveryFailures:l.discoveryFailures,cwd:i.cwd,workspacePath:i.workspacePath,providerId:i.providerId,modelId:i.modelId});for(let C of T.plugins){let{extension:N,pluginPath:O}=C,L=bK(i.workspacePath,O)?"workspace-plugin":"global-plugin";for(let D of C.tools)I.push({name:D.name,pluginName:N.name,path:O,source:L,description:D.description?.trim()||void 0});k.push({pluginName:N.name,path:O,capabilities:[...N.manifest.capabilities].sort(),tools:C.tools.map((D)=>D.name).sort(),rules:C.rules.map((D)=>D.id).sort(),hooks:Object.keys(N.hooks??{}).sort(),commands:C.commands.map((D)=>D.name).sort(),mcpServers:C.mcpServers.map((D)=>D.name).sort(),providers:C.providers.map((D)=>D.name).sort(),state:"ready"})}for(let C of T.failed)k.push({pluginName:C.name,path:C.pluginPath,capabilities:C.capabilities??[],tools:[],rules:[],hooks:[],commands:[],mcpServers:[],providers:[],state:C.state,...C.lastError?{lastError:C.lastError}:{}});let E=TK(I),A={tools:E,plugins:k,failures:T.failures,warnings:T.warnings};if(T.failures.length===0)kK(g,A);return{tools:Kw(E,c),plugins:k,failures:T.failures,warnings:T.warnings}}function Ao(i,l){if(!l)return"global";let u=XT(l,i);return!u.startsWith("..")&&!GT(u)?"workspace":"global"}function YT(i,l){return Ao(i,l)==="workspace"?"workspace-plugin":"global-plugin"}function QT(i,l){let u=XT(ih(i),ih(l));return u===""||!u.startsWith("..")&&!GT(u)}function EK(i){try{let l=JSON.parse(uK(i,"utf8"));return typeof l.name==="string"&&l.name.trim()?l.name.trim():void 0}catch{return}}function ZT(i,l){let u=rh(i),c=l?ih(l):void 0;while(!c||u!==c&&QT(c,u)){let g=Lf(u,"package.json");if(co(g)){let I=EK(g);if(I)return I;break}let b=rh(u);if(b===u)break;u=b}return Bo(i,sh(i))}function AK(i){let l=new Set(as().disabledPlugins??[]),u=new Map;for(let c of KI(i.workspaceRoot||void 0)){if(!co(c))continue;try{for(let g of GI(c)){if(u.has(g))continue;u.set(g,{id:g,name:ZT(g,c),path:g,enabled:!l.has(g),kind:"plugin",source:i.workspaceRoot?YT(g,i.workspaceRoot):"global-plugin",toggleable:!0})}}catch{}}return Li([...u.values()])}function xK(i){let l=[];for(let u of Uh({workspacePath:i.workspaceRoot||void 0,cwd:i.cwd,includeDisabled:!0}))for(let c of Ju([u]))l.push({directory:c,pluginName:ZT(u),pluginPath:u,source:i.workspaceRoot?YT(u,i.workspaceRoot):"global-plugin"});return l.sort((u,c)=>c.directory.length-u.directory.length)}function CK(i){let l=new Set,u=(c)=>{for(let g of dK(c,{withFileTypes:!0})){let b=Lf(c,g.name);if(g.isDirectory())u(b);else if(g.isFile()&&sh(g.name).toLowerCase()===".md"){let I=Bo(g.name,sh(g.name));l.add(I.toLowerCase()==="skill"?Bo(rh(b)):I)}}};for(let c of Ju([i]))try{u(c)}catch{}return[...l].sort()}function RK(i,l){return l.find((u)=>QT(u.directory,i))}function Li(i){return[...i].sort((l,u)=>{let c=(g)=>{switch(g){case"workspace":case"workspace-plugin":return 0;case"global":case"global-plugin":return 1;case"builtin":return 2}};if(l.source!==u.source)return c(l.source)-c(u.source);return l.name.localeCompare(u.name)})}function Gw(i,l){return l&&Ao(i,l)==="workspace"?"workspace-plugin":"global-plugin"}function Xw(i,l){let u=i.diagnostics.filter((c)=>c.pluginPath===l).map((c)=>c.message);return u.length>0?u.join(`
|
|
922
|
+
`):void 0}function PK(i){let l=new Set;for(let c of i.report.plugins){l.add(c.rootPath);let g=!i.disabledPluginNames.has(c.manifest.name),b=Gw(c.rootPath,i.workspaceRoot),I=c.skills.map((E)=>E.metadata.name).sort(),k=c.mcpServers.map((E)=>E.registration.name).sort(),T=[`${I.length} skill${I.length===1?"":"s"}`,`${k.length} MCP server${k.length===1?"":"s"}`].join(", ");if(i.plugins.push({id:`agent-plugin:${c.manifest.name}`,name:c.manifest.name,path:c.rootPath,enabled:g,kind:"plugin",source:b,toggleable:!0,agentPlugin:!0,pluginName:c.manifest.name,pluginPath:c.rootPath,description:[c.manifest.description,`Portable Agent Plugin${c.manifest.version?` v${c.manifest.version}`:""} (${T})`].filter(Boolean).join(`
|
|
923
|
+
`),loadError:Xw(i.report,c.rootPath),contributions:{inspectionStatus:g?"available":"disabled",capabilities:[...I.length>0?["skills"]:[],...k.length>0?["mcp"]:[]],tools:[],skills:I,rules:[],hooks:[],commands:[],mcpServers:k,providers:[]}}),!g)continue;for(let E of c.skills)i.skills.push({id:`${c.manifest.name}:${E.metadata.name}`,name:E.metadata.name,path:E.filePath,enabled:!0,kind:"skill",source:b,description:E.metadata.description,toggleable:!1,agentPlugin:!0,pluginName:c.manifest.name,pluginPath:c.rootPath});for(let E of c.mcpServers)i.mcp.push({id:E.registration.name,name:E.registration.name,path:Lf(c.rootPath,"mcp.json"),enabled:!0,kind:"mcp",source:b,description:`${E.registration.transport.type}, portable Agent Plugin`,toggleable:!1,agentPlugin:!0,pluginName:c.manifest.name,pluginPath:c.rootPath})}let u=new Set(i.report.diagnostics.filter((c)=>!l.has(c.pluginPath)&&(c.scope==="plugin"||c.scope==="manifest")).map((c)=>c.pluginPath));for(let c of u)i.plugins.push({id:`agent-plugin:invalid:${c}`,name:Bo(c)||c,path:c,enabled:!1,kind:"plugin",source:Gw(c,i.workspaceRoot),toggleable:!1,agentPlugin:!0,pluginPath:c,description:"Invalid portable Agent Plugin package.",loadError:Xw(i.report,c),contributions:{inspectionStatus:"failed",capabilities:[],tools:[],skills:[],rules:[],hooks:[],commands:[],mcpServers:[],providers:[]}})}function e_(i){return i.workspaceRoot?.trim()||i.cwd?.trim()||""}function nh(i,l){return i.cwd?.trim()||l||process.cwd()}async function Jw(i,l){if(i.userInstructionService)return await l(i.userInstructionService);let u=e_(i),c=nh(i,u),g=Km({skills:{workspacePath:u||void 0,includePluginSkills:!0,cwd:c},rules:{workspacePath:u||void 0},workflows:{workspacePath:u||void 0}});try{return await g.start(),await l(g)}finally{g.stop()}}function MK(i,l){if(!i)return;let u=i.listRecords("skill");if(l.id){let c=u.find((g)=>g.id===l.id);if(c)return c}for(let c of u)if(c.filePath===l.path||c.item.name===l.name||c.id===l.name)return c;return}class t_{pluginSource;constructor(i={}){this.pluginSource=i.pluginSource}async list(i={}){return await Jw(i,async(l)=>{let u=e_(i),c=xK({workspaceRoot:u,cwd:nh(i,u)}),g=[],b=[],I=[],k=this.pluginSource?[]:AK({workspaceRoot:u}),T=[],E=[];if(this.pluginSource){let N=await this.pluginSource.list(i);k.push(...N.plugins),T.push(...N.tools)}try{let N=await KS({pluginPaths:i.agentPluginPaths,cwd:nh(i,u)});PK({report:N,workspaceRoot:u,disabledPluginNames:Ch(),plugins:k,skills:I,mcp:E})}catch(N){let O=N instanceof Error?N.message:String(N);console.warn(`[agent-plugins] Package discovery failed; listing settings without Agent Plugins: ${O}`)}let A=new Set(k.filter((N)=>N.enabled!==!1).map((N)=>N.path));if(l){for(let N of l.listRecords("workflow")){let O=N.item;g.push({id:N.id,name:O.name,path:N.filePath,enabled:O.disabled!==!0,kind:"workflow",source:Ao(N.filePath,u),description:O.instructions,toggleable:!1})}for(let N of l.listRecords("rule")){let O=N.item;b.push({id:N.id,name:O.name,path:N.filePath,enabled:O.disabled!==!0,kind:"rule",source:Ao(N.filePath,u),description:O.instructions,toggleable:!1})}for(let N of l.listRecords("skill")){let O=N.item,L=RK(N.filePath,c);I.push({id:N.id,name:O.name,path:N.filePath,enabled:O.disabled!==!0,kind:"skill",source:L?.source??Ao(N.filePath,u),description:O.description,pluginName:L?.pluginName,pluginPath:L?.pluginPath,toggleable:!0})}}if(u&&!this.pluginSource&&i.includePluginTools!==!1)try{let N=await _K({workspacePath:u,cwd:i.cwd,providerId:i.availabilityContext?.providerId,modelId:i.availabilityContext?.modelId});for(let L of N.tools)T.push({id:`${L.pluginName}:${L.name}:${L.path}`,name:L.name,path:L.path,enabled:L.enabled&&A.has(L.path),kind:"tool",source:L.source,description:L.description,toggleable:!0,pluginName:L.pluginName,pluginPath:L.path});let O=new Map(N.plugins.map((L)=>[L.path,L]));for(let L of k){if(L.agentPlugin===!0)continue;let D=O.get(L.path),U=!D||D.state==="failed";if(L.enabled!==!1&&D?.lastError)L.loadError??=`Failed during ${D.lastError.phase}: ${D.lastError.message}`;L.contributions={inspectionStatus:L.enabled===!1?"disabled":U?"failed":"available",capabilities:D?.capabilities??[],tools:D?.tools??[],skills:[...new Set([...CK(L.path),...I.filter((F)=>F.pluginPath===L.path).map((F)=>F.name)])].sort(),rules:D?.rules??[],hooks:D?.hooks??[],commands:D?.commands??[],mcpServers:D?.mcpServers??[],providers:D?.providers??[]}}}catch{}let C=vn();if(vI({filePath:C}))try{for(let N of am({filePath:C}))E.push({id:N.name,name:N.name,path:C,enabled:N.disabled!==!0,kind:"mcp",source:Ao(C,u),description:N.transport.type,toggleable:!0})}catch{}return{workflows:Li(g.filter((N)=>co(N.path))),rules:Li(b.filter((N)=>co(N.path))),plugins:k,skills:Li(I.filter((N)=>co(N.path))),tools:Li(T),mcp:Li(E.filter((N)=>co(N.path)))}})}async toggle(i){if(i.type==="skills")return await Jw(i,async(l)=>{let u=MK(l,i);if(u?.item.source?.type==="agent-plugin")throw Error(`Skill '${u.item.name}' is contributed by the Agent Plugin '${u.item.source.pluginName}' and cannot be toggled individually; toggle the plugin instead.`);let c=u?.filePath;if(!c)throw Error(`Unable to resolve skill setting '${i.id??i.name??Bo(i.path??"")}'.`);let g=u?.item&&"disabled"in u.item?u.item.disabled!==!0:void 0,b=i.enabled??(g!==void 0?!g:void 0);if(b===void 0)throw Error(`Cannot determine toggle state for skill '${i.id??i.name??Bo(i.path??"")}'; provide an explicit enabled value or a resolvable workspace context.`);return await fK({filePath:c,enabled:b}),await l?.refreshType("skill"),{snapshot:await this.list({...i,userInstructionService:l}),changedTypes:["skills"]}});if(i.type==="tools"){if(!i.name?.trim())throw Error("Tool settings toggle requires a tool name.");if(i.enabled===void 0)ex(i.name);else rx(i.name,!i.enabled);return{snapshot:await this.list(i),changedTypes:["tools"]}}if(i.type==="plugins"){let l=await this.list(i),u=i.id?.trim(),c=i.path?.trim(),g=i.name?.trim(),b=l.plugins.find((T)=>u&&T.id===u||c&&T.path===c||g&&T.name===g);if(!b)throw Error(`Unknown plugin: ${c??u??g??"(missing target)"}`);if(b.agentPlugin===!0){if(b.toggleable!==!0)throw Error(`Agent Plugin '${b.name}' cannot be toggled.`);let T=i.enabled??b.enabled===!1;return ix(b.pluginName??b.name,!T),{snapshot:await this.list(i),changedTypes:["plugins","skills","mcp"]}}let I=b.path;if(this.pluginSource){let T=i.enabled;if(T===void 0)T=!b.enabled;let E=await this.pluginSource.setEnabled({path:I,enabled:T,cwd:i.cwd,workspaceRoot:i.workspaceRoot});return{snapshot:{...l,plugins:[...E.plugins,...l.plugins.filter((A)=>A.agentPlugin===!0)],tools:Li(E.tools)},changedTypes:["plugins"]}}let k=i.enabled;if(k===void 0)k=!b.enabled;return sx(I,!k),{snapshot:await this.list(i),changedTypes:["plugins"]}}if(i.type==="mcp"){let l=i.name?.trim()||i.id?.trim();if(!l)throw Error("MCP server settings toggle requires a server name.");let u=i.path?.trim()||vn(),c=i.enabled;if(c===void 0){let g=am({filePath:u}).find((b)=>b.name===l);if(!g)throw Error(`Unknown MCP server: ${l}`);c=g.disabled===!0}return iA({filePath:u,name:l,disabled:!c}),{snapshot:await this.list(i),changedTypes:["mcp"]}}throw Error(`Settings type '${i.type}' does not support toggles.`)}}function _d(i){return i?.trim()||void 0}function i_(i,l){let u=Uf(i,l);return u===""||!u.startsWith(`..${XK}`)&&u!==".."&&!Df(u)}function JK(i,l,u){if(!Cp(i))return;let c=Zw(i),g=l;while(!Cp(g)){let I=GK(g);if(I===g)break;g=I}if(!Cp(g))return;let b=Zw(g);if(!i_(c,b))throw Error(`${u} escapes the workspace through a symbolic link`)}function eb(i,l,u,c){let g=s_(i,Df(l)?Uf(i,l):l);if(!i_(i,g)||!c&&g===i)throw Error(`${u} must stay within the task workspace`);return JK(i,g,u),g}function Xl(i){let l=i.resourcePaths??[];if(i.scope==="global"){if(_d(i.workspaceRoot))throw Error("global tasks cannot set workspaceRoot");if(_d(i.cwd))throw Error("global tasks cannot set cwd");if(l.some((T)=>T.trim()))throw Error("global tasks cannot reference workspace files");return{resourcePaths:[]}}let u=_d(i.workspaceRoot);if(!u)throw Error("workspaceRoot is required for workspace tasks");let c=s_(u),g=_d(i.cwd),b=g?eb(c,g,"cwd",!0):void 0,I=[],k=new Set;for(let T of l){let E=T.trim();if(!E)throw Error("resourcePaths must contain only non-empty paths");if(Df(E)||E.split(/[\\/]+/u).includes(".."))throw Error("resourcePaths must be workspace-relative without '..'");let A=eb(c,E,"resourcePaths",!1),C=Uf(c,A);if(!k.has(C))k.add(C),I.push(C)}return{workspaceRoot:c,cwd:b,resourcePaths:I}}var VK=new Set(["suggestion","follow-up","todo","handoff","idea","reminder"]),YK=new Set(["status","instructions","revision","approvedRevision","createdBy","updatedBy","currentRunId","lastRunId","lastSessionId","error","createdAt","updatedAt","completedAt","archivedAt"]),QK=new Set(["taskId","type","priority","title","description","availableAt","expiresAt","cwd","resourcePaths","assignee","modelSelection","mode","systemPrompt","maxIterations","timeoutSeconds","automationEligible"]);function ZK(i){let l=he(i).replace(/\r\n/g,`
|
|
924
|
+
`);if(!l.startsWith(`---
|
|
925
|
+
`))return{body:l};let u=l.slice(4),c=u.indexOf(`
|
|
926
|
+
---`);if(c===-1)return{body:l};let g=u.slice(c+4);if(g.startsWith(`
|
|
927
|
+
`))g=g.slice(1);return{frontmatter:u.slice(0,c),body:g}}function Ed(i,l){return KK("sha256").update(JSON.stringify(i)).update(`
|
|
928
|
+
`).update(l.trim()).digest("hex")}function Br(i){if(typeof i!=="string")return;let l=i.trim();return l.length>0?l:void 0}function tb(i,l){let u=Br(i);if(!u||!Number.isFinite(Date.parse(u)))return Error(`${l} must be a valid ISO-8601 timestamp`);return new Date(u).toISOString()}function rb(i,l){if(i===void 0)return;if(!Number.isInteger(i)||i<=0)return Error(`${l} must be a positive integer`);return i}function eG(i,l){if(i===void 0)return[];if(!Array.isArray(i))return Error(`${l} must be an array of strings`);let u=[],c=new Set;for(let g of i){let b=Br(g);if(!b)return Error(`${l} must contain only non-empty strings`);if(!c.has(b))c.add(b),u.push(b)}return u}function tG(i){if(i===void 0)return;if(!i||typeof i!=="object"||Array.isArray(i))return Error("modelSelection must be a mapping");let l=i,u=Object.keys(l).filter((b)=>b!=="providerId"&&b!=="modelId");if(u.length>0)return Error(`modelSelection contains unknown field(s): ${u.join(", ")}`);let c=Br(l.providerId);if(!c)return Error("modelSelection.providerId is required");let g=Br(l.modelId);return{providerId:c,...g?{modelId:g}:{}}}function tt(i,l,u){return{ok:!1,specPath:i.specPath,contentHash:l,error:u}}function sb(i){let{frontmatter:l,body:u}=ZK(i.raw);if(l===void 0)return tt(i,Ed({},u),"task spec must begin with YAML frontmatter");let c;try{let H=X.parse(l);if(!H||typeof H!=="object"||Array.isArray(H))return tt(i,Ed({},u),"frontmatter must be a YAML mapping");c=H}catch(H){return tt(i,Ed({},u),H instanceof Error?`failed to parse frontmatter: ${H.message}`:"failed to parse frontmatter")}let g=Ed(c,u),b=Object.keys(c).filter((H)=>YK.has(H));if(b.length>0)return tt(i,g,`operational field(s) cannot be set in a task spec: ${b.join(", ")}`);let I=Object.keys(c).filter((H)=>!QK.has(H));if(I.length>0)return tt(i,g,`unknown task spec field(s): ${I.join(", ")}`);if(i.scope==="workspace"&&!Br(i.workspaceRoot))return tt(i,g,"workspaceRoot is required for workspace-scoped task specs");let k=Br(c.type);if(!k||!VK.has(k))return tt(i,g,"type must be one of: suggestion, follow-up, todo, handoff, idea, reminder");let T=Br(c.title);if(!T)return tt(i,g,"title is required");let E=u.trim();if(!E)return tt(i,g,"markdown body instructions are required");let A=c.priority??3;if(!Number.isInteger(A)||A<0||A>5)return tt(i,g,"priority must be an integer from 0 to 5");let C=tb(c.expiresAt,"expiresAt");if(C instanceof Error)return tt(i,g,C.message);let N;if(c.availableAt!==void 0){let H=tb(c.availableAt,"availableAt");if(H instanceof Error)return tt(i,g,H.message);if(N=H,Date.parse(N)>=Date.parse(C))return tt(i,g,"availableAt must be before expiresAt")}let O=eG(c.resourcePaths,"resourcePaths");if(O instanceof Error)return tt(i,g,O.message);let L;try{L=Xl({scope:i.scope,workspaceRoot:i.workspaceRoot,cwd:Br(c.cwd),resourcePaths:O})}catch(H){return tt(i,g,H instanceof Error?H.message:String(H))}let D=tG(c.modelSelection);if(D instanceof Error)return tt(i,g,D.message);let U=rb(c.maxIterations,"maxIterations");if(U instanceof Error)return tt(i,g,U.message);let F=rb(c.timeoutSeconds,"timeoutSeconds");if(F instanceof Error)return tt(i,g,F.message);let j=c.mode;if(j!==void 0&&j!=="act"&&j!=="plan"&&j!=="yolo")return tt(i,g,"mode must be one of: act, plan, yolo");if(c.automationEligible!==void 0&&typeof c.automationEligible!=="boolean")return tt(i,g,"automationEligible must be a boolean");return{ok:!0,specPath:i.specPath,contentHash:g,spec:{taskId:Br(c.taskId),type:k,title:T,description:Br(c.description),instructions:E,scope:i.scope,workspaceRoot:L.workspaceRoot,cwd:L.cwd,resourcePaths:L.resourcePaths,priority:A,assignee:Br(c.assignee),modelSelection:D,mode:j,systemPrompt:Br(c.systemPrompt),maxIterations:U,timeoutSeconds:F,availableAt:N,expiresAt:C,automationEligible:c.automationEligible!==!1,specPath:i.specPath,contentHash:g}}}function rG(i){let l={taskId:i.taskId,type:i.type,priority:i.priority??3,title:i.title,...i.description?{description:i.description}:{},...i.availableAt?{availableAt:i.availableAt}:{},expiresAt:i.expiresAt,...i.cwd?{cwd:i.cwd}:{},resourcePaths:i.resourcePaths??[],...i.assignee?{assignee:i.assignee}:{},...i.modelSelection?{modelSelection:i.modelSelection}:{},...i.mode?{mode:i.mode}:{},...i.systemPrompt?{systemPrompt:i.systemPrompt}:{},...i.maxIterations!==void 0?{maxIterations:i.maxIterations}:{},...i.timeoutSeconds!==void 0?{timeoutSeconds:i.timeoutSeconds}:{},automationEligible:i.automationEligible!==!1};return`---
|
|
929
|
+
${X.stringify(l,{lineWidth:0}).trimEnd()}
|
|
930
|
+
---
|
|
931
|
+
|
|
932
|
+
${i.instructions.trim()}
|
|
933
|
+
`}function sG(i,l){let u=Date.parse(i.expiresAt),c=new Date(Math.min(Date.now(),u-1)).toISOString();return{taskId:i.taskId,type:i.type,title:i.title,description:i.description,instructions:i.instructions,scope:i.scope,workspaceRoot:i.workspaceRoot,cwd:i.cwd,resourcePaths:i.resourcePaths,priority:i.priority,assignee:i.assignee,modelSelection:i.modelSelection,mode:i.mode,systemPrompt:i.systemPrompt,maxIterations:i.maxIterations,timeoutSeconds:i.timeoutSeconds,availableAt:i.availableAt??c,expiresAt:i.expiresAt,automationEligible:i.automationEligible,createdBy:l,specPath:i.specPath}}function iG(i){let l=i.trim().replace(/[^a-zA-Z0-9._-]+/g,"-");if(!l)throw Error("taskId must contain at least one filename-safe character");return`${l}.task.md`}function nG(i,l){let u=r_(i,l);return u===""||!u.startsWith(`..${WK}`)&&u!==".."&&!ah(u)}class n_{specsDir;scope;workspaceRoot;constructor(i){this.scope=i.scope,this.workspaceRoot=i.workspaceRoot?.trim()||void 0,this.specsDir=Qw(Qa({scope:i.scope,workspaceRoot:this.workspaceRoot,taskSpecsDir:i.taskSpecsDir}))}listSpecPaths(){if(!Qr(this.specsDir))return[];return this.assertSpecsDirSafe(),FK(this.specsDir,{withFileTypes:!0}).filter((i)=>i.isFile()&&i.name.endsWith(".task.md")).map((i)=>xp(this.specsDir,i.name)).sort((i,l)=>i.localeCompare(l))}listSpecs(){return this.listSpecPaths().map((i)=>{try{return this.readSpec(i)}catch(l){return{ok:!1,specPath:i,contentHash:"",error:l instanceof Error?l.message:String(l)}}})}readSpec(i){this.assertSpecsDirSafe();let l=this.resolveSpecPath(i);if(Ap(l).isSymbolicLink())throw Error("task spec files cannot be symbolic links");return sb({specPath:l,raw:qK(l,"utf8"),scope:this.scope,workspaceRoot:this.workspaceRoot})}writeSpec(i,l={}){if(!i.taskId.trim())throw Error("taskId is required");this.ensureSpecsDir();let u=this.resolveWritePath(i.taskId,l.specPath);if(l.createOnly&&Qr(u))throw Error(`task spec already exists: ${u}`);if(Qr(u)&&Ap(u).isSymbolicLink())throw Error("task spec files cannot be symbolic links");let c=rG(i),g=sb({specPath:u,raw:c,scope:this.scope,workspaceRoot:this.workspaceRoot});if(!g.ok)throw Error(`invalid task spec: ${g.error}`);let b=xp(this.specsDir,`.${HK(u)}.${process.pid}.${Date.now()}.tmp`);try{if(BK(b,c,{encoding:"utf8",mode:384}),this.assertExpectedContent(u,l),l.createOnly)DK(b,u);else jK(b,u)}finally{if(Qr(b))Yw(b,{force:!0})}return g.spec}resolveWritePath(i,l){return this.resolveSpecPath(l??iG(i))}ensureSpecsDir(){this.assertSpecsDirSafe(),UK(this.specsDir,{recursive:!0}),this.assertSpecsDirSafe()}deleteSpec(i,l={}){this.assertSpecsDirSafe();let u=this.resolveSpecPath(i);if(!Qr(u))return!1;if(l.expectedContentHash){if(this.readSpec(u).contentHash!==l.expectedContentHash)throw Error(`task spec changed before delete: ${u}`)}return Yw(u),!0}assertExpectedContent(i,l){if(l.createOnly){if(Qr(i))throw Error(`task spec already exists: ${i}`);return}if(!l.expectedContentHash)return;if(!Qr(i))throw Error(`task spec disappeared before update: ${i}`);if(this.readSpec(i).contentHash!==l.expectedContentHash)throw Error(`task spec changed before update: ${i}`)}assertSpecsDirSafe(){if(Qr(this.specsDir)&&Ap(this.specsDir).isSymbolicLink())throw Error("task specs directory cannot be a symbolic link");if(!this.workspaceRoot||!Qr(this.workspaceRoot))return;let i=Vw(this.workspaceRoot),l=this.specsDir;while(!Qr(l)){let u=zK(l);if(u===l)break;l=u}if(Qr(l)&&!nG(i,Vw(l)))throw Error("task specs directory escapes the workspace")}resolveSpecPath(i){let l=Qw(ah(i)?i:xp(this.specsDir,i)),u=r_(this.specsDir,l);if(u===""||u.startsWith("..")||ah(u)||!l.endsWith(".task.md"))throw Error("task spec path must be a *.task.md file within the specs directory");return l}}var oG=[`CREATE TABLE IF NOT EXISTS agenda_tasks (
|
|
934
|
+
task_id TEXT PRIMARY KEY,
|
|
935
|
+
type TEXT NOT NULL CHECK (type IN ('suggestion', 'follow-up', 'todo', 'handoff', 'idea', 'reminder')),
|
|
936
|
+
status TEXT NOT NULL CHECK (status IN ('pending_approval', 'approved', 'in_progress', 'completed', 'failed', 'cancelled', 'expired')),
|
|
937
|
+
title TEXT NOT NULL,
|
|
938
|
+
description TEXT,
|
|
939
|
+
instructions TEXT NOT NULL,
|
|
940
|
+
scope TEXT NOT NULL CHECK (scope IN ('workspace', 'global')),
|
|
941
|
+
workspace_root TEXT,
|
|
942
|
+
cwd TEXT,
|
|
943
|
+
resource_paths_json TEXT NOT NULL DEFAULT '[]',
|
|
944
|
+
priority INTEGER NOT NULL DEFAULT 3 CHECK (priority BETWEEN 0 AND 5),
|
|
945
|
+
assignee TEXT,
|
|
946
|
+
model_selection_json TEXT,
|
|
947
|
+
mode TEXT CHECK (mode IS NULL OR mode IN ('act', 'plan', 'yolo')),
|
|
948
|
+
system_prompt TEXT,
|
|
949
|
+
max_iterations INTEGER,
|
|
950
|
+
timeout_seconds INTEGER,
|
|
951
|
+
available_at TEXT NOT NULL,
|
|
952
|
+
expires_at TEXT NOT NULL,
|
|
953
|
+
automation_eligible INTEGER NOT NULL DEFAULT 1,
|
|
954
|
+
revision INTEGER NOT NULL DEFAULT 1,
|
|
955
|
+
approved_revision INTEGER,
|
|
956
|
+
created_by_json TEXT NOT NULL,
|
|
957
|
+
updated_by_json TEXT NOT NULL,
|
|
958
|
+
origin_session_id TEXT,
|
|
959
|
+
origin_task_id TEXT,
|
|
960
|
+
current_run_id TEXT,
|
|
961
|
+
last_run_id TEXT,
|
|
962
|
+
last_session_id TEXT,
|
|
963
|
+
spec_path TEXT UNIQUE,
|
|
964
|
+
error TEXT,
|
|
965
|
+
created_at TEXT NOT NULL,
|
|
966
|
+
updated_at TEXT NOT NULL,
|
|
967
|
+
completed_at TEXT,
|
|
968
|
+
archived_at TEXT,
|
|
969
|
+
CHECK (
|
|
970
|
+
(scope = 'workspace' AND workspace_root IS NOT NULL) OR
|
|
971
|
+
(scope = 'global' AND workspace_root IS NULL)
|
|
972
|
+
)
|
|
973
|
+
);`,`CREATE TABLE IF NOT EXISTS agenda_task_runs (
|
|
974
|
+
run_id TEXT PRIMARY KEY,
|
|
975
|
+
task_id TEXT NOT NULL REFERENCES agenda_tasks(task_id) ON DELETE CASCADE,
|
|
976
|
+
task_revision INTEGER NOT NULL,
|
|
977
|
+
attempt INTEGER NOT NULL,
|
|
978
|
+
status TEXT NOT NULL CHECK (status IN ('starting', 'running', 'completed', 'failed', 'cancelled', 'interrupted')),
|
|
979
|
+
claim_token TEXT,
|
|
980
|
+
claim_until_at TEXT,
|
|
981
|
+
requested_by_client_id TEXT,
|
|
982
|
+
session_id TEXT,
|
|
983
|
+
claimed_at TEXT NOT NULL,
|
|
984
|
+
started_at TEXT,
|
|
985
|
+
completed_at TEXT,
|
|
986
|
+
result_summary TEXT,
|
|
987
|
+
error TEXT,
|
|
988
|
+
created_at TEXT NOT NULL,
|
|
989
|
+
updated_at TEXT NOT NULL,
|
|
990
|
+
UNIQUE (task_id, attempt)
|
|
991
|
+
);`,`CREATE TABLE IF NOT EXISTS agenda_task_automation (
|
|
992
|
+
scope_key TEXT PRIMARY KEY,
|
|
993
|
+
mode TEXT NOT NULL CHECK (mode IN ('manual', 'auto_start', 'unattended')),
|
|
994
|
+
apply_to_agent_created INTEGER NOT NULL DEFAULT 1,
|
|
995
|
+
max_concurrent_runs INTEGER NOT NULL DEFAULT 2,
|
|
996
|
+
max_chain_depth INTEGER NOT NULL DEFAULT 1,
|
|
997
|
+
max_starts_per_hour INTEGER NOT NULL DEFAULT 20,
|
|
998
|
+
enabled_by_json TEXT,
|
|
999
|
+
enabled_at TEXT,
|
|
1000
|
+
updated_at TEXT NOT NULL
|
|
1001
|
+
);`,`CREATE INDEX IF NOT EXISTS agenda_tasks_ready_idx
|
|
1002
|
+
ON agenda_tasks(status, priority, available_at, expires_at, created_at);`,`CREATE INDEX IF NOT EXISTS agenda_tasks_scope_idx
|
|
1003
|
+
ON agenda_tasks(scope, workspace_root, status, available_at);`,`CREATE INDEX IF NOT EXISTS agenda_tasks_origin_session_idx
|
|
1004
|
+
ON agenda_tasks(origin_session_id, created_at);`,`CREATE INDEX IF NOT EXISTS agenda_task_runs_task_idx
|
|
1005
|
+
ON agenda_task_runs(task_id, attempt DESC);`,`CREATE INDEX IF NOT EXISTS agenda_task_runs_session_idx
|
|
1006
|
+
ON agenda_task_runs(session_id);`,`CREATE UNIQUE INDEX IF NOT EXISTS agenda_task_runs_one_active_idx
|
|
1007
|
+
ON agenda_task_runs(task_id)
|
|
1008
|
+
WHERE status IN ('starting', 'running');`];function aG(i){i.exec("PRAGMA journal_mode = WAL;"),i.exec("PRAGMA busy_timeout = 5000;"),i.exec("PRAGMA foreign_keys = ON;");for(let l of oG)i.exec(l)}var ob={kind:"system",id:"task_store"};class Yd extends Error{current;constructor(i){super(`task ${i.taskId} is at revision ${i.revision}; the requested revision is stale`);this.current=i,this.name="AgendaTaskRevisionConflictError"}}function Tl(i){if(typeof i!=="string"||!i)return;try{return JSON.parse(i)}catch{return}}function es(i){if(typeof i==="number"&&Number.isFinite(i))return Math.floor(i);if(typeof i==="bigint")return Number(i);return}function Rp(i){return{taskId:f(i.task_id),type:f(i.type),status:f(i.status),title:f(i.title),description:h(i.description),instructions:f(i.instructions),scope:f(i.scope),workspaceRoot:h(i.workspace_root),cwd:h(i.cwd),resourcePaths:Tl(i.resource_paths_json)?.filter((l)=>typeof l==="string")??[],priority:es(i.priority)??3,assignee:h(i.assignee),modelSelection:Tl(i.model_selection_json),mode:h(i.mode),systemPrompt:h(i.system_prompt),maxIterations:es(i.max_iterations),timeoutSeconds:es(i.timeout_seconds),availableAt:f(i.available_at),expiresAt:f(i.expires_at),automationEligible:Number(i.automation_eligible??0)===1,revision:es(i.revision)??1,approvedRevision:es(i.approved_revision),createdBy:Tl(i.created_by_json)??ob,updatedBy:Tl(i.updated_by_json)??ob,originSessionId:h(i.origin_session_id),originTaskId:h(i.origin_task_id),currentRunId:h(i.current_run_id),lastRunId:h(i.last_run_id),lastSessionId:h(i.last_session_id),specPath:h(i.spec_path),error:h(i.error),createdAt:f(i.created_at),updatedAt:f(i.updated_at),completedAt:h(i.completed_at),archivedAt:h(i.archived_at)}}function ab(i){return{runId:f(i.run_id),taskId:f(i.task_id),taskRevision:es(i.task_revision)??1,attempt:es(i.attempt)??1,status:f(i.status),claimToken:h(i.claim_token),claimUntilAt:h(i.claim_until_at),requestedByClientId:h(i.requested_by_client_id),sessionId:h(i.session_id),claimedAt:f(i.claimed_at),startedAt:h(i.started_at),completedAt:h(i.completed_at),resultSummary:h(i.result_summary),error:h(i.error),createdAt:f(i.created_at),updatedAt:f(i.updated_at)}}function lb(i){return{scopeKey:f(i.scope_key),mode:f(i.mode),applyToAgentCreated:Number(i.apply_to_agent_created??0)===1,maxConcurrentRuns:es(i.max_concurrent_runs)??2,maxChainDepth:es(i.max_chain_depth)??1,maxStartsPerHour:es(i.max_starts_per_hour)??20,enabledBy:Tl(i.enabled_by_json),enabledAt:h(i.enabled_at),updatedAt:f(i.updated_at)}}function pl(i,l){let u=i.trim();if(!u)throw Error(`${l} is required`);return u}function Jt(i){return typeof i==="string"&&i.trim()?i.trim():void 0}function Ui(i,l){let u=Date.parse(i);if(!Number.isFinite(u))throw Error(`${l} must be a valid ISO-8601 timestamp`);return new Date(u).toISOString()}function db(i,l){return i==null?void 0:Ui(i,l)}function Pi(i,l){if(i==null)return;if(!Number.isInteger(i)||i<=0)throw Error(`${l} must be a positive integer`);return i}function ub(i,l){if(Date.parse(i)>=Date.parse(l))throw Error("availableAt must be before expiresAt")}function Ad(i){return Array(i).fill("?").join(", ")}class o_{db;constructor(i={}){this.db=V(i.dbPath??Ka()),aG(this.db);let l=x();this.db.prepare(`INSERT OR IGNORE INTO agenda_task_automation (
|
|
1009
|
+
scope_key, mode, apply_to_agent_created, max_concurrent_runs,
|
|
1010
|
+
max_chain_depth, max_starts_per_hour, updated_at
|
|
1011
|
+
) VALUES ('global', 'manual', 1, 2, 1, 20, ?)`).run(l)}close(){this.db.close?.()}createTask(i){let l=x(),u=Jt(i.taskId)??`task_${ib()}`,c=Xl(i),g=Ui(i.availableAt??l,"availableAt"),b=Ui(i.expiresAt,"expiresAt");ub(g,b);let I=i.priority??3;if(!Number.isInteger(I)||I<0||I>5)throw Error("priority must be an integer from 0 to 5");let k=Pi(i.maxIterations,"maxIterations"),T=Pi(i.timeoutSeconds,"timeoutSeconds"),E=i.requiresApproval!==!1,A=E?"pending_approval":"approved",C=E?null:1;this.db.prepare(`INSERT INTO agenda_tasks (
|
|
1012
|
+
task_id, type, status, title, description, instructions, scope,
|
|
1013
|
+
workspace_root, cwd, resource_paths_json, priority, assignee,
|
|
1014
|
+
model_selection_json, mode, system_prompt, max_iterations,
|
|
1015
|
+
timeout_seconds, available_at, expires_at, automation_eligible,
|
|
1016
|
+
revision, approved_revision, created_by_json, updated_by_json, origin_session_id,
|
|
1017
|
+
origin_task_id, spec_path, created_at, updated_at
|
|
1018
|
+
) VALUES (
|
|
1019
|
+
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
|
|
1020
|
+
?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?, ?
|
|
1021
|
+
)`).run(u,i.type,A,pl(i.title,"title"),Jt(i.description)??null,pl(i.instructions,"instructions"),i.scope,c.workspaceRoot??null,c.cwd??null,JSON.stringify(c.resourcePaths),I,Jt(i.assignee)??null,i.modelSelection?JSON.stringify(i.modelSelection):null,i.mode??null,Jt(i.systemPrompt)??null,k??null,T??null,g,b,i.automationEligible===!1?0:1,C,JSON.stringify(i.createdBy),JSON.stringify(i.createdBy),Jt(i.originSessionId)??null,Jt(i.originTaskId)??null,Jt(i.specPath)??null,l,l);let N=this.getTask(u);if(!N)throw Error(`failed to create task ${u}`);return N}getTask(i){let l=this.db.prepare("SELECT * FROM agenda_tasks WHERE task_id = ?").get(i);return l?Rp(l):void 0}getTaskBySpecPath(i){let l=this.db.prepare("SELECT * FROM agenda_tasks WHERE spec_path = ?").get(i);return l?Rp(l):void 0}listWorkspaceRoots(){let i=this.db.prepare(`SELECT DISTINCT workspace_root FROM agenda_tasks
|
|
1022
|
+
WHERE scope = 'workspace' AND workspace_root IS NOT NULL
|
|
1023
|
+
ORDER BY workspace_root ASC`).all(),l=new Set;for(let u of i){let c=h(u.workspace_root);if(c)l.add(nb(c))}return[...l].sort((u,c)=>u.localeCompare(c))}listTasks(i={}){if(i.statuses?.length===0||i.types?.length===0||i.priorities?.length===0)return[];let l=[],u=[];if(i.statuses)l.push(`status IN (${Ad(i.statuses.length)})`),u.push(...i.statuses);if(i.types)l.push(`type IN (${Ad(i.types.length)})`),u.push(...i.types);let c=i.workspaceRoot?.trim()?nb(i.workspaceRoot):void 0;if(i.scope==="workspace"){if(l.push("scope = 'workspace'"),c)l.push("workspace_root = ?"),u.push(c)}else if(i.scope==="global")l.push("scope = 'global'");else if(c)l.push("(scope = 'global' OR (scope = 'workspace' AND workspace_root = ?))"),u.push(c);if(i.priorities)l.push(`priority IN (${Ad(i.priorities.length)})`),u.push(...i.priorities);if(typeof i.automationEligible==="boolean")l.push("automation_eligible = ?"),u.push(i.automationEligible?1:0);if(i.availableBefore)l.push("available_at <= ?"),u.push(Ui(i.availableBefore,"availableBefore"));if(!i.includeArchived)l.push("archived_at IS NULL");let g=Math.min(1000,Math.max(1,Math.floor(i.limit??200)));return this.db.prepare(`SELECT * FROM agenda_tasks
|
|
1024
|
+
${l.length>0?`WHERE ${l.join(" AND ")}`:""}
|
|
1025
|
+
ORDER BY priority ASC, available_at ASC, created_at ASC, task_id ASC
|
|
1026
|
+
LIMIT ?`).all(...u,g).map(Rp)}updateTask(i){let l=this.getTask(i.taskId);if(!l)return;if(l.revision!==i.expectedRevision)throw new Yd(l);if(l.status==="in_progress")throw Error("an in-progress task cannot be edited");let u=i.scope??l.scope,c=Xl({scope:u,workspaceRoot:i.workspaceRoot===null?void 0:i.workspaceRoot??l.workspaceRoot,cwd:i.cwd===null?void 0:i.cwd??l.cwd,resourcePaths:i.resourcePaths??l.resourcePaths}),g=Ui(i.availableAt??l.availableAt,"availableAt"),b=Ui(i.expiresAt??l.expiresAt,"expiresAt");ub(g,b);let I=i.priority??l.priority;if(!Number.isInteger(I)||I<0||I>5)throw Error("priority must be an integer from 0 to 5");let k=l.status==="approved"||l.status==="failed"?"pending_approval":l.status,T=l.revision+1,E=x();return this.db.prepare(`UPDATE agenda_tasks SET
|
|
1027
|
+
type = ?, status = ?, title = ?, description = ?, instructions = ?,
|
|
1028
|
+
scope = ?, workspace_root = ?, cwd = ?, resource_paths_json = ?,
|
|
1029
|
+
priority = ?, assignee = ?, model_selection_json = ?, mode = ?,
|
|
1030
|
+
system_prompt = ?, max_iterations = ?, timeout_seconds = ?,
|
|
1031
|
+
available_at = ?, expires_at = ?, automation_eligible = ?, revision = ?,
|
|
1032
|
+
approved_revision = NULL, error = NULL, updated_by_json = ?, updated_at = ?
|
|
1033
|
+
WHERE task_id = ? AND revision = ?`).run(i.type??l.type,k,pl(i.title??l.title,"title"),i.description===null?null:Jt(i.description??l.description)??null,pl(i.instructions??l.instructions,"instructions"),u,c.workspaceRoot??null,c.cwd??null,JSON.stringify(c.resourcePaths),I,i.assignee===null?null:Jt(i.assignee??l.assignee)??null,i.modelSelection===null?null:JSON.stringify(i.modelSelection??l.modelSelection)||null,i.mode===null?null:i.mode??l.mode??null,i.systemPrompt===null?null:Jt(i.systemPrompt??l.systemPrompt)??null,Pi(i.maxIterations===null?void 0:i.maxIterations??l.maxIterations,"maxIterations")??null,Pi(i.timeoutSeconds===null?void 0:i.timeoutSeconds??l.timeoutSeconds,"timeoutSeconds")??null,g,b,i.automationEligible??l.automationEligible?1:0,T,JSON.stringify(i.updatedBy),E,i.taskId,l.revision),this.getTask(i.taskId)}updateTaskState(i,l,u){let c=this.getTask(i);if(!c)return;if(u!==void 0&&c.revision!==u)throw new Yd(c);let g=l.approvedRevision===null?void 0:l.approvedRevision??c.approvedRevision,b=l.status??c.status;if(b==="in_progress"&&g!==c.revision)throw Error("in-progress task must be approved for its current revision");let I=x();return this.db.prepare(`UPDATE agenda_tasks SET
|
|
1034
|
+
status = ?, approved_revision = ?, current_run_id = ?, last_run_id = ?,
|
|
1035
|
+
last_session_id = ?, spec_path = ?, error = ?, completed_at = ?,
|
|
1036
|
+
archived_at = ?, updated_by_json = ?, updated_at = ?
|
|
1037
|
+
WHERE task_id = ? AND revision = ?`).run(b,g??null,l.currentRunId===null?null:l.currentRunId??c.currentRunId??null,l.lastRunId===null?null:l.lastRunId??c.lastRunId??null,l.lastSessionId===null?null:l.lastSessionId??c.lastSessionId??null,l.specPath===null?null:l.specPath??c.specPath??null,l.error===null?null:l.error??c.error??null,l.completedAt===null?null:l.completedAt??c.completedAt??null,l.archivedAt===null?null:l.archivedAt??c.archivedAt??null,JSON.stringify(l.updatedBy??c.updatedBy),I,i,c.revision),this.getTask(i)}deleteTask(i){return(this.db.prepare("DELETE FROM agenda_tasks WHERE task_id = ?").run(i).changes??0)>0}createRun(i){let l=this.getTask(i.taskId);if(!l)throw Error(`task ${i.taskId} does not exist`);if(l.revision!==i.taskRevision)throw new Yd(l);let u=this.db.prepare("SELECT COALESCE(MAX(attempt), 0) AS max_attempt FROM agenda_task_runs WHERE task_id = ?").get(i.taskId),c=(es(u?.max_attempt)??0)+1,g=`run_${ib()}`,b=x(),I=i.claimedAt?Ui(i.claimedAt,"claimedAt"):b;this.db.prepare(`INSERT INTO agenda_task_runs (
|
|
1038
|
+
run_id, task_id, task_revision, attempt, status, claim_token,
|
|
1039
|
+
claim_until_at, requested_by_client_id, session_id, claimed_at,
|
|
1040
|
+
created_at, updated_at
|
|
1041
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(g,i.taskId,i.taskRevision,c,i.status??"starting",Jt(i.claimToken)??null,db(i.claimUntilAt,"claimUntilAt")??null,Jt(i.requestedByClientId)??null,Jt(i.sessionId)??null,I,b,b);let k=this.getRun(g);if(!k)throw Error(`failed to create run ${g}`);return k}getRun(i){let l=this.db.prepare("SELECT * FROM agenda_task_runs WHERE run_id = ?").get(i);return l?ab(l):void 0}updateRun(i,l){let u=this.getRun(i);if(!u)return;let c=x();return this.db.prepare(`UPDATE agenda_task_runs SET
|
|
1042
|
+
status = ?, claim_token = ?, claim_until_at = ?,
|
|
1043
|
+
requested_by_client_id = ?, session_id = ?, started_at = ?,
|
|
1044
|
+
completed_at = ?, result_summary = ?, error = ?, updated_at = ?
|
|
1045
|
+
WHERE run_id = ?`).run(l.status??u.status,l.claimToken===null?null:l.claimToken??u.claimToken??null,l.claimUntilAt===null?null:l.claimUntilAt??u.claimUntilAt??null,l.requestedByClientId===null?null:l.requestedByClientId??u.requestedByClientId??null,l.sessionId===null?null:l.sessionId??u.sessionId??null,l.startedAt===null?null:l.startedAt??u.startedAt??null,l.completedAt===null?null:l.completedAt??u.completedAt??null,l.resultSummary===null?null:l.resultSummary??u.resultSummary??null,l.error===null?null:l.error??u.error??null,c,i),this.getRun(i)}listRuns(i={}){let l=[],u=[];if(i.taskId)l.push("task_id = ?"),u.push(i.taskId);if(i.sessionId)l.push("session_id = ?"),u.push(i.sessionId);let c=Array.isArray(i.status)?i.status:i.status?[i.status]:void 0;if(c?.length===0)return[];if(c)l.push(`status IN (${Ad(c.length)})`),u.push(...c);let g=Math.min(1000,Math.max(1,Math.floor(i.limit??200)));return this.db.prepare(`SELECT * FROM agenda_task_runs
|
|
1046
|
+
${l.length>0?`WHERE ${l.join(" AND ")}`:""}
|
|
1047
|
+
ORDER BY created_at DESC, attempt DESC LIMIT ?`).all(...u,g).map(ab)}getAutomationPolicy(i="global"){let l=this.db.prepare("SELECT * FROM agenda_task_automation WHERE scope_key = ?").get(i);if(!l)this.db.prepare(`INSERT OR IGNORE INTO agenda_task_automation (
|
|
1048
|
+
scope_key, mode, apply_to_agent_created, max_concurrent_runs,
|
|
1049
|
+
max_chain_depth, max_starts_per_hour, updated_at
|
|
1050
|
+
) VALUES (?, 'manual', 1, 2, 1, 20, ?)`).run(i,x()),l=this.db.prepare("SELECT * FROM agenda_task_automation WHERE scope_key = ?").get(i);if(!l)throw Error(`failed to initialize automation policy ${i}`);return lb(l)}listAutomationPolicies(){return this.db.prepare("SELECT * FROM agenda_task_automation ORDER BY scope_key").all().map((i)=>lb(i))}setAutomationPolicy(i){let l=pl(i.scopeKey,"scopeKey"),u=Pi(i.maxConcurrentRuns,"maxConcurrentRuns"),c=Pi(i.maxChainDepth,"maxChainDepth"),g=Pi(i.maxStartsPerHour,"maxStartsPerHour"),b=x();return this.db.prepare(`INSERT INTO agenda_task_automation (
|
|
1051
|
+
scope_key, mode, apply_to_agent_created, max_concurrent_runs,
|
|
1052
|
+
max_chain_depth, max_starts_per_hour, enabled_by_json,
|
|
1053
|
+
enabled_at, updated_at
|
|
1054
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
1055
|
+
ON CONFLICT(scope_key) DO UPDATE SET
|
|
1056
|
+
mode = excluded.mode,
|
|
1057
|
+
apply_to_agent_created = excluded.apply_to_agent_created,
|
|
1058
|
+
max_concurrent_runs = excluded.max_concurrent_runs,
|
|
1059
|
+
max_chain_depth = excluded.max_chain_depth,
|
|
1060
|
+
max_starts_per_hour = excluded.max_starts_per_hour,
|
|
1061
|
+
enabled_by_json = excluded.enabled_by_json,
|
|
1062
|
+
enabled_at = excluded.enabled_at,
|
|
1063
|
+
updated_at = excluded.updated_at`).run(l,i.mode,i.applyToAgentCreated?1:0,u,c,g,i.enabledBy?JSON.stringify(i.enabledBy):null,db(i.enabledAt,"enabledAt")??null,b),this.getAutomationPolicy(l)}}var qi={kind:"system",id:"file_reconciler"},Mi={kind:"system",id:"task_manager"},cb={kind:"automation_policy",id:"global"},ml=new Set(["completed","failed","cancelled","interrupted"]),lG=30000,dG=250;function Ms(){return new Date().toISOString()}function pb(i){return typeof i==="string"&&i.trim()?i.trim():void 0}function mb(i){let l=Date.parse(i);if(!Number.isFinite(l))throw Error("expiresAt must be a valid ISO-8601 timestamp");if(l<=Date.now())throw Error("expiresAt must be in the future")}function hb(i,l){let u=LK(i,l);return u!==""&&!u.startsWith("..")&&!u.startsWith("/")}function hl(i){if(!i||!oh(i))return!1;try{return OK(i).isDirectory()}catch{return!1}}function Pp(i,l){return JSON.stringify({type:i.type,title:i.title,description:i.description,instructions:i.instructions,scope:i.scope,workspaceRoot:i.workspaceRoot,cwd:i.cwd,resourcePaths:i.resourcePaths,priority:i.priority,assignee:i.assignee,modelSelection:i.modelSelection,mode:i.mode,systemPrompt:i.systemPrompt,maxIterations:i.maxIterations,timeoutSeconds:i.timeoutSeconds,availableAt:i.availableAt??l.availableAt,expiresAt:i.expiresAt,automationEligible:i.automationEligible})}function Mp(i){return JSON.stringify({type:i.type,title:i.title,description:i.description,instructions:i.instructions,scope:i.scope,workspaceRoot:i.workspaceRoot,cwd:i.cwd,resourcePaths:i.resourcePaths,priority:i.priority,assignee:i.assignee,modelSelection:i.modelSelection,mode:i.mode,systemPrompt:i.systemPrompt,maxIterations:i.maxIterations,timeoutSeconds:i.timeoutSeconds,availableAt:i.availableAt,expiresAt:i.expiresAt,automationEligible:i.automationEligible})}function uG(i,l){return{taskId:l.taskId,expectedRevision:l.revision,type:i.type,title:i.title,description:i.description??null,instructions:i.instructions,scope:i.scope,workspaceRoot:i.workspaceRoot??null,cwd:i.cwd??null,resourcePaths:i.resourcePaths,priority:i.priority,assignee:i.assignee??null,modelSelection:i.modelSelection??null,mode:i.mode??null,systemPrompt:i.systemPrompt??null,maxIterations:i.maxIterations??null,timeoutSeconds:i.timeoutSeconds??null,availableAt:i.availableAt??l.availableAt,expiresAt:i.expiresAt,automationEligible:i.automationEligible,updatedBy:qi}}function cG(i,l){return{...i,type:l.type??i.type,title:l.title??i.title,description:l.description===null?void 0:l.description??i.description,instructions:l.instructions??i.instructions,scope:l.scope??i.scope,workspaceRoot:l.workspaceRoot===null?void 0:l.workspaceRoot??i.workspaceRoot,cwd:l.cwd===null?void 0:l.cwd??i.cwd,resourcePaths:l.resourcePaths??i.resourcePaths,priority:l.priority??i.priority,assignee:l.assignee===null?void 0:l.assignee??i.assignee,modelSelection:l.modelSelection===null?void 0:l.modelSelection??i.modelSelection,mode:l.mode===null?void 0:l.mode??i.mode,systemPrompt:l.systemPrompt===null?void 0:l.systemPrompt??i.systemPrompt,maxIterations:l.maxIterations===null?void 0:l.maxIterations??i.maxIterations,timeoutSeconds:l.timeoutSeconds===null?void 0:l.timeoutSeconds??i.timeoutSeconds,availableAt:l.availableAt??i.availableAt,expiresAt:l.expiresAt??i.expiresAt,automationEligible:l.automationEligible??i.automationEligible}}class a_{runtime;store;ownsStore;globalSpecsDir;watcherDebounceMs;watchFiles;logger;publishEvent;scopes=new Map;activeRuns=new Map;backgroundRuns=new Set;maintenanceTimer;queuedAutomationScopes=new Set;automationEnabled;automationPumping=!1;automationPolicyGeneration=0;started=!1;disposed=!1;constructor(i){this.runtime=i.runtime,this.ownsStore=!i.store,this.store=i.store??new o_({dbPath:i.dbPath}),this.globalSpecsDir=i.globalSpecsDir,this.watcherDebounceMs=Math.max(0,i.watcherDebounceMs??dG),this.watchFiles=i.watchFiles!==!1,this.automationEnabled=i.automationEnabled!==!1,this.logger=i.logger??Ln,this.publishEvent=i.publish??(()=>{})}async start(){if(this.disposed)throw Error("AgendaTaskManager disposed");if(this.started)return;this.started=!0,this.recoverInterruptedRuns(),await this.reconcileSourceForProjection("global",void 0,"startup");for(let i of this.store.listWorkspaceRoots())if(hl(i))await this.reconcileSourceForProjection("workspace",i,"startup");this.expireTasks(),this.maintenanceTimer=setInterval(()=>{this.expireTasks(),this.queueAutomation()},lG),this.maintenanceTimer.unref?.(),this.queueAutomation()}async dispose(){if(this.disposed)return;if(this.disposed=!0,this.maintenanceTimer)clearInterval(this.maintenanceTimer);for(let i of this.scopes.values()){if(i.timer)clearTimeout(i.timer);i.watcher?.close()}this.scopes.clear();for(let i of this.activeRuns.values())if(i.sessionId)await this.runtime.abortSession(i.sessionId,"Hub task manager stopped").catch(()=>{});await Promise.allSettled(this.backgroundRuns);for(let[i,l]of this.activeRuns)this.store.updateRun(l.runId,{status:"interrupted",completedAt:Ms(),error:"Hub task manager stopped before the run completed."}),this.store.updateTaskState(i,{status:"failed",currentRunId:null,error:"Hub task manager stopped before the run completed.",updatedBy:Mi});if(this.activeRuns.clear(),this.ownsStore)this.store.close()}async createTask(i){this.assertUsable(),mb(i.expiresAt);let l=Xl(i),u={...i,...l},c=pb(u.taskId)??P("task_");if(await this.reconcileScope(u.scope,u.workspaceRoot),this.store.getTask(c))throw Error(`task ${c} already exists`);let g=this.ensureScope(u.scope,u.workspaceRoot),b=g.resolveWritePath(c,u.specPath);if(oh(b)||this.store.getTaskBySpecPath(b))throw Error(`task spec already exists: ${b}`);let I=this.store.createTask({...u,taskId:c,specPath:b});try{g.writeSpec({...u,taskId:c},{specPath:b,createOnly:!0})}catch(k){throw this.store.deleteTask(c),k}return this.publish("task.created",I),this.expireTask(I),this.queueAutomation(),this.requireTask(c)}async listTasks(i={}){if(this.assertUsable(),!i.scope||i.scope==="global")await this.reconcileSourceForProjection("global",void 0,"list");if(i.workspaceRoot){if(hl(i.workspaceRoot))await this.reconcileSourceForProjection("workspace",i.workspaceRoot,"list")}else if(i.scope!=="global"){for(let l of this.store.listWorkspaceRoots())if(hl(l))await this.reconcileSourceForProjection("workspace",l,"list")}return this.expireTasks(),this.store.listTasks(i)}async getTask(i){this.assertUsable();let l=this.store.getTask(i.trim());if(l?.scope==="workspace"&&hl(l.workspaceRoot))await this.reconcileSourceForProjection("workspace",l.workspaceRoot,"read");else if(l?.scope==="global")await this.reconcileSourceForProjection("global",void 0,"read");let u=this.store.getTask(i.trim());if(u)this.expireTask(u);return this.store.getTask(i.trim())}async updateTask(i){this.assertUsable();let l=this.requireTask(i.taskId);if(i.updatedBy.id!==qi.id)await this.reconcileSourceForProjection(l.scope,l.workspaceRoot,"update");let u=this.requireTask(i.taskId);if(u.revision!==i.expectedRevision)this.store.updateTask(i);if(u.status==="in_progress")throw Error("an in-progress task cannot be edited");if(u.status==="completed"||u.status==="cancelled"||u.status==="expired")throw Error(`task ${u.taskId} cannot be edited from ${u.status}; create a new task instead`);let c=cG(u,i);mb(c.expiresAt);let g=Xl(c),b={...c,...g},I={...i,scope:b.scope,workspaceRoot:b.workspaceRoot??null,cwd:b.cwd??null,resourcePaths:b.resourcePaths},k=this.ensureScope(b.scope,b.workspaceRoot),T=u.specPath!==void 0&&hb(k.specsDir,u.specPath);if(!T)await this.reconcileFileStore(k);let E=k.resolveWritePath(u.taskId,T?u.specPath:void 0);if(E!==u.specPath&&(oh(E)||this.store.getTaskBySpecPath(E)))throw Error(`task spec already exists: ${E}`);let A;if(T&&u.specPath){let D=k.readSpec(u.specPath);if(!D.ok)throw Error(`task spec is invalid: ${D.error}`);if(i.updatedBy.id!==qi.id&&Pp(D.spec,u)!==Mp(u))throw Error(`task spec changed outside the manager; reconcile task ${u.taskId} and retry`);A=D.contentHash}let C,N;try{C=k.writeSpec(b,{specPath:E,expectedContentHash:A,createOnly:!T}),N=this.store.updateTask(I)}catch(D){try{if(C&&T&&u.specPath)k.writeSpec(u,{specPath:u.specPath,expectedContentHash:C.contentHash});else if(C)k.deleteSpec(E,{expectedContentHash:C.contentHash})}catch(U){this.logError("agenda task update rollback failed",U,{taskId:u.taskId,specPath:E})}throw D}if(!N||!C)throw Error(`unknown task: ${i.taskId}`);let O=this.store.updateTaskState(N.taskId,{status:"pending_approval",approvedRevision:null,currentRunId:null,specPath:C.specPath,error:null,completedAt:null,archivedAt:null,updatedBy:i.updatedBy},N.revision);if(u.specPath&&u.specPath!==C.specPath)this.fileStoreForTask(u).deleteSpec(u.specPath);let L=O??this.requireTask(i.taskId);return this.publish("task.updated",L),this.expireTask(L),this.queueAutomation(),this.requireTask(i.taskId)}async approveTask(i,l,u){this.assertUsable();let c=await this.refreshAndVerifyTaskIntent(i);if(this.assertRevision(c,u),this.isExpired(c))throw this.expireTask(c),Error(`task ${i} has expired`);if(c.status==="approved"&&c.approvedRevision===c.revision)return c;if(c.status!=="pending_approval"&&c.status!=="failed")throw Error(`task ${i} cannot be approved from ${c.status}`);let g=this.store.updateTaskState(i,{status:"approved",approvedRevision:c.revision,error:null,updatedBy:l},c.revision);if(!g)throw Error(`unknown task: ${i}`);return this.publish("task.updated",g),this.queueAutomation(),g}async cancelTask(i,l,u,c){this.assertUsable();let g=this.requireTask(i);if(this.assertRevision(g,u),g.status==="cancelled")return g;if(g.status==="completed"||g.status==="expired")throw Error(`task ${i} cannot be cancelled from ${g.status}`);let b=g.currentRunId?this.store.getRun(g.currentRunId):void 0,I=c?.trim()||"Agenda task cancelled";if(b&&!ml.has(b.status))this.store.updateRun(b.runId,{status:"cancelled",completedAt:Ms(),error:c?.trim()||void 0});this.activeRuns.delete(i);let k=this.store.updateTaskState(i,{status:"cancelled",approvedRevision:null,currentRunId:null,error:c?.trim()||null,updatedBy:l},g.revision);if(!k)throw Error(`unknown task: ${i}`);if(this.publish("task.updated",k,b),b?.sessionId)try{await this.runtime.abortSession(b.sessionId,I)}catch(T){this.logError("agenda task session abort failed",T,{taskId:i,runId:b.runId,sessionId:b.sessionId})}return k}async runTask(i,l,u,c){this.assertUsable();let g=await this.refreshAndVerifyTaskIntent(i);if(this.assertRevision(g,u),this.isExpired(g))throw this.expireTask(g),Error(`task ${i} has expired`);if(Date.parse(g.availableAt)>Date.now())throw Error(`task ${i} is not available yet`);if(g.status!=="approved"&&g.status!=="failed")throw Error(`task ${i} must be approved before it can run`);if(g.approvedRevision!==g.revision)throw Error(`task ${i} approval is stale`);if(this.activeRuns.has(i)||g.currentRunId)throw Error(`task ${i} already has an active run`);let b=this.store.createRun({taskId:i,taskRevision:g.revision,requestedByClientId:c}),I=this.store.updateTaskState(i,{currentRunId:b.runId,lastRunId:b.runId,error:null,completedAt:null,updatedBy:l},g.revision);if(!I)throw Error(`unknown task: ${i}`);this.activeRuns.set(i,{runId:b.runId}),this.publish("task.updated",I,b);try{let k=await this.runtime.startSession(I,b,c,{unattended:l.kind==="automation_policy"&&this.store.getAutomationPolicy(I.scope==="workspace"&&I.workspaceRoot?I.workspaceRoot:"global").mode==="unattended"}),T=this.store.getRun(b.runId),E=this.store.getTask(i);if(!T||ml.has(T.status)||E?.status!==g.status||E.currentRunId!==b.runId){if(T&&!ml.has(T.status))this.store.updateRun(b.runId,{status:"cancelled",sessionId:k.sessionId,completedAt:Ms(),error:"Task changed or was cancelled while its session was starting."});else if(T)this.store.updateRun(b.runId,{sessionId:k.sessionId});throw this.activeRuns.delete(i),await this.runtime.abortSession(k.sessionId,"Agenda task was cancelled while its session was starting").catch((C)=>this.logError("cancelled agenda task session abort failed",C,{taskId:i,runId:b.runId,sessionId:k.sessionId})),Error(`task ${i} changed or was cancelled while starting`)}b=this.store.updateRun(b.runId,{status:"running",sessionId:k.sessionId,startedAt:Ms()})??b,I=this.store.updateTaskState(i,{status:"in_progress",lastSessionId:k.sessionId,updatedBy:l})??I,this.activeRuns.set(i,{runId:b.runId,sessionId:k.sessionId}),this.publish("task.run.started",I,b);let A=this.finishRun(I,b,k.sessionId);return this.backgroundRuns.add(A),A.finally(()=>this.backgroundRuns.delete(A)),{task:I,run:b}}catch(k){throw await this.finishRunFailure(I,b,k),k}}async getAutomationPolicy(i="global"){return this.assertUsable(),this.store.getAutomationPolicy(i)}async setAutomationPolicy(i,l){this.assertUsable();let u=Ms(),c=this.store.setAutomationPolicy({...i,enabledBy:i.mode==="manual"?void 0:l,enabledAt:i.mode==="manual"?void 0:u});return this.automationPolicyGeneration+=1,this.publishEvent("task.automation.updated",{policy:c}),this.queueAutomation(c.scopeKey),c}notifyAutomationReadinessChanged(){if(!this.disposed)this.queueAutomation()}async finishRun(i,l,u){try{let c=await this.runtime.runSession(u,i,l),g=this.store.getRun(l.runId);if(!g||ml.has(g.status))return;if(c.status==="completed"){let b=Ms(),I=this.store.updateRun(l.runId,{status:"completed",completedAt:b,resultSummary:c.summary,error:null})??g,k=this.store.updateTaskState(i.taskId,{status:"completed",currentRunId:null,error:null,completedAt:b,updatedBy:Mi})??this.requireTask(i.taskId);this.publish("task.run.completed",k,I)}else if(c.status==="cancelled")await this.cancelTask(i.taskId,Mi,i.revision,c.error||"Task session was cancelled");else await this.finishRunFailure(i,l,Error(c.error||c.summary||"Task session failed"))}catch(c){await this.finishRunFailure(i,l,c)}finally{this.activeRuns.delete(i.taskId);let c=this.store.getTask(i.taskId);(c?.scope==="workspace"&&c.workspaceRoot?this.reconcileScope("workspace",c.workspaceRoot):this.reconcileScope("global")).catch((g)=>this.logError("post-run agenda task reconciliation failed",g,{taskId:i.taskId})),this.queueAutomation()}}async finishRunFailure(i,l,u){let c=this.store.getRun(l.runId);if(!c||ml.has(c.status))return;let g=u instanceof Error?u.message:String(u),b=this.store.updateRun(l.runId,{status:"failed",completedAt:Ms(),error:g})??c,I=this.store.getTask(i.taskId);if(!I||I.status==="cancelled")return;if(I.currentRunId!==l.runId){this.activeRuns.delete(i.taskId),this.publish("task.run.failed",I,b);return}let k=this.store.updateTaskState(i.taskId,{status:"failed",currentRunId:null,error:g,updatedBy:Mi})??I;this.activeRuns.delete(i.taskId),this.publish("task.run.failed",k,b)}ensureScope(i,l){let u=pb(l);if(i==="workspace"&&!u)throw Error("workspaceRoot is required for workspace task scope");if(i==="workspace"&&!hl(u))throw Error("workspaceRoot must be an existing directory");let c=i==="global"?"global":`workspace:${u}`,g=this.scopes.get(c);if(g)return g.store;let b=new n_({scope:i,workspaceRoot:u,taskSpecsDir:i==="global"?this.globalSpecsDir:void 0}),I={store:b},k=!0;try{b.ensureSpecsDir();let T=this.watchFiles?this.resolveWatchRoot(b.specsDir):void 0;if(T!==void 0)I.watcher=$K(T,(E,A)=>{if(!A||!String(A).endsWith(".task.md"))return;if(I.timer)clearTimeout(I.timer);I.timer=setTimeout(()=>{I.timer=void 0,this.reconcileFileStore(b).catch((C)=>this.logError("agenda task watcher reconciliation failed",C,{specsDir:b.specsDir}))},this.watcherDebounceMs)}),I.watcher.on("error",(E)=>this.logError("agenda task watcher failed",E,{specsDir:b.specsDir}))}catch(T){k=!1,this.logError("agenda task source could not be attached",T,{specsDir:b.specsDir})}if(k)this.scopes.set(c,I);return b}async reconcileScope(i,l){let u=this.ensureScope(i,l);await this.reconcileFileStore(u)}async reconcileSourceForProjection(i,l,u){try{await this.reconcileScope(i,l)}catch(c){this.logError(`agenda task source ${u} reconciliation failed`,c,{scope:i,...l?{workspaceRoot:l}:{}})}}async reconcileFileStore(i){if(this.disposed)return;let l=new Set;for(let c of i.listSpecs()){if(l.add(c.specPath),!c.ok){this.logger.log("agenda task spec is invalid",{severity:"warn",specPath:c.specPath,error:c.error});continue}try{let g=c.spec;if(!g.taskId)g=i.writeSpec({...g,taskId:P("task_")},{specPath:g.specPath,expectedContentHash:g.contentHash});let b=this.store.getTaskBySpecPath(g.specPath);if(b&&g.taskId&&g.taskId!==b.taskId)this.logger.log("agenda task id is immutable for an existing spec",{severity:"warn",taskId:b.taskId,requestedTaskId:g.taskId,specPath:g.specPath}),g=i.writeSpec({...g,taskId:b.taskId},{specPath:g.specPath,expectedContentHash:g.contentHash});let I=g.taskId?this.store.getTask(g.taskId):void 0,k=b??I;if(I?.specPath&&I.specPath!==g.specPath){this.logger.log("agenda task id is already owned by another spec",{severity:"warn",taskId:g.taskId,specPath:g.specPath});continue}if(!k){let T=this.store.createTask(sG(g,qi));this.publish("task.created",T),this.expireTask(T);continue}if(k.archivedAt){let T=k.status==="cancelled"&&k.error==="Task spec was deleted.",E=this.store.updateTaskState(k.taskId,{status:T?"pending_approval":k.status,approvedRevision:T?null:k.approvedRevision,archivedAt:null,error:T?null:k.error,updatedBy:qi});if(E)k=E,this.publish("task.updated",E)}if(Pp(g,k)===Mp(k))continue;if(k.status==="in_progress"){this.logger.log("agenda task edit deferred until its run completes",{severity:"warn",taskId:k.taskId});continue}if(k.status==="completed"||k.status==="cancelled"||k.status==="expired"){this.logger.log("terminal agenda task edits are not applied",{severity:"warn",taskId:k.taskId,status:k.status}),i.writeSpec(k,{specPath:g.specPath,expectedContentHash:g.contentHash});continue}await this.updateTask(uG(g,k))}catch(g){this.logError("agenda task spec reconciliation failed",g,{specPath:c.spec.specPath})}}let u=this.store.listTasks({scope:i.scope,workspaceRoot:i.workspaceRoot,includeArchived:!0,limit:1000});for(let c of u){if(!c.specPath||!hb(i.specsDir,c.specPath)||l.has(c.specPath)||c.archivedAt)continue;if(c.status==="in_progress")await this.cancelTask(c.taskId,qi,c.revision,"Task spec was deleted.");let g=this.store.updateTaskState(c.taskId,{status:c.status==="completed"||c.status==="expired"?c.status:"cancelled",approvedRevision:null,currentRunId:null,error:c.status==="cancelled"?c.error??null:"Task spec was deleted.",archivedAt:Ms(),updatedBy:qi});if(g)this.publish("task.deleted",g)}this.queueAutomation()}expireTasks(){for(let i of this.store.listTasks({limit:1000}))this.expireTask(i)}expireTask(i){if(!this.isExpired(i))return;if(i.currentRunId||i.status==="in_progress"||i.status==="completed"||i.status==="cancelled"||i.status==="expired")return;let l=this.store.updateTaskState(i.taskId,{status:"expired",approvedRevision:null,currentRunId:null,error:"Task expired before it was started.",updatedBy:Mi});if(l)this.publish("task.updated",l)}isExpired(i){return Date.parse(i.expiresAt)<=Date.now()}recoverInterruptedRuns(){let i=Ms();for(let l of this.store.listRuns({status:["starting","running"],limit:1000})){this.store.updateRun(l.runId,{status:"interrupted",completedAt:i,error:"Hub restarted while this task was running."});let u=this.store.getTask(l.taskId);if(!u||u.currentRunId!==l.runId)continue;if(u.status==="completed"||u.status==="cancelled"||u.status==="expired"){this.store.updateTaskState(u.taskId,{currentRunId:null});continue}if(l.status==="starting"&&u.approvedRevision===l.taskRevision&&u.revision===l.taskRevision&&!this.isExpired(u)){this.store.updateTaskState(u.taskId,{status:"approved",currentRunId:null,error:"Hub restarted before this task session was linked.",updatedBy:Mi});continue}this.store.updateTaskState(u.taskId,{status:l.status==="starting"?"pending_approval":"failed",approvedRevision:l.status==="starting"?null:u.approvedRevision,currentRunId:null,error:"Hub restarted while this task was running.",updatedBy:Mi})}}queueAutomation(i){if(this.disposed||!this.automationEnabled)return;if(i)this.queuedAutomationScopes.add(i);else for(let l of this.store.listAutomationPolicies())this.queuedAutomationScopes.add(l.scopeKey);if(this.automationPumping)return;queueMicrotask(()=>{this.pumpAutomation().catch((l)=>this.logError("agenda task automation pump failed",l,{}))})}async pumpAutomation(){if(this.disposed||this.automationPumping)return;this.automationPumping=!0;let i=this.automationPolicyGeneration;try{while(this.queuedAutomationScopes.size>0){let l=this.queuedAutomationScopes.values().next().value;if(!l)break;this.queuedAutomationScopes.delete(l);let u=this.store.getAutomationPolicy(l);if(u.mode==="manual")continue;this.expireTasks();let c=this.store.listRuns({limit:1000}).filter((I)=>Date.parse(I.claimedAt)>=Date.now()-3600000).length,g=Math.min(Math.max(0,u.maxConcurrentRuns-this.activeRuns.size),Math.max(0,u.maxStartsPerHour-c));if(g<=0)continue;let b=this.store.listTasks({statuses:["pending_approval","approved"],...l==="global"?{}:{scope:"workspace",workspaceRoot:l},automationEligible:!0,availableBefore:Ms(),limit:1000});for(let I of b){if(g<=0)break;if(i!==this.automationPolicyGeneration)return;try{let k=I;if(k.status==="pending_approval"){if(!this.canAutomaticallyApprove(k,u))continue;k=await this.approveTask(k.taskId,cb,k.revision)}if(i!==this.automationPolicyGeneration)return;if(u.mode==="auto_start"&&this.runtime.isInteractiveClientAvailable?.()!==!0)continue;await this.runTask(k.taskId,cb,k.revision),g-=1}catch(k){this.logError("agenda task automation start failed",k,{taskId:I.taskId})}}}}finally{if(this.automationPumping=!1,this.queuedAutomationScopes.size>0)this.queueAutomation()}}canAutomaticallyApprove(i,l){let u=[i.createdBy,i.updatedBy];if(u.some((c)=>c.kind==="system"&&c.id==="file_reconciler"))return!1;if(!l.applyToAgentCreated&&u.some((c)=>c.kind==="agent"))return!1;return this.taskChainDepth(i)<=l.maxChainDepth}taskChainDepth(i){let l=0,u=i,c=new Set([i.taskId]);while(u.originTaskId){if(c.has(u.originTaskId))return Number.POSITIVE_INFINITY;c.add(u.originTaskId);let g=this.store.getTask(u.originTaskId);if(!g)break;l+=1,u=g}return l}fileStoreForTask(i){return this.ensureScope(i.scope,i.workspaceRoot)}async refreshAndVerifyTaskIntent(i){let l=this.requireTask(i);await this.reconcileScope(l.scope,l.workspaceRoot);let u=this.requireTask(i);if(u.archivedAt)throw Error(`task ${i} no longer has an active task spec`);if(!u.specPath)throw Error(`task ${i} has no canonical task spec`);let c;try{c=this.fileStoreForTask(u).readSpec(u.specPath)}catch(g){throw Error(`task ${i} task spec is unavailable: ${g instanceof Error?g.message:String(g)}`)}if(!c.ok)throw Error(`task ${i} task spec is invalid: ${c.error}`);if(c.spec.taskId!==u.taskId||Pp(c.spec,u)!==Mp(u))throw Error(`task ${i} task spec does not match revision ${u.revision}`);return u}requireTask(i){let l=i.trim();if(!l)throw Error("taskId is required");let u=this.store.getTask(l);if(!u)throw Error(`unknown task: ${l}`);return u}assertRevision(i,l){if(i.revision!==l)throw Error(`task ${i.taskId} is at revision ${i.revision}; the requested revision is stale`)}publish(i,l,u){this.publishEvent(i,{task:l,...u?{run:u}:{}},u?.sessionId??l.lastSessionId)}resolveWatchRoot(i){try{return NK.native(i)}catch(l){this.logError("agenda task watcher disabled: specs dir could not be resolved",l,{specsDir:i});return}}logError(i,l,u){if(this.logger.error)this.logger.error(i,{...u,error:l});else this.logger.log(i,{...u,error:l,severity:"error"})}assertUsable(){if(this.disposed)throw Error("AgendaTaskManager disposed")}}var gb=s(["suggestion","follow-up","todo","handoff","idea","reminder"]),pG=s(["pending_approval","approved","in_progress","completed","failed","cancelled","expired"]),yb=p([a(0),a(1),a(2),a(3),a(4),a(5)]),mG=t({provider_id:e().min(1),model_id:e().min(1).optional()}),Ff=t({operation:s(["create","update","list","get"]),task_id:e().min(1).optional(),expected_revision:n().int().positive().optional(),type:gb.optional(),title:e().min(1).optional(),description:e().nullable().optional(),instructions:e().min(1).optional(),scope:s(["workspace","global"]).optional(),workspace_root:e().min(1).nullable().optional(),cwd:e().min(1).nullable().optional(),resource_paths:o(e().min(1)).optional(),priority:yb.optional(),assignee:e().min(1).nullable().optional(),model_selection:mG.nullable().optional(),mode:s(["act","plan","yolo"]).nullable().optional(),system_prompt:e().nullable().optional(),max_iterations:n().int().positive().nullable().optional(),timeout_seconds:n().int().positive().nullable().optional(),available_at:e().datetime().optional(),expires_at:e().datetime().optional(),automation_eligible:r().optional(),statuses:o(pG).optional(),types:o(gb).optional(),priorities:o(yb).optional(),limit:n().int().positive().max(500).optional()}),hG=new Set(["create","update"]);function Np(i,l,u,c){if(!hG.has(l.operation))return;Ko(i.telemetry,{ulid:u.sessionId??u.conversationId??u.agentId,tool:`tasks.todo.${l.operation}`,success:c,agentId:u.agentId})}function ro(i,l){let u=i?.trim();if(!u)throw Error(`${l} is required for this operation`);return u}function vb(i){if(i===void 0||i===null)return i;return{providerId:i.provider_id,modelId:i.model_id}}function l_(i,l){return fb(i)===fb(l)}function wb(i,l){if(!i)throw Error("task does not exist");if(l.workspaceRoot){if(i.scope!=="workspace"||!i.workspaceRoot||!l_(i.workspaceRoot,l.workspaceRoot))throw Error("task is outside this session's workspace scope");return}if(i.scope!=="global")throw Error("task is outside this session's global scope")}function fG(i,l){let u=l.workspaceRoot?"workspace":"global";if(i.scope&&i.scope!==u)throw Error(`this session can only manage ${u} tasks`);if(i.workspace_root!==void 0){if(!l.workspaceRoot||i.workspace_root===null||!l_(i.workspace_root,l.workspaceRoot))throw Error(`this session can only manage ${u} tasks`)}return u}async function gG(i,l,u){let c=Ff.safeParse(l);if(!c.success)return{ok:!1,error:{code:"invalid_task_input",message:c.error.issues[0]?.message??"Invalid task input"}};let g=c.data,b={kind:"agent",id:u.agentId,agentId:u.agentId,sessionId:u.sessionId};try{if(!u.sessionId)throw Error("tasks requires a Hub session");let I=await i.resolveSessionDefaults(u.sessionId);if(!I)throw Error("tasks could not resolve the current session");let k=fG(g,I);switch(g.operation){case"create":{let T={type:ro(g.type,"type"),title:ro(g.title,"title"),description:g.description??void 0,instructions:ro(g.instructions,"instructions"),scope:k,workspaceRoot:I.workspaceRoot,cwd:k==="workspace"?(g.cwd??I.cwd)?.trim()||void 0:void 0,resourcePaths:g.resource_paths,priority:g.priority,assignee:g.assignee??void 0,modelSelection:vb(g.model_selection)??I.modelSelection,mode:g.mode??void 0,systemPrompt:g.system_prompt??void 0,maxIterations:g.max_iterations??void 0,timeoutSeconds:g.timeout_seconds??void 0,availableAt:g.available_at,expiresAt:ro(g.expires_at,"expires_at"),automationEligible:g.automation_eligible,createdBy:b,originSessionId:u.sessionId,originTaskId:I.originTaskId},E={ok:!0,operation:g.operation,task:await i.manager.createTask(T)};return Np(i,g,u,!0),E}case"update":{let T=ro(g.task_id,"task_id");if(wb(await i.manager.getTask(T),I),!g.expected_revision)throw Error("expected_revision is required for update");let E={ok:!0,operation:g.operation,task:await i.manager.updateTask({taskId:T,expectedRevision:g.expected_revision,type:g.type,title:g.title,description:g.description,instructions:g.instructions,scope:k,workspaceRoot:I.workspaceRoot??null,cwd:g.cwd,resourcePaths:g.resource_paths,priority:g.priority,assignee:g.assignee,modelSelection:vb(g.model_selection),mode:g.mode,systemPrompt:g.system_prompt,maxIterations:g.max_iterations,timeoutSeconds:g.timeout_seconds,availableAt:g.available_at,expiresAt:g.expires_at,automationEligible:g.automation_eligible,updatedBy:b})};return Np(i,g,u,!0),E}case"list":{let T={statuses:g.statuses,types:g.types,scope:k,workspaceRoot:I.workspaceRoot,priorities:g.priorities,automationEligible:g.automation_eligible,limit:g.limit};return{ok:!0,operation:g.operation,tasks:await i.manager.listTasks(T)}}case"get":{let T=await i.manager.getTask(ro(g.task_id,"task_id"));return wb(T,I),{ok:!0,operation:g.operation,task:T}}}}catch(I){return Np(i,g,u,!1),{ok:!1,operation:g.operation,error:{code:"task_operation_failed",message:I instanceof Error?I.message:String(I)}}}}var wG=s(["create","update","list","get","pause","resume","delete","run_now"]),bG=t({provider_id:e().min(1),model_id:e().min(1).optional()}),fc=t({operation:wG,schedule_id:e().min(1).optional(),schedule_type:s(["once","recurring"]).optional(),name:e().min(1).optional(),prompt:e().min(1).optional(),run_at:e().datetime({offset:!0}).optional(),cron_pattern:e().min(1).optional(),timezone:e().min(1).nullable().optional().describe("IANA timezone for recurring schedules. Omit unless the user explicitly requests a timezone; new schedules default to the local timezone. Updates preserve the existing timezone when omitted."),enabled:r().optional(),mode:s(["act","plan","yolo"]).optional(),system_prompt:e().nullable().optional(),max_iterations:n().int().positive().nullable().optional(),timeout_seconds:n().int().positive().nullable().optional(),max_parallel:n().int().positive().max(32).optional(),tags:o(e().min(1)).optional(),model_selection:bG.optional(),limit:n().int().positive().max(200).optional()});function so(i,l,u,c){if(!c_.has(l.operation))return;Ko(i.telemetry,{ulid:u.sessionId??u.conversationId??u.agentId,tool:`tasks.scheduled.${l.operation}`,success:c,agentId:u.agentId})}var c_=new Set(["create","update","pause","resume","delete","run_now"]);function Ho(i,l){let u=i?.trim();if(!u)throw Error(`${l} is required for this operation`);return u}function qf(i,l){try{let u=lh.native(i);if(!yG(u).isDirectory())throw Error("not a directory");return u}catch{throw Error(`${l} does not resolve to an existing safe path`)}}function IG(i,l){try{return lh.native(i)===lh.native(l)}catch{return!1}}function p_(i,l,u){let c=vG(i,l);if(c===".."||c.startsWith(`..${u_}`)||d_(c))throw Error(`${u} is outside the workspace scope`)}function m_(i,l,u){return qf(d_(l)?l:`${i}${u_}${l}`,u)}function kG(i){let l=qf(i.workspaceRoot,"workspaceRoot"),u=i.cwd?m_(l,i.cwd,"cwd"):l;return p_(l,u,"cwd"),{...i,workspaceRoot:l,cwd:u}}function io(i,l){if(!i)throw Error("schedule does not exist");if(!IG(i.workspaceRoot,l.workspaceRoot))throw Error("schedule is outside this session's workspace scope");let u=qf(i.workspaceRoot,"schedule workspaceRoot");if(i.cwd){let c=m_(u,i.cwd,"schedule cwd");p_(u,c,"schedule cwd")}}function bb(i){if(!i)return;return{providerId:i.provider_id.trim(),modelId:i.model_id?.trim()||void 0}}function Op(i){if(!i)return;return[...new Set(i.map((l)=>l.trim()).filter(Boolean))]}function h_(i){let l=Date.parse(Ho(i,"run_at"));if(!Number.isFinite(l))throw Error("run_at must be an ISO timestamp");if(l<=Date.now())throw Error("run_at must be in the future");return l}function SG(i){if(i.schedule_type==="once"){if(i.cron_pattern)throw Error("cron_pattern cannot be used with a one-time schedule");if(i.timezone)throw Error("timezone is encoded in run_at for a one-time schedule");return{cronPattern:pe,metadata:{[fe]:h_(i.run_at)}}}if(i.schedule_type==="recurring"){if(i.run_at)throw Error("run_at cannot be used with a recurring schedule");return{cronPattern:Ho(i.cron_pattern,"cron_pattern"),timezone:i.timezone?.trim()||void 0}}throw Error("schedule_type is required for create")}function TG(i){if(i.run_at&&i.cron_pattern)throw Error("run_at and cron_pattern cannot be updated together");if(i.schedule_type==="once"||i.run_at){if(i.cron_pattern)throw Error("cron_pattern cannot be used with a one-time schedule");if(i.timezone)throw Error("timezone is encoded in run_at for a one-time schedule");return{cronPattern:pe,timezone:null,metadata:{[fe]:h_(i.run_at)}}}if(i.schedule_type==="recurring"||i.cron_pattern)return{cronPattern:Ho(i.cron_pattern,"cron_pattern"),timezone:i.timezone===null?null:i.timezone?.trim()||void 0};return{timezone:i.timezone===null?null:i.timezone?.trim()||void 0}}function fl(i){return Ho(i.schedule_id,"schedule_id")}async function _G(i,l,u){let c=fc.safeParse(l);if(!c.success)return{ok:!1,error:{code:"invalid_schedule_input",message:c.error.issues[0]?.message??"Invalid schedule input"}};let g=c.data;try{if(!u.sessionId)throw Error("tasks requires a Hub session");let b=await i.resolveSessionDefaults(u.sessionId);if(!b?.workspaceRoot.trim())throw Error("tasks could not resolve the current workspace");let I=kG(b);if(c_.has(g.operation)&&!I.interactive)throw Error("schedule mutations require an interactive user session");switch(g.operation){case"create":{let k=i.schedules.createSchedule({name:Ho(g.name,"name"),...SG(g),prompt:Ho(g.prompt,"prompt"),workspaceRoot:I.workspaceRoot,cwd:I.cwd,modelSelection:bb(g.model_selection)??I.modelSelection,enabled:g.enabled,mode:g.mode??"yolo",systemPrompt:g.system_prompt??void 0,maxIterations:g.max_iterations??void 0,timeoutSeconds:g.timeout_seconds??void 0,maxParallel:g.max_parallel??1,createdBy:`agent:${u.agentId}`,tags:Op(g.tags)});return i.publish?.("schedule.created",{schedule:k},u.sessionId),so(i,g,u,!0),{ok:!0,operation:g.operation,schedule:k}}case"update":{let k=fl(g);io(i.schedules.getSchedule(k),I);let T=i.schedules.updateSchedule(k,{scheduleId:k,...TG(g),name:g.name?.trim()||void 0,prompt:g.prompt?.trim()||void 0,modelSelection:bb(g.model_selection),enabled:g.enabled,mode:g.mode,systemPrompt:g.system_prompt,maxIterations:g.max_iterations,timeoutSeconds:g.timeout_seconds,maxParallel:g.max_parallel,tags:Op(g.tags)});if(!T)throw Error("schedule does not exist");return i.publish?.("schedule.updated",{schedule:T},u.sessionId),so(i,g,u,!0),{ok:!0,operation:g.operation,schedule:T}}case"list":{let k=i.schedules.listSchedules({enabled:g.enabled,tags:Op(g.tags),workspaceRoot:I.workspaceRoot,limit:g.limit??50}).filter((T)=>{try{return io(T,I),!0}catch{return!1}}).slice(0,g.limit??50);return{ok:!0,operation:g.operation,schedules:k}}case"get":{let k=i.schedules.getSchedule(fl(g));return io(k,I),{ok:!0,operation:g.operation,schedule:k}}case"pause":case"resume":{let k=fl(g);io(i.schedules.getSchedule(k),I);let T=g.operation==="pause"?i.schedules.pauseSchedule(k):i.schedules.resumeSchedule(k);if(!T)throw Error("schedule does not exist");return i.publish?.("schedule.updated",{schedule:T},u.sessionId),so(i,g,u,!0),{ok:!0,operation:g.operation,schedule:T}}case"delete":{let k=fl(g);io(i.schedules.getSchedule(k),I);let T=i.schedules.deleteSchedule(k);if(!T)throw Error("schedule does not exist");return i.publish?.("schedule.deleted",{deleted:T,scheduleId:k},u.sessionId),so(i,g,u,!0),{ok:!0,operation:g.operation,deleted:T}}case"run_now":{let k=fl(g);io(i.schedules.getSchedule(k),I);let T=i.schedules.triggerScheduleNowDetached(k);if(!T)throw Error("schedule does not exist");return i.publish?.("schedule.triggered",{execution:T},u.sessionId),so(i,g,u,!0),{ok:!0,operation:g.operation,execution:T}}}}catch(b){return so(i,g,u,!1),{ok:!1,operation:g.operation,error:{code:"schedule_operation_failed",message:b instanceof Error?b.message:String(b)}}}}var jf="tasks",EG='# Tasks\n\nUse the `tasks` tool to manage durable Todo items and explicitly requested scheduled agent work.\n\n- Use `kind: "todo"` for meaningful follow-ups, handoffs, ideas, reminders, and other work that should remain visible after this session. This includes useful work you identify and suggest proactively. Agent-created Todos require user approval; Todos created directly by the user are approved immediately. Todo `available_at` controls availability in the list; it never schedules execution.\n- Use `kind: "scheduled"` only when the user explicitly asks Cline to execute work once at a future time or on a recurrence. One-time schedules require an exact future ISO 8601 `run_at` with an offset or Z. Recurring schedules require a five-field `cron_pattern` and default to the local timezone. Omit `timezone` unless the user explicitly requests a different timezone; never guess EST, UTC, or another zone. When a timezone is requested, use its IANA name (for example, America/New_York) so daylight-saving changes are handled.\n- "Remind me" is ambiguous: ask whether the user wants a reviewed Todo note or an agent to execute work at that time when intent is unclear.\n- Never create both kinds for the same request unless the user explicitly requests both. Check existing items before creating a likely duplicate.\n- Todo instructions and scheduled prompts must be self-contained. Include the goal, constraints, relevant project context, and expected output.\n- Scheduled sessions run in the user\'s schedules home workspace, not this conversation\'s folder. Include absolute paths in the scheduled `prompt` for any project files or repositories the work must touch.\n- Never approve or start a Todo yourself. Only mutate schedules from an interactive user session, and only update, pause, resume, delete, or run one immediately when the user asks.',AG="# Tasks\n\nUse the `tasks` tool only when the user explicitly asks Cline to execute work once at a future time or on a recurrence. Always pass `kind: \"scheduled\"`.\n\n- One-time schedules require an exact future ISO 8601 `run_at` with an offset or Z. Recurring schedules require a five-field `cron_pattern` and default to the local timezone. Omit `timezone` unless the user explicitly requests a different timezone; never guess EST, UTC, or another zone. When a timezone is requested, use its IANA name (for example, America/New_York) so daylight-saving changes are handled.\n- Never create a schedule proactively. Check existing schedules before creating a likely duplicate.\n- Make the scheduled `prompt` self-contained because it runs in a new unattended session in the user's schedules home workspace, not this conversation's folder. Include the goal, constraints, expected output, and absolute paths for any project files or repositories the work must touch.\n- Only update, pause, resume, delete, or run a schedule immediately when the user asks for that action.",xG=Ff.extend({kind:a("todo")}).strict(),f_=fc.extend({kind:a("scheduled")}).strict(),CG=w("kind",[xG,f_]),RG=w("kind",[f_]),g_=["create","update","list","get","pause","resume","delete","run_now"],PG=t({...fc.shape,...Ff.shape,kind:s(["todo","scheduled"]),operation:s(g_)}).strict(),MG=t({...fc.shape,kind:s(["scheduled"]),operation:s(g_)}).strict();function NG(i){let l=i.todo;return _({name:jf,description:l?'Create and manage reviewed Todo items or explicitly requested scheduled agent work. Use kind "todo" for durable Agenda items that require user or automation approval. Use kind "scheduled" for one-time or recurring autonomous execution. Todo available_at is not an execution timer; schedules use run_at or cron_pattern.':'Create and manage explicitly requested scheduled agent work with kind "scheduled". One-time schedules use a future ISO 8601 run_at; recurring schedules use a five-field cron_pattern.',inputSchema:S(l?PG:MG),retryable:!1,maxRetries:0,execute:async(u,c)=>{let g=(l?CG:RG).safeParse(u);if(!g.success)return{ok:!1,kind:typeof u==="object"&&u!==null&&"kind"in u&&(u.kind==="todo"||u.kind==="scheduled")?u.kind:void 0,error:{code:"invalid_tasks_input",message:g.error.issues[0]?.message??"Invalid tasks input"}};if(g.data.kind==="todo"){if(!l)return{ok:!1,kind:"todo",error:{code:"invalid_tasks_input",message:'kind "todo" is not available in this session'}};return{kind:"todo",...await gG(l,g.data,c)}}return{kind:"scheduled",...await _G(i.scheduled,g.data,c)}}})}function OG(i){return{name:"hub-task-guidance",manifest:{capabilities:["rules"]},setup:(l)=>{l.registerRule({id:"hub:task-guidance",content:i?.todoEnabled===!1?AG:EG,whenToolAvailable:jf})}}}function LG(i){if(typeof i!=="object"||i===null||!("error"in i))return;let l=i.error;return typeof l==="string"&&l.trim()?l:void 0}function Ib(i,l,u){let c=LG(u);if(c)return c;let g=l.trim();if(g){let b=g.length>200?`${g.slice(0,200)}...`:g;return`Cline account request failed with status ${i}: ${b}`}return`Cline account request failed with status ${i}`}class y_{apiBaseUrl;getAuthTokenFn;getCurrentUserIdFn;getOrganizationMemberIdFn;getHeadersFn;requestTimeoutMs;fetchImpl;constructor(i){let l=i.apiBaseUrl.trim();if(!l)throw Error("apiBaseUrl is required");this.apiBaseUrl=l,this.getAuthTokenFn=i.getAuthToken,this.getCurrentUserIdFn=i.getCurrentUserId,this.getOrganizationMemberIdFn=i.getOrganizationMemberId,this.getHeadersFn=i.getHeaders,this.requestTimeoutMs=i.requestTimeoutMs??30000,this.fetchImpl=i.fetchImpl??fetch}async fetchMe(){return this.request("/api/v1/users/me")}async fetchRemoteConfig(){return this.request("/api/v1/users/me/remote-config")}async fetchFeaturebaseToken(){try{return await this.request("/api/v1/users/me/featurebase-token")}catch{return}}async fetchBalance(i){let l=await this.resolveUserId(i);return this.request(`/api/v1/users/${encodeURIComponent(l)}/balance`)}async fetchUsageTransactions(i){let l=await this.resolveUserId(i);return(await this.request(`/api/v1/users/${encodeURIComponent(l)}/usages`)).items??[]}async fetchPaymentTransactions(i){let l=await this.resolveUserId(i);return(await this.request(`/api/v1/users/${encodeURIComponent(l)}/payments`)).paymentTransactions??[]}async fetchUserOrganizations(){return(await this.fetchMe()).organizations??[]}async fetchAvailableSubscriptionPlans(i){let l=new URL("/api/v1/plans",this.apiBaseUrl);if(i?.type)l.searchParams.set("type",i.type);return this.request(`${l.pathname}${l.search}`)}async fetchCurrentUserPlan(){return this.request("/api/v1/users/me/plan")}async fetchOrganization(i){let l=i.trim();if(!l)throw Error("organizationId is required");return this.request(`/api/v1/organizations/${encodeURIComponent(l)}`)}async fetchOrganizationBalance(i){let l=i.trim();if(!l)throw Error("organizationId is required");return this.request(`/api/v1/organizations/${encodeURIComponent(l)}/balance`)}async fetchOrganizationUsageTransactions(i){let l=i.organizationId.trim();if(!l)throw Error("organizationId is required");let u=await this.resolveOrganizationMemberId(l,i.memberId);return(await this.request(`/api/v1/organizations/${encodeURIComponent(l)}/members/${encodeURIComponent(u)}/usages`)).items??[]}async switchAccount(i){await this.request("/api/v1/users/active-account",{method:"PUT",body:{organizationId:i?.trim()||null},expectNoContent:!0})}async resolveUserId(i){let l=i?.trim();if(l)return l;let u=(this.getCurrentUserIdFn?await this.getCurrentUserIdFn():void 0)?.trim();if(u)return u;let c=await this.fetchMe();if(!c.id?.trim())throw Error("Unable to resolve current user id");return c.id}async resolveOrganizationMemberId(i,l){let u=l?.trim();if(u)return u;let c=(this.getOrganizationMemberIdFn?await this.getOrganizationMemberIdFn(i):void 0)?.trim();if(c)return c;let g=(await this.fetchUserOrganizations()).find((b)=>b.organizationId===i)?.memberId;if(!g?.trim())throw Error(`Unable to resolve memberId for organization ${i}`);return g}async request(i,l){let u=(await this.getAuthTokenFn())?.trim();if(!u)throw Error("No Cline account auth token found");let c=this.getHeadersFn?await this.getHeadersFn():{},g=new AbortController,b=setTimeout(()=>g.abort(),this.requestTimeoutMs);try{let I=await this.fetchImpl(new URL(i,this.apiBaseUrl),{method:l?.method??"GET",headers:{Authorization:`Bearer ${u}`,"Content-Type":"application/json",...c??{}},body:l?.body!==void 0?JSON.stringify(l.body):void 0,signal:g.signal});if(I.status===204||l?.expectNoContent){if(!I.ok)throw Error(`Cline account request failed with status ${I.status}`);return}let k=await I.text(),T;if(k.trim())try{T=JSON.parse(k)}catch{if(!I.ok)throw Error(Ib(I.status,k,void 0));throw Error("Cline account response was not valid JSON")}if(!I.ok)throw Error(Ib(I.status,k,T));if(typeof T==="object"&&T!==null){let E=T;if(typeof E.success==="boolean"){if(!E.success)throw Error(E.error||"Cline account request failed");return E.data}}if(T===void 0||T===null)throw Error("Cline account response payload was empty");return T}finally{clearTimeout(b)}}}var UG=610000,FG=3000,gl=15000,qG="CLOUD_SESSION_ERROR:",v_="__cline_create_request__:";function jG(i){return(i.trim().split(`
|
|
1064
|
+
`)[0]??"").trim().slice(0,72)}class ge extends Error{code;detail;connectUrl;status;constructor(i,l,u,c){super(`${qG}${JSON.stringify({code:i,message:l,connectUrl:u})}`);this.code=i,this.detail=l,this.connectUrl=u,this.status=c,this.name="CloudSessionError"}}class w_ extends ge{constructor(i){super("request_failed","Cloud session creation had an ambiguous result. Check your cloud session list or dashboard before starting another task.");this.name="CloudCreationUnconfirmedError",this.cause=i}}class b_ extends Error{constructor(i){super(i instanceof Error?i.message:"Cloud handoff creation was rejected.",{cause:i});this.name="CloudHandoffCreationRejectedError"}}function dh(i){let l=i.length;while(l>0&&i[l-1]==="/")l--;return i.slice(0,l)}function BG(i){return`${v_}${i}`.slice(0,255)}function kb(i){return i?.startsWith(v_)===!0}function I_(i){switch(i){case"provisioning":case"cloning_repo":case"agent_starting":case"ready":case"failed":return i;default:return}}function $p(i){let l=ne(i.replace(/^workos:/,""));return typeof l?.sub==="string"&&l.sub.trim()?l.sub.trim():void 0}function Sb(i){return new Promise((l,u)=>{if(i.aborted){u(i.reason);return}let c=()=>{clearTimeout(g),u(i.reason)},g=setTimeout(()=>{i.removeEventListener("abort",c),l()},FG);i.addEventListener("abort",c,{once:!0})})}function HG(i,l){if(i&&typeof i==="object"){let u=i.error;if(typeof u==="string"&&u.trim())return u.trim()}return l}function Lp(i,l,u,c){let g=HG(l,`Cloud session request failed (${i})`);if(i===401)return new ge("authentication_required",g);if(i===404)return new ge("session_not_found",g);if(i===410)return new ge("session_expired",g);if(i===412)return new ge("github_not_connected",g,c??`${dh(u)}/dashboard/integrations`);if(i===403&&g.trim().toLowerCase()==="forbidden")return new ge("request_failed","Your active account or organization cannot create cloud sessions. Switch to Personal or another organization in Settings → Account, then try again.",void 0,i);return new ge("request_failed",g,void 0,i)}class k_{options;apiBaseUrl;appBaseUrl;fetchImpl;createTimeoutMs;unconfirmedHandoffCreates=new Set;completedHandoffCreates=new Map;constructor(i){this.options=i,this.apiBaseUrl=dh(i.apiBaseUrl),this.appBaseUrl=dh(i.appBaseUrl),this.fetchImpl=i.fetch??fetch,this.createTimeoutMs=i.createTimeoutMs??UG}async request(i,l={},u,c,g){let b=!1,I;while(!0){let k;try{k=typeof c==="string"?c:await this.options.getAuthToken()}catch(A){if(I)throw Lp(401,void 0,this.appBaseUrl,u);throw A}if(!k?.trim())throw new ge("authentication_required","Sign in to Cline before starting a cloud session.");if(k.trim()===I)throw new ge("authentication_required","The cloud session credential was rejected. Sign in again.");if(typeof c==="object"){if(c.subject?$p(k.trim())!==c.subject:k.trim()!==c.token)throw new ge("authentication_required","The signed-in account changed during cloud session creation.");c.token=k.trim()}g?.();let T=await this.fetchImpl(`${this.apiBaseUrl}${i}`,{...l,signal:l.signal??AbortSignal.timeout(gl),headers:{Accept:"application/json",Authorization:`Bearer ${k.trim()}`,...l.body?{"Content-Type":"application/json"}:{},...l.headers}}),E=T.status===204?void 0:await T.json().catch(()=>{return});if(!T.ok){if(T.status===401&&typeof c==="object"&&!b&&c.subject){b=!0,I=k.trim();continue}throw Lp(T.status,E,this.appBaseUrl,u)}return E?.data}}async list(i){return await this.listWithToken(i)}async listWithToken(i,l,u=!1){let c=i?.trim()?`?organizationId=${encodeURIComponent(i.trim())}`:"";return(await this.request(`/api/v1/session${c}`,{},void 0,l)??[]).flatMap((g)=>{if(!g||typeof g!=="object"||typeof g.id!=="string")return[];return[{...g,title:!u&&kb(g.title)?void 0:g.title,repoContext:g.repoContext&&typeof g.repoContext==="object"?g.repoContext:{},metadata:{...g.metadata&&typeof g.metadata==="object"?g.metadata:{},...!u&&kb(g.title)?{createRequestTitle:g.title}:{}}}]})}async listRepositories(i){let l=i?.trim(),u=l?`${this.appBaseUrl}/dashboard/organization/integrations`:`${this.appBaseUrl}/dashboard/integrations`,c=l?`/api/v1/organizations/${encodeURIComponent(l)}/integrations/github/repositories`:"/api/v1/integrations/github/repositories";try{let g=await this.request(c)??[];return{connected:!0,connectUrl:u,repositories:g.flatMap((b)=>{let I=Number(b.id),k=String(b.html_url??b.clone_url??"").trim();if(!Number.isSafeInteger(I)||I<=0||!k)return[];let T=String(b.name??"").trim();return[{id:I,name:T,fullName:String(b.full_name??(T||k)).trim(),url:k,defaultBranch:String(b.default_branch??"").trim()}]})}}catch(g){if(g instanceof ge&&g.code==="session_not_found")return{connected:!1,connectUrl:u,repositories:[]};throw g}}async listBranches(i,l,u={}){if(!Number.isSafeInteger(i)||i<=0)throw new ge("request_failed","Select a GitHub repository before loading branches.");let c=l?.trim(),g=c?`/api/v1/organizations/${encodeURIComponent(c)}/integrations/github/repositories/${i}/branches`:`/api/v1/integrations/github/repositories/${i}/branches`,b=new URLSearchParams,I=u.query?.trim(),k=u.cursor?.trim();if(I)b.set("query",I);if(k)b.set("cursor",k);let T=b.size>0?`${g}?${b}`:g;try{let E=await this.request(T),A=Array.isArray(E)?E:Array.isArray(E?.items)?E.items:[],C=I?.toLowerCase();return{available:!0,branches:A.flatMap((N)=>{let O=String(N.name??"").trim();return O&&(!Array.isArray(E)||!C||O.toLowerCase().includes(C))?[O]:[]}),nextToken:Array.isArray(E)?"":String(E?.nextToken??"").trim()}}catch(E){if(E instanceof ge&&E.code==="session_not_found")return{available:!1,branches:[]};throw E}}async status(i,l={}){return await this.request(`/api/v1/session/${encodeURIComponent(i)}/status`,{signal:l.signal?AbortSignal.any([l.signal,AbortSignal.timeout(gl)]):void 0},void 0,l.authToken)}async create(i){if(i.handoff&&typeof i.handoff.onCreating!=="function")throw new ge("request_failed","Cloud handoff requires an onCreating callback to persist creation intent before dispatch.");let l=(await this.options.getAuthToken())?.trim();if(!l)throw new ge("authentication_required","Sign in to Cline before starting a cloud session.");let u={token:l,subject:$p(l)},c=BG(i.requestId?.trim()||DG()),g=i.handoff?`${u.subject??l}/${i.organizationId??""}/${i.requestId?.trim()??""}`:void 0;if(i.handoff&&!i.requestId?.trim())throw new ge("request_failed","A stable request id is required for cloud handoff creation.");let b=async()=>(await this.listWithToken(i.organizationId??void 0,u,!0)).filter((C)=>C.title===c&&C.repoContext.repoUrl===i.repoUrl&&C.metadata.modelId===i.modelId&&(!i.branch?.trim()||C.repoContext.branch===i.branch.trim())),I=async(C)=>{if(C.status==="failed"||C.expiredAt&&Date.parse(C.expiredAt)<=Date.now()){let O=new ge(C.status==="failed"?"session_failed":"session_expired","The recovered cloud handoff workspace is no longer usable.");try{await this.deleteWithAuth(C.id,u)}catch(L){if(!(L instanceof ge&&(L.code==="session_not_found"||L.code==="session_expired")))throw AggregateError([O,L],"The unusable recovered cloud handoff workspace could not be removed.")}if(g)this.unconfirmedHandoffCreates.delete(g),this.completedHandoffCreates.delete(g);throw await i.handoff?.onOuterSessionRemoved?.(C.id),O}await i.handoff?.onOuterSessionCreated(C.id,{created:!1});let N={sessionId:C.id,status:C.status,sandboxUrl:C.sandboxUrl,cleanupAuthToken:u.token};if(g)this.unconfirmedHandoffCreates.delete(g),this.completedHandoffCreates.set(g,N);return N};if(g){let C=await b();if(C.length>1)throw new ge("request_failed","Cloud handoff creation is ambiguous; inspect your cloud session list before continuing.");if(C[0])return await I(C[0]);let N=this.completedHandoffCreates.get(g);if(N){try{await this.request(`/api/v1/session/${encodeURIComponent(N.sessionId)}/status`,{},void 0,u)}catch(O){if(O instanceof ge&&(O.code==="session_not_found"||O.code==="session_expired"))await i.handoff?.onOuterSessionRemoved?.(N.sessionId),this.completedHandoffCreates.delete(g),this.unconfirmedHandoffCreates.delete(g);throw O}return await i.handoff?.onOuterSessionCreated(N.sessionId,{created:!1}),{...N,cleanupAuthToken:u.token}}if(this.unconfirmedHandoffCreates.has(g))throw new ge("request_failed","Cloud handoff creation is still unconfirmed. Recover the original request before creating another workspace.");this.unconfirmedHandoffCreates.add(g)}try{await i.handoff?.onCreating()}catch(C){if(g)this.unconfirmedHandoffCreates.delete(g);throw C}let k=new AbortController,T=setTimeout(()=>k.abort(),this.createTimeoutMs),E,A=!1;try{let C=await this.request("/api/v1/session",{method:"POST",body:JSON.stringify({modelId:i.modelId,repoUrl:i.repoUrl,...i.sandboxType?{sandboxType:i.sandboxType}:{},title:c,...i.branch?.trim()?{branch:i.branch.trim()}:{},...i.organizationId?.trim()?{organizationId:i.organizationId.trim()}:{}}),signal:k.signal},i.organizationId?.trim()?`${this.appBaseUrl}/dashboard/organization/integrations`:void 0,u,()=>{A=!0}),N=C?.sessionId?.trim();if(!N)throw new ge("request_failed","The cloud session service returned no session id.");E=N,await this.persistHandoffOuterSession(i,N,u,g);let O={sessionId:N,status:C.status?.trim()||"provisioning",sandboxUrl:C.sandboxUrl?.trim()??"",cleanupAuthToken:u.token};if(g)this.unconfirmedHandoffCreates.delete(g),this.completedHandoffCreates.set(g,O);return O}catch(C){if(E)throw C;let N=!A||C instanceof ge&&(C.status!==void 0&&C.status>=400&&C.status<500&&C.status!==408&&C.status!==409||["authentication_required","github_not_connected","session_not_found","session_expired"].includes(C.code));if(g&&N)throw this.unconfirmedHandoffCreates.delete(g),new b_(C);if(k.signal.aborted||!(C instanceof ge)||C instanceof ge&&C.code==="request_failed"&&(C.status===void 0||C.status>=500||C.status===408||C.status===409)){let O=[];try{O=await b()}catch(D){if(i.handoff)throw AggregateError([C,D],"Cloud handoff creation is unconfirmed and its session list could not be checked.")}if(!i.handoff&&!N&&O.length!==1)throw new w_(C);if(O.length>1)throw new ge("request_failed","Cloud session creation had an ambiguous result. Check your cloud session list before trying again.");let L=O[0];if(L){if(i.handoff)return await I(L);return{sessionId:L.id,status:L.status,sandboxUrl:L.sandboxUrl,cleanupAuthToken:u.token}}}else if(g)this.unconfirmedHandoffCreates.delete(g);throw C}finally{clearTimeout(T)}}async persistHandoffOuterSession(i,l,u,c){if(!i.handoff)return;try{await i.handoff.onOuterSessionCreated(l,{created:!0})}catch(g){try{await this.deleteWithAuth(l,u.token)}catch(b){if(!(b instanceof ge&&(b.code==="session_not_found"||b.code==="session_expired")))throw AggregateError([g,b],`Cloud session ${l} was created but its recovery record could not be saved or its sandbox removed.`)}if(c)this.unconfirmedHandoffCreates.delete(c);throw await i.handoff.onOuterSessionRemoved?.(l),g}}async waitUntilReady(i,l,u){l=AbortSignal.any([l,AbortSignal.timeout(this.createTimeoutMs)]);let c=await this.options.getAuthToken(),g=c?{token:c,subject:$p(c)}:void 0;while(!l.aborted){let b;try{b=await this.request(`/api/v1/session/${encodeURIComponent(i)}/status`,{signal:AbortSignal.any([l,AbortSignal.timeout(gl)])},void 0,g)}catch(k){if(l.aborted)throw k;if(k instanceof ge&&k.code!=="request_failed")throw k;await Sb(l);continue}let I=b?.status?.trim().toLowerCase();if(u?.({phase:I_(b?.phase)}),I==="ready"||I==="active")return;if(I==="failed")throw new ge("session_failed",b?.statusReason?.trim()||"The cloud sandbox could not be prepared.");if(I!=="provisioning")throw new ge("request_failed","The cloud session service returned an unexpected provisioning status.");await Sb(l)}throw l.reason}async resume(i,l){return await this.request(`/api/v1/session/${encodeURIComponent(i)}/resume`,{method:"POST",signal:l?AbortSignal.any([l,AbortSignal.timeout(gl)]):void 0})}async delete(i,l){await this.deleteWithAuth(i,l)}async deleteWithAuth(i,l){let u;try{await this.request(`/api/v1/session/${encodeURIComponent(i)}`,{method:"DELETE"},void 0,l)}catch(c){if(!(c instanceof ge)||c.code!=="session_not_found"&&c.code!=="session_expired")throw c;u=c}for(let[c,g]of this.completedHandoffCreates)if(g.sessionId===i)this.completedHandoffCreates.delete(c),this.unconfirmedHandoffCreates.delete(c);if(u)throw u}async updateTitle(i,l){return await this.request(`/api/v1/session/${encodeURIComponent(i)}`,{method:"PATCH",body:JSON.stringify({title:l})})}async history(i){let l=await this.options.getAuthToken();if(!l?.trim())throw new ge("authentication_required","Sign in to Cline to load this session's history.");let u=await this.fetchImpl(`${this.apiBaseUrl}/api/v1/session/${encodeURIComponent(i)}/history`,{headers:{Accept:"application/json",Authorization:`Bearer ${l.trim()}`},signal:AbortSignal.timeout(gl)});if(u.status===404)return null;let c=await u.json().catch(()=>{return});if(!u.ok)throw Lp(u.status,c,this.appBaseUrl);if(!c||typeof c!=="object"||!("version"in c)||c.version!==1||!("messages"in c)||!Array.isArray(c.messages))throw new ge("request_failed","Invalid archived session history");return c.messages}}var Tb=15000,tX=200,_b=3000,rX=100,sX=[100,250,500,1000,2000],__="--cline-hub-daemon",iX=3,nX=60000,Eb=new Map;function oX(i,l=Date.now()){let u=Eb.get(i);if(!u||l-u.windowStartedAt>nX)return Eb.set(i,{count:1,windowStartedAt:l}),!0;return u.count+=1,u.count<=iX}function aX(i){return[...i.host?["--host",i.host]:[],...typeof i.port==="number"?["--port",String(i.port)]:[],...i.pathname?["--pathname",i.pathname]:[]]}function lX(){try{let i=ZG(Z(),"logs","hub-daemon.log");return GG(QG(i),{recursive:!0}),{fd:XG(i,"a"),logPath:i}}catch{return}}function dX(){return re()==="production"?Rf():hc()}function _l(i){return TT(i)}function uX(i){try{let l=JSON.parse(JG(`${i}.superseded`,"utf8"));return{url:typeof l.url==="string"?l.url:void 0,authToken:typeof l.authToken==="string"?l.authToken:void 0,pid:typeof l.pid==="number"?l.pid:void 0}}catch{return}}function Dp(i){try{VG(`${i}.superseded`)}catch{}}function Ab(i,l,u){if(!l||l.url!==u)return i;return{...i,authToken:i.authToken??l.authToken,pid:i.pid??l.pid}}async function El(i,l){try{return await Cf(i,{authToken:l})}catch{return}}async function xb(i,l){let u=Date.now()+l;while(Date.now()<u){if(!(await El(i))?.url)return!0;await new Promise((c)=>setTimeout(c,rX))}return!1}async function Bf(i,l){if(!oX(i.url))return!1;await Qd(i.url,i.authToken,"retired by newer install").catch(()=>!1),await DX(i.url,i.authToken).catch(()=>!1);let u=await xb(i.url,_b);if(!u&&i.pid&&cX(i.pid)){try{process.kill(i.pid,"SIGTERM")}catch{}u=await xb(i.url,_b)}if(u)await mc(l).catch(()=>{return});return u}function cX(i){try{return process.kill(i,0),!0}catch(l){return l?.code==="EPERM"}}async function pX(i){try{let l=await R_(i.url,i.authToken);return l.activeSessionCount>0||(l.activePluginRequests??0)>0||(l.activeCloudCommands??0)>0}catch{return!1}}async function Up(i,l){if(_l(i))return"reusable";let u=await Qd(i.url,i.authToken,"retired by newer install").catch(()=>!1);if(await pX(i)){if(u)await Qd(i.url,i.authToken,"hub retirement deferred",{off:!0}).catch(()=>!1);return"deferred_busy"}let c=await Bf(i,l);if(!c&&u)await Qd(i.url,i.authToken,"hub retirement failed",{off:!0}).catch(()=>!1);return c?"retired":"failed"}async function mX(i){if(re()!=="production")return;let l=hc();if(l.discoveryPath===i.discoveryPath)return;let u=await jo(l.discoveryPath);if(u?.url)await Bf(u,l.discoveryPath);else await mc(l.discoveryPath).catch(()=>{return})}function hX(){let i=import.meta.url.endsWith(".ts")?"ts":"js";return eX(new URL(`./entry.${i}`,import.meta.url))}function fX(i,l){if($n(i))return[__];return[...l&&i.toLowerCase().endsWith(".ts")?["--conditions=development"]:[],i]}var Fp;function gX(i,l){let u,c;if(Fp)u=Fp.command,c=Fp.args??[__];else{let g=process.execPath?.trim();if(!g)throw Error("unable to resolve runtime executable for hub daemon");let b=YG(g).toLowerCase().includes("bun");u=g,c=fX(hX(),b)}return{launcher:u,args:[...c,"--cwd",i,...aX(l),...l.manageConnectors===!1?["--no-connectors"]:[]],cwd:i,env:{...qn(We(process.env),yX()),CLINE_NO_INTERACTIVE:"1",[ti]:"1"}}}function yX(){let i=Hi(),l=i?.name?.trim();return l?{client:l,version:i?.version,transport:"local"}:void 0}function vX(i){if(!i||typeof i!=="object")return!1;if(("code"in i?i.code:void 0)==="ETXTBSY")return!0;let l="message"in i?i.message:void 0;return typeof l==="string"&&l.includes("ETXTBSY")}function wX(i,l={}){if(zt())return;let u=gX(i,l),c=lX();try{WG(u.launcher,u.args,{detached:!0,stdio:c?["ignore",c.fd,c.fd]:"ignore",env:u.env,cwd:u.cwd,windowsHide:!0}).unref()}finally{if(c)KG(c.fd)}}async function bX(i,l={}){for(let u=0;;u++)try{wX(i,l);return}catch(c){let g=sX[u];if(!vX(c)||g===void 0)throw c;await new Promise((b)=>setTimeout(b,g))}}async function IX(i,l,u={}){let c=u.host!==void 0||u.port!==void 0||u.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),g=yT(u),b=$u(g.host,g.port,g.pathname),I=(O)=>{if(!c)Wf(O.url,O.authToken);return O};await mX(i).catch(()=>{return});let k=await jo(i.discoveryPath),T=k?.url?void 0:uX(i.discoveryPath),E=!1;if(k?.url){let O=k.authToken;if(!O)E=!0,await Bf(k,i.discoveryPath);else{let L=await El(k.url,O);if(L?.url&&_l(L)&&await Zs(L.url,{authToken:O}))return Dp(i.discoveryPath),I({url:L.url,authToken:O});if(L?.url){if(await Up({...L,authToken:O},i.discoveryPath)==="deferred_busy"&&await Zs(L.url,{authToken:O}))return I({url:L.url,authToken:O})}else await mc(i.discoveryPath).catch(()=>{return})}}let A=await El(b);if(A?.url){let O=Ab(A,k??T,b);if(_l(A)){let D=[A.authToken,k?.authToken,T?.authToken].filter((U)=>typeof U==="string"&&U.trim().length>0);for(let U of D){if(!await Zs(A.url,{authToken:U}))continue;let F={hubId:A.hubId??`repaired-${A.port}`,protocolVersion:A.protocolVersion,minClientProtocolVersion:A.minClientProtocolVersion,maxClientProtocolVersion:A.maxClientProtocolVersion,capabilities:A.capabilities,coreVersion:A.coreVersion,buildId:A.buildId,authToken:U,host:A.host,port:A.port,url:A.url,pid:A.pid??k?.pid??T?.pid,startedAt:A.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await ET(i.discoveryPath,F)}catch{}return Dp(i.discoveryPath),I({url:A.url,authToken:U})}throw Error(`A compatible Cline Hub is already running at ${b}, but its discovery record is missing or unreadable and no usable auth token is available. Run 'cline doctor fix' to repair local hub discovery.${E?" This can happen immediately after upgrading from a build that wrote an empty hub auth token; run 'cline doctor fix' to stop the old daemon and repair local hub discovery.":""}`)}let L=await Up(O,i.discoveryPath);if(L==="deferred_busy"){for(let D of[O.authToken,k?.authToken].filter((U)=>typeof U==="string"&&U.trim().length>0))if(await Zs(A.url,{authToken:D}))return I({url:A.url,authToken:D});if(u.allowPortFallback!==!0&&g.port!==0)throw Error(`An older Cline Hub is running at ${b} and is still serving active sessions, so it was not replaced, but no usable auth token is available to attach to it. Finish those sessions, or run 'cline doctor fix' to stop the hub.`)}if(L==="failed"&&u.allowPortFallback!==!0&&g.port!==0)throw Error(`An incompatible Cline Hub is already running at ${b} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}let C=u.allowPortFallback===!0&&g.port!==0?{...g,port:0}:g;await u.beforeSpawn?.(),await bX(l,{...C,manageConnectors:u.manageConnectors});let N=Date.now()+Tb;while(Date.now()<N){let O=await jo(i.discoveryPath);if(O?.url&&O.authToken){let D=await El(O.url,O.authToken);if(D?.url&&_l(D)&&await Zs(D.url,{authToken:O.authToken}))return Dp(i.discoveryPath),I({url:D.url,authToken:O.authToken})}let L=await El(b);if(L?.url&&!_l(L)){let D=Ab(L,O??T,b),U=await Up(D,i.discoveryPath);if(U==="deferred_busy"&&O?.authToken&&await Zs(L.url,{authToken:O.authToken}))return I({url:L.url,authToken:O.authToken});if(U==="failed"&&u.allowPortFallback!==!0&&g.port!==0)throw Error(`An incompatible Cline Hub is still running at ${b} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}await new Promise((D)=>setTimeout(D,tX))}throw Error(`Timed out after ${Tb}ms waiting for detached hub startup.`)}async function kX(i,l={}){let u=dX();return await Sz(u.discoveryPath,async()=>IX(u,i,l))}function SX(){return re()==="production"?Rf():hc()}function TX(){let i=globalThis.WebSocket;if(!i)throw Error("Global WebSocket is not available in this runtime. Node 22+ is required for hub mode.");return i}function _X(i){let l=new URL(i);l.protocol=i.protocol==="wss:"?"https:":"http:";let u=ya(l.toString());if(!u)return;return i.protocol==="wss:"?new T_.HttpsProxyAgent(u):new S_.HttpProxyAgent(u)}function E_(i){if(typeof i==="string")return i;if(i instanceof Uint8Array)return Buffer.from(i).toString();if(i instanceof ArrayBuffer)return Buffer.from(i).toString();if(Array.isArray(i))return Buffer.concat(i.map((l)=>Buffer.from(l))).toString();if(i&&typeof i==="object"&&"data"in i&&typeof i.data<"u")return E_(i.data);return String(i)}function EX(i){if(typeof i==="string")return i;if(i instanceof Uint8Array)return Buffer.from(i).toString("utf8");if(i instanceof ArrayBuffer)return Buffer.from(i).toString("utf8");return""}function Cb(i){let l=i,u=EX(l.reason);return new kt("hub_connection_closed",l.code||u?`Hub connection closed (code=${l.code??0}${u?`, reason=${u}`:""})`:uh,{closeCode:l.code,closeReason:u||void 0})}function qp(i,l){if(i instanceof kt)return i;if(i instanceof Error)return new kt("hub_connect_failed",i.message);if(i&&typeof i==="object"&&"error"in i&&i.error instanceof Error)return new kt("hub_connect_failed",i.error.message);let u=i&&typeof i==="object"&&"message"in i&&typeof i.message==="string"?i.message.trim():"";if(u)return new kt("hub_connect_failed",u);let c=i&&typeof i==="object"&&"type"in i&&typeof i.type==="string"?i.type.trim():"";return new kt("hub_connect_failed",c?`Failed to connect to hub at ${l.toString()} (${c} event before socket open).`:`Failed to connect to hub at ${l.toString()}.`)}var jp="*",xd=8000,AX="cline-hub-auth.",A_=new Map,x_=new Set,xX=3000,uh="Hub connection closed",CX=250,RX=5000,Rb=0.5;class kt extends Error{code;details;constructor(i,l,u){super(l);this.code=i,this.details=u,this.name="HubTransportError"}}function PX(i){return i instanceof kt}class ch extends Error{command;code;constructor(i,l,u){super(u);this.command=i,this.code=l,this.name="HubCommandError"}}function Hf(i,l={}){let u=i.searchParams.get("authToken")?.trim();if(i.searchParams.delete("authToken"),u)return u;if(l.skipRegistry)return;let c=zf(i.toString());return c?A_.get(c):void 0}function MX(i){try{let l=new URL(i).hostname.toLowerCase().replace(/^\[|\]$/g,"");return l==="localhost"||l==="127.0.0.1"||l==="::1"}catch{return!1}}function zf(i){if(!MX(i))return;let l=new URL(C_(i));return l.search="",l.hash="",l.toString()}function Pb(i){let l=zf(i);return!!l&&x_.has(l)}function Wf(i,l){let u=zf(i);if(u){if(x_.add(u),l?.trim())A_.set(u,l)}return i}class gc{options;socket;connectPromise;clientId;currentUrl;recoveryPromise;pendingReplies=new Map;listeners=new Set;subscriptionCounts=new Map;lastEventSequenceByKey=new Map;reconnectTimer;reconnectAttempt=0;closedByClient=!1;connectGeneration=0;lastCloseError=new kt("hub_connection_closed",uh);sawSocketClose=!1;registered=!1;capabilities;constructor(i){if(this.options=i,i.authToken?.trim()&&i.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");this.clientId=i.clientId??`core-${Math.random().toString(36).slice(2,10)}-${Date.now().toString(36)}`,this.currentUrl=i.url,this.capabilities=[...i.capabilities??[]]}getClientId(){return this.clientId}getUrl(){return this.currentUrl}isConnected(){return this.socket?.readyState===1&&this.registered}getConnectionError(){return this.isConnected()?null:this.lastCloseError}async updateCapabilities(i){if(this.capabilities=i.map((l)=>({...l})),!this.registered)return;await this.command("client.update",{capabilities:this.capabilities})}async connect(){if(this.connectPromise)return this.connectPromise;if(this.socket&&(this.socket.readyState===1||this.socket.readyState===0))return this.connectPromise??Promise.resolve();this.closedByClient=!1,this.clearReconnectTimer();let i=new URL(this.currentUrl),l=this.options.authToken?.trim()||Hf(i,{skipRegistry:Boolean(this.options.resolveConnectionHeaders)});if(i.hash="",l&&this.options.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");let u=++this.connectGeneration,c=this.openSocket(i,l,u),g;this.connectPromise=c.then(async(I)=>{if(g=I,await this.commandOnce("client.register",{clientId:this.clientId,clientType:this.options.clientType??"core",displayName:this.options.displayName??"core",transport:"native",actorKind:"client",capabilities:this.capabilities,metadata:{...this.options.metadata,version:this.options.clientVersion??String(zl.version),pid:process.pid},workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}},void 0,void 0,!1),u!==this.connectGeneration||this.closedByClient){try{I.close()}catch{}throw this.lastCloseError}this.registered=!0;for(let k of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(k));this.reconnectAttempt=0});let b=this.connectPromise;try{await b}catch(I){if(this.connectPromise===b)this.connectPromise=void 0;if(g&&this.socket===g){this.lastCloseError=qp(I,i),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{g.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw I}}async openSocket(i,l,u){let c=this.options.resolveConnectionHeaders,g;if(c){let E;try{g=await Promise.race([Promise.resolve().then(()=>c()),new Promise((A,C)=>{E=setTimeout(()=>{C(new kt("hub_connect_timeout",`Timed out resolving hub connection headers after ${xd}ms`))},xd)})])}catch(A){let C=A instanceof kt?A:new kt("hub_connect_failed",A instanceof Error?A.message:String(A));if(u===this.connectGeneration)this.lastCloseError=C;throw C}finally{clearTimeout(E)}}if(u!==this.connectGeneration||this.closedByClient)throw this.lastCloseError;if(g&&Object.keys(g).some((E)=>E.toLowerCase()==="sec-websocket-protocol")){let E=new kt("hub_connect_failed","Hub connection headers cannot set Sec-WebSocket-Protocol.");if(u===this.connectGeneration)this.lastCloseError=E;throw E}let b;try{b=g?_X(i):void 0}catch(E){let A=qp(E,i);if(u===this.connectGeneration)this.lastCloseError=A;throw A}let I=g?new xa(i.toString(),{headers:{...g},agent:b}):new(TX())(i.toString(),l?[`${AX}${l}`]:void 0);this.socket=I;let k=!1,T=new Promise((E,A)=>{let C=!1,N=setTimeout(()=>{if(C)return;C=!0,k=!0;let O=new kt("hub_connect_timeout",`Timed out connecting to hub after ${xd}ms`);if(this.socket===I)this.lastCloseError=O,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{I.close()}catch{}A(O)},xd);I.addEventListener("open",()=>{if(C)return;C=!0,clearTimeout(N),E()}),I.addEventListener("error",(O)=>{if(C)return;C=!0,clearTimeout(N);let L=qp(O,i);if(this.socket===I)this.lastCloseError=L,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;A(L)}),I.addEventListener("close",(O)=>{if(C)return;C=!0,clearTimeout(N);let L=k?this.lastCloseError:Cb(O);if(this.socket===I){if(!k)this.lastCloseError=L,this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0}A(L)})});return I.addEventListener("message",(E)=>{this.handleFrame(JSON.parse(E_(E)))}),I.addEventListener("close",(E)=>{if(this.socket!==I)return;if(!k)this.lastCloseError=Cb(E),this.sawSocketClose=!0;this.registered=!1;for(let A of this.pendingReplies.values())A.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0,!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect()}),await T,I}subscribe(i,l){let u=l?.sessionId?.trim()||void 0,c={listener:i,sessionId:u};return this.listeners.add(c),this.adjustSubscriptionCount(u,1),()=>{if(!this.listeners.delete(c))return;this.adjustSubscriptionCount(u,-1)}}async command(i,l,u,c){let g=0,b=!1,I={...c,onDispatch:(T)=>{b=!0,c?.onDispatch?.(T)}},k=i!=="client.register"&&i!=="client.unregister";while(!0)try{return await this.commandOnce(i,l,u,I)}catch(T){if(!k||b&&c?.retryAfterDispatch===!1||g>=1||!await this.recoverLocalHubTransport(T))throw T;g+=1}}async commandOnce(i,l,u,c,g=!0){if(g)await this.connect();c?.beforeDispatch?.();let b=P("hubreq_");c?.onDispatch?.(b);let I=ei(i,c?.timeoutMs),k=new Promise((E,A)=>{let C=I===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(b))return;A(new ch(i,"hub_command_timeout",`Hub command ${i} timed out after ${I}ms (hub=${this.currentUrl}, requestId=${b}, clientId=${this.clientId}). Check hub-daemon.log for matching command.start/command.slow entries, or run 'cline doctor fix' to restart the hub.`))},I);this.pendingReplies.set(b,{resolve:(N)=>{if(C)clearTimeout(C);E(N)},reject:(N)=>{if(C)clearTimeout(C);A(N)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:i,requestId:b,clientId:this.clientId,sessionId:u,timeoutMs:I,payload:l}})}catch(E){throw this.pendingReplies.delete(b),E}let T=await k;if(!T.ok){if(T.error?.code===kf){let E=u??(typeof l?.sessionId==="string"?l.sessionId:void 0);throw new uc(E,T.error.message)}throw new ch(i,T.error?.code,T.error?.message??`Hub command ${i} failed`)}return T}async recoverLocalHubTransport(i){if(!Pb(this.currentUrl)||!PX(i))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let l=await Mb({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}).catch(()=>{return});if(!l)return!1;return this.currentUrl=l,this.close(),!0})().finally(()=>{this.recoveryPromise=void 0}),await this.recoveryPromise}hasActiveSubscriptions(){return this.subscriptionCounts.size>0}clearReconnectTimer(){if(!this.reconnectTimer)return;clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0}scheduleReconnect(){if(this.reconnectTimer||this.closedByClient||!this.hasActiveSubscriptions())return;let i=Math.min(CX*2**this.reconnectAttempt,RX),l=Math.round(i*(1-Rb)+Math.random()*i*Rb);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.reconnectSubscribedTransport()},l)}async reconnectSubscribedTransport(){if(this.closedByClient||!this.hasActiveSubscriptions())return;try{await this.connect(),this.reconnectAttempt=0}catch{if(!Pb(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let i=await Mb({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd});if(i){this.currentUrl=i,await this.connect(),this.reconnectAttempt=0;return}}catch{}this.reconnectAttempt+=1,this.scheduleReconnect()}}close(){let i=this.socket;if(this.closedByClient=!0,this.connectGeneration+=1,this.clearReconnectTimer(),this.registered=!1,i)this.lastCloseError=new kt("hub_connection_closed",uh);for(let l of this.pendingReplies.values())l.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,!i)return;this.sawSocketClose=!1,this.socket=void 0;try{i.close()}catch{}}async dispose(){if(this.socket?.readyState===1&&this.registered)try{await this.command("client.unregister",void 0,void 0,{timeoutMs:2000})}catch{}this.close()}sendFrame(i){if(!this.socket||this.socket.readyState!==1){if(this.lastCloseError.code==="hub_connection_closed"&&!this.sawSocketClose)throw new kt("hub_connection_not_open","Hub connection is not open.");throw this.lastCloseError}this.socket.send(JSON.stringify(i))}sendSubscriptionFrame(i,l){let u=i==="stream.subscribe"?this.lastEventSequenceByKey.get(this.subscriptionKeyForSessionId(l)):void 0;this.sendFrame({kind:i,clientId:this.clientId,...l?{sessionId:l}:{},...u!==void 0?{sinceSequence:u}:{}})}adjustSubscriptionCount(i,l){let u=this.subscriptionKeyForSessionId(i),c=(this.subscriptionCounts.get(u)??0)+l;if(c<=0){if(this.subscriptionCounts.delete(u),!this.hasActiveSubscriptions())this.clearReconnectTimer();if(l<0&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.unsubscribe",i);return}if(this.subscriptionCounts.set(u,c),l>0&&c===1&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.subscribe",i)}subscriptionKeyForSessionId(i){return i??jp}subscriptionSessionIdFromKey(i){return i===jp?void 0:i}handleFrame(i){switch(i.kind){case"reply":{let l=i.envelope.requestId;if(!l)return;let u=this.pendingReplies.get(l);if(!u)return;this.pendingReplies.delete(l),u.resolve(i.envelope);return}case"event":{let l=i.envelope.sequence;if(typeof l==="number"){let u=i.envelope.sessionId?.trim();for(let c of[jp,u]){if(!c||!this.subscriptionCounts.has(c))continue;let g=this.lastEventSequenceByKey.get(c)??0;if(l>g)this.lastEventSequenceByKey.set(c,l)}}for(let u of this.listeners){if(u.sessionId&&u.sessionId!==i.envelope.sessionId?.trim())continue;u.listener(i.envelope)}return}case"command":case"stream.subscribe":case"stream.unsubscribe":return}}}function C_(i){let l=new URL(i);if(l.protocol==="http:")l.protocol="ws:";else if(l.protocol==="https:")l.protocol="wss:";return l.toString()}async function Zs(i,l){let u=new gc({url:i,authToken:l?.authToken,clientType:"hub-healthcheck",displayName:"hub healthcheck",workspaceRoot:l?.workspaceRoot,cwd:l?.cwd});try{return await u.connect(),!0}catch{return!1}finally{u.close()}}async function ph(i,l){let u=C_(i),c=await Cf(u,{authToken:l?.authToken});if(!c)return{status:"unreachable",url:u};if(l?.requireCurrentBuild){let g=Qo(),b=ST(c,g);if(!b.compatible&&!TT(c))return{status:b.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:u}}else if(!Mt(c).compatible)return{status:"protocol_mismatch",url:u};if(l?.verifyConnection===!0&&!await Zs(u,{workspaceRoot:l.workspaceRoot,cwd:l.cwd,authToken:l.authToken}))return{status:"unreachable",url:u};return{status:"compatible",url:u}}function NX(i){let l=i&&typeof i==="object"&&Array.isArray(i.sessions)?i.sessions:[],u=0,c=new Set;for(let b of l){if(!b||typeof b!=="object")continue;let I=b.participants;if(!Array.isArray(I)||I.length===0)continue;u+=1;for(let k of I){let T=k&&typeof k==="object"?k.clientId:void 0;if(typeof T==="string"&&T.trim())c.add(T)}}let g=(b)=>{let I=i&&typeof i==="object"?i[b]:void 0;return typeof I==="number"&&Number.isInteger(I)&&I>0?I:0};return{activeSessionCount:u,participantClientCount:c.size,activePluginRequests:g("activePluginRequests"),activeCloudCommands:g("activeCloudCommands")}}async function R_(i,l,u){let c=new gc({url:i,authToken:l,clientType:"hub-recovery-check",displayName:"hub recovery check",workspaceRoot:u?.workspaceRoot,cwd:u?.cwd});try{let g=await c.command("session.list",{limit:500},void 0,{timeoutMs:xX});return NX(g.payload)}finally{await c.dispose().catch(()=>{return})}}async function OX(i,l,u){try{let c=await R_(i,l,u);return c.activeSessionCount===0&&c.activePluginRequests===0&&c.activeCloudCommands===0}catch{return!1}}async function $X(i,l){let u=`${i.discoveryPath}.superseded`,c=await jo(u);if(!c?.url||!c.authToken)return;let g=await ph(c.url,{authToken:c.authToken});if(g.status!=="compatible")return;if(await OX(g.url,c.authToken,l))return;return Wf(g.url,c.authToken)}async function LX(i={}){if(i.endpoint?.trim()){let g=await ph(i.endpoint);return g.status==="compatible"?g.url:void 0}let l=SX(),u=await jo(l.discoveryPath);if(!u?.url)return await $X(l,i);let c=await ph(u.url,{authToken:u.authToken,requireCurrentBuild:!0});if(c.status==="compatible")return Wf(c.url,u.authToken);if(c.status==="protocol_mismatch")await mc(l.discoveryPath).catch(()=>{return});return}async function Mb(i={}){let l=await LX(i);if(l&&await Zs(l,{workspaceRoot:i.workspaceRoot,cwd:i.cwd}))return l;if(i.endpoint?.trim())return;try{return(await kX(i.workspaceRoot??process.cwd())).url}catch(u){i.onStartupError?.(u);return}}async function Qd(i,l,u,c){Xe();let g=new URL(i),b=l?.trim()||Hf(g);if(g.protocol==="ws:")g.protocol="http:";else if(g.protocol==="wss:")g.protocol="https:";if(g.pathname="/drain",g.hash="",u)g.searchParams.set("reason",u);if(c?.off)g.searchParams.set("off","1");return(await fetch(g,{method:"POST",headers:b?{authorization:`Bearer ${b}`}:void 0})).ok}async function DX(i,l){Xe();let u=new URL(i),c=l?.trim()||Hf(u);if(u.protocol==="ws:")u.protocol="http:";else if(u.protocol==="wss:")u.protocol="https:";return u.pathname="/shutdown",u.hash="",(await fetch(u,{method:"POST",headers:c?{authorization:`Bearer ${c}`}:void 0})).ok}function Nb(i){return i.map((l)=>{let u=l&&typeof l==="object"?l:{};return{role:u.role,content:u.content}})}function Ob(i,l){return i.length===l.length&&JSON.stringify(Nb(i))===JSON.stringify(Nb(l))}class P_ extends Error{constructor(i,l){super(`Cloud transcript verification failed (local ${i} messages, cloud ${l}).`);this.name="CloudHandoffTranscriptMismatchError"}}function UX(i,l){if(!i||typeof i!=="object")return;let u=i,c=typeof u.id==="string"?u.id.trim():"";if(!c)return;let g=typeof u.display_name==="string"?u.display_name.trim():typeof u.displayName==="string"?u.displayName.trim():"",b=typeof u.name==="string"?u.name.trim():"";return{id:c,name:g||b||c,catalogId:l}}function Bp(i,l){return Array.isArray(i)?i.flatMap((u)=>{let c=UX(u,l);return c?[c]:[]}):[]}async function FX(i,l={}){let u=i.trim(),c=u.length;while(c>0&&u[c-1]==="/")c--;let g=u.slice(0,c),b=async(D)=>{let U=await(l.fetchImpl??fetch)(`${g}${D}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(1e4)});if(!U.ok)throw Error(`HTTP ${U.status}`);return await U.json()},I,k;try{[I,k]=await Promise.all([b("/api/v1/ai/cline/models"),b("/api/v1/ai/cline/recommended-models")])}catch(D){throw Error("Could not load the cloud model catalog.",{cause:D})}let T=I&&typeof I==="object"?I:void 0,E=Bp(Array.isArray(I)?I:T?.data,"cline"),A=k&&typeof k==="object"?k:void 0,C=A?.data&&typeof A.data==="object"?A.data:A,N=Bp(C?.clinePass,"cline-pass"),O=Bp(C?.clineCloud,"cline-cloud"),L=new Set;return[...l.isOrganizationSession?[]:N,...O,...E].filter((D)=>{if(L.has(D.id))return!1;return L.add(D.id),!0})}function Hp(i){return Array.isArray(i?.sessions)?i.sessions.filter((l)=>Boolean(l)&&typeof l==="object"&&!Array.isArray(l)):[]}function $b(i){let l=i.updatedAt;return typeof l==="number"?l:Date.parse(String(l??""))||0}function Lb(i){let l=i?.metadata&&typeof i.metadata==="object"?i.metadata:void 0;return String(l?.model??i?.model??"").trim()}function zp(i){let l=i.metadata&&typeof i.metadata==="object"?i.metadata:void 0;return!String(l?.parentSessionId??i.parentSessionId??"").trim()}function M_(i,l="text"){if(!i||typeof i!=="object"||Array.isArray(i))return"";let u=i.content;if(typeof u==="string")return l==="text"?u.trim():"";if(!Array.isArray(u))return"";return u.map((c)=>c&&typeof c==="object"&&!Array.isArray(c)?l==="thinking"&&c.type==="redacted_thinking"?"[redacted]":String(c[l]??""):"").join("").trim()}function Zd(i){let l=i.trim(),u=l.match(/^<user_input\b[^>]*>([\s\S]*)<\/user_input>$/);return(u?u[1]:l).trim()}function Fu(i,l,u){let c=Zd(u);return i.filter((g)=>Boolean(g)&&typeof g==="object"&&!Array.isArray(g)&&String(g.role??"").toLowerCase()==="user"&&(c!==""||AP(g))&&Zd(M_(g))===c).length+l.filter((g)=>Zd(g.prompt)===c).length}function N_(i){return i.flatMap((l)=>{if(l.event!=="session.pending_prompt_submitted")return[];let u=l.payload?.prompt&&typeof l.payload.prompt==="object"&&!Array.isArray(l.payload.prompt)?l.payload.prompt:void 0,c=String(u?.id??"").trim();if(!c)return[];return[{id:c,prompt:String(u?.prompt??""),steer:u?.delivery==="steer",attachmentCount:typeof u?.attachmentCount==="number"?u.attachmentCount:0,userImages:Array.isArray(u?.userImages)?u.userImages.filter((g)=>typeof g==="string"):void 0}]})}var qX=new Set(["run.completed","run.aborted","run.failed"]),jX=new Set(["assistant.delta","assistant.finished","reasoning.delta","reasoning.finished"]);function Db(i,l){return i.filter((u)=>Boolean(u)&&typeof u==="object"&&!Array.isArray(u)&&String(u.role??"").toLowerCase()==="assistant").map((u)=>M_(u,l)).filter(Boolean)}function Ub(i,l,u="text"){let c=new Map;for(let g of Db(l,u))c.set(g,(c.get(g)??0)+1);return Db(i,u).filter((g)=>{let b=c.get(g)??0;if(b===0)return!0;if(b===1)c.delete(g);else c.set(g,b-1);return!1})}function qu(i,l,u=new Set){if(!i||typeof i!=="object")return u;if(Array.isArray(i)){for(let b of i)qu(b,l,u);return u}let c=i,g=l==="tool_use"?c.id:c.tool_use_id;if(c.type===l&&typeof g==="string")u.add(g);for(let b of Object.values(c))qu(b,l,u);return u}function Fb(i,l="assistant"){let u="",c="";for(let g of i)if(g.event===`${l}.delta`)c+=l==="reasoning"&&g.payload?.redacted&&!g.payload?.text?"[redacted]":typeof g.payload?.text==="string"?g.payload.text:"";else if(g.event===`${l}.finished`){let b=g.payload?.[l==="assistant"?"text":"reasoning"],I=typeof b==="string"&&b?b:c;if(I)u=I;c=""}return(u||c).trim()}function BX(i,l,u={}){let c=u.queueSnapshotApplied!==!1,g=Ub(l,u.baselineMessages??[]),b=Ub(l,u.baselineMessages??[],"thinking"),I=qu(l,"tool_use"),k=qu(l,"tool_result"),T=new Set(i.slice(0,u.messagesSnapshotEventCutoff??i.length)),E=new Set,A=new Map;for(let D of i.slice(0,u.messagesSnapshotEventCutoff??i.length)){let U=N_([D])[0];if(!U)continue;let F=Zd(U.prompt),j=A.get(F)??Math.max(0,Fu(l,[],F)-Fu(u.baselineMessages??[],[],F));if(A.set(F,Math.max(0,j-1)),j>0)E.add(D)}let C=[...c?i.slice(u.queueSnapshotEventCutoff??i.length):i].reverse().find((D)=>D.event==="session.pending_prompts"),N=[],O=[],L=(D)=>{if(O.length===0)return;let U=O.filter((oe)=>T.has(oe)),F=(oe)=>{if(!D)return-1;let G=[...U].reverse().findIndex((Pe)=>Pe.event===`${oe}.finished`),se=G<0?-1:U.length-1-G;return se>=0||O.at(-1)?.event==="run.aborted"?se:U.length-1},j=F("assistant"),H=F("reasoning"),Q=Fb(U.slice(0,j+1)),z=Q?g.findIndex((oe)=>oe.endsWith(Q)):-1,W=z>=0;if(W)g.splice(z,1);let ee=Fb(U.slice(0,H+1),"reasoning"),te=ee?b.findIndex((oe)=>oe.endsWith(ee)):-1;if(te>=0)b.splice(te,1);for(let[oe,G]of O.entries()){if(E.has(G)){N.push({...G,payload:{...G.payload,transcriptReflected:!0}});continue}if(T.has(G)&&jX.has(G.event)&&(G.event.startsWith("reasoning.")?te>=0&&oe<=H:W&&oe<=j))continue;if(G.event==="session.pending_prompts"&&G!==C)continue;if(T.has(G)&&G.event.startsWith("tool.")){let se=String(G.payload?.toolCallId??"").trim();if(k.has(se)||G.event==="tool.started"&&I.has(se))continue}N.push(G)}O=[]};for(let D of i)if(O.push(D),qX.has(D.event))L(!0);return L(!1),N}function Wp(i){let l=structuredClone(i),u=(c)=>{if(!c||typeof c!=="object"||Object.isFrozen(c))return;for(let g of Object.values(c))u(g);Object.freeze(c)};return u(l),l}function Kf(i){let l=i?.trim();return l?me(l).slice(0,120):void 0}function O_(i){if(typeof i==="string")return i;if(Array.isArray(i)){let l=[];for(let u of i){if(typeof u==="string"){if(u.trim())l.push(u);continue}if(!u||typeof u!=="object")continue;let c=u,g=typeof c.type==="string"?c.type:"",b=g==="text"?String(c.text??""):g==="thinking"?String(c.thinking??""):g==="tool_use"?`[tool] ${String(c.name??"tool_call")}`:g==="tool_result"?`[tool_result]
|
|
1065
|
+
${O_(c.content)}`:g==="image"?"[image]":g==="redacted_thinking"?"[redacted_thinking]":typeof c.text==="string"?c.text:"";if(b.trim())l.push(b)}return l.join(`
|
|
1066
|
+
`)}if(i&&typeof i==="object"){let l=i;if(typeof l.text==="string")return l.text}return""}function HX(i){let l=Kf(i??void 0);if(!l)return;return l.split(`
|
|
1067
|
+
`)[0]?.trim().slice(0,70)||void 0}function zX(i){for(let l of["user","assistant"])for(let u of i){if(!u||typeof u!=="object")continue;let c=u;if(c.role!==l)continue;let g=Kf(O_(c.content));if(!g)continue;return g.split(`
|
|
1068
|
+
`)[0]?.trim().slice(0,70)||void 0}return}function WX(i){let l=i.metadata&&typeof i.metadata==="object"?Kf(i.metadata.title):void 0;if(l)return l.slice(0,70);let u=HX(i.prompt);if(u)return u;let c=i.messages?zX(i.messages):void 0;if(c)return c;return`Session ${i.sessionId.slice(-6)}`}function KX(i,l,u,c){let g=l.payload??{},b=()=>{let k=u.get(c);if(k===void 0||!i.messages[k]||i.messages[k]?.role!=="assistant")k=i.messages.length,i.messages.push({role:"assistant",content:[]}),u.set(c,k);let T=i.messages[k];if(!Array.isArray(T.content))T.content=[];return T.content},I=(k,T,E)=>{let A=b(),C=A.at(-1);if(C?.type===k)C[T]=`${C[T]??""}${E}`;else A.push({type:k,[T]:E})};switch(l.event){case"assistant.delta":if(typeof g.text==="string")I("text","text",g.text);return;case"reasoning.delta":if(typeof g.text==="string"&&g.text)I("thinking","thinking",g.text);else if(g.redacted===!0)b().push({type:"redacted_thinking",data:""});return;case"assistant.finished":u.delete(c);return;case"assistant.media":if(g.media)b().push({type:"media",media:structuredClone(g.media)});return;case"tool.started":{let k=String(g.toolCallId??"");if(k&&!i.messages.some((T)=>Array.isArray(T.content)&&T.content.some((E)=>E.type==="tool_use"&&E.id===k)))b().push({type:"tool_use",id:k,name:String(g.toolName??"tool"),input:structuredClone(g.input??{})});return}case"tool.finished":{let k=String(g.toolCallId??"");if(k&&!i.messages.some((T)=>Array.isArray(T.content)&&T.content.some((E)=>E.type==="tool_result"&&E.tool_use_id===k)))i.messages.push({role:"user",content:[{type:"tool_result",tool_use_id:k,content:typeof g.output==="string"?g.output:JSON.stringify(g.output??""),is_error:Boolean(g.error)}]}),u.delete(c);return}case"usage.updated":i.usage=structuredClone(g.totals??g.delta??{});return;case"session.pending_prompts":{let k=Array.isArray(g.prompts)?g.prompts:[];i.promptsInQueue=k.map((T)=>({id:String(T.id??""),prompt:String(T.prompt??""),steer:T.delivery==="steer",attachmentCount:typeof T.attachmentCount==="number"?T.attachmentCount:0,userImages:Array.isArray(T.userImages)?T.userImages.filter((E)=>typeof E==="string"):void 0})).filter((T)=>T.id&&(T.prompt||T.attachmentCount));return}case"session.pending_prompt_submitted":{let k=g.prompt,T=String(k?.id??"");if(!T||i.lastQueuedPromptStartId===T)return;if(i.lastQueuedPromptStartId=T,i.promptsInQueue=i.promptsInQueue.filter((E)=>E.id!==T),g.transcriptReflected!==!0)i.messages.push({role:"user",content:[{type:"text",text:String(k?.prompt??"")}]});i.busy=!0,i.status="running",i.endedAt=void 0,u.delete(c);return}case"run.started":case"session.attached":case"session.updated":{if(typeof l.sequence==="number"&&i.lastHubStatusSequence!==void 0&&l.sequence<i.lastHubStatusSequence)return;if(typeof l.sequence==="number")i.lastHubStatusSequence=l.sequence;let k=g.session,T=typeof k?.status==="string"?k.status:l.event==="run.started"?"running":i.status,E=T==="pending"?"running":T;if(l.event==="session.updated"&&E==="running"&&i.endedAt!==void 0&&!i.busy)return;let A=i.busy;if(i.status=E,i.busy=E==="running",l.event==="run.started"){if(!A)u.delete(c);i.endedAt=void 0}return}case"run.completed":case"run.failed":case"run.aborted":{if(typeof l.sequence==="number"&&i.lastHubStatusSequence!==void 0&&l.sequence<i.lastHubStatusSequence)return;if(typeof l.sequence==="number")i.lastHubStatusSequence=l.sequence;i.status=typeof g.reason==="string"?g.reason:l.event==="run.failed"?"error":l.event==="run.aborted"?"aborted":"completed",i.busy=!1,i.endedAt=Date.now(),u.delete(c);return}}}function Kp(i){return i instanceof Error&&i.name==="HubTransportError"&&["hub_connect_timeout","hub_connect_failed","hub_connection_closed","hub_connection_not_open"].includes(String(i.code))}function Gp(i,l){return i instanceof Error&&i.name==="HubCommandError"&&i.code==="hub_command_timeout"&&(!l||i.command===l)}var nt="/workspace",GX=30000,XX=2000,JX=2000,$_="IMPORTANT: GitHub authentication is handled automatically by the infrastructure. An egress proxy transparently injects credentials into all GitHub traffic. You do NOT need to set up, configure, or manage any tokens, API keys, or credentials, and you must never run `gh auth login` or attempt to authenticate manually. "+"The GitHub CLI (`gh`) is installed and already authenticated — prefer it for GitHub work "+"(`gh pr create`, `gh pr diff`, `gh issue list`, `gh api`, ...). `git` push and pull are authenticated the same way. "+"Simply run the commands normally — credentials are injected transparently.";function VX(i){let l=`cline/${(i.metadata.taskId?.trim()||i.id).slice(-8).toLowerCase()}`,u=i.sandboxType==="resumable"||i.metadata.sandboxType==="resumable";return`${$_}
|
|
1069
|
+
|
|
1070
|
+
Do all work for this task on the branch \`${l}\`: create it from the current checkout before your first change (or check it out if it already exists), and never commit directly to the default branch. `+(u?"Commit and push only when the user asks. ":`SAVE YOUR WORK: This sandbox is temporary. Push your progress to origin so it remains available outside the sandbox. The branch \`${l}\` is a backup of your work-in-progress, not a finished deliverable, so commit to it freely even when the work is incomplete. Commit regularly as you complete meaningful steps, using clear, descriptive messages. The first time you commit, push the branch with \`git push -u origin ${l}\`, and push again after each later commit. `)+"Do not force-push or amend commits that are already pushed unless the user explicitly asks."}function Xp(i){if(!i)return nt;if(Uu.isAbsolute(i)||i.includes("\\")||i.split("/").some((u)=>!u||u==="."||u===".."))throw new ge("request_failed","The handoff workspace path must stay inside the repository.");let l=Uu.join(nt,i);if(!l.startsWith(`${nt}/`))throw new ge("request_failed","The handoff workspace path must stay inside the repository.");return l}function Gf(i){let l=i.metadata.cwd;return typeof l==="string"&&Uu.normalize(l)===l&&(l===nt||l.startsWith(`${nt}/`))?l:nt}function qb(i){let l=i?.metadata&&typeof i.metadata==="object"?i.metadata:void 0,u=l?.handoff&&typeof l.handoff==="object"?l.handoff:void 0;return String(u?.sourceSessionId??"").trim()}class mh extends Error{constructor(i){super(i instanceof Error?i.message:"Cloud conversation creation was not dispatched.",{cause:i});this.name="CloudHandoffSeedRejectedError"}}class hh extends ge{constructor(){super("request_failed","The connection was interrupted and Cline could not confirm whether this message was queued. Check the cloud session before resending it.");this.name="CloudQueueUnconfirmedError"}}class L_ extends Error{constructor(){super("The cloud session was created, but its transcript was not persisted. This cloud runtime cannot durably seed handoff transcripts and must use @cline/core 0.0.72 or newer. Updating the cloud runtime or pod is required; retrying /cloud against this same pod will not help.");this.name="CloudHandoffSeedUnsupportedError"}}function Ls(i){let l=i.expiredAt?Date.parse(i.expiredAt):Number.NaN;return Number.isFinite(l)&&l<=Date.now()}function YX(i){return i.trim().startsWith("ses-")}function QX(i,l){let u=new URL(`/api/v1/session/${encodeURIComponent(l)}`,i);return u.protocol=u.protocol==="https:"?"wss:":"ws:",u.toString()}function Jp(i){return{config:{executionTarget:"cloud",provider:"cline",providerId:"cline",model:i.metadata.modelId??"",modelId:i.metadata.modelId??"",repoUrl:i.repoContext.repoUrl??"",branch:i.repoContext.branch??"",cwd:Gf(i),workspaceRoot:nt},messages:[],promptsInQueue:[],busy:!1,startedAt:Date.parse(i.createdAt)||Date.now(),endedAt:Ls(i)&&i.expiredAt?Date.parse(i.expiredAt):void 0,status:i.status,attachedViaHub:!0}}function Vp(i,l,u){return{sessionId:i.id,origin:"cloud",executionTarget:"cloud",status:l,provider:"cline",model:i.metadata.modelId??"",repoUrl:i.repoContext.repoUrl??"",branch:i.repoContext.branch??"",cwd:Gf(i),workspaceRoot:nt,...u?.trim()?{prompt:u.trim()}:{},metadata:{origin:"cloud",repoUrl:i.repoContext.repoUrl??"",git:{url:i.repoContext.repoUrl??"",branch:i.repoContext.branch??""}}}}function jb(i){return{sessionId:i.id,origin:"cloud",executionTarget:"cloud",status:i.status,provider:"cline",model:i.metadata.modelId??"",cwd:Gf(i),workspaceRoot:nt,repoUrl:i.repoContext.repoUrl??"",branch:i.repoContext.branch??"",startedAt:i.createdAt,...i.lastActivityAt?{lastActivityAt:i.lastActivityAt}:{},endedAt:Ls(i)?i.expiredAt??void 0:i.status==="failed"?i.lastActivityAt??i.createdAt:void 0,updatedAt:i.updatedAt,...i.title?.trim()?{title:i.title.trim()}:{},metadata:{...i.title?.trim()?{title:i.title.trim()}:{},origin:"cloud",...i.metadata.provisioningPhase?{provisioningPhase:i.metadata.provisioningPhase}:{},repoUrl:i.repoContext.repoUrl??"",git:{url:i.repoContext.repoUrl??"",branch:i.repoContext.branch??""}}}}function ZX(i){if(typeof i!=="string")return i;try{return JSON.parse(i)}catch{return i}}function e2(i,l){let u=[...i??[]],c=new Set(u.map((g)=>g.id));for(let g of l)if(!c.has(g.id))u.push(g);return u}class D_{options;sessionGenerations=new Map;sessions=new Map;approvals=new Map;listeners=new Set;detachedSessions=new Set;restoredOptions=new Map;authoritativeMessages=new Map;streamingMessages=new Map;disposed=!1;connections=new Map;connectionPromises=new Map;knownSessions=new Map;unlistedSessions=new Map;pendingInitialTasks;lastListedSessions=[];lastListedOrganizationId;discoveryRefresh;unconfirmedInnerCreates=new Set;createRequests=new Map;provisioningControllers=new Map;sendAbortTokens=new Map;titleWrites=new Map;deletingSessions=new Set;createHubClient;constructor(i){this.options=i,this.pendingInitialTasks=i.pendingInitialTasks??new Map,this.createHubClient=i.createHubClient??((l)=>new gc(l))}restoreCreationOptions(i,l){if(this.restoredOptions.set(i,structuredClone(l)),this.pendingInitialTasks.has(i))this.pendingInitialTasks.set(i,{...this.pendingInitialTasks.get(i),...structuredClone(l)});let u=this.sessions.get(i);if(u)Object.assign(u.config,structuredClone(l))}seedSessionState(i,l){if(!this.sessions.has(i))this.sessions.set(i,structuredClone(l))}stateFromRecord(i){let l=Jp(i);return Object.assign(l.config,this.pendingInitialTasks.get(i.id),this.restoredOptions.get(i.id)),l}getSnapshot(i){let l=this.knownSessions.get(i),u=this.sessions.get(i)??(l?this.stateFromRecord(l):void 0);if(!u)return;let c=this.connections.get(i);return Wp({...u,sessionId:i,record:l,approvals:Array.from(this.approvals.values()).filter((g)=>g.item.sessionId===i).map((g)=>g.item),connectionState:this.detachedSessions.has(i)||this.disposed?"detached":c?.reconnectResolution||c?.rehydrationPromise?"reconnecting":c?c.connected?"connected":c.reconnecting?"reconnecting":"connecting":this.connectionPromises.has(i)?"connecting":"detached",transcriptKnown:c?.transcriptKnown??Boolean(l&&Ls(l))})}subscribe(i,l){let u=(c)=>{if(!l||c.sessionId===l)i(c)};return this.listeners.add(u),()=>{this.listeners.delete(u)}}publish(i){let l=i.type==="snapshot"?Object.freeze(i):Wp(i);for(let u of this.listeners)try{u(l)}catch(c){this.options.logger?.error?.("Cloud session subscriber failed",{error:c})}}publishSnapshot(i,l=!1,u){this.cancelScheduledSnapshot(i);let c=this.getSnapshot(i);if(c)this.publish({type:"snapshot",sessionId:i,snapshot:c,replace:l,cause:u});else this.publish({type:"removed",sessionId:i})}snapshotTimers=new Map;cancelScheduledSnapshot(i){clearTimeout(this.snapshotTimers.get(i)),this.snapshotTimers.delete(i)}scheduleSnapshot(i){if(this.disposed||this.detachedSessions.has(i)||this.snapshotTimers.has(i))return;let l=setTimeout(()=>this.publishSnapshot(i),100);l.unref?.(),this.snapshotTimers.set(i,l)}notify(i,l){let u=String(l.sessionId??"");if(i==="cloud_session_sync_failed")this.publish({type:"sync_failed",sessionId:u,message:String(l.message??"Cloud synchronization failed")});else this.publishSnapshot(u,i==="cloud_session_rehydrated",i==="chat_session_status"?"status":i==="chat_session_ended"?"ended":i==="tool_approval_state"?"approvals":void 0)}applyLiveEvent(i,l){let u=this.sessions.get(i);if(u)KX(u,l,this.streamingMessages,i)}async respondApproval(i,l,u){this.assertSessionActive(i);let c=this.approvals.get(`${i}:${l}`);if(!c){if(!this.connections.has(i))throw Error("This cloud session connection is closed; reopen the session to respond.");throw new ge("request_failed","This approval was already resolved or is no longer available.")}await c.resolve(u)}async detach(i){this.detachedSessions.add(i),this.sessionGenerations.set(i,(this.sessionGenerations.get(i)??0)+1),this.connectionPromises.delete(i),this.sendAbortTokens.set(i,Symbol()),this.abortProvisioningControllers(i,Error("Cloud viewer detached")),await this.disposeConnection(i),this.publishSnapshot(i)}isCloudSession(i){return YX(i)||this.knownSessions.has(i)||this.connections.has(i)||this.sessions.get(i)?.config.executionTarget==="cloud"}getCachedDiscoveryRecord(i){let l=this.knownSessions.get(i);return l?jb(l):void 0}async getCrossScopeDiscoveryRecord(i){let l=this.getCachedDiscoveryRecord(i);if(!l)return;try{let u=(await this.options.api.status(i)).status?.trim();return u?{...l,status:u}:l}catch(u){if(u instanceof ge&&(u.code==="session_not_found"||u.code==="session_expired")){this.knownSessions.delete(i),this.unlistedSessions.delete(i),this.pendingInitialTasks.delete(i);return}return l}}async list(){return await this.listInOrganization(await this.resolveActiveOrganizationId())}async listInOrganization(i){if(this.disposed)throw Error("Cloud session controller was disposed");let l=(I)=>this.sessions.get(I)?.title??this.knownSessions.get(I)?.title,u=new Map([...this.knownSessions.keys(),...this.sessions.keys()].map((I)=>[I,l(I)])),c=(I)=>{let k=l(I.id);if(this.titleWrites.has(I.id)||k!==u.get(I.id))I.title=k??I.title},g=(await this.options.api.list(i)).map((I)=>this.preserveConnectedRuntimeModel(I));if(this.disposed)throw Error("Cloud session controller was disposed");this.lastListedOrganizationId=i,this.lastListedSessions=g;for(let I of g)c(I),this.knownSessions.set(I.id,I),this.unlistedSessions.delete(I.id);await Promise.all(Array.from(this.unlistedSessions.entries()).filter(([,I])=>I.organizationId===i).map(([I])=>this.getCrossScopeDiscoveryRecord(I)));let b=await Promise.all(g.map(async(I)=>{if(I.status!=="provisioning")return I;let k=await this.options.api.status(I.id).catch(()=>{return}),T=k?.status?.trim();if(!T)return I;return{...I,status:T,metadata:{...I.metadata,...I_(k?.phase)?{provisioningPhase:k?.phase}:{},...k?.statusReason?.trim()?{statusReason:k.statusReason.trim()}:{}}}}));if(this.disposed)throw Error("Cloud session controller was disposed");for(let I of b){c(I),this.knownSessions.set(I.id,I);let k=this.sessions.get(I.id);if(k)k.title=I.title;if(k?.status==="provisioning"&&I.status!=="provisioning")k.status=I.status;let T=this.connections.get(I.id);if(T)T.remote=I;let E=Ls(I);if(E||I.status==="failed"||I.status==="suspended"){if(k)k.busy=!1,k.status=E?"expired":I.status,k.endedAt=E?Date.parse(I.expiredAt??"")||Date.now():Math.max(k.endedAt??0,Date.parse(I.lastActivityAt??I.createdAt)||0)||void 0;if(T)this.disposeConnection(I.id).catch(()=>{return})}}this.lastListedOrganizationId=i,this.lastListedSessions=b;for(let I of b)if(this.sessions.has(I.id))this.publishSnapshot(I.id);return Wp(b)}async handoffTargetExists(i){try{return await this.options.api.status(i),!0}catch(l){if(l instanceof ge&&(l.code==="session_not_found"||l.code==="session_expired"))return!1;throw l}}preserveConnectedRuntimeModel(i){let l=this.connections.get(i.id)?.remote.metadata,u=l?.cwd??this.knownSessions.get(i.id)?.metadata.cwd;return{...i,metadata:{...i.metadata,...l?.modelId?{modelId:l.modelId}:{},...u?{cwd:u}:{}}}}async refreshOrganization(){await this.resolveActiveOrganizationId({fresh:!0})}async resolveActiveOrganizationId(i){return await this.options.getActiveOrganizationId?.(i)}async listRepositories(){return await this.options.api.listRepositories(await this.resolveActiveOrganizationId())}async listModels(){if(this.disposed)throw Error("Cloud session manager was disposed");let i=await this.resolveActiveOrganizationId({fresh:!0}),l=await FX(this.options.apiBaseUrl,{isOrganizationSession:Boolean(i)});if(this.disposed)throw Error("Cloud session manager was disposed");return l}async prepareHandoffRepository(i){let l=await this.resolveActiveOrganizationId(),u=await this.options.api.listRepositories(l);if(!u.connected)throw new ge("github_not_connected","Connect GitHub before handing this session off to cloud.",u.connectUrl);let c=(g)=>g.trim().replace(/\.git$/i,"").replace(/\/+$/,"").toLowerCase();if(!u.repositories.some((g)=>c(g.url)===c(i)))throw new ge("github_not_connected",`The GitHub integration cannot access ${i}. Grant repository access before handing off.`,u.connectUrl);return l?{organizationId:l}:{}}async listBranches(i,l={}){return await this.options.api.listBranches(i,await this.resolveActiveOrganizationId(),l)}async listForDiscovery(i={}){let l,u=(async()=>{let k=await this.resolveActiveOrganizationId();l={organizationId:k};let T=this.discoveryRefresh?.organizationId===k?this.discoveryRefresh?.promise:void 0;if(!T){let E=this.listInOrganization(k).finally(()=>{if(this.discoveryRefresh?.promise===E)this.discoveryRefresh=void 0});this.discoveryRefresh={organizationId:k,promise:E},T=E}return{organizationId:k,records:await T}})(),c=()=>l?{organizationId:l.organizationId,records:this.lastListedOrganizationId===l.organizationId?this.lastListedSessions:[]}:void 0,g;if(i.timeoutMs===void 0)g=await u;else{let k;try{g=await Promise.race([u.catch((T)=>{if(!(T instanceof ge&&T.code==="authentication_required"))this.options.logger?.error?.("Cloud session discovery failed",{error:T});return c()}),new Promise((T)=>{k=setTimeout(()=>T(c()),Math.max(0,i.timeoutMs??0))})])}finally{if(k!==void 0)clearTimeout(k)}}if(!g)return[];let{organizationId:b,records:I}=g;return[...new Map([...Array.from(this.unlistedSessions.values()).filter((k)=>k.organizationId===b).map((k)=>k.record),...I].map((k)=>[k.id,k])).values()].map((k)=>{let T=jb(k),E=this.sessions.get(k.id);if(!E)return T;let A=E.title?.trim()||k.title?.trim();return{...T,status:E.status,prompt:E.prompt,endedAt:E.endedAt!==void 0?new Date(E.endedAt).toISOString():T.endedAt,metadata:{...T.metadata??{},title:WX({sessionId:k.id,metadata:A?{title:A}:void 0,prompt:E.prompt,messages:E.messages})}}})}async create(i){let l=i.requestId?.trim();if(!l)return await this.createOnce(i);let u=this.createRequests.get(l);if(u)return await u;let c=this.createOnce(i).finally(()=>{if(this.createRequests.get(l)===c)this.createRequests.delete(l)});return this.createRequests.set(l,c),await c}trackProvisioningController(i,l){let u=this.provisioningControllers.get(i);if(!u)u=new Set,this.provisioningControllers.set(i,u);return u.add(l),()=>{if(u.delete(l),u.size===0)this.provisioningControllers.delete(i)}}abortProvisioningControllers(i,l){let u=this.provisioningControllers.get(i);if(!u?.size)return!1;for(let c of u)c.abort(l);return!0}async waitUntilReady(i){this.detachedSessions.delete(i),this.assertSessionActive(i);let l=new AbortController,u=this.trackProvisioningController(i,l);try{await this.options.api.waitUntilReady(i,AbortSignal.any([l.signal,AbortSignal.timeout(610000)])),l.signal.throwIfAborted(),this.assertSessionActive(i),await this.refreshKnownSession(i)}finally{u()}}async seedHandoff(i,l){Xp(l.workspaceRelativePath),this.detachedSessions.delete(i);let u=await this.ensureConnection(i,{createInner:!0,handoffSeed:l});if(!u.innerSessionId)throw Error("Cloud Hub did not return an inner session id");return{innerSessionId:u.innerSessionId}}async verifyHandoffTranscript(i,l,u={}){let c=await this.ensureConnection(i),g=c.innerSessionId;if(!g)throw Error("Cloud Hub did not return an inner session id");let b=await c.client.command("session.messages",{sessionId:g},g);this.assertSessionActive(i,c);let I=b.payload?.messages;if(!Array.isArray(I))throw Error("Cloud runtime returned no transcript after seeding.");if(l.length>0&&I.length===0)throw new L_;if(!(u.allowAppendedMessages?I.length>=l.length&&Ob(l,I.slice(0,l.length)):Ob(l,I)))throw new P_(l.length,I.length);c.transcriptKnown=!0;let k=this.sessions.get(i);if(k)k.messages=structuredClone(I),this.authoritativeMessages.set(i,structuredClone(I)),this.streamingMessages.delete(i),this.publishSnapshot(i,!0)}async createOnce(i){if(this.disposed)throw Error("Cloud session manager was disposed");let l=Xp(i.workspaceRelativePath),u=i.organizationId===void 0?await this.resolveActiveOrganizationId({fresh:!0}):i.organizationId??void 0,c=i.handoff,g=!c,b=await this.options.api.create({...i,organizationId:u,...c&&{handoff:{...c,onOuterSessionCreated:async(L,D)=>{g=D?.created===!0,await c.onOuterSessionCreated(L,D)}}}});if(!b?.sessionId?.trim())throw new ge("request_failed","The cloud session service returned an unexpected response; please try again.");if(this.disposed){if(g&&this.options.lateCreateDisposition==="delete")await this.deleteProvisionedSessionAfterDispose(b.sessionId,b.cleanupAuthToken,i.handoff?.onOuterSessionRemoved);throw Error("Cline account changed while the cloud session was starting")}let I={id:b.sessionId,sandboxType:i.sandboxType,status:b.status,sandboxUrl:b.sandboxUrl,repoContext:{repoUrl:i.repoUrl,...i.branch?.trim()?{branch:i.branch.trim()}:{}},metadata:{modelId:i.modelId,cwd:l},createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};this.knownSessions.set(I.id,I),this.unlistedSessions.set(I.id,{record:I,organizationId:u});let{autoApproveTools:k,thinking:T,reasoningEffort:E,mode:A,workspaceRelativePath:C}=i;this.pendingInitialTasks.set(I.id,{autoApproveTools:k,thinking:T,reasoningEffort:E,mode:A??"act",workspaceRelativePath:C});let N=this.stateFromRecord(I);N.prompt=i.initialPrompt?.trim()||void 0,N.config.mode=i.mode??"act",this.sessions.set(I.id,N);let O;try{if(i.handoff){let L=await i.handoff.resolveMessages();this.assertSessionActive(I.id),O=(await this.seedHandoff(I.id,{sourceSessionId:i.handoff.sourceSessionId,messages:L,mode:i.mode,workspaceRelativePath:i.workspaceRelativePath,config:{autoApproveTools:i.autoApproveTools,thinking:i.thinking,reasoningEffort:i.reasoningEffort},onSeeding:i.handoff.onSeeding})).innerSessionId}}catch(L){if(this.disposed&&g&&this.options.lateCreateDisposition==="delete")await this.deleteProvisionedSessionAfterDispose(I.id,b.cleanupAuthToken,i.handoff?.onOuterSessionRemoved);throw L}return this.assertSessionActive(I.id),this.notify("chat_session_status",{sessionId:I.id,status:N.status}),{sessionId:I.id,origin:"cloud",executionTarget:"cloud",status:I.status,provider:"cline",model:i.modelId,repoUrl:i.repoUrl,branch:i.branch??"",cwd:l,workspaceRoot:nt,...O?{innerSessionId:O}:{},...N.prompt?{prompt:N.prompt}:{}}}async deleteProvisionedSessionAfterDispose(i,l,u){this.knownSessions.delete(i),this.unlistedSessions.delete(i),this.pendingInitialTasks.delete(i),this.sessions.delete(i),await this.options.api.delete(i,l).then(()=>u?.(i)).catch((c)=>{this.options.logger?.log("Failed to clean up a cloud session created during an account change",{sessionId:i,error:c})})}async attach(i,l){let u=this.sessionGenerations.get(i)??0;if(this.detachedSessions.delete(i),l)this.restoreCreationOptions(i,l);let c=await this.ensureKnownSession(i);if(this.assertSessionActive(i),u!==(this.sessionGenerations.get(i)??0))throw Error("Cloud viewer detached during attachment");if(!this.sessions.has(i))this.sessions.set(i,this.stateFromRecord(c));if(c.status==="provisioning"||c.status==="failed")return Vp(c,c.status,this.sessions.get(i)?.prompt);if(Ls(c))return await this.disposeConnection(i),await this.attachExpired(c);let g;try{g=await this.ensureConnection(i)}catch(k){let T=await this.refreshKnownSession(i);if(T&&Ls(T))return await this.disposeConnection(i),await this.attachExpired(T);throw k}await this.ensureAttached(g);let b=g.remote,I=this.sessions.get(i);return Vp(b,I?.status??b.status,I?.prompt)}async send(i,l,u,c,g,b){let I=this.sendAbortTokens.get(i),k=this.knownSessions.get(i);if(k&&Ls(k))throw new ge("session_expired","This cloud session has expired; its sandbox is gone. Start a new cloud session to continue.");let T=await this.ensureConnection(i,{createInner:!0}),E=()=>this.disposed||T.disposed||this.deletingSessions.has(i)||this.sendAbortTokens.get(i)!==I,A=()=>{if(E())throw Error("Cloud session prompt cancelled")};if(A(),await T.reconnectResolution,A(),await this.ensureAttached(T),await T.reconnectResolution,A(),!T.transcriptKnown)await this.rehydrateAfterTransportDrop(i,T);A(),await this.updateModel(T,c),await T.reconnectResolution,A();let C=T.innerSessionId;if(!C)throw Error("Cloud Hub session was not initialized");let N=this.sessions.get(i),O=u??(N?.busy?"queue":void 0),L=Fu(N?.messages??[],N?.promptsInQueue??[],l),D=O!=="queue"&&O!=="steer",U=N&&O!=="queue"?{role:"user",content:[{type:"text",text:l}]}:void 0;if(N&&U)N.messages=[...N.messages,U];let F=()=>{if(N&&U)N.messages=N.messages.filter((z)=>z!==U),this.publishSnapshot(i)};if(N&&D){let z=N.status!=="running";if(N.busy=!0,N.status="running",z)this.publishSnapshot(i,!1,"status")}let j=new Set,H=!1,Q=()=>{if(H||E())return;H=!0,this.publish({type:"prompt_accepted",sessionId:i,prompt:l,delivery:O})};try{let z=await T.client.command("session.send_input",{prompt:l,delivery:O,...g?.length?{attachments:{userImages:g}}:{}},C,{timeoutMs:O==="queue"?GX:null,onDispatch:(ee)=>{j.add(ee),T.pendingInputs??=new Map,T.pendingInputs.set(ee,{clientId:T.client.getClientId(),ownsBusyState:D,accept:Q})},beforeDispatch:()=>{if(A(),T.innerSessionId!==C)throw Error("The cloud session reconnected before the prompt could be sent. Please try again.");if(b?.beforeDispatch?.(),N&&D)N.prompt||=l;let ee=this.knownSessions.get(i);if(ee&&!ee.title?.trim()&&!this.titleWrites.has(i)){let te=jG(l);if(te){if(ee.title=te,N)N.title=te;let oe=this.options.api.updateTitle?.(i,te).then(()=>{}).catch(()=>{}).finally(()=>{if(this.titleWrites.get(i)===oe)this.titleWrites.delete(i)});if(oe)this.titleWrites.set(i,oe)}}}});Q();let W=O==="queue"||O!=="steer"&&z.payload?.result===void 0;if(W)F();return{sessionId:i,ok:!0,...W?{queued:!0}:{},result:z.payload?.result}}catch(z){if(E())throw F(),z;if(Kp(z)||Gp(z,"session.send_input")){let W;try{W=await this.rehydrateAfterTransportDrop(i,T)}catch(ee){if(A(),F(),N&&D)N.busy=!1,N.status="error";if(O==="queue")throw new hh;throw ee}if(A(),O==="queue")throw new hh;if(O==="steer")throw new ge("request_failed","Cline could not confirm whether this message was accepted. Check the cloud session before resending it.");if(Fu(W.messages,e2(W.prompts,W.submittedPrompts),l)<=L)throw new ge("request_failed","Cline could not confirm whether this message was accepted. Check the cloud session before resending it.");return{sessionId:i,ok:!0,...O==="queue"?{queued:!0}:{},recoveredAfterDisconnect:!0,status:W.status}}if(F(),N&&D)N.busy=!1,N.status="error";throw this.publishSnapshot(i),z}finally{for(let z of j)T.pendingInputs?.delete(z)}}async updateModel(i,l){let u=l?.trim();if(!u||i.remote.metadata.modelId===u)return;let c=i.innerSessionId;if(!c)throw Error("Cloud Hub session was not initialized");await i.client.command("session.update_connection",{sessionId:c,updates:{modelId:u}},c,{beforeDispatch:()=>{if(this.assertSessionActive(i.remote.id,i),i.innerSessionId!==c)throw Error("The cloud session reconnected before the model could be changed. Please try again.")}}),this.assertSessionActive(i.remote.id,i),this.applyModel(i,u)}applyModel(i,l){i.remote.metadata.modelId=l;let u=this.sessions.get(i.remote.id);if(u)u.config.model=l,u.config.modelId=l}async rehydrateAfterTransportDrop(i,l){if(this.assertSessionActive(i,l),l.rehydrationPromise)return l.rehydrationRerunRequested=!0,await l.rehydrationPromise;let u=(async()=>{let c;do l.rehydrationRerunRequested=!1,c=await this.performTransportRehydration(i,l),this.assertSessionActive(i,l);while(l.rehydrationRerunRequested&&!this.disposed);return c})().finally(()=>{if(l.rehydrationPromise===u)l.rehydrationPromise=void 0,this.publishSnapshot(i)});return l.rehydrationPromise=u,await u}async performTransportRehydration(i,l){this.assertSessionActive(i,l);let u=l.innerSessionId;if(!u)throw Error("Cloud Hub session was not initialized");l.bufferingEvents=!0,l.bufferedEvents=[],l.bufferedEventsDropped=0;try{await this.ensureAttached(l),this.assertSessionActive(i,l);let c=await l.client.command("session.get",{includeSnapshot:!0},u);this.assertSessionActive(i,l);let g=c.payload?.session&&typeof c.payload.session==="object"&&!Array.isArray(c.payload.session)?c.payload.session:void 0;this.applySessionModel(l,g);let b=this.sessions.get(i),I=this.authoritativeMessages.get(i)??[],k=String(g?.status??b?.status??"running").trim(),T=k==="pending"?"running":k;if(T==="running"&&!l.transcriptKnown&&!l.pendingInputs?.size)l.externalRun??={progressHydrated:!0};let E=()=>l.client.command("session.messages",{sessionId:u},u),A=await E().catch((z)=>{if(!Gp(z,"session.messages"))throw z;return this.assertSessionActive(i,l),E()});if(this.assertSessionActive(i,l),!Array.isArray(A.payload?.messages))throw Error("Cloud Hub returned an invalid transcript snapshot");let C=A.payload.messages,N=l.bufferedEventsDropped+l.bufferedEvents.length,O=await l.client.command("session.pending_prompts",{sessionId:u},u).catch(()=>{return});this.assertSessionActive(i,l);let L=l.bufferedEventsDropped+l.bufferedEvents.length;if(b){let z=b.status!==T;if(this.authoritativeMessages.set(i,structuredClone(C)),b.messages=structuredClone(C),this.streamingMessages.delete(i),b.status=T,b.busy=T==="running",z)if(T==="completed"||T==="failed"||T==="aborted")b.endedAt=Date.now(),this.notify("chat_session_ended",{sessionId:i,reason:T==="failed"?"error":T});else this.notify("chat_session_status",{sessionId:i,status:T})}let D=O!==void 0&&O.ok!==!1&&Array.isArray(O.payload?.prompts),U=D?this.applyQueueSnapshot(i,O):void 0;l.transcriptKnown=!0;let F=C;this.assertSessionActive(i,l),this.notify("cloud_session_rehydrated",{sessionId:i,status:T,transcriptKnown:!0,messages:F}),this.assertSessionActive(i,l);let j=l.bufferedEvents,H=N_(j),Q=BX(j,C,{queueSnapshotApplied:D,queueSnapshotEventCutoff:Math.max(0,L-l.bufferedEventsDropped),messagesSnapshotEventCutoff:Math.max(0,N-l.bufferedEventsDropped),baselineMessages:I});l.bufferedEvents=[],l.bufferingEvents=!1,l.syncFailureNotified=!1;for(let z of Q)this.forwardEvent(i,l,z);return{status:T,messages:C,prompts:U,submittedPrompts:H}}catch(c){let g=l.bufferedEvents;l.bufferedEvents=[],l.bufferingEvents=!1,this.assertSessionActive(i,l);for(let b of g)this.forwardEvent(i,l,b);if(!l.syncFailureNotified)l.syncFailureNotified=!0,this.notify("cloud_session_sync_failed",{sessionId:i,message:c instanceof Error?c.message:String(c)});throw c}}async abort(i){if(this.sendAbortTokens.set(i,Symbol()),this.abortProvisioningControllers(i,Error("Cloud session prompt cancelled")))return{sessionId:i,ok:!0};let l=await this.ensureConnection(i),u=()=>{if(this.disposed||l.disposed)throw Error("Cloud session connection was disposed")};if(u(),await l.client.connect(),await l.reconnectResolution,u(),await this.resolveInnerSession(i,l),l.innerSessionId){await this.ensureAttached(l),await l.reconnectResolution,u();let g=l.innerSessionId;if(!g)throw Error("Cloud Hub session was not initialized");await l.client.command("run.abort",{sessionId:g},g,{beforeDispatch:()=>{if(u(),l.innerSessionId!==g)throw Error("The cloud session reconnected before Stop could be sent. Please try Stop again.")}})}u();let c=this.sessions.get(i);if(c)c.busy=!1,c.status="aborted";return this.publishSnapshot(i),{sessionId:i,ok:!0}}async pendingPrompts(i){if(this.knownSessions.get(i)?.status==="provisioning")return{sessionId:i,promptsInQueue:[]};if(!(await this.ensureConnection(i)).innerSessionId)return{sessionId:i,promptsInQueue:[]};let l=await this.queueCommand(i,"session.pending_prompts",{});return{sessionId:i,promptsInQueue:this.applyQueueSnapshot(i,l)}}async updatePendingPrompt(i,l,u){let c=await this.queueCommand(i,"session.update_pending_prompt",{promptId:l,...u});return{sessionId:i,updated:c.payload?.updated===!0,promptsInQueue:this.applyQueueSnapshot(i,c)}}async removePendingPrompt(i,l){let u=await this.queueCommand(i,"session.remove_pending_prompt",{promptId:l});return{sessionId:i,removed:u.payload?.removed===!0,promptsInQueue:this.applyQueueSnapshot(i,u)}}async queueCommand(i,l,u){let c=await this.ensureConnection(i),g=c.innerSessionId;if(!g)throw Error("Cloud Hub session was not initialized");await c.client.connect(),await c.reconnectResolution,await this.ensureAttached(c),await c.reconnectResolution;let b=await c.client.command(l,{sessionId:g,...u},g,{beforeDispatch:()=>{if(this.assertSessionActive(i,c),c.innerSessionId!==g)throw Error("The cloud session reconnected before the queue request could be sent. Refresh the queue and try again.")}});return this.assertSessionActive(i,c),b}applyQueueSnapshot(i,l){if(!Array.isArray(l.payload?.prompts))throw Error("Cloud Hub returned an invalid pending-prompts snapshot");let u=l.payload.prompts.map((g)=>({id:typeof g.id==="string"?g.id:"",prompt:typeof g.prompt==="string"?g.prompt:"",steer:g.delivery==="steer",attachmentCount:typeof g.attachmentCount==="number"?g.attachmentCount:0,userImages:Array.isArray(g.userImages)?g.userImages.filter((b)=>typeof b==="string"):void 0})).filter((g)=>g.id),c=this.sessions.get(i);if(c)c.promptsInQueue=u;return this.publishSnapshot(i,!1,"queue"),u}async readMessages(i){let l=this.knownSessions.get(i);if(l?.status==="provisioning"||l?.status==="failed")return[];if(l&&Ls(l))return await this.loadArchivedMessages(l)??[];try{let u=await this.ensureConnection(i);if(!u.innerSessionId)return[];return(await this.rehydrateAfterTransportDrop(i,u)).messages}catch(u){let c=await this.refreshKnownSession(i)??l;if(c){let g=await this.loadArchivedMessages(c).catch(()=>null);if(g!==null)return g}throw u}}async updateTitle(i,l){let u=this.titleWrites.get(i),c=(async()=>{await u?.catch(()=>{}),this.assertSessionActive(i),await this.options.api.updateTitle(i,l);let g=this.knownSessions.get(i);if(g)g.title=l;let b=this.sessions.get(i);if(b)b.title=l;this.publishSnapshot(i)})();this.titleWrites.set(i,c);try{await c}finally{if(this.titleWrites.get(i)===c)this.titleWrites.delete(i)}}async delete(i){this.deletingSessions.add(i),this.abortProvisioningControllers(i);try{let l=this.connectionPromises.get(i);if(l)await l.catch(()=>{return});await this.disposeConnection(i);try{await this.options.api.delete(i)}catch(u){let c=u instanceof ge?u.code:"";if(c!=="session_not_found"&&c!=="session_expired")throw u}this.knownSessions.delete(i),this.unlistedSessions.delete(i),this.pendingInitialTasks.delete(i),this.sessions.delete(i),this.authoritativeMessages.delete(i),this.restoredOptions.delete(i),this.publish({type:"removed",sessionId:i}),this.sendAbortTokens.delete(i);for(let[u,c]of this.approvals)if(c.item.sessionId===i)this.approvals.delete(u)}finally{this.deletingSessions.delete(i)}}async dispose(){this.disposed=!0;for(let l of this.snapshotTimers.keys())this.cancelScheduledSnapshot(l);this.sendAbortTokens.clear();for(let l of this.provisioningControllers.values())for(let u of l)u.abort();this.provisioningControllers.clear();let i=new Set([...this.connections.keys(),...this.knownSessions.keys(),...this.sessions.keys()]);for(let[l,u]of this.approvals)if(i.has(u.item.sessionId))this.approvals.delete(l);for(let l of i)this.sessions.delete(l),this.knownSessions.delete(l),this.publish({type:"removed",sessionId:l});if(this.knownSessions.clear(),this.unlistedSessions.clear(),!this.options.pendingInitialTasks)this.pendingInitialTasks.clear();this.listeners.clear(),await Promise.allSettled(Array.from(this.connections.keys()).map((l)=>this.disposeConnection(l)))}async attachExpired(i){let l=this.sessions.get(i.id)??Jp(i);return l.busy=!1,l.status="expired",this.sessions.set(i.id,l),await this.loadArchivedMessages(i).catch(()=>{return}),Vp(i,"expired")}async loadArchivedMessages(i){let l=this.sessionGenerations.get(i.id),u=await this.options.api.history(i.id);if(this.assertSessionActive(i.id),this.sessionGenerations.get(i.id)!==l)throw Error("Cloud session attachment changed while loading history");if(u===null)return null;let c=this.sessions.get(i.id)??Jp(i);return c.messages=structuredClone(u),this.sessions.set(i.id,c),this.authoritativeMessages.set(i.id,structuredClone(c.messages)),this.publishSnapshot(i.id,!0),u}async refreshKnownSession(i){let l=await this.resolveActiveOrganizationId(),u=await this.options.api.list(l).catch(()=>{return});if(this.disposed)throw Error("Cloud session manager was disposed");if(!u)return this.knownSessions.get(i);for(let c of u)this.knownSessions.set(c.id,c);return u.find((c)=>c.id===i)}async ensureKnownSession(i){let l=this.knownSessions.get(i);if(l)return l;let u=(await this.list()).find((c)=>c.id===i);if(!u)throw new ge("session_not_found",`Cloud session ${i} was not found.`);return this.knownSessions.get(i)??structuredClone(u)}assertSessionActive(i,l){if(this.disposed||l?.disposed||this.detachedSessions.has(i)||l?.generation!==void 0&&l.generation!==(this.sessionGenerations.get(i)??0))throw Error("Cloud session connection was disposed");if(this.deletingSessions.has(i))throw new ge("session_not_found","This cloud session is being deleted.")}async ensureConnection(i,l={}){let u=this.sessionGenerations.get(i)??0,c=()=>{if(this.assertSessionActive(i),u!==(this.sessionGenerations.get(i)??0))throw Error("Cloud viewer detached during connection")};c();let g=this.connectionPromises.get(i),b=g?await g:this.connections.get(i);if(b?.remote.status==="suspended")return await this.disposeConnection(i),c(),await this.ensureConnection(i,l);if(b){if(this.assertSessionActive(i,b),await b.reconnectResolution,this.assertSessionActive(i,b),!b.innerSessionId)await b.client.connect(),await b.reconnectResolution,this.assertSessionActive(i,b),await this.resolveInnerSession(i,b,Boolean(l.handoffSeed)),this.assertSessionActive(i,b);if(l.handoffSeed&&b.innerSessionId)await this.assertHandoffConnectionReusable(b,l.handoffSeed);if(l.createInner&&!b.innerSessionId)await this.createInnerSession(b,l.handoffSeed);return this.assertSessionActive(i,b),b}let I=(async()=>{let k=await this.ensureKnownSession(i);if(c(),!this.pendingInitialTasks.has(i)&&(k.sandboxType==="resumable"||k.metadata.sandboxType==="resumable"||k.status==="suspended")){let C=await this.options.api.status(i).catch(async(O)=>{if(!(O instanceof ge?O.code==="request_failed"&&(O.status===void 0||O.status===408||O.status===429||O.status>=500):O instanceof TypeError||O instanceof Error&&O.name==="TimeoutError"))throw O;return c(),await this.refreshKnownSession(i).catch(()=>{return})});if(c(),C?.status)k.status=C.status;let N=this.sessions.get(i);if(N?.status==="suspended"&&["provisioning","ready","active"].includes(k.status))N.status=k.status,N.busy=!1,N.endedAt=void 0}if(k.status==="suspended"){let C=new AbortController,N=this.trackProvisioningController(i,C);try{try{k=await this.options.api.resume(i,C.signal)}catch(L){if(!(L instanceof ge)||L.status!==409)throw L;c(),C.signal.throwIfAborted();let D=await this.options.api.status(i,{signal:C.signal});if(D.status!=="provisioning"&&D.status!=="ready"&&D.status!=="active")throw L;k={...k,status:D.status}}c(),C.signal.throwIfAborted(),this.knownSessions.set(i,k);let O=this.sessions.get(i);if(O)O.status=k.status,O.busy=!1,O.endedAt=void 0;this.publishSnapshot(i,!1,"status")}finally{N()}}if(k.status==="provisioning"){let C=new AbortController,N=this.trackProvisioningController(i,C);try{if(await this.options.api.waitUntilReady(i,C.signal,({phase:L})=>{k.metadata.provisioningPhase=L,this.notify("chat_session_status",{sessionId:i,status:"provisioning",phase:L})}),this.disposed)throw Error("Cloud session manager was disposed");if(k=await this.refreshKnownSession(i)??k,C.signal.throwIfAborted(),k.status==="provisioning")k.status="ready";let O=this.sessions.get(i);if(O?.status==="provisioning")O.status="idle",O.busy=!1,O.endedAt=void 0}catch(O){if(O instanceof ge&&O.code==="session_failed"){if(k.status="failed",k.metadata.statusReason=O.detail,k.metadata.provisioningPhase="failed",!this.disposed)this.knownSessions.set(i,k);let L=this.sessions.get(i);if(L)L.status="error";this.notify("chat_session_status",{sessionId:i,status:"error"})}throw O}finally{N()}}if(c(),k.status==="failed")throw new ge("session_failed",k.metadata.statusReason||"The cloud sandbox could not be prepared.");if(Ls(k))throw new ge("session_expired","This cloud session has expired; its sandbox is gone. Start a new cloud session to continue.");this.sessions.set(i,this.sessions.get(i)??this.stateFromRecord(k));let T,E=0,A=this.createHubClient({url:QX(this.options.apiBaseUrl,i),clientId:`${this.options.clientIdentity?.prefix??"cloud"}-${i}-${zG()}`,clientType:this.options.clientIdentity?.type??"cloud-client",displayName:this.options.clientIdentity?.displayName??"Cline cloud session",workspaceRoot:nt,cwd:nt,resolveConnectionHeaders:async()=>{c();let C=E>0;if(E+=1,T)T.connected=!1,T.reconnecting=C,this.publishSnapshot(i);if(C){let O=T;if(O&&!O.disposed){O.transcriptKnown=!1,O.innerSessionId=void 0;let L=(async()=>{if(await this.resolveInnerSession(i,O),O.innerSessionId)await this.rehydrateAfterTransportDrop(i,O)})().catch(()=>this.disposeConnectionIfSessionGone(i,O)).finally(()=>{if(O.reconnectResolution===L)O.reconnectResolution=void 0,O.connected=O.transcriptKnown,this.publishSnapshot(i)});O.reconnectResolution=L}}let N=await this.options.getAuthToken();if(!N?.trim())throw new ge("authentication_required","Sign in to Cline to reconnect this cloud session.");return c(),{Authorization:`Bearer ${N.trim()}`}}});T={generation:u,remote:k,client:A,bufferedEvents:[],bufferedEventsDropped:0,transcriptKnown:!1,seenEventIds:new Set,unsubscribe:()=>{}},T.unsubscribe=A.subscribe(()=>{},{sessionId:k.metadata.taskId?.trim()||i}),this.connections.set(i,T);try{if(await A.connect(),T.connected=!0,this.publishSnapshot(i),this.assertSessionActive(i,T),await this.resolveInnerSession(i,T,Boolean(l.handoffSeed)),this.assertSessionActive(i,T),l.handoffSeed&&T.innerSessionId)await this.assertHandoffConnectionReusable(T,l.handoffSeed);if(l.createInner&&!T.innerSessionId)await this.createInnerSession(T,l.handoffSeed);return this.assertSessionActive(i,T),T}catch(C){if(Kp(C)&&!this.disposed&&!T.disposed&&!this.deletingSessions.has(i))throw C;if(this.connections.get(i)===T)this.connections.delete(i);if(T.disposed=!0,T.unsubscribe(),!this.disposed&&u===(this.sessionGenerations.get(i)??0))this.clearPendingApprovals(i);throw await A.dispose().catch(()=>{return}),C}})().finally(()=>{if(this.connectionPromises.get(i)===I)this.connectionPromises.delete(i)});return this.connectionPromises.set(i,I),await I}async resolveInnerSession(i,l,u=!1){if(this.assertSessionActive(i,l),l.innerSessionId)return;let c=l.remote.metadata.taskId?.trim(),g;if(c)try{let k=await l.client.command("session.get",{sessionId:c},c);this.assertSessionActive(i,l),g=k.payload?.session&&typeof k.payload.session==="object"&&!Array.isArray(k.payload.session)?k.payload.session:void 0}catch(k){if(!Ou(k))throw k}else{let k=await l.client.command("session.list",{limit:100});this.assertSessionActive(i,l),g=Hp(k.payload).filter(zp).sort((T,E)=>$b(E)-$b(T))[0]}let b=String(g?.sessionId??"").trim();if(!b||!g){if(!u&&!this.pendingInitialTasks.has(i))throw Error("This cloud session's task is unavailable. Start a new cloud session to continue.");return}if(l.remote.sandboxType==="resumable"||l.remote.metadata.sandboxType==="resumable")await this.restoreSavedInnerSession(l,b,g),this.assertSessionActive(i,l);this.pendingInitialTasks.delete(i),l.innerSessionId=b,this.subscribeToInnerSession(i,l);let I=Lb(g);if(I)this.applyModel(l,I);await this.ensureAttached(l)}async restoreSavedInnerSession(i,l,u){let c=()=>i.client.command("session.update_connection",{sessionId:l,updates:{}},l);try{await c();return}catch(L){if(!(Ou(L)||L instanceof Error&&L.code==="command_failed"&&L.message===`session not found: ${l}`))throw L}this.assertSessionActive(i.remote.id,i);let g=await i.client.command("session.messages",{},l);this.assertSessionActive(i.remote.id,i);let b=g.payload?.messages;if(!Array.isArray(b)||b.length===0)throw Error("The saved conversation is empty or unavailable.");let I=u.metadata??{},k=u.runtimeOptions??{},T=this.sessions.get(i.remote.id)?.config,E=Object.hasOwn(I,"thinking")?I.thinking:T?.thinking,A=Object.hasOwn(I,"reasoningEffort")?I.reasoningEffort:T?.reasoningEffort,C=typeof I.autoApproveTools==="boolean"?I.autoApproveTools:T?.autoApproveTools,N=u.cwd??u.workspaceRoot??nt,O=u.workspaceRoot??nt;try{let L=await i.client.command("session.create",{workspaceRoot:O,cwd:N,initialMessages:b,metadata:{...I,interactive:!0},sessionConfig:{sessionId:l,providerId:I.provider??"cline",modelId:I.model??I.modelId??i.remote.metadata.modelId,workspaceRoot:O,cwd:N,systemPrompt:k.systemPrompt??I.systemPrompt??"",mode:k.mode??I.mode??"act",...typeof E==="boolean"?{thinking:E}:{},...typeof A==="string"?{reasoningEffort:A}:{},...I.checkpointEnabled===!0?{checkpoint:{enabled:!0}}:{}},runtimeOptions:k,...typeof C==="boolean"?{toolPolicies:{"*":{autoApprove:C}}}:{}});if(this.assertSessionActive(i.remote.id,i),(L.payload?.session?.sessionId??L.payload?.sessionId)!==l)throw Error("Cloud Hub did not restore the requested session.")}catch(L){if(L?.code!=="session_already_exists")throw L;this.assertSessionActive(i.remote.id,i),await c()}}async assertHandoffConnectionReusable(i,l){let u=await i.client.command("session.list",{limit:100});this.assertSessionActive(i.remote.id,i);let c=Hp(u.payload).filter(zp),[g]=c;if(c.length!==1||String(g?.sessionId??"").trim()!==i.innerSessionId||qb(g)!==l.sourceSessionId)throw new ge("request_failed","This cloud workspace already contains another conversation. Open it in Cline Cloud or delete it before retrying the handoff.")}async createInnerSession(i,l){if(this.assertSessionActive(i.remote.id,i),i.innerSessionCreation){if(await i.innerSessionCreation,l)await this.assertHandoffConnectionReusable(i,l);return}let u=(async()=>{if(l&&await this.adoptExistingHandoffSession(i,l)){this.unconfirmedInnerCreates.delete(i.remote.id);return}if(l?.recoverOnly||this.unconfirmedInnerCreates.has(i.remote.id))throw new ge("request_failed","Cloud conversation creation is still unconfirmed. Wait for it to appear before trying again.");await this.createInnerSessionOnce(i,l)})().finally(()=>{i.innerSessionCreation=void 0});return i.innerSessionCreation=u,await u}async adoptExistingHandoffSession(i,l){let u=await i.client.command("session.list",{limit:100});this.assertSessionActive(i.remote.id,i);let c=Hp(u.payload).filter(zp);if(c.length===0)return!1;let[g]=c,b=String(g?.sessionId??"").trim();if(c.length!==1||!b||qb(g)!==l.sourceSessionId)throw new ge("request_failed","This cloud workspace already contains another conversation. Open it in Cline Cloud or delete it before retrying the handoff.");return i.innerSessionId=b,this.subscribeToInnerSession(i.remote.id,i),this.applySessionModel(i,g),await this.ensureAttached(i),!0}async createInnerSessionOnce(i,l){let u=i.remote.metadata.modelId?.trim();if(!u)throw Error("Cloud session is missing its model id");let c=this.sessions.get(i.remote.id),g=this.pendingInitialTasks.get(i.remote.id)??this.restoredOptions.get(i.remote.id),b=Xp(l?.workspaceRelativePath??g?.workspaceRelativePath),I=l?.mode??g?.mode??"act";try{await l?.onSeeding?.(),this.assertSessionActive(i.remote.id,i)}catch(D){if(l)throw new mh(D);throw D}let k=VX(i.remote),T=l?.config?.thinking??c?.config.thinking,E=l?.config?.reasoningEffort??c?.config.reasoningEffort,A=!1,C=i.client.command("session.create",{workspaceRoot:nt,cwd:b,...l?{initialMessages:l.messages}:{},sessionConfig:{...i.remote.metadata.taskId?.trim()?{sessionId:i.remote.metadata.taskId.trim()}:{},providerId:"cline",modelId:u,workspaceRoot:nt,cwd:b,systemPrompt:l?`${$_}
|
|
1071
|
+
|
|
1072
|
+
This session was handed off from a local workspace to a fresh Linux clone of ${i.remote.repoContext.repoUrl??"the repository"}@${i.remote.repoContext.branch??"the selected branch"} at ${nt}. Earlier transcript references to the local OS, absolute paths, environment, and tool availability are stale.`+(b===nt?"":`
|
|
1073
|
+
|
|
1074
|
+
Continue from the original repository subdirectory at ${b}.`):k,mode:I,enableTools:!0,...typeof T==="boolean"?{thinking:T}:{},...typeof E==="string"?{reasoningEffort:E}:{}},metadata:{source:this.options.clientIdentity?.source??"sdk",provider:"cline",model:u,interactive:!0,thinking:T??null,reasoningEffort:T===!1?null:E??null,...l?{handoff:{from:"local",sourceSessionId:l.sourceSessionId,outerSessionId:i.remote.id}}:{}},runtimeOptions:{mode:I},modelSelection:{provider:"cline",model:u},toolPolicies:{"*":{autoApprove:(l?.config?.autoApproveTools??c?.config.autoApproveTools)!==!1}}},void 0,{beforeDispatch:()=>this.assertSessionActive(i.remote.id,i),onDispatch:()=>{A=!0}}),N;try{N=await C}catch(D){if(l&&!A)throw new mh(D);if(l&&(Gp(D,"session.create")||Kp(D)))this.unconfirmedInnerCreates.add(i.remote.id);throw D}this.assertSessionActive(i.remote.id,i);let O=N.payload?.session&&typeof N.payload.session==="object"?N.payload.session:void 0,L=String(O?.sessionId??N.payload?.sessionId??"").trim();if(!L){if(l)this.unconfirmedInnerCreates.add(i.remote.id);throw Error("Cloud Hub did not return an inner session id")}if(this.unconfirmedInnerCreates.delete(i.remote.id),this.pendingInitialTasks.delete(i.remote.id),i.innerSessionId=L,i.remote.metadata.cwd=b,c)c.config.cwd=b,c.config.mode=I;this.subscribeToInnerSession(i.remote.id,i),this.applySessionModel(i,O),i.transcriptKnown=!l}handleEvent(i,l,u){if(this.disposed||l.disposed)return;if(l.innerSessionId&&u.sessionId&&u.sessionId!==l.innerSessionId)return;let c=u.eventId?.trim();if(c&&!(u.event==="approval.requested"&&u.sequence===void 0)){if(l.seenEventIds.has(c))return;l.seenEventIds.add(c);while(l.seenEventIds.size>JX){let g=l.seenEventIds.values().next().value;if(g)l.seenEventIds.delete(g)}}if(l.bufferingEvents){if(l.bufferedEvents.push(u),l.bufferedEvents.length>XX)l.bufferedEvents.shift(),l.bufferedEventsDropped+=1,this.options.logger?.log("Cloud sync event buffer reached its limit",{sessionId:i,severity:"warn"});return}this.forwardEvent(i,l,u)}forwardEvent(i,l,u){if(this.disposed||l.disposed)return;if(u.event==="session.attached"||u.event==="session.updated"||u.event==="session.created")this.applySessionModel(l,u.payload?.session);if(u.event==="approval.requested"){this.handleApprovalRequested(i,l,u);return}if(u.event==="approval.resolved"){let I=String(u.payload?.approvalId??"").trim();if(I)this.removeApproval(i,I);return}if(u.event==="run.started"){let I=this.sessions.get(i)?.busy,k=u.payload?.requestId,T=typeof k==="string"?l.pendingInputs?.get(k):void 0;if(T&&u.payload?.clientId===T.clientId){if(T.accept(),T.ownsBusyState)l.externalRun=void 0}else if(typeof u.payload?.clientId==="string")l.externalRun??={progressHydrated:Boolean(I)}}let c=l.externalRun,g=u.event==="run.completed"||u.event==="run.failed"||u.event==="run.aborted",b=c&&!c.progressHydrated&&(u.event==="assistant.delta"||u.event==="reasoning.delta"||u.event==="tool.started");if(c&&(b||g)){if(c.progressHydrated=!0,g)l.externalRun=void 0;let I=Boolean(l.rehydrationPromise);if(this.rehydrateAfterTransportDrop(i,l).catch((k)=>{if(this.disposed||l.disposed)return;this.notify("cloud_session_sync_failed",{sessionId:i,message:k instanceof Error?k.message:"Cloud transcript refresh failed"})}),!I){l.bufferedEvents.push(u);return}}if(this.applyLiveEvent(i,u),this.publish({type:"hub_event",sessionId:i,event:{...u,sessionId:i}}),u.event==="assistant.delta"||u.event==="reasoning.delta"||u.event==="tool.updated")this.scheduleSnapshot(i);else this.publishSnapshot(i)}handleApprovalRequested(i,l,u){this.storePendingApproval(i,l,u.payload),this.sendApprovalSnapshot(i)}storePendingApproval(i,l,u){let c=String(u?.approvalId??"").trim();if(!c)return;let g=`${i}:${c}`,b={approvalId:c,requestId:g,sessionId:i,createdAt:new Date(typeof u?.createdAt==="number"?u.createdAt:Date.now()).toISOString(),toolCallId:String(u?.toolCallId??""),toolName:String(u?.toolName??"tool"),input:ZX(u?.inputJson),iteration:typeof u?.iteration==="number"?u.iteration:void 0,agentId:typeof u?.agentId==="string"?u.agentId:void 0,conversationId:typeof u?.conversationId==="string"?u.conversationId:void 0};this.approvals.set(g,{item:b,resolve:async(I)=>{if(this.disposed||l.disposed)throw Error("This cloud session connection is closed; reopen the session to respond.");if(await this.ensureAttached(l),this.disposed||l.disposed)throw Error("This cloud session connection is closed; reopen the session to respond.");await l.client.command("approval.respond",{approvalId:c,approved:I.approved,reason:I.reason},l.innerSessionId)}})}removeApproval(i,l){this.approvals.delete(`${i}:${l}`),this.sendApprovalSnapshot(i)}clearPendingApprovals(i){for(let[l,u]of this.approvals)if(u.item.sessionId===i)this.approvals.delete(l);this.sendApprovalSnapshot(i)}sendApprovalSnapshot(i){this.notify("tool_approval_state",{sessionId:i,items:Array.from(this.approvals.values()).filter((l)=>l.item.sessionId===i).map((l)=>l.item)})}async ensureAttached(i){if(this.assertSessionActive(i.remote.id,i),!i.innerSessionId)return;let l=await i.client.command("session.attach",{sessionId:i.innerSessionId},i.innerSessionId);this.assertSessionActive(i.remote.id,i),this.applySessionModel(i,l.payload?.session)}subscribeToInnerSession(i,l){let u=l.innerSessionId;if(!u)return;l.unsubscribe(),this.clearPendingApprovals(i),l.unsubscribe=l.client.subscribe((c)=>this.handleEvent(i,l,c),{sessionId:u})}applySessionModel(i,l){if(!l||typeof l!=="object"||Array.isArray(l))return;let u=Lb(l);if(u)this.applyModel(i,u);let c=l,g=typeof c.cwd==="string"&&Uu.normalize(c.cwd)===c.cwd&&(c.cwd===nt||c.cwd.startsWith(`${nt}/`))?c.cwd:void 0;if(g){i.remote.metadata.cwd=g;let k=this.sessions.get(i.remote.id);if(k)k.config.cwd=g}let b=this.sessions.get(i.remote.id),I=c.runtimeOptions?.mode;if(b&&(I==="act"||I==="plan"||I==="yolo"||I==="zen"))b.config.mode=I}async disposeConnection(i){this.cancelScheduledSnapshot(i);let l=this.connections.get(i);if(this.connections.delete(i),!l)return;l.disposed=!0,l.pendingInputs?.clear(),l.unsubscribe(),this.clearPendingApprovals(i),await l.client.dispose()}async disposeConnectionIfSessionGone(i,l){if(l.disposed||this.disposed)return;let u;try{u=await this.resolveActiveOrganizationId()}catch{return}let c=await this.options.api.list(u).catch(()=>{return});if(!c||l.disposed)return;let g=c.find((I)=>I.id===i),b=g?this.preserveConnectedRuntimeModel(g):void 0;if(!b){await this.disposeConnection(i).catch(()=>{return});return}if(this.knownSessions.set(i,b),l.remote=b,b.status==="failed"||b.status==="suspended"){let I=this.sessions.get(i);if(I)I.busy=!1,I.status=b.status,I.endedAt=Date.parse(b.updatedAt)||Date.now();await this.disposeConnection(i).catch(()=>{return});return}if(Ls(b))await this.attachExpired(b).catch(()=>{return}),await this.disposeConnection(i).catch(()=>{return})}}var it=e().trim().min(1),t2=e().nullish(),Yp=t({mode:s(["act","plan","yolo","zen"]).optional(),workspaceRelativePath:e().optional(),autoApproveTools:r().optional(),thinking:r().optional(),reasoningEffort:s(["low","medium","high","xhigh"]).optional()}),Bb={create:M([Yp.extend({sandboxType:s(["standard","resumable"]).optional(),requestId:it.optional(),modelId:it,repoUrl:it,initialPrompt:e().optional(),branch:it.optional(),organizationId:it.nullable().optional()}).strict()]),attach:M([it,Yp.nullish()]),send:M([it,e(),s(["queue","steer"]).nullish(),t2,o(e()).nullish()]),abort:M([it]),pendingPrompts:M([it]),updatePendingPrompt:M([it,it,t({prompt:e().optional(),delivery:s(["queue","steer"]).optional()}).strict()]),removePendingPrompt:M([it,it]),readMessages:M([it]),updateTitle:M([it,e()]),delete:M([it]),list:M([]),listForDiscovery:M([t({timeoutMs:n().positive().max(30000).optional()}).nullish()]),getCrossScopeDiscoveryRecord:M([it]),listModels:M([]),listRepositories:M([]),listBranches:M([n().int().positive(),t({cursor:e().optional(),query:e().optional()}).nullish()]),respondApproval:M([it,it,t({approved:r(),reason:e().optional()}).strict()]),refreshOrganization:M([]),restoreCreationOptions:M([it,Yp.strict()])};class U_{options;serviceId=$G();scopeGeneration=0;revision=0;organization;organizationGeneration=0;controller;scope;closed=!1;snapshots=new Map;tokenManager;settings=new ci;scopeTimer;retiring=new Set;activeCommands=0;constructor(i){this.options=i,this.tokenManager=new oc({providerSettingsManager:this.settings,telemetry:i.telemetry,onCredentialsRefreshed:(l,u)=>{let c=this.scope;if(l.provider!=="cline"||!c||c.kind!=="credential"||c.identity!==(l.auth?.accessToken||l.apiKey)||c.apiBaseUrl!==l.baseUrl)return;let g=u.auth?.accountId||u.auth?.accessToken||u.apiKey;if(g)Object.assign(c,{kind:u.auth?.accountId?"account":"credential",identity:g,apiBaseUrl:u.baseUrl})}}),this.scopeTimer=setInterval(()=>this.checkScope(),1000),this.scopeTimer.unref?.()}currentScope(){if(this.options.getScope){let c=this.options.getScope();return c?{kind:"custom",identity:c}:void 0}let i=this.settings.getProviderSettings("cline"),l=i?.auth?.accountId,u=l||i?.auth?.accessToken||i?.apiKey;return u?{kind:l?"account":"credential",identity:u,apiBaseUrl:i?.baseUrl}:void 0}isCurrentScope(i){let l=this.currentScope();return i?.kind===l?.kind&&i?.identity===l?.identity&&i?.apiBaseUrl===l?.apiBaseUrl}checkScope(){if(!this.controller||this.isCurrentScope(this.scope))return;let i=this.controller;this.controller=void 0,this.scope=void 0;for(let u of this.snapshots.keys())this.publish({type:"removed",sessionId:u});this.snapshots.clear(),this.scopeGeneration++,this.options.publish(void 0,{serviceId:this.serviceId,revision:++this.revision,scopeGeneration:this.scopeGeneration});let l=i.dispose().catch((u)=>this.options.logger?.error?.("Cloud controller teardown failed",{error:u})).finally(()=>this.retiring.delete(l));this.retiring.add(l)}getController(){if(this.closed)throw Error("Hub cloud service is closed");if(this.checkScope(),this.controller)return this.controller;this.invalidateOrganization(),this.scope=this.currentScope();let i=this.options.createController?.()??this.createController();return this.controller=i,i.subscribe((l)=>{if(this.controller!==i||this.closed)return;if(l.type==="snapshot")this.snapshots.set(l.sessionId,l.snapshot);if(l.type==="removed")this.snapshots.delete(l.sessionId);this.publish(l)}),i}createController(){let i=ke(),l=this.scope,u=this.settings.getProviderSettings("cline")?.baseUrl?.trim()||i.apiBaseUrl,c=async()=>{if(!this.isCurrentScope(l))throw Error("Cline account changed");let b,I;try{b=(await this.tokenManager.resolveProviderApiKey({providerId:"cline"}))?.apiKey}catch(k){I=k}if(!b&&!(I instanceof od))b=oi("cline")?.getApiKey(this.settings.getProviderSettings("cline"));if(!b&&I)this.options.logger?.error?.("Cloud account token refresh failed",{error:I}),ql(this.options.telemetry,"cline",{errorName:I instanceof Error?I.name:"Error",errorCode:"hub_cloud_refresh_failed_no_fallback_token"});if(!this.isCurrentScope(l))throw Error("Cline account changed");return b},g=new y_({apiBaseUrl:u,getAuthToken:c});return new D_({api:new k_({apiBaseUrl:u,appBaseUrl:i.appBaseUrl,getAuthToken:c}),apiBaseUrl:u,getAuthToken:c,logger:this.options.logger,clientIdentity:{prefix:"hub-cloud",type:"hub-cloud",displayName:"Cline Hub cloud session",source:"desktop"},lateCreateDisposition:"preserve",getActiveOrganizationId:async(b)=>{if(b?.fresh)this.invalidateOrganization();let I=this.organization;if(!b?.fresh&&I&&Date.now()-I.at<60000)return I.id;let k=this.organizationGeneration;if(!await c())return;let T=(await g.fetchUserOrganizations())?.find((E)=>E.active)?.organizationId;if(k===this.organizationGeneration)this.organization={id:T,at:Date.now()};return T}})}publish(i){this.options.publish(i,{serviceId:this.serviceId,revision:++this.revision,scopeGeneration:this.scopeGeneration})}snapshot(){return this.checkScope(),{serviceId:this.serviceId,revision:this.revision,scopeGeneration:this.scopeGeneration,snapshots:[...this.snapshots.values()]}}invalidateOrganization(){this.organization=void 0,this.organizationGeneration++}watch(){return this.invalidateOrganization(),this.getController(),this.snapshot()}async command(i,l,u){if(!Object.hasOwn(Bb,i))throw Error(`Unknown cloud operation: ${i}`);let c=i,g=Bb[c].parse(l).map((k)=>k===null?void 0:k);if(c==="create"){let k=g[0];k.sandboxType??="resumable"}this.checkScope();let b=t({serviceId:e(),scopeGeneration:n().int()}).parse(u);if(b.serviceId!==this.serviceId||b.scopeGeneration!==this.scopeGeneration)throw Error("Cloud account changed before request");let I=this.getController();this.activeCommands++;try{let k=await I[c].apply(I,g);if(this.checkScope(),this.controller!==I)throw Error("Cline account changed during cloud operation");return{serviceId:this.serviceId,revision:this.revision,scopeGeneration:this.scopeGeneration,result:k}}finally{this.activeCommands--}}async dispose(){this.closed=!0,clearInterval(this.scopeTimer);let i=this.controller;this.controller=void 0,this.snapshots.clear(),await Promise.all([i?.dispose(),...this.retiring])}}function r2(i){switch(i){case"idle":return"idle";case"pending":return"pending";case"completed":return"completed";case"failed":return"failed";case"cancelled":return"aborted";default:return"running"}}function s2(i){let l=i.metadata&&typeof i.metadata==="object"?JSON.parse(JSON.stringify(i.metadata)):{};if(i.parentSessionId?.trim())l.parentSessionId=i.parentSessionId;if(i.parentAgentId?.trim())l.parentAgentId=i.parentAgentId;if(i.agentId?.trim())l.agentId=i.agentId;if(i.conversationId?.trim())l.conversationId=i.conversationId;if(i.messagesPath?.trim())l.messagesPath=i.messagesPath;if(i.prompt?.trim())l.prompt=i.prompt;if(i.provider?.trim())l.provider=i.provider;if(i.model?.trim())l.model=i.model;if(i.source?.trim())l.source=i.source;if(typeof i.pid==="number")l.pid=i.pid;return Object.keys(l).length>0?l:void 0}function F_(i,l,u,c){return{sessionId:i.sessionId,workspaceRoot:i.workspaceRoot,cwd:i.cwd,createdAt:Date.parse(i.startedAt),updatedAt:Date.parse(i.updatedAt),createdByClientId:l?.createdByClientId??"hub",status:r2(i.status),participants:l?[...l.participants.values()]:[],metadata:s2(i),runtimeOptions:{enableTools:i.enableTools,enableSpawn:i.enableSpawn,enableTeams:i.enableTeams,mode:typeof i.metadata?.mode==="string"?i.metadata.mode:void 0,systemPrompt:typeof i.metadata?.systemPrompt==="string"?i.metadata.systemPrompt:void 0},runtimeSession:i.agentId?{agentId:i.agentId,team:i.teamName?{teamId:i.teamName}:void 0}:void 0,...u?{usage:{...u}}:{},...c?{aggregateUsage:{...c}}:{}}}function ue(i,l){return{version:i.version,requestId:i.requestId,ok:!0,...l!==void 0?{payload:l}:{}}}function ve(i,l,u){return{version:i.version,requestId:i.requestId,ok:!1,error:{code:l,message:u}}}function is(i){return i&&typeof i==="object"&&!Array.isArray(i)?i:void 0}function Qe(i){if(typeof i.payload?.sessionId==="string")return i.payload.sessionId.trim();return i.sessionId?.trim()??""}function Vt(i,l,u){return{version:"v1",event:i,eventId:P("hevt_"),sessionId:u,timestamp:Date.now(),payload:l}}async function Nr(i,l){let u=await i.sessionHost.getSession(l);if(!u)return;let c=await i.sessionHost.getAccumulatedUsage?.(l);return F_(u,i.sessionState.get(l),c?.usage,c?.aggregateUsage)}async function ns(i,l){let u=await i.sessionHost.getSession(l);if(!u)return;let c=await i.sessionHost.getAccumulatedUsage?.(l);return Eu({session:u,usage:c?.usage,aggregateUsage:c?.aggregateUsage})}function q_(i,l,u,c,g={}){i.detachedClientsBySession?.get(l)?.delete(u);let b=i.sessionState.get(l);if(b){if(g.interactive!==void 0)b.interactive=g.interactive;if(c==="creator"&&!b.createdByClientId)b.createdByClientId=u;if(!b.participants.has(u))b.participants.set(u,{clientId:u,attachedAt:Date.now(),role:c});return b}let I={createdByClientId:u,interactive:g.interactive??!0,participants:new Map([[u,{clientId:u,attachedAt:Date.now(),role:c}]])};return i.sessionState.set(l,I),I}function i2(i,l,u,c,g={}){i.detachedClientsBySession?.get(l)?.delete(u);let b=i.sessionState.get(l);if(b){if(g.interactive!==void 0)b.interactive=g.interactive;if(!b.participants.has(u))b.participants.set(u,{clientId:u,attachedAt:Date.now(),role:c});return b}let I={interactive:g.interactive??!0,participants:new Map([[u,{clientId:u,attachedAt:Date.now(),role:c}]])};return i.sessionState.set(l,I),I}async function Qp(i,l){let u=P("approval_"),c=l.sessionId;if(i.sessionState.get(c)?.interactive===!1)return{approved:!1,reason:"Tool approval requires an interactive session, but this session is non-interactive."};let g;try{g=await i.sessionHost.getSession(c)}catch{g=void 0}let b=typeof g?.metadata?.agendaTaskId==="string"?g.metadata.agendaTaskId:void 0;return await new Promise((I)=>{let k=i.buildEvent("approval.requested",{approvalId:u,sessionId:l.sessionId,agentId:l.agentId,conversationId:l.conversationId,iteration:l.iteration,toolCallId:l.toolCallId,toolName:l.toolName,inputJson:JSON.stringify(l.input??null),policy:l.policy,agendaTaskId:b},c);i.pendingApprovals.set(u,{sessionId:c,resolve:I,requestedEvent:k}),i.publish(k)})}function n2(i,l){let u=[];for(let c of i.pendingApprovals.values()){if(!c.requestedEvent)continue;if(l&&c.sessionId!==l)continue;u.push(c.requestedEvent)}return u}function j_(i,l,u){let c=i.pendingApprovals.get(l);if(!c)return;return i.pendingApprovals.delete(l),c.resolve(u),{sessionId:c.sessionId}}function B_(i,l,u){let c=0;for(let[g,b]of[...i.pendingApprovals.entries()]){if(!l({approvalId:g,sessionId:b.sessionId}))continue;i.pendingApprovals.delete(g),b.resolve({approved:!1,reason:u}),i.publish(i.buildEvent("approval.resolved",{approvalId:g,approved:!1,cancelled:!0,reason:u},b.sessionId)),c+=1}return c}async function o2(i,l){let u=typeof l.payload?.approvalId==="string"?l.payload.approvalId.trim():"";if(!i.pendingApprovals.get(u))return ve(l,"approval_not_found",`Unknown approval: ${u}`);let c=typeof l.payload?.reason==="string"?l.payload.reason:l.payload?.payload&&typeof l.payload.payload==="object"&&!Array.isArray(l.payload.payload)&&typeof l.payload.payload.reason==="string"?l.payload.payload.reason:void 0,g=l.payload?.approved===!0,b=j_(i,u,{approved:g,reason:c});if(!b)return ve(l,"approval_not_found",`Unknown approval: ${u}`);return i.publish(i.buildEvent("approval.resolved",{approvalId:u,approved:g,reason:c},b.sessionId)),ue(l,{approvalId:u,approved:g})}function a2(i){if(i instanceof Error)return{name:i.name,message:i.message,stack:i.stack};if(i===void 0)return;return i}var Hb={debug:10,info:20,warn:30,error:40,silent:50};function l2(){let i=process.env.CLINE_HUB_LOG_LEVEL?.trim().toLowerCase();if(i==="debug"||i==="info"||i==="warn"||i==="error"||i==="silent")return i;return process.env.VITEST?"error":"info"}function Ae(i,l,u={}){if(Hb[i]<Hb[l2()])return;let c=JSON.stringify({ts:new Date().toISOString(),level:i,component:"hub",message:l,...Object.fromEntries(Object.entries(u).map(([g,b])=>[g,a2(b)]).filter(([,g])=>g!==void 0))});if(i==="error"||i==="warn"){console.error(`[hub] ${c}`);return}console.log(`[hub] ${c}`)}function Ni(i,l){let u=l instanceof Error?l.stack||l.message:String(l);Ae("error",i,{error:u})}var ju="The app running this task disconnected before it could respond. Reopen the task to continue.",d2=7000;function u2(i,l,u){let c=[];for(let g of i.pendingCapabilityRequests.values()){if(!g.undeliveredEvent||g.targetClientId!==l||u&&g.sessionId!==u)continue;c.push(g.undeliveredEvent),g.undeliveredEvent=void 0}return c}async function c2(i,l,u,c,g,b){let I=P("capreq_"),k=performance.now();Ae("info","capability.request.start",{requestId:I,sessionId:l,capabilityName:u,targetClientId:g});let T=(E)=>(Ae("warn","capability.request.end",{requestId:I,sessionId:l,capabilityName:u,targetClientId:g,ok:!1,error:`target_client_${E}`,durationMs:Math.round(performance.now()-k)}),gg(i.telemetry,{sessionId:l,capabilityName:u,reason:E}),Error(ju));if(i.detachedClientsBySession?.get(l)?.has(g))throw T("detached");return await new Promise((E,A)=>{let C=i.buildEvent("capability.requested",{requestId:I,targetClientId:g,capabilityName:u,payload:c},l),N=i.clients.has(g);if(i.pendingCapabilityRequests.set(I,{sessionId:l,targetClientId:g,capabilityName:u,onProgress:b,undeliveredEvent:N?void 0:C,resolve:(O)=>{if(Ae(O.ok?"info":"warn","capability.request.end",{requestId:I,sessionId:l,capabilityName:u,targetClientId:g,ok:O.ok,error:O.error,durationMs:Math.round(performance.now()-k)}),!O.ok){if(O.error===ju)gg(i.telemetry,{sessionId:l,capabilityName:u,reason:"cancelled_while_waiting"});A(Error(O.error||`Capability ${u} was rejected by ${g}.`));return}E(O.payload)}}),!N){setTimeout(()=>{if(!i.pendingCapabilityRequests.get(I)?.undeliveredEvent)return;i.pendingCapabilityRequests.delete(I),A(T("disconnected"))},d2);return}i.publish(C),Ae("info","capability.request.published",{requestId:I,sessionId:l,capabilityName:u,targetClientId:g})})}function p2(i,l){let u=typeof l.payload?.requestId==="string"?l.payload.requestId.trim():"",c=i.pendingCapabilityRequests.get(u);if(!c)return ue(l,{requestId:u,ignored:!0});if((l.clientId?.trim()||"")!==c.targetClientId)return ve(l,"capability_wrong_client",`Capability request ${u} is owned by ${c.targetClientId}`);if(l.sessionId?.trim()&&l.sessionId.trim()!==c.sessionId)return ve(l,"capability_wrong_session",`Capability request ${u} belongs to session ${c.sessionId}`);let g=l.payload?.payload&&typeof l.payload.payload==="object"&&!Array.isArray(l.payload.payload)?l.payload.payload:{};return c.onProgress?.(g),ue(l,{requestId:u})}function Jl(i,l,u){let c=0;for(let[g,b]of[...i.pendingCapabilityRequests.entries()]){if(!l({requestId:g,...b}))continue;i.pendingCapabilityRequests.delete(g),Ae("warn","capability.request.cancelled",{requestId:g,sessionId:b.sessionId,capabilityName:b.capabilityName,targetClientId:b.targetClientId,reason:u}),b.resolve({ok:!1,error:u}),i.publish(i.buildEvent("capability.resolved",{requestId:g,capabilityName:b.capabilityName,targetClientId:b.targetClientId,ok:!1,cancelled:!0,error:u},b.sessionId)),c+=1}return c}async function m2(i,l){let u=typeof l.payload?.sessionId==="string"?l.payload.sessionId.trim():l.sessionId?.trim()||"",c=typeof l.payload?.capabilityName==="string"?l.payload.capabilityName.trim():"",g=typeof l.payload?.targetClientId==="string"?l.payload.targetClientId.trim():"";if(!u||!c||!g)return ve(l,"invalid_capability_request","capability.request requires sessionId, capabilityName, and targetClientId");try{let b=l.payload?.payload&&typeof l.payload.payload==="object"&&!Array.isArray(l.payload.payload)?l.payload.payload:{},I=await i.requestCapability(u,c,b,g);return ue(l,I)}catch(b){return ve(l,"capability_request_failed",b instanceof Error?b.message:String(b))}}function h2(i,l){let u=typeof l.payload?.requestId==="string"?l.payload.requestId.trim():"",c=i.pendingCapabilityRequests.get(u);if(!c)return ue(l,{requestId:u,ignored:!0});let g=l.clientId?.trim()||"";if(g!==c.targetClientId)return ve(l,"capability_wrong_client",`Capability request ${u} is owned by ${c.targetClientId}`);if(l.sessionId?.trim()&&l.sessionId.trim()!==c.sessionId)return ve(l,"capability_wrong_session",`Capability request ${u} belongs to session ${c.sessionId}`);i.pendingCapabilityRequests.delete(u);let b=l.payload?.payload&&typeof l.payload.payload==="object"&&!Array.isArray(l.payload.payload)?l.payload.payload:void 0,I=typeof l.payload?.error==="string"?l.payload.error:void 0,k=l.payload?.ok===!0;return Ae(k?"info":"warn","capability.respond",{requestId:u,sessionId:c.sessionId,capabilityName:c.capabilityName,targetClientId:c.targetClientId,respondedByClientId:g,ok:k,error:I}),c.resolve({ok:k,payload:b,error:I}),i.publish(i.buildEvent("capability.resolved",{requestId:u,capabilityName:c.capabilityName,targetClientId:c.targetClientId,respondedByClientId:g,ok:k,payload:b,error:I},c.sessionId)),ue(l,{requestId:u,ok:k})}function f2(i,l){let u=l.payload,c=u?.clientId?.trim()||l.clientId?.trim()||P("client_");return i.clients.set(c,{clientId:c,clientType:u?.clientType??"unknown",displayName:u?.displayName,actorKind:u?.actorKind??"client",connectedAt:Date.now(),lastSeenAt:Date.now(),transport:u?.transport??"native",capabilities:u?.capabilities??[],metadata:u?.metadata,workspaceContext:u?.workspaceContext}),i.publish(i.buildEvent("hub.client.registered",{clientId:c,clientType:u?.clientType??"unknown",displayName:u?.displayName,metadata:u?.metadata,connectedAt:Date.now()})),ue(l,{clientId:c})}function g2(i,l){let u=l.clientId?.trim(),c=u?i.clients.get(u):void 0;if(!u||!c)return ve(l,"client_not_found","Client is not registered with this hub.");let g=is(l.payload?.metadata);if(c.lastSeenAt=Date.now(),g)c.metadata=JSON.parse(JSON.stringify(g));if(Array.isArray(l.payload?.capabilities))c.capabilities=l.payload.capabilities.flatMap((b)=>{if(!b||typeof b!=="object"||Array.isArray(b))return[];let I=b;if(typeof I.name!=="string"||!I.name.trim())return[];return[{name:I.name.trim(),...typeof I.description==="string"?{description:I.description}:{},...Array.isArray(I.scopes)&&I.scopes.every((k)=>typeof k==="string")?{scopes:I.scopes}:{}}]});return ue(l)}function y2(i,l,u){let c=l.clientId?.trim();if(c)i.clients.delete(c),u(c),i.publish(i.buildEvent("hub.client.disconnected",{clientId:c}));return ue(l)}function v2(i,l){return ue(l,{clients:[...i.clients.values()]})}function Sn(i){return typeof i==="object"&&i!==null&&!Array.isArray(i)}function Bu(i){return typeof i==="string"?i.trim():void 0}function zb(i){if(!Sn(i))return{};let l={};for(let[u,c]of Object.entries(i))if(typeof c==="string")l[u]=c.trim();return l}function w2(){return Je((i)=>i.listConfigs()).map((i)=>({id:i.channel,type:i.type,configuredAt:i.configuredAt,updatedAt:i.updatedAt})).sort((i,l)=>i.type.localeCompare(l.type))}function Xf(){return{available:rr(),active:QI(),configured:w2()}}function b2(i,l){if(i.required&&!l[i.flag]?.trim())throw Error(`${i.label} is required`)}function I2(i,l){let u={};for(let g of i.fields)u[g.flag]=l[g.flag]??g.initialValue??"";let c={};for(let g of i.fields){if(!xo(g,u))continue;b2(g,u),c[g.flag]=u[g.flag]}return c}function k2(i){if(!Sn(i))throw Error("connector.configure payload must be an object.");let l=Bu(i.channel);if(!l)throw Error("channel is required");let u=bo.find((A)=>A.id===l);if(!u)throw Error(`unknown connector channel: ${l}`);if(!new Set(mi().map((A)=>A.name)).has(u.id))throw Error(`connector channel is not available: ${l}`);let c=zb(i.values),g=I2(u,c),b=Sn(i.security)?i.security:{},I=b.enabled===!0,k=zb(b.values);if(I&&u.security)for(let A of u.security.fields){let C=k[A.key];if(!C)throw Error(A.requiredMessage);let N=A.validate?.(C);if(N)throw Error(N)}let T=I?{enabled:!0,values:k}:{enabled:!1,values:{}},E=ar(u,g,T);return Je((A)=>A.upsertConfig({channel:l,type:l,values:g,security:T,updateConnectArgs:(C)=>or(u,C.connection.connectArgs,E,{replaceSecurityArgs:C.config?.security?.enabled===!0||T.enabled})})),Xf()}function S2(i){if(!Sn(i))throw Error("connector.delete_config payload must be an object.");let l=Bu(i.channel);if(!l)throw Error("channel is required");return Je((u)=>u.deleteConfig(l)),Xf()}function T2(i){return Array.isArray(i)?i.filter((l)=>typeof l==="string"):[]}function Vf(){let i=tk();if(!i)throw Error("connector supervision is unavailable in this hub; start connectors with the CLI instead");return i}function H_(i){if(!Sn(i))throw Error("payload must be an object.");let l=Bu(i.channel);if(!l)throw Error("channel is required");let u=Bu(i.instanceId);if(!u)throw Error("instanceId is required");return{channel:l,instanceId:u}}async function _2(i){let{channel:l,instanceId:u}=H_(i),c=Sn(i)?i:{};return await Vf().start({channel:l,instanceId:u,args:T2(c.args),restart:c.restart===!0})}async function E2(i){let{channel:l,instanceId:u}=H_(i),c=Sn(i)?i:{};return{stopped:await Vf().stop({channel:l,instanceId:u,disableAutostart:c.disableAutostart!==!1}),channel:l,instanceId:u}}function A2(i){return i==="connector.configure"||i==="connector.delete_config"||i==="connector.start"||i==="connector.stop"}function yl(i,l,u){if(!A2(l.command))return;Ko(i.telemetry,{ulid:l.sessionId??l.requestId??"hub",tool:l.command,success:u})}async function x2(i,l){try{if(l.command==="connector.channels")return ue(l,Xf());if(l.command==="connector.configure"){let u=k2(l.payload);return yl(i,l,!0),ue(l,u)}if(l.command==="connector.delete_config"){let u=S2(l.payload);return yl(i,l,!0),ue(l,u)}if(l.command==="connector.start"){let u=await _2(l.payload);return yl(i,l,!0),ue(l,u)}if(l.command==="connector.stop"){let u=await E2(l.payload);return yl(i,l,!0),ue(l,u)}if(l.command==="connector.supervised")return ue(l,{supervised:Vf().list()});return ve(l,"unsupported_connector_command",`unsupported connector command: ${l.command}`)}catch(u){return yl(i,l,!1),ve(l,"connector_command_failed",u instanceof Error?u.message:String(u))}}function Vl(i){return typeof i==="string"&&i.trim().length>0?i:void 0}function Yf(i,l,u){let c=u instanceof Error?u.message:String(u);return ve(i,Ou(u)?kf:l,c)}async function C2(i,l){let u=Qe(l),c=Vl(l.payload?.toolName);if(!u||!c)return ve(l,"invalid_mcp_apps_resolve_tool","session.mcp_apps.resolve_tool requires a sessionId and toolName");let g=i.sessionHost.resolveMcpAppTool;if(!g)return ue(l,{});try{let b=await g.call(i.sessionHost,u,c);return ue(l,b?{binding:b}:{})}catch(b){return Yf(l,"mcp_apps_resolve_tool_failed",b)}}async function R2(i,l){let u=Qe(l),c=Vl(l.payload?.serverName),g=Vl(l.payload?.uri);if(!u||!c||!g)return ve(l,"invalid_mcp_apps_read_resource","session.mcp_apps.read_resource requires a sessionId, serverName, and uri");let b=i.sessionHost.readMcpAppResource;if(!b)return ve(l,"unsupported_command","This runtime does not support MCP Apps.");try{let I=await b.call(i.sessionHost,u,{serverName:c,uri:g});return ue(l,{result:I})}catch(I){return Yf(l,"mcp_apps_read_resource_failed",I)}}async function P2(i,l){let u=Qe(l),c=Vl(l.payload?.serverName),g=Vl(l.payload?.toolName),b=l.payload?.arguments,I=is(b);if(!u||!c||!g||b!==void 0&&!I)return ve(l,"invalid_mcp_apps_call_tool","session.mcp_apps.call_tool requires a sessionId, serverName, toolName, and object arguments");let k=i.sessionHost.callMcpAppTool;if(!k)return ve(l,"unsupported_command","This runtime does not support MCP Apps.");try{let T=await k.call(i.sessionHost,u,{serverName:c,toolName:g,...I?{arguments:I}:{}});return ue(l,{result:T})}catch(T){return Yf(l,"mcp_apps_call_tool_failed",T)}}var M2=30000;function N2(i){if(i==="aborted")return"run.aborted";if(i==="error"||i==="failed")return"run.failed";return"run.completed"}function O2(i){if(i.finishReason!=="error")return;return i.text.trim()||void 0}function $2(i,l){let u=i.activeRpcTurnCountBySession;u.set(l,(u.get(l)??0)+1);let c=!1;return()=>{if(c)return;c=!0;let g=(u.get(l)??1)-1;if(g<=0)u.delete(l);else u.set(l,g)}}function Wb(i,l,u){let c=u instanceof Error&&u.message.trim()?u.message:`Unknown session: ${l}`;return ve(i,kf,c)}function L2(i){return i?i:void 0}function D2(i){let l=typeof i.timeoutMs==="number"?i.timeoutMs:typeof i.timeout_ms==="number"?i.timeout_ms:void 0;if(l&&Number.isFinite(l)&&l>0)return Math.floor(l);let u=typeof i.timeoutSeconds==="number"?i.timeoutSeconds:typeof i.timeout_seconds==="number"?i.timeout_seconds:void 0;if(u&&Number.isFinite(u)&&u>0)return Math.floor(u*1000);return}async function U2(i,l,u,c){let g=performance.now(),b=!1,I={command:l.command,requestId:l.requestId,clientId:l.clientId,sessionId:u.sessionId,timeoutMs:c},k=setInterval(()=>{if(b)return;let A=Math.round(performance.now()-g);Ae("warn","run.heartbeat",{...I,elapsedMs:A}),i.publish(i.buildEvent("run.heartbeat",{requestId:l.requestId,elapsedMs:A,...c?{timeoutMs:c}:{}},u.sessionId))},M2),T=i.sessionHost.runTurn(u);T.then((A)=>{if(!b)return;Ae("warn","run.late_end",{...I,elapsedMs:Math.round(performance.now()-g),finishReason:A?.finishReason})},(A)=>{if(!b)return;Ae("error","run.late_error",{...I,elapsedMs:Math.round(performance.now()-g),error:A})});let E;try{if(!c)return await T;return await Promise.race([T,new Promise((A,C)=>{E=setTimeout(()=>{let N=`Hub run ${l.command} timed out after ${c}ms.`;b=!0,clearInterval(k),C(Error(N)),Ae("error","run.timeout",{...I,elapsedMs:Math.round(performance.now()-g)}),B_(i,(O)=>O.sessionId===u.sessionId,N),Jl(i,(O)=>O.sessionId===u.sessionId,N),i.sessionHost.abort(u.sessionId,N).catch((O)=>{Ae("error","run.timeout_abort_failed",{...I,error:O})})},c)})])}finally{if(b=!0,clearInterval(k),E)clearTimeout(E)}}async function fh(i,l){let u=Qe(l),c=l.payload&&typeof l.payload==="object"?l.payload:{},g=typeof c.prompt==="string"?c.prompt:typeof c.input==="string"?c.input:"",b=c.attachments&&typeof c.attachments==="object"&&!Array.isArray(c.attachments)?c.attachments:void 0,I=Array.isArray(b?.userImages)?b.userImages.filter((N)=>typeof N==="string"&&N.trim().length>0):void 0,k=Array.isArray(b?.userFiles)?b.userFiles.filter((N)=>typeof N==="string"&&N.trim().length>0):void 0;if(!g.trim()&&!I?.length&&!k?.length)return ve(l,"invalid_session_input","session input requires a prompt or attachment");if(!await i.sessionHost.getSession(u))return Wb(l,u);i.publish(i.buildEvent("run.started",{...l.requestId?{requestId:l.requestId}:{},...l.clientId?{clientId:l.clientId}:{}},u));let T=D2(c);i.suppressNextTerminalEventBySession.set(u,"run.start.reply");let E=$2(i,u),A;try{try{A=await U2(i,l,{sessionId:u,prompt:g,mode:L2(c.mode),delivery:c.delivery==="queue"||c.delivery==="steer"?c.delivery:void 0,userImages:I,userFiles:k,timeoutMs:T},T)}catch(N){if(i.suppressNextTerminalEventBySession.get(u)==="run.start.reply")i.suppressNextTerminalEventBySession.delete(u);if(Ou(N))return Wb(l,u,N);throw i.publish(i.buildEvent("run.failed",{reason:"error",error:N instanceof Error?N.message:String(N)},u)),N}if(A){let N=await ns(i,u),O=O2(A);if(i.publish(i.buildEvent(N2(A.finishReason),{reason:A.finishReason,...O?{error:O}:{},result:A,...N?{snapshot:N}:{}},u)),i.suppressNextTerminalEventBySession.get(u)==="run.start.reply")i.suppressNextTerminalEventBySession.delete(u)}else i.suppressNextTerminalEventBySession.delete(u)}finally{E()}let C=await ns(i,u);return ue(l,A||C?{...A?{result:A}:{},...C?{snapshot:C}:{}}:void 0)}async function F2(i,l){let u=Qe(l),c=typeof l.payload?.reason==="string"?l.payload.reason:"Run was aborted before pending approval or capability request was resolved.";B_(i,(g)=>g.sessionId===u,c);try{await i.sessionHost.abort(u,l.payload?.reason)}catch(g){Ae("warn","run.abort_failed",{command:l.command,requestId:l.requestId,clientId:l.clientId,sessionId:u,error:g})}finally{Jl(i,(g)=>g.sessionId===u,c)}return ue(l,{applied:!0})}async function q2(i,l){let u=Qe(l);if(!u)return ve(l,"invalid_session_id","run.proceed_while_running requires a sessionId");if(typeof i.sessionHost.proceedWhileRunning!=="function")return ve(l,"unsupported_command","This runtime does not support proceeding while commands are running.");let c=typeof l.payload?.toolCallId==="string"&&l.payload.toolCallId.trim().length>0?l.payload.toolCallId.trim():void 0,g=await i.sessionHost.proceedWhileRunning(u,c);return ue(l,{detachedCount:g})}async function j2(i,l){let u=ba(l.payload?.payload);if(!u)return ve(l,"invalid_hook_payload","session.hook requires a valid hook event payload");return await i.sessionHost.dispatchHookEvent(u),ue(l,{applied:!0})}var H2=32,z2=604800000;class Zf extends Error{retryable=!0;constructor(i,l,u){super(`Session ${i} queue is full (${l} pending runs, limit ${u}); retry later.`);this.name="HubRunAdmissionRejectedError"}}function W2(i){let l=i?.replace(/[^a-zA-Z0-9_-]/g,"-");return B2(xe(),l?`hub-runs-${l}.db`:"hub-runs.db")}class z_{db;maxPendingPerSession;closed=!1;constructor(i={}){this.db=V(i.dbPath??W2(i.ownerId)),this.maxPendingPerSession=i.maxPendingPerSession??H2,this.db.exec("PRAGMA journal_mode = WAL;"),this.db.exec("PRAGMA busy_timeout = 5000;"),this.db.exec(`
|
|
1075
|
+
CREATE TABLE IF NOT EXISTS hub_runs (
|
|
1076
|
+
accepted_seq INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1077
|
+
run_id TEXT NOT NULL UNIQUE,
|
|
1078
|
+
session_id TEXT NOT NULL,
|
|
1079
|
+
state TEXT NOT NULL,
|
|
1080
|
+
input_json TEXT NOT NULL,
|
|
1081
|
+
client_id TEXT,
|
|
1082
|
+
accepted_at INTEGER NOT NULL,
|
|
1083
|
+
started_at INTEGER,
|
|
1084
|
+
ended_at INTEGER,
|
|
1085
|
+
error TEXT
|
|
1086
|
+
);
|
|
1087
|
+
CREATE INDEX IF NOT EXISTS idx_hub_runs_session
|
|
1088
|
+
ON hub_runs(session_id, accepted_seq);
|
|
1089
|
+
CREATE INDEX IF NOT EXISTS idx_hub_runs_state
|
|
1090
|
+
ON hub_runs(state, accepted_seq);
|
|
1091
|
+
`)}admit(i,l,u){let c=this.countPendingBySession(i);if(c>=this.maxPendingPerSession)throw new Zf(i,c,this.maxPendingPerSession);let g=P("hrun_"),b=Date.now();return this.db.prepare(`INSERT INTO hub_runs (run_id, session_id, state, input_json, client_id, accepted_at)
|
|
1092
|
+
VALUES (?, ?, 'queued', ?, ?, ?);`).run(g,i,JSON.stringify(l),u??null,b),{runId:g,acceptedAt:b,queuePosition:c}}get(i){let l=this.db.prepare("SELECT * FROM hub_runs WHERE run_id = ?;").get(i);return l?vl(l):void 0}nextQueued(i){let l=this.db.prepare(`SELECT * FROM hub_runs WHERE session_id = ? AND state = 'queued'
|
|
1093
|
+
ORDER BY accepted_seq LIMIT 1;`).get(i);return l?vl(l):void 0}hasRunning(i){let l=this.db.prepare("SELECT COUNT(*) AS n FROM hub_runs WHERE session_id = ? AND state = 'running';").get(i);return Number(l?.n??0)>0}countPendingBySession(i){let l=this.db.prepare(`SELECT COUNT(*) AS n FROM hub_runs
|
|
1094
|
+
WHERE session_id = ? AND state IN ('queued', 'running');`).get(i);return Number(l?.n??0)}countPending(){let i=this.db.prepare("SELECT COUNT(*) AS n FROM hub_runs WHERE state IN ('queued', 'running');").get();return Number(i?.n??0)}markRunning(i){this.db.prepare("UPDATE hub_runs SET state = 'running', started_at = ? WHERE run_id = ? AND state = 'queued';").run(Date.now(),i)}markTerminal(i,l,u){this.db.prepare("UPDATE hub_runs SET state = ?, ended_at = ?, error = ? WHERE run_id = ?;").run(l,Date.now(),u??null,i)}list(i={}){let l=[],u=[];if(i.sessionId)l.push("session_id = ?"),u.push(i.sessionId);return u.push(i.limit??100),this.db.prepare(`SELECT * FROM hub_runs
|
|
1095
|
+
${l.length?`WHERE ${l.join(" AND ")}`:""}
|
|
1096
|
+
ORDER BY accepted_seq DESC LIMIT ?;`).all(...u).map(vl)}recoverOnStartup(){let i=this.db.prepare("SELECT * FROM hub_runs WHERE state = 'running' ORDER BY accepted_seq;").all().map(vl);this.db.prepare(`UPDATE hub_runs SET state = 'interrupted', ended_at = ?,
|
|
1097
|
+
error = 'Hub daemon exited before the run finished.'
|
|
1098
|
+
WHERE state = 'running';`).run(Date.now());let l=this.db.prepare("SELECT * FROM hub_runs WHERE state = 'queued' ORDER BY accepted_seq;").all().map(vl);return this.db.prepare("DELETE FROM hub_runs WHERE ended_at IS NOT NULL AND ended_at < ?;").run(Date.now()-z2),{interrupted:i.map((u)=>({...u,state:"interrupted"})),requeued:l}}close(){if(this.closed)return;this.closed=!0,this.db.close?.()}}function vl(i){let l={};try{let u=JSON.parse(String(i.input_json));if(u&&typeof u==="object"&&!Array.isArray(u))l=u}catch{}return{runId:String(i.run_id),sessionId:String(i.session_id),state:String(i.state),input:l,clientId:typeof i.client_id==="string"?i.client_id:void 0,acceptedAt:Number(i.accepted_at),startedAt:i.started_at===null?void 0:Number(i.started_at),endedAt:i.ended_at===null?void 0:Number(i.ended_at),error:typeof i.error==="string"?i.error:void 0}}var K2="hub_draining",G2=new Set(["session.create","session.restore","session.fork","run.start","session.send_input","run.enqueue","plugins.commands.run","plugins.commands.list"]);function X2(i){return G2.has(i)}function Kb(i){return{version:i.version,requestId:i.requestId,ok:!1,error:{code:K2,message:"Hub is draining and refuses new mutating work; retry once a hub is serving again.",details:{retryable:!0}}}}class W_{ctx;queue;activeSessions=new Set;constructor(i,l){this.ctx=i,this.queue=l}pump(i){if(this.activeSessions.has(i))return;this.activeSessions.add(i),this.drainSession(i).catch((l)=>{Ae("error","run.queue.pump_failed",{sessionId:i,error:l})}).finally(()=>{if(this.activeSessions.delete(i),this.queue.nextQueued(i))this.pump(i)})}async drainSession(i){for(;;){let l=this.queue.nextQueued(i);if(!l)return;this.queue.markRunning(l.runId),await this.execute(l)}}async execute(i){let l={version:"v1",command:"run.start",requestId:i.runId,clientId:i.clientId,sessionId:i.sessionId,payload:{...i.input,sessionId:i.sessionId}};try{let u=await fh(this.ctx,l);if(u.ok){let c=u.payload?.result?.finishReason;this.queue.markTerminal(i.runId,c==="aborted"?"aborted":c==="error"||c==="failed"?"failed":"completed",c==="error"?"Run finished with an error.":void 0)}else this.queue.markTerminal(i.runId,"failed",u.error?.message??"Run failed.")}catch(u){this.queue.markTerminal(i.runId,"failed",u instanceof Error?u.message:String(u))}}}function J2(i,l,u,c){let g=Qe(l);if(!g)return ve(l,"invalid_session_id","run.enqueue requires a sessionId");let b=l.payload&&typeof l.payload==="object"?l.payload:{};if(!(typeof b.prompt==="string"?b.prompt:typeof b.input==="string"?b.input:"").trim())return ve(l,"invalid_session_input","run.enqueue requires a prompt string");let I;try{I=u.admit(g,b,l.clientId?.trim()||void 0)}catch(k){if(k instanceof Zf)return{version:l.version,requestId:l.requestId,ok:!1,error:{code:"run_admission_rejected",message:k.message,details:{retryable:!0}}};throw k}return i.publish(i.buildEvent("run.enqueued",{runId:I.runId,acceptedAt:I.acceptedAt,queuePosition:I.queuePosition,...l.clientId?{clientId:l.clientId}:{}},g)),c.pump(g),ue(l,{...I})}function V2(i,l){let u=Qe(i)||void 0,c=typeof i.payload?.limit==="number"&&Number.isFinite(i.payload.limit)&&i.payload.limit>0?Math.floor(i.payload.limit):void 0;return ue(i,{runs:l.list({sessionId:u,limit:c}).map((g)=>({runId:g.runId,sessionId:g.sessionId,state:g.state,acceptedAt:g.acceptedAt,startedAt:g.startedAt,endedAt:g.endedAt,error:g.error}))})}async function Y2(i,l){switch(l.type){case"chunk":return;case"agent_event":await Q2(i,l);return;case"hook":if(l.payload.hookEventName==="tool_call")i.publish(i.buildEvent("tool.started",{toolName:l.payload.toolName},l.payload.sessionId));else if(l.payload.hookEventName==="tool_result")i.publish(i.buildEvent("tool.finished",{toolName:l.payload.toolName},l.payload.sessionId));return;case"team_progress":{let u={type:"team_progress_projection",version:1,sessionId:l.payload.sessionId,summary:l.payload.summary,lastEvent:l.payload.lifecycle};i.publish(i.buildEvent("team.progress",u,l.payload.sessionId));return}case"pending_prompts":i.publish(i.buildEvent("session.pending_prompts",{sessionId:l.payload.sessionId,prompts:l.payload.prompts},l.payload.sessionId));return;case"pending_prompt_submitted":{let u={id:l.payload.id,prompt:l.payload.prompt,delivery:l.payload.delivery,attachmentCount:l.payload.attachmentCount,userImages:l.payload.userImages,userFiles:l.payload.userFiles};i.publish(i.buildEvent("session.pending_prompt_submitted",{sessionId:l.payload.sessionId,prompt:u},l.payload.sessionId));return}case"session_snapshot":i.publish(i.buildEvent("session.updated",{sessionId:l.payload.sessionId,snapshot:l.payload.snapshot},l.payload.sessionId));return;case"status":{let[u,c]=await Promise.all([Nr(i,l.payload.sessionId),ns(i,l.payload.sessionId)]);if(u)i.publish(i.buildEvent("session.updated",{session:u,...c?{snapshot:c}:{}},l.payload.sessionId));return}case"ended":await eJ(i,l);return;default:return}}async function Q2(i,l){let{sessionId:u,event:c}=l.payload;if(c.type==="iteration_start"){i.publish(i.buildEvent("iteration.started",{iteration:c.iteration},u));return}if(c.type==="iteration_end"){i.publish(i.buildEvent("iteration.finished",{iteration:c.iteration,hadToolCalls:c.hadToolCalls,toolCallCount:c.toolCallCount},u));return}if(c.type==="content_start"){if(c.contentType==="text"&&typeof c.text==="string"&&c.text.length>0){i.publish(i.buildEvent("assistant.delta",{text:c.text},u));return}if(c.contentType==="reasoning"){if(c.redacted&&!c.reasoning){i.publish(i.buildEvent("reasoning.delta",{text:"",redacted:!0},u));return}if(typeof c.reasoning==="string"&&c.reasoning.length>0)i.publish(i.buildEvent("reasoning.delta",{text:c.reasoning,redacted:c.redacted===!0},u));return}if(c.contentType==="tool"){i.publish(i.buildEvent("tool.started",{toolCallId:c.toolCallId,toolName:c.toolName,input:c.input},u));return}}if(c.type==="content_update"&&c.contentType==="tool"){i.publish(i.buildEvent("tool.updated",{toolCallId:c.toolCallId,toolName:c.toolName,update:c.update},u));return}if(c.type==="content_end"){switch(c.contentType){case"text":i.publish(i.buildEvent("assistant.finished",{text:c.text},u));break;case"media":if(c.media)i.publish(i.buildEvent("assistant.media",{media:c.media},u));break;case"reasoning":i.publish(i.buildEvent("reasoning.finished",{reasoning:c.reasoning},u));break;case"tool":i.publish(i.buildEvent("tool.finished",{toolCallId:c.toolCallId,toolName:c.toolName,output:c.output,error:c.error},u));break}return}if(c.type==="notice"){i.publish(i.buildEvent("session.notice",{sessionId:u,message:c.message,noticeType:c.noticeType,...c.displayRole?{displayRole:c.displayRole}:{},...c.reason?{reason:c.reason}:{},...c.metadata?{metadata:c.metadata}:{},agent:{kind:l.payload.teamRole==="teammate"?"teammate":c.parentAgentId?"subagent":"lead",agentId:c.agentId,conversationId:c.conversationId,parentAgentId:c.parentAgentId,teamAgentId:l.payload.teamAgentId,teamRole:l.payload.teamRole}},u));return}if(c.type==="usage"){let g;try{g=await i.sessionHost.getAccumulatedUsage?.(u)}catch{g=void 0}i.publish(i.buildEvent("usage.updated",{sessionId:u,delta:{inputTokens:c.inputTokens,outputTokens:c.outputTokens,cacheReadTokens:c.cacheReadTokens??0,cacheWriteTokens:c.cacheWriteTokens??0,reasoningTokenCount:c.reasoningTokenCount,totalCost:c.cost??0},totals:{inputTokens:c.totalInputTokens,outputTokens:c.totalOutputTokens,cacheReadTokens:c.totalCacheReadTokens??0,cacheWriteTokens:c.totalCacheWriteTokens??0,totalCost:c.totalCost??0},usage:g?.usage,aggregateUsage:g?.aggregateUsage,agent:{kind:l.payload.teamRole==="teammate"?"teammate":c.parentAgentId?"subagent":"lead",agentId:c.agentId,conversationId:c.conversationId,parentAgentId:c.parentAgentId,teamAgentId:l.payload.teamAgentId,teamRole:l.payload.teamRole}},u));return}if(c.type==="done"){i.publish(i.buildEvent("agent.done",{reason:c.reason,text:c.text,iterations:c.iterations,usage:c.usage},u));return}if(c.type==="error")await Z2(i,l)}async function Z2(i,l){let{sessionId:u,event:c}=l.payload;if(c.type!=="error"||c.recoverable)return;if(c.parentAgentId||l.payload.teamRole==="teammate")return;if((i.activeRpcTurnCountBySession.get(u)??0)>0)return;let g=c.error instanceof Error?c.error.message:String(c.error),b=await ns(i,u);i.publish(i.buildEvent("run.failed",{reason:"error",...g?{error:g,text:g}:{},...b?{snapshot:b}:{}},u))}async function eJ(i,l){let u=i.suppressNextTerminalEventBySession.get(l.payload.sessionId),c=u===l.payload.reason||u==="run.start.reply";if(c)i.suppressNextTerminalEventBySession.delete(l.payload.sessionId);let[g,b]=await Promise.all([Nr(i,l.payload.sessionId),ns(i,l.payload.sessionId)]);if(l.payload.reason==="completed"){let I=await Rz(g);i.publish(i.buildEvent("ui.notify",I,l.payload.sessionId))}if(c)return;i.publish(i.buildEvent(l.payload.reason==="aborted"?"run.aborted":l.payload.reason==="error"||l.payload.reason==="failed"?"run.failed":"run.completed",{reason:l.payload.reason,...b?{snapshot:b}:{}},l.payload.sessionId))}var tJ=["beforeRun","afterRun","beforeModel","afterModel","beforeTool","afterTool","onEvent"];function tn(i){return i&&typeof i==="object"&&!Array.isArray(i)?JSON.parse(JSON.stringify(i)):void 0}function rJ(i,l){let u=typeof i.name==="string"?i.name.trim():"",c=typeof i.description==="string"?i.description:"",g=typeof i.capabilityName==="string"?i.capabilityName.trim():"",b=tn(i.inputSchema);if(!u||!c||!b||!g||l.has(g))return;return l.add(g),{kind:"tool",capabilityName:g,name:u,description:c,inputSchema:b,...typeof i.successContext==="string"?{successContext:i.successContext}:{},...tn(i.lifecycle)?{lifecycle:tn(i.lifecycle)}:{}}}function K_(i){if(!Array.isArray(i))return[];let l=[],u=new Set;for(let c of i){if(!c||typeof c!=="object"||Array.isArray(c))continue;let g=c,b=g.kind,I=typeof g.capabilityName==="string"?g.capabilityName.trim():"";if(!I||u.has(I))continue;if(b==="tool"){let k=rJ(g,u);if(k)l.push(k);continue}if(b==="toolExecutor"){let k=g.executor;if(!vo(k))continue;u.add(I),l.push({kind:"toolExecutor",capabilityName:I,executor:k});continue}if(b==="hook"){let k=typeof g.name==="string"?g.name.trim():"";if(!k)continue;u.add(I),l.push({kind:"hook",capabilityName:I,name:k});continue}if(b==="compaction"){u.add(I),l.push({kind:"compaction",capabilityName:I,...tn(g.config)?{config:tn(g.config)}:{}});continue}if(b==="checkpoint"){u.add(I),l.push({kind:"checkpoint",capabilityName:I,...tn(g.config)?{config:tn(g.config)}:{}});continue}if(b==="mistakeLimit"){u.add(I),l.push({kind:"mistakeLimit",capabilityName:I});continue}if(b==="userInstructionService")u.add(I),l.push({kind:"userInstructionService",capabilityName:I})}return l}function G_(i){let l=i.metadata?{...i.metadata}:void 0;return{sessionId:i.sessionId,agentId:i.agentId,conversationId:i.conversationId,runId:i.runId,iteration:i.iteration,toolCallId:i.toolCallId,metadata:l&&Object.keys(l).length>0?l:void 0}}function X_(i){return Object.hasOwn(i,"update")?i.update:i}function Yl(i){return i.trim().replace(/^\/+/,"").toLowerCase()}function sJ(i){let l=(i??[]).map(Yl).filter(Boolean);return l.length>0?new Set(l):void 0}function iJ(i,l,u){if(!u)return!0;let c=Yl(i),g=Yl(l),b=c.includes(":")?c.split(":").at(-1)??c:c,I=g.includes(":")?g.split(":").at(-1)??g:g;return u.has(c)||u.has(g)||u.has(b)||u.has(I)}function gh(i,l){let u=sJ(l);return i.records.skill.map((c)=>({id:c.id,name:c.item.name,description:"description"in c.item&&typeof c.item.description==="string"?c.item.description:void 0,disabled:c.item.disabled===!0,skill:c.item})).filter((c)=>iJ(c.id,c.name,u))}function Gb(i,l){let u=async(c,g)=>{let b=Yl(c),I=gh(i,l).filter((T)=>T.id===b||Yl(T.name)===b||T.id.endsWith(`:${b}`)).filter((T)=>!T.disabled);if(I.length!==1)return I.length>1?`Skill "${c}" is ambiguous. Use one of: ${I.map((T)=>T.id).join(", ")}`:`Skill "${c}" not found.`;let k=I[0].skill;return W0(k,g)};return Object.defineProperty(u,"configuredSkills",{get:()=>gh(i,l).map(({skill:c,...g})=>g),enumerable:!0}),u}function nJ(i,l,u,c){let g={records:{skill:[],rule:[],workflow:[]},runtimeCommands:[]},b=async()=>{let I=await c(i,u.capabilityName,{},l);if(I?.snapshot)g=I.snapshot};return{start:b,stop:()=>{},refreshType:async()=>{await b()},listRecords:(I)=>[...g.records[I]],listRuntimeCommands:()=>[...g.runtimeCommands],resolveRuntimeSlashCommand:(I,k)=>{if(!I.startsWith("/")||I.length<2)return I;let T=I.match(/^\/(\S+)/)?.[1];if(!T)return I;let E=qo(T),A=g.runtimeCommands.find((C)=>qo(C.name)===E);if(!A)return I;if(A.kind==="skill"&&k?.expandSkillCommands===!1)return I;return`${A.instructions}${I.slice(T.length+1)}`},hasConfiguredSkills:(I)=>gh(g,I).some((k)=>!k.disabled),createSkillsExecutor:(I)=>Gb(g,I),createExtension:(I)=>({name:"cline-hub-user-instructions",manifest:{capabilities:[I.includeRules?"rules":void 0,I.registerSkillsTool?"tools":void 0,I.includeSkills||I.includeWorkflows?"commands":void 0].filter((k)=>Boolean(k))},setup(k){if(I.includeRules)k.registerRule({id:"cline-hub-user-instructions:rules",source:"hub-user-instructions",content:()=>z0(g.records.rule)});if(I.registerSkillsTool)k.registerTool(tc(Gb(g,I.allowedSkillNames)));for(let T of g.runtimeCommands.filter((E)=>E.kind==="skill"&&I.includeSkills||E.kind==="workflow"&&I.includeWorkflows))k.registerCommand({name:T.name,description:T.description,handler:(E)=>{let A=E.trim();return A?`${T.instructions}
|
|
1099
|
+
|
|
1100
|
+
${A}`:T.instructions}})}})}}function oJ(i,l,u,c){let g=u.map((b)=>[b.executor,async(...I)=>{let k=I.at(-1),T=I.slice(0,-1);return(await c(i,b.capabilityName,{executor:b.executor,args:T,context:G_(k)},l,k.emitUpdate?(E)=>{k.emitUpdate?.(X_(E))}:void 0))?.result}]);return g.length>0?Object.fromEntries(g):void 0}function aJ(i,l,u,c){if(u.length===0)return;return u.map((g)=>({name:g.name,description:g.description,inputSchema:g.inputSchema,lifecycle:g.lifecycle,successContext:g.successContext,async execute(b,I){return(await c(i,g.capabilityName,{toolName:g.name,input:b,context:G_(I)},l,I.emitUpdate?(k)=>{I.emitUpdate?.(X_(k))}:void 0))?.result}}))}var lJ=new Set(["assistant-text-delta","assistant-reasoning-delta","tool-call-delta","tool-updated"]);function dJ(i,l,u,c){let g=new Map(u.map((I)=>[I.name,I])),b={};for(let I of tJ){let k=g.get(I);if(!k)continue;b[I]=async(T)=>{if(I==="onEvent"&&lJ.has(T.type))return;return(await c(i,k.capabilityName,{context:T},l))?.control}}return Object.keys(b).length>0?b:void 0}function J_(i){let l=i.contributions.filter((T)=>T.kind==="toolExecutor"),u=i.contributions.filter((T)=>T.kind==="tool"),c=i.contributions.filter((T)=>T.kind==="hook"),g=i.contributions.find((T)=>T.kind==="compaction"),b=i.contributions.find((T)=>T.kind==="checkpoint"),I=i.contributions.find((T)=>T.kind==="mistakeLimit"),k=i.contributions.find((T)=>T.kind==="userInstructionService");return{hasClientContributions:i.contributions.length>0,toolExecutors:oJ(i.sessionId,i.targetClientId,l,i.requestCapability),localRuntime:{...c.length>0?{hooks:dJ(i.sessionId,i.targetClientId,c,i.requestCapability)}:{},...u.length>0?{extraTools:aJ(i.sessionId,i.targetClientId,u,i.requestCapability)}:{},...g?{compaction:{...i.sessionConfig?.compaction??{},...g.config,compact:async(T)=>(await i.requestCapability(i.sessionId,g.capabilityName,{context:T},i.targetClientId))?.result}}:{},...b?{checkpoint:{...i.sessionConfig?.checkpoint??{},...b.config,createCheckpoint:async(T)=>(await i.requestCapability(i.sessionId,b.capabilityName,{context:T},i.targetClientId))?.result}}:{},...I?{onConsecutiveMistakeLimitReached:async(T)=>(await i.requestCapability(i.sessionId,I.capabilityName,{context:T},i.targetClientId))?.result}:{},...k?{userInstructionService:nJ(i.sessionId,i.targetClientId,k,i.requestCapability)}:{}}}}var Xb="hubCapabilityOwnerClientId";function rn(i,l){let u=i?.[l];return typeof u==="string"&&u.trim()?u.trim():void 0}function V_(i){let l=is(i),u=typeof l?.name==="string"?l.name.trim():"";if(!u)return;let c=rn(l,"version"),g=rn(l,"platform"),b=rn(l,"platformVersion");return{name:u,...c?{version:c}:{},...g?{platform:g}:{},...b?{platformVersion:b}:{},...typeof l?.isMultiRoot==="boolean"?{isMultiRoot:l.isMultiRoot}:{}}}function Y_(i){let l=is(i),u=rn(l,"distinctId"),c=l?.accountId===null?null:rn(l,"accountId"),g=rn(l,"email"),b=rn(l,"organizationId");if(!u&&c===void 0&&!g&&!b)return;return{...u?{distinctId:u}:{},...c!==void 0?{accountId:c}:{},...g?{email:g}:{},...b?{organizationId:b}:{}}}async function Q_(i,l){let u=await i.sessionHost.deleteSession(l);i.sessionState.delete(l);try{i.sessionSearch.removeSession(l)}catch(c){Ae("warn","session search eviction failed",{error:c,sessionId:l})}return u}function Z_(i,l,u){let c=HL(u);return i.filter((g)=>(l!=="yolo"||g.name!==jf)&&WL(g.name,c))}function Cd(i){return typeof i==="string"&&i.trim().length>0?i.trim():void 0}function uJ(i){if(i===null)return null;let l=Dn.safeParse(i);return l.success?l.data:void 0}function cJ(i){let l=is(i)??{},u={},c=Cd(l.providerId);if(c)u.providerId=c;let g=Cd(l.modelId);if(g)u.modelId=g;let b=Cd(l.apiKey);if(b!==void 0)u.apiKey=b;let I=Cd(l.baseUrl);if(I!==void 0)u.baseUrl=I;if(l.headers&&typeof l.headers==="object")u.headers=l.headers;if(l.providerConfig&&typeof l.providerConfig==="object")u.providerConfig=l.providerConfig;if(Object.hasOwn(l,"thinking")){if(typeof l.thinking==="boolean"||l.thinking===null)u.thinking=l.thinking}if(Object.hasOwn(l,"reasoningEffort")){let k=uJ(l.reasoningEffort);if(k!==void 0)u.reasoningEffort=k}if(Object.hasOwn(l,"thinkingBudgetTokens")){if(typeof l.thinkingBudgetTokens==="number"&&Number.isFinite(l.thinkingBudgetTokens)&&l.thinkingBudgetTokens>0)u.thinkingBudgetTokens=Math.trunc(l.thinkingBudgetTokens);else if(l.thinkingBudgetTokens===null)u.thinkingBudgetTokens=null}return nf(u)}function pJ(i,l){return i.sessionState.get(l)?.createdByClientId}function Jb(i){return typeof i==="string"||i===null?i:void 0}function mJ(i){if(!i||!("autoApproveTools"in i)&&!(Xb in i))return i;let l={...i};return delete l[Xb],delete l.autoApproveTools,l}function eE(i,l){let u=is(i),c=is(u?.["*"]);if(typeof c?.autoApprove==="boolean")return c.autoApprove;return l.autoApproveTools===!0}function tE(i){let l=pJ(i.ctx,i.sessionId);if(!l)return ve(i.envelope,"session_wrong_client",`Session ${i.sessionId} has no owner`);if(l!==i.clientId)return ve(i.envelope,"session_wrong_client",`Session ${i.sessionId} is owned by ${l}`);return}function rE(i){let l=is(i);if(!l)return;let u={};for(let[c,g]of Object.entries(l)){let b=is(g)?.enabled;u[c]=typeof b==="boolean"?{enabled:b}:{}}return Object.keys(u).length>0?u:void 0}async function Vb(i,l,u){let c=performance.now(),g={command:l.command,requestId:l.requestId,clientId:l.clientId,sessionId:l.sessionId};Ae("info","session.create.begin",g);let b=l.payload&&typeof l.payload==="object"?l.payload:{},I=b.metadata&&typeof b.metadata==="object"?JSON.parse(JSON.stringify(b.metadata)):{},k=b.sessionConfig&&typeof b.sessionConfig==="object"?JSON.parse(JSON.stringify(b.sessionConfig)):void 0,T=b.runtimeOptions&&typeof b.runtimeOptions==="object"?b.runtimeOptions:{},E=V_(T.clientContext),A=Y_(T.userContext),C=Zu(b.initialCompactionState);if(typeof k?.mode==="string")I.mode=k.mode;else if(typeof T.mode==="string")I.mode=T.mode;if(typeof k?.systemPrompt==="string")I.systemPrompt=k.systemPrompt;else if(typeof T.systemPrompt==="string")I.systemPrompt=T.systemPrompt;if(k?.checkpoint?.enabled===!0)I.checkpointEnabled=!0;else if(T.checkpointEnabled===!0)I.checkpointEnabled=!0;I.autoApproveTools=eE(b.toolPolicies,T);let N=b.modelSelection&&typeof b.modelSelection==="object"?b.modelSelection:{},O=typeof b.workspaceRoot==="string"&&b.workspaceRoot.trim()?b.workspaceRoot.trim():typeof b.cwd==="string"&&b.cwd.trim()?b.cwd.trim():void 0,L=l.clientId?.trim()||"hub-client",D=K_(T.clientContributions);Ae("info","session.create.contributions_parsed",{...g,clientId:L,workspaceRoot:O,cwd:typeof b.cwd==="string"?b.cwd:void 0,contributionCount:D.length});let U=(typeof k?.sessionId==="string"?k.sessionId.trim():"")||P(),F=Kn(T.configExtensions);Ae("info","session.create.runtime_build.begin",{...g,sessionId:U,configExtensionCount:F?.length??0}),i.detachedClientsBySession?.get(U)?.delete(L);let j=J_({sessionId:U,targetClientId:L,contributions:D,sessionConfig:k,requestCapability:i.requestCapability});Ae("info","session.create.start_session.begin",{...g,sessionId:U,provider:k?.providerId??(typeof N.provider==="string"?N.provider:typeof I.provider==="string"?I.provider:"hub"),model:k?.modelId??(typeof N.model==="string"?N.model:typeof I.model==="string"?I.model:"hub")});let H=k?.mode??(T.mode==="plan"||T.mode==="yolo"?T.mode:"act"),Q=await i.sessionHost.startSession({source:typeof I.source==="string"?I.source:void 0,interactive:I.interactive!==!1,sessionMetadata:Object.keys(I).length>0?I:void 0,initialMessages:Array.isArray(b.initialMessages)?b.initialMessages:void 0,initialCompactionState:C,localRuntime:{modelCatalogDefaults:{loadLatestOnInit:!0,loadPrivateOnAuth:!0},configExtensions:F,...j.localRuntime,...E||A?{extensionContext:{...j.localRuntime.extensionContext,...E?{client:E}:{},...A?{user:A}:{}}}:{},extensions:[...i.sessionExtensions??[],...j.localRuntime.extensions??[]],extraTools:Z_([...i.sessionTools??[],...j.localRuntime.extraTools??[]],H,typeof I.source==="string"?I.source:void 0)},capabilities:{toolExecutors:j.toolExecutors,requestToolApproval:u},config:{...k??{},sessionId:U,providerId:k?.providerId??(typeof N.provider==="string"?N.provider:typeof I.provider==="string"?I.provider:"hub"),modelId:k?.modelId??(typeof N.model==="string"?N.model:typeof I.model==="string"?I.model:"hub"),apiKey:k?.apiKey??(typeof N.apiKey==="string"?N.apiKey:void 0),cwd:k?.cwd??(typeof b.cwd==="string"&&b.cwd.trim()?b.cwd.trim():O),workspaceRoot:k?.workspaceRoot??O,systemPrompt:k?.systemPrompt??(typeof T.systemPrompt==="string"?T.systemPrompt:""),mode:H,maxIterations:k?.maxIterations??(typeof T.maxIterations==="number"?T.maxIterations:void 0),enableTools:k?.enableTools??T.enableTools!==!1,enableSpawnAgent:k?.enableSpawnAgent??T.enableSpawn!==!1,enableAgentTeams:k?.enableAgentTeams??T.enableTeams!==!1,checkpoint:k?.checkpoint??(T.checkpointEnabled===!0?{enabled:!0}:void 0),teamName:k?.teamName??(typeof I.teamName==="string"?I.teamName:void 0)},toolPolicies:b.toolPolicies&&typeof b.toolPolicies==="object"&&!Array.isArray(b.toolPolicies)?JSON.parse(JSON.stringify(b.toolPolicies)):T.autoApproveTools===!0?{"*":{autoApprove:!0}}:void 0,plugins:rE(b.plugins)}),z=Q.pluginIssues??[];if(z.length>0)Ae("warn","session.create.plugin_issues",{...g,sessionId:Q.sessionId,plugins:z.map((oe)=>({name:oe.name,state:oe.state,reason:oe.reason,phase:oe.lastError?.phase,message:oe.lastError?.message}))});Ae("info","session.create.start_session.end",{...g,sessionId:Q.sessionId,elapsedMs:Math.round(performance.now()-c),hasImmediateResult:!!Q.result}),q_(i,Q.sessionId,L,"creator",{interactive:I.interactive!==!1}),Ae("info","session.create.read_records.begin",{...g,sessionId:Q.sessionId});let[W,ee]=await Promise.all([Nr(i,Q.sessionId),ns(i,Q.sessionId)]);Ae("info","session.create.read_records.end",{...g,sessionId:Q.sessionId,hasSession:!!W,hasSnapshot:!!ee,elapsedMs:Math.round(performance.now()-c)});let te=z.length>0?{pluginIssues:JSON.parse(JSON.stringify(z))}:{};if(W)i.publish(i.buildEvent("session.created",{session:W,...ee?{snapshot:ee}:{},...te},Q.sessionId));return Ae("info","session.create.reply",{...g,sessionId:Q.sessionId,elapsedMs:Math.round(performance.now()-c)}),ue(l,{session:W,...ee?{snapshot:ee}:{},...te})}async function hJ(i,l,u){let c=l.payload&&typeof l.payload==="object"?l.payload:{},g=typeof c.sessionId==="string"?c.sessionId.trim():l.sessionId?.trim()||"",b=c.checkpointRunCount;if(!g)return ve(l,"invalid_restore","session.restore requires a session id");let I=c.restore&&typeof c.restore==="object"?c.restore:{},k=I.messages!==!1;if(typeof b!=="number")return ve(l,"invalid_restore","checkpointRunCount must be a positive integer");try{let T=c.sessionConfig&&typeof c.sessionConfig==="object"?JSON.parse(JSON.stringify(c.sessionConfig)):void 0;if(k&&!T)return ve(l,"invalid_restore","sessionConfig is required when restore.messages is true");let E=c.runtimeOptions&&typeof c.runtimeOptions==="object"?c.runtimeOptions:{},A=V_(E.clientContext),C=Y_(E.userContext),N=Zu(c.initialCompactionState),O=c.metadata&&typeof c.metadata==="object"?JSON.parse(JSON.stringify(c.metadata)):{};if(typeof T?.mode==="string")O.mode=T.mode;else if(typeof E.mode==="string")O.mode=E.mode;if(typeof T?.systemPrompt==="string")O.systemPrompt=T.systemPrompt;else if(typeof E.systemPrompt==="string")O.systemPrompt=E.systemPrompt;if(T?.checkpoint?.enabled===!0)O.checkpointEnabled=!0;else if(E.checkpointEnabled===!0)O.checkpointEnabled=!0;O.autoApproveTools=eE(c.toolPolicies,E);let L=c.modelSelection&&typeof c.modelSelection==="object"?c.modelSelection:{},D=l.clientId?.trim()||"hub-client",U=K_(E.clientContributions),F=(typeof T?.sessionId==="string"?T.sessionId.trim():"")||P(),j=Kn(E.configExtensions);i.detachedClientsBySession?.get(F)?.delete(D);let H=J_({sessionId:F,targetClientId:D,contributions:U,sessionConfig:T,requestCapability:i.requestCapability}),Q=await new hf().restoreCheckpoint({sessionId:g,checkpointRunCount:b,telemetry:i.telemetry,restore:{messages:I.messages,workspace:I.workspace,omitCheckpointMessageFromSession:I.omitCheckpointMessageFromSession===!0},start:T,cwd:typeof T?.cwd==="string"&&T.cwd.trim()||typeof T?.workspaceRoot==="string"&&T.workspaceRoot.trim()||void 0,getSession:(te)=>i.sessionHost.getSession(te),readMessages:(te)=>i.sessionHost.readSessionMessages(te),buildStartInput:(te)=>{if(te.restoredCheckpointMetadata)O.checkpoint=te.restoredCheckpointMetadata;let oe=typeof c.workspaceRoot==="string"&&c.workspaceRoot.trim()?c.workspaceRoot.trim():typeof c.cwd==="string"&&c.cwd.trim()?c.cwd.trim():te.sourceSession.workspaceRoot||te.sourceSession.cwd,G=T?.mode??(E.mode==="plan"||E.mode==="yolo"?E.mode:"act");return{source:typeof O.source==="string"?O.source:void 0,interactive:O.interactive!==!1,sessionMetadata:{...O,restoredFromSessionId:g,restoredCheckpointRunCount:b},initialMessages:te.initialMessages,initialCompactionState:N,localRuntime:{modelCatalogDefaults:{loadLatestOnInit:!0,loadPrivateOnAuth:!0},configExtensions:j,...H.localRuntime,...A||C?{extensionContext:{...H.localRuntime.extensionContext,...A?{client:A}:{},...C?{user:C}:{}}}:{},extensions:[...i.sessionExtensions??[],...H.localRuntime.extensions??[]],extraTools:Z_([...i.sessionTools??[],...H.localRuntime.extraTools??[]],G,typeof O.source==="string"?O.source:void 0)},capabilities:{toolExecutors:H.toolExecutors,requestToolApproval:u},config:{...T??{},sessionId:F,providerId:T?.providerId??(typeof L.provider==="string"?L.provider:te.sourceSession.provider),modelId:T?.modelId??(typeof L.model==="string"?L.model:te.sourceSession.model),apiKey:T?.apiKey??(typeof L.apiKey==="string"?L.apiKey:""),cwd:T?.cwd??te.plan.cwd,workspaceRoot:T?.workspaceRoot??oe,systemPrompt:T?.systemPrompt??(typeof E.systemPrompt==="string"?E.systemPrompt:""),mode:G,maxIterations:T?.maxIterations??(typeof E.maxIterations==="number"?E.maxIterations:void 0),enableTools:T?.enableTools??E.enableTools!==!1,enableSpawnAgent:T?.enableSpawnAgent??E.enableSpawn!==!1,enableAgentTeams:T?.enableAgentTeams??E.enableTeams!==!1,checkpoint:T?.checkpoint??(E.checkpointEnabled===!0?{enabled:!0}:void 0),teamName:T?.teamName??(typeof O.teamName==="string"?O.teamName:void 0)},toolPolicies:c.toolPolicies&&typeof c.toolPolicies==="object"&&!Array.isArray(c.toolPolicies)?JSON.parse(JSON.stringify(c.toolPolicies)):E.autoApproveTools===!0?{"*":{autoApprove:!0}}:void 0,plugins:rE(c.plugins)}},startSession:(te)=>i.sessionHost.startSession(te),getStartedSessionId:(te)=>te.sessionId,cleanupStartedSession:async(te)=>{if(!await Q_(i,te.sessionId))throw Error(`Failed to clean up restored session ${te.sessionId}`)},readRestoredSession:(te)=>i.sessionHost.getSession(te)});if(!k)return ue(l,{checkpoint:Q.checkpoint});let z=Q.startResult;if(!z)return ve(l,"restore_failed","Checkpoint restore did not start a session");q_(i,z.sessionId,D,"creator",{interactive:O.interactive!==!1});let[W,ee]=await Promise.all([Nr(i,z.sessionId),ns(i,z.sessionId)]);if(W)i.publish(i.buildEvent("session.created",{session:W,...ee?{snapshot:ee}:{}},z.sessionId));return ue(l,{session:W,...ee?{snapshot:ee}:{},messages:Q.messages??[],checkpoint:Q.checkpoint})}catch(T){if(T instanceof Fs)return ve(l,T.code,T.code==="session_not_found"?`Unknown session: ${g}`:T.message);return ve(l,"restore_failed",T instanceof Error?T.message:String(T))}}async function fJ(i,l){let u=Qe(l);if(!u)return ve(l,"invalid_session_attach","session.attach requires a session id");let c=await Nr(i,u);if(!c)return ve(l,"session_not_found",`Unknown session: ${u}`);i2(i,u,l.clientId?.trim()||"hub-client","participant");let g=await Nr(i,u);return i.publish(i.buildEvent("session.attached",{session:g??c},u)),ue(l,{session:g??c})}async function gJ(i,l){let u=Qe(l);if(!u)return ve(l,"invalid_session_detach","session.detach requires a session id");let c=l.clientId?.trim()||"hub-client",g=i.detachedClientsBySession?.get(u);if(!g&&i.detachedClientsBySession)g=new Set,i.detachedClientsBySession.set(u,g);g?.add(c);let b=i.sessionState.get(u);if(b){if(b.participants.delete(c),b.createdByClientId===c)b.createdByClientId=void 0;if(b.participants.size===0)i.sessionState.delete(u)}Jl(i,(T)=>T.sessionId===u&&T.targetClientId===c,ju);let[I,k]=await Promise.all([Nr(i,u),ns(i,u)]);return i.publish(i.buildEvent("session.detached",I?{session:I,...k?{snapshot:k}:{},clientId:c}:{clientId:c},u)),ue(l)}async function yJ(i,l){let u=Qe(l),c=l.payload?.includeSnapshot===!0,[g,b]=await Promise.all([Nr(i,u),c?ns(i,u):Promise.resolve(void 0)]);return g?ue(l,{session:g,...b?{snapshot:b}:{}}):ve(l,"session_not_found",`Unknown session: ${u}`)}async function vJ(i,l){let u=Qe(l);if(!u)return ve(l,"invalid_session_id","session.messages requires a session id");if(!await Nr(i,u))return ve(l,"session_not_found",`Unknown session: ${u}`);let c=await i.sessionHost.readSessionMessages(u);return ue(l,{sessionId:u,messages:c})}async function wJ(i,l){let u=Qe(l);if(!u)return ve(l,"invalid_session_id","session.compaction.get requires a session id");if(!await Nr(i,u))return ve(l,"session_not_found",`Unknown session: ${u}`);let c=l.clientId?.trim()||"hub-client",g=tE({sessionId:u,ctx:i,clientId:c,envelope:l});if(g)return g;let b=await i.sessionHost.readSessionCompactionState(u);return ue(l,{sessionId:u,state:b})}async function bJ(i,l){let u=typeof l.payload?.limit==="number"?l.payload.limit:200,c=(await i.sessionHost.listSessions(u,{rootOnly:l.payload?.rootOnly===!0})).map((g)=>F_(g,i.sessionState.get(g.sessionId)));return ue(l,{sessions:c})}async function IJ(i,l){let u=l.payload??{};if(typeof u.query!=="string"||!u.query.trim())return ve(l,"invalid_search_query","session.search requires a non-empty query");return ue(l,{hits:i.sessionSearch.search({query:u.query,limit:u.limit,workspaceRoot:u.workspaceRoot})})}async function kJ(i,l){let u=Qe(l),c=mJ(is(l.payload?.metadata)),g=Jb(l.payload?.prompt),b=Jb(l.payload?.title),I=await i.sessionHost.updateSession(u,{metadata:c,...g!==void 0?{prompt:g}:{},...b!==void 0?{title:b}:{}}),[k,T]=await Promise.all([Nr(i,u),ns(i,u)]);if(k)i.publish(i.buildEvent("session.updated",{session:k,...T?{snapshot:T}:{}},u));return{version:l.version,requestId:l.requestId,ok:I.updated,payload:{updated:I.updated,session:k,...T?{snapshot:T}:{}}}}async function SJ(i,l){let u=Qe(l);if(!u)return ve(l,"invalid_session_update_connection","session.update_connection requires a session id");let c=i.sessionHost.updateSessionConnection;if(!c)return ve(l,"unsupported_session_update_connection","runtime host does not support session connection updates");let g=is(l.payload),b=cJ(g?.updates);return await c.call(i.sessionHost,u,b),ue(l,{sessionId:u,updated:!0})}async function TJ(i,l){let u=Qe(l);if(!u)return ve(l,"invalid_session_id","session.compaction.update requires a session id");let c=l.clientId?.trim()||"hub-client",g=await Nr(i,u);if(!g)return ve(l,"session_not_found",`Unknown session: ${u}`);let b=tE({sessionId:u,ctx:i,clientId:c,envelope:l});if(b)return b;let I=l.payload&&typeof l.payload==="object"?l.payload:{},k=Zu(I.state);if(!k)return ve(l,"invalid_compaction_state","session.compaction.update requires a valid compaction state");let T=await i.sessionHost.updateSessionCompactionState(u,k),[E,A]=T.updated?await Promise.all([Nr(i,u),ns(i,u)]):[g,void 0];if(T.updated)i.publish(i.buildEvent("session.updated",{session:E??g,...A?{snapshot:A}:{}},u));return{version:l.version,requestId:l.requestId,ok:!0,payload:{updated:T.updated,session:E??g,...A?{snapshot:A}:{}}}}async function _J(i,l){let u=Qe(l),c=await Q_(i,u);return ue(l,{deleted:c})}async function EJ(i,l){let u=Qe(l),c=i.sessionHost.pendingPrompts;if(!c)return ve(l,"pending_prompts_unavailable","Pending prompt service is not available.");let g=await c.list({sessionId:u});return ue(l,{sessionId:u,prompts:g})}async function AJ(i,l){let u=Qe(l),c=i.sessionHost.pendingPrompts;if(!c)return ve(l,"pending_prompts_unavailable","Pending prompt service is not available.");let g=await c.steerFirst({sessionId:u});return ue(l,g)}async function xJ(i,l){let u=Qe(l),c=typeof l.payload?.promptId==="string"?l.payload.promptId.trim():"",g=typeof l.payload?.prompt==="string"?l.payload.prompt:void 0,b=l.payload?.delivery==="queue"||l.payload?.delivery==="steer"?l.payload.delivery:void 0,I=i.sessionHost.pendingPrompts;if(!I)return ve(l,"pending_prompts_unavailable","Pending prompt service is not available.");let k=await I.update({sessionId:u,promptId:c,prompt:g,delivery:b});return ue(l,k)}async function CJ(i,l){let u=Qe(l),c=typeof l.payload?.promptId==="string"?l.payload.promptId.trim():"",g=i.sessionHost.pendingPrompts;if(!g)return ve(l,"pending_prompts_unavailable","Pending prompt service is not available.");let b=await g.delete({sessionId:u,promptId:c});return ue(l,b)}var PJ=604800000,MJ=200000,NJ=67108864,OJ=16777216;function $J(i){let l=i?.replace(/[^a-zA-Z0-9_-]/g,"-");return RJ(xe(),l?`hub-events-${l}.db`:"hub-events.db")}class sE{db;retentionMs;maxRows;maxTotalBytes;appendedBytesSincePrune=0;closed=!1;constructor(i={}){this.db=V(i.dbPath??$J(i.ownerId)),this.retentionMs=i.retentionMs??PJ,this.maxRows=i.maxRows??MJ,this.maxTotalBytes=i.maxTotalBytes??NJ,this.db.exec("PRAGMA journal_mode = WAL;"),this.db.exec("PRAGMA synchronous = NORMAL;"),this.db.exec("PRAGMA busy_timeout = 5000;"),this.db.exec(`
|
|
1101
|
+
CREATE TABLE IF NOT EXISTS hub_events (
|
|
1102
|
+
sequence INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1103
|
+
event TEXT NOT NULL,
|
|
1104
|
+
session_id TEXT,
|
|
1105
|
+
envelope_json TEXT NOT NULL,
|
|
1106
|
+
created_at INTEGER NOT NULL
|
|
1107
|
+
);
|
|
1108
|
+
CREATE INDEX IF NOT EXISTS idx_hub_events_session
|
|
1109
|
+
ON hub_events(session_id, sequence);
|
|
1110
|
+
CREATE INDEX IF NOT EXISTS idx_hub_events_created
|
|
1111
|
+
ON hub_events(created_at);
|
|
1112
|
+
`)}append(i){if(this.closed)return i;let l=i.timestamp??Date.now(),u=JSON.stringify(i),c=this.db.prepare(`INSERT INTO hub_events (event, session_id, envelope_json, created_at)
|
|
1113
|
+
VALUES (?, ?, ?, ?);`).run(i.event,i.sessionId??null,u,l)?.lastInsertRowid,g=typeof c==="number"||typeof c==="bigint"?Number(c):this.lastSequence();if(this.appendedBytesSincePrune+=Buffer.byteLength(u),this.appendedBytesSincePrune>=OJ)this.appendedBytesSincePrune=0,this.prune();return{...i,sequence:g}}listAfter(i,l,u){if(this.closed)return[];let c=["sequence > ?"],g=[i];if(l.sessionId)c.push("session_id = ?"),g.push(l.sessionId);return g.push(u),this.db.prepare(`SELECT sequence, envelope_json FROM hub_events
|
|
1114
|
+
WHERE ${c.join(" AND ")} ORDER BY sequence LIMIT ?;`).all(...g).flatMap((b)=>{try{return[{...JSON.parse(String(b.envelope_json)),sequence:Number(b.sequence)}]}catch{return[]}})}lastSequence(){if(this.closed)return 0;let i=this.db.prepare("SELECT MAX(sequence) AS sequence FROM hub_events;").get();return Number(i?.sequence??0)}prune(i=Date.now()){if(this.closed)return;if(this.db.prepare("DELETE FROM hub_events WHERE created_at < ?;").run(i-this.retentionMs),this.db.prepare(`DELETE FROM hub_events WHERE sequence <= (
|
|
1115
|
+
SELECT sequence FROM hub_events ORDER BY sequence DESC
|
|
1116
|
+
LIMIT 1 OFFSET ?
|
|
1117
|
+
);`).run(this.maxRows),this.fileSizeBytes()>this.maxTotalBytes){this.db.prepare(`DELETE FROM hub_events WHERE sequence <= (
|
|
1118
|
+
SELECT sequence FROM (
|
|
1119
|
+
SELECT sequence, SUM(LENGTH(CAST(envelope_json AS BLOB))) OVER (
|
|
1120
|
+
ORDER BY sequence DESC
|
|
1121
|
+
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
|
|
1122
|
+
) AS newer_bytes FROM hub_events
|
|
1123
|
+
)
|
|
1124
|
+
WHERE newer_bytes > ? ORDER BY sequence DESC LIMIT 1
|
|
1125
|
+
);`).run(Math.floor(this.maxTotalBytes/2));try{this.db.exec("VACUUM;")}catch{}}}fileSizeBytes(){let i=(l)=>Number(this.db.prepare(`PRAGMA ${l};`).get()?.[l]??0);return i("page_count")*i("page_size")}close(){if(this.closed)return;this.closed=!0,this.db.close?.()}}function LJ(i){switch(i){case"schedule.create":return"schedule.created";case"schedule.update":case"schedule.enable":case"schedule.disable":return"schedule.updated";case"schedule.delete":return"schedule.deleted";case"schedule.trigger":return"schedule.triggered";default:return}}var DJ=new Set(["task.create","task.list","task.get","task.update","task.approve","task.cancel","task.run","task.automation.get","task.automation.set"]);function UJ(i){return DJ.has(i)}function FJ(i){return i.payload&&typeof i.payload==="object"?i.payload:{}}function Rd(i){return typeof i.taskId==="string"?i.taskId.trim():""}function Zp(i){let l=i.expectedRevision;if(typeof l!=="number"||!Number.isInteger(l)||l<1)throw Error("expectedRevision must be a positive integer");return l}class iE{tasks;constructor(i){this.tasks=i}async handleCommand(i,l){let u=FJ(i),c={kind:"user",id:i.clientId?.trim()||"hub-client",clientId:i.clientId?.trim()||void 0};try{let g=this.resolveWorkspace(l);switch(i.command){case"task.create":{let b=await this.tasks.createTask({...u,scope:"workspace",workspaceRoot:g,cwd:g,requiresApproval:!1,createdBy:c});return ue(i,{task:b})}case"task.list":{let b=u,[I,k]=await Promise.all([this.tasks.listTasks({...b,scope:"workspace",workspaceRoot:g}),this.tasks.listTasks({...b,scope:"global",workspaceRoot:void 0})]);return ue(i,{tasks:[...I,...k]})}case"task.get":{let b=await this.requireScopedTask(u,g);return ue(i,{task:b})}case"task.update":{let b=await this.requireScopedTask(u,g),I=await this.tasks.updateTask({...u,scope:b.scope,workspaceRoot:b.workspaceRoot??null,cwd:b.cwd??null,updatedBy:c});return ue(i,{task:I})}case"task.approve":return await this.requireScopedTask(u,g),ue(i,{task:await this.tasks.approveTask(Rd(u),c,Zp(u))});case"task.cancel":return await this.requireScopedTask(u,g),ue(i,{task:await this.tasks.cancelTask(Rd(u),c,Zp(u),typeof u.reason==="string"?u.reason:void 0)});case"task.run":{await this.requireScopedTask(u,g);let b=await this.tasks.runTask(Rd(u),c,Zp(u),i.clientId);return ue(i,b)}case"task.automation.get":return ue(i,{policy:await this.tasks.getAutomationPolicy(g)});case"task.automation.set":{let b=u.policy&&typeof u.policy==="object"&&!Array.isArray(u.policy)?u.policy:void 0;if(!b)throw Error("task.automation.set requires a policy object");return ue(i,{policy:await this.tasks.setAutomationPolicy({...b,scopeKey:g},c)})}default:return ve(i,"unsupported_command",`Unsupported agenda task command: ${i.command}`)}}catch(g){return ve(i,"task_command_failed",g instanceof Error?g.message:String(g))}}resolveWorkspace(i){let l=i?.workspaceContext?.workspaceRoot?.trim();if(!i?.clientId||!l)throw Error("task commands require a Hub-authorized workspace");return Yb(l)}async requireScopedTask(i,l){let u=await this.tasks.getTask(Rd(i));if(!u||u.scope==="workspace"&&(!u.workspaceRoot||Yb(u.workspaceRoot)!==l))throw Error("task does not exist in this workspace");return u}}var Pd=!1,qJ=new Set(["skills","workflows","rules","plugins","tools","mcp"]);function yh(i){return typeof i==="object"&&i!==null&&!Array.isArray(i)}function Ul(i,l){let u=i[l];if(u===void 0)return;if(typeof u!=="string")throw Error(`settings payload '${l}' must be a string.`);return u}function nE(i,l){let u=i[l];if(u===void 0)return;if(typeof u!=="boolean")throw Error(`settings payload '${l}' must be a boolean.`);return u}function jJ(i,l){let u=i[l];if(u===void 0)return;if(!Array.isArray(u)||!u.every((c)=>typeof c==="string"))throw Error(`settings payload '${l}' must be an array of strings.`);return u}function oE(i){if(i===void 0)return{};if(!yh(i))throw Error("settings.list payload must be an object.");return{cwd:Ul(i,"cwd"),workspaceRoot:Ul(i,"workspaceRoot"),agentPluginPaths:jJ(i,"agentPluginPaths"),includePluginTools:nE(i,"includePluginTools"),availabilityContext:yh(i.availabilityContext)?i.availabilityContext:void 0}}function BJ(i){if(!yh(i))throw Error("settings.toggle payload must be an object.");let{type:l}=i;if(typeof l!=="string"||!qJ.has(l))throw Error("settings.toggle payload 'type' must be one of: skills, workflows, rules, plugins, tools, mcp.");return{...oE(i),type:l,id:Ul(i,"id"),path:Ul(i,"path"),name:Ul(i,"name"),enabled:nE(i,"enabled")}}var HJ={debug:(i,l)=>Ae("debug",i,l),log:(i,l)=>Ae(l?.severity==="warn"||l?.severity==="error"?"warn":"info",i,l),error:(i,l)=>Ae("error",i,l)};class aE{options;clients=new Map;listeners=new Map;sessionState=new Map;pendingApprovals=new Map;pendingCapabilityRequests=new Map;suppressNextTerminalEventBySession=new Map;activeRpcTurnCountBySession=new Map;schedules;scheduleCommands;tasks;taskCommands;sessionTools=[];sessionExtensions=[];settings;sessionSearch;cronService;sessionHost;hubId=P("hub_");ctx;eventLog;eventLogPruneTimer;runQueue;runExecutor;draining=!1;pendingPluginCommands=new Set;plugins=rd();unsubscribePluginStatus;cloud;constructor(i){this.options=i,this.cloud=new U_({...i.cloudSessionOptions,logger:i.logger,telemetry:i.telemetry,publish:(u,c)=>this.publish(Vt("cloud.event",{event:u,...c},u?.sessionId))}),this.plugins.setLogger(HJ),this.unsubscribePluginStatus=this.plugins.subscribe((u)=>{this.publish(Vt("plugin.status_changed",{plugin:JSON.parse(JSON.stringify(u))}))}),this.sessionHost=i.sessionHost??new Sf({sessionService:new _f(new Tf),fetch:i.fetch,logger:i.logger,telemetry:i.telemetry}),this.sessionSearch=new KT(this.sessionHost,i.sessionSearchOptions??{});let l=this.sessionSearch.getInitializationError();if(l!==void 0)Ni("session search is unavailable",l);if(this.ctx={isDraining:()=>this.draining,sessionSearch:this.sessionSearch,clients:this.clients,sessionState:this.sessionState,pendingApprovals:this.pendingApprovals,pendingCapabilityRequests:this.pendingCapabilityRequests,detachedClientsBySession:new Map,suppressNextTerminalEventBySession:this.suppressNextTerminalEventBySession,activeRpcTurnCountBySession:this.activeRpcTurnCountBySession,telemetry:i.telemetry,sessionTools:this.sessionTools,sessionExtensions:this.sessionExtensions,sessionHost:this.sessionHost,publish:(u)=>this.publish(u),buildEvent:Vt,requestCapability:(u,c,g,b,I)=>c2(this.ctx,u,c,g,b,I)},this.tasks=new a_({...i.taskOptions,automationEnabled:Pd,watchFiles:Pd&&i.taskOptions?.watchFiles!==!1,runtime:{isInteractiveClientAvailable:()=>[...this.clients.values()].some((u)=>u.capabilities.some((c)=>c.name===gs)),startSession:(u,c,g,b)=>this.startAgendaTaskSession(u,c,g,b?.unattended===!0),runSession:(u,c,g)=>this.runAgendaTaskSession(u,c,g),abortSession:async(u,c)=>{await this.sessionHost.abort(u,c)}},logger:i.taskOptions?.logger??i.logger,publish:(u,c,g)=>{this.publish(Vt(u,c,g))}}),this.taskCommands=new iE(this.tasks),this.schedules=new WT({...i.scheduleOptions,telemetry:i.telemetry,runtimeHandlers:i.runtimeHandlers,eventPublisher:(u,c)=>{let g=u==="schedule.execution.completed"?"schedule.execution_completed":u==="schedule.execution.failed"?"schedule.execution_failed":void 0;if(!g)return;this.publish(Vt(g,c&&typeof c==="object"?c:void 0))}}),this.scheduleCommands=new zT(this.schedules),this.sessionTools.push(NG({todo:Pd?{manager:this.tasks,telemetry:i.telemetry,resolveSessionDefaults:async(u)=>{let c=await this.sessionHost.getSession(u);if(!c)return;let g=!gn(c.workspaceRoot)?c.workspaceRoot:void 0;return{workspaceRoot:g,cwd:g?c.cwd:void 0,modelSelection:{providerId:c.provider,modelId:c.model},originTaskId:typeof c.metadata?.agendaTaskId==="string"?c.metadata.agendaTaskId:void 0}}}:void 0,scheduled:{schedules:this.schedules,telemetry:i.telemetry,publish:(u,c,g)=>{this.publish(Vt(u,c,g))},resolveSessionDefaults:async(u)=>{let c=await this.sessionHost.getSession(u);if(!c)return;return{workspaceRoot:await jO(),modelSelection:{providerId:c.provider,modelId:c.model},interactive:c.interactive}}}})),this.sessionExtensions.push(OG({todoEnabled:Pd})),this.settings=i.settingsService??new t_,i.cronOptions)this.cronService=new BT({runtimeHandlers:i.runtimeHandlers,...i.cronOptions,telemetry:i.telemetry});this.sessionHost.subscribe((u)=>{if(Y2(this.ctx,u).catch((c)=>{Ni("session event handling failed",c),B(this.options.telemetry,{component:"core",operation:"hub.session_event_project",error:c,severity:"error",handled:!0,context:{eventType:u.type,sessionId:u.payload.sessionId}})}),u.type==="ended")this.sessionSearch.refreshNow().catch((c)=>{Ni("session search indexing failed",c)})})}async startAgendaTaskSession(i,l,u,c=!1){let g=(i.originSessionId?await this.sessionHost.getSession(i.originSessionId):void 0)?.metadata?.autoApproveTools===!0,b=c||g,I=i.modelSelection?.providerId?.trim()||"cline",k=i.modelSelection?.modelId?.trim()||(I==="cline"?hr:""),T=wn({title:i.title,agendaTaskId:i.taskId,agendaTaskRunId:l.runId,agendaTaskAssignee:i.assignee,interactive:!c,source:jr.CORE},{mode:"task",trigger:"agenda_task"}),E=u?.trim()||"agenda-task-manager",A=await Vb(this.ctx,{version:"v1",command:"session.create",requestId:P("task_session_"),clientId:E,payload:{workspaceRoot:i.workspaceRoot,cwd:i.cwd,sessionConfig:{providerId:I,modelId:k,systemPrompt:i.systemPrompt??"",mode:i.mode??"act",maxIterations:i.maxIterations,enableTools:!0,enableSpawnAgent:!0,enableAgentTeams:!0},metadata:T,runtimeOptions:{mode:i.mode??"act",maxIterations:i.maxIterations,enableTools:!0,enableSpawn:!0,enableTeams:!0},toolPolicies:{"*":{autoApprove:b,enabled:!0}}}},(L)=>Qp(this.ctx,L));if(!A.ok)throw Error(A.error?.message??"failed to create task session");let C=A.payload?.session,N=A.payload?.snapshot,O=typeof N?.sessionId==="string"?N.sessionId:typeof C?.sessionId==="string"?C.sessionId:"";if(!O)throw Error("task session did not return a session id");return{sessionId:O}}async runAgendaTaskSession(i,l,u){let c=l.resourcePaths.length?`
|
|
1126
|
+
|
|
1127
|
+
Relevant resources (paths are relative to workspace root ${l.workspaceRoot}):
|
|
1128
|
+
${l.resourcePaths.map((A)=>`- ${A} (absolute: ${vp(l.workspaceRoot??l.cwd??"",A)})`).join(`
|
|
1129
|
+
`)}`:"",g=l.assignee?`
|
|
1130
|
+
Assigned agent: ${l.assignee}. If a configured agent or subagent with this name is available, delegate the work to it and oversee completion; otherwise execute it directly and mention the fallback in the summary.`:"",b=`Execute this approved agenda task.
|
|
1131
|
+
|
|
1132
|
+
Title: ${l.title}
|
|
1133
|
+
Type: ${l.type}
|
|
1134
|
+
Priority: P${l.priority}${g}
|
|
1135
|
+
|
|
1136
|
+
${l.instructions}${c}`,I=await fh(this.ctx,{version:"v1",command:"run.start",requestId:P("task_run_"),clientId:u.requestedByClientId??"agenda-task-manager",sessionId:i,payload:{sessionId:i,input:b,mode:l.mode??"act",timeoutSeconds:l.timeoutSeconds}});if(!I.ok)return{status:"failed",error:I.error?.message??"task session run failed"};let k=I.payload?.result,T=typeof k?.finishReason==="string"?k.finishReason:void 0,E=typeof k?.text==="string"&&k.text.trim()?k.text.trim():void 0;if(T==="completed")return{status:"completed",summary:E};if(T==="aborted")return{status:"cancelled",summary:E};return{status:"failed",summary:E,error:E??(T?`Task session ended with ${T}`:"Task session did not return a completion result")}}getCronService(){return this.cronService}getHubId(){return this.hubId}async start(){if(this.sessionSearch.start(),await this.tasks.start(),await this.schedules.start(),this.cronService)try{await this.cronService.start()}catch(i){console.error("[hub] cron service start failed",i)}this.startEventLog(),this.startRunQueue()}startEventLog(){if(this.options.eventLog===!1||this.eventLog)return;try{let i=new sE({ownerId:this.options.owner?.ownerId,...this.options.eventLog??{}});i.prune(),this.eventLog=i,this.eventLogPruneTimer=setInterval(()=>{try{i.prune()}catch{}},3600000),this.eventLogPruneTimer.unref?.()}catch(i){Ae("error","event_log.start_failed",{error:i})}}startRunQueue(){if(this.options.runQueue===!1||this.runQueue)return;try{this.runQueue=new z_({ownerId:this.options.owner?.ownerId,...this.options.runQueue??{}}),this.runExecutor=new W_(this.ctx,this.runQueue);let i=this.runQueue.recoverOnStartup();for(let u of i.interrupted)this.publish(Vt("run.interrupted",{runId:u.runId,error:u.error,reason:"hub_restart"},u.sessionId));let l=new Set(i.requeued.map((u)=>u.sessionId));for(let u of l)this.runExecutor.pump(u);if(i.interrupted.length>0||i.requeued.length>0)Ae("info","run.queue.recovered",{interrupted:i.interrupted.length,requeued:i.requeued.length})}catch(i){Ae("error","run.queue.start_failed",{error:i})}}async stop(){if(this.draining=!0,await Promise.allSettled(this.pendingPluginCommands),this.unsubscribePluginStatus?.(),this.unsubscribePluginStatus=void 0,this.eventLogPruneTimer)clearInterval(this.eventLogPruneTimer),this.eventLogPruneTimer=void 0;for(let i of this.pendingApprovals.keys())j_(this.ctx,i,{approved:!1,reason:"Hub shutting down before approval was resolved."});if(Jl(this.ctx,()=>!0,"Hub shutting down before capability request was resolved."),await this.cloud.dispose(),await this.sessionSearch.dispose(),await this.tasks.dispose(),await this.sessionHost.dispose("hub_server_stop"),await this.schedules.dispose(),this.cronService)try{await this.cronService.dispose()}catch(i){console.error("[hub] cron service stop failed",i)}this.eventLog?.close(),this.eventLog=void 0,this.runQueue?.close(),this.runQueue=void 0,this.runExecutor=void 0}async handleCommand(i,l){try{if(l===null&&(i.command==="cloud.command"||i.command==="cloud.watch"))return ve(i,"client_not_registered","Register before accessing cloud sessions");let u=i.clientId?.trim(),c=l===void 0?this.options.workspaceRoot?.trim()&&u?{clientId:u,workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.workspaceRoot}}:void 0:l??void 0,g=await this.dispatchCommand(i,c);return this.captureFailedReply(i,g),g}catch(u){throw B(this.options.telemetry,{component:"core",operation:"hub.command",error:u,severity:"error",handled:!1,context:this.commandTelemetryContext(i)}),u}}async dispatchCommand(i,l){if(this.draining&&X2(i.command))return Kb(i);if(UJ(i.command))return await this.taskCommands.handleCommand(i,l);if(i.command==="cloud.command"||i.command==="cloud.watch"){let u=i.clientId?.trim();if(!u||!this.clients.has(u)||l&&l.clientId!==u)return ve(i,"client_not_registered","Register before accessing cloud sessions");if(this.draining&&i.command==="cloud.command"&&["create","attach","send"].includes(String(i.payload?.operation)))return Kb(i);try{if(i.command==="cloud.watch")return ue(i,this.cloud.watch());let c=await this.cloud.command(String(i.payload?.operation??""),i.payload?.args,i.payload?.scope);return ue(i,c)}catch(c){return ve(i,"cloud_command_failed",c instanceof Error?c.message:String(c))}}switch(i.command){case"client.register":{let u=f2(this.ctx,i);return this.tasks.notifyAutomationReadinessChanged(),u}case"client.update":{let u=g2(this.ctx,i);return this.tasks.notifyAutomationReadinessChanged(),u}case"client.unregister":{let u=y2(this.ctx,i,(c)=>{this.listeners.delete(c),this.detachClientFromSessions(c)});return this.tasks.notifyAutomationReadinessChanged(),u}case"client.list":return v2(this.ctx,i);case"session.create":return await Vb(this.ctx,i,(u)=>Qp(this.ctx,u));case"session.restore":return await hJ(this.ctx,i,(u)=>Qp(this.ctx,u));case"session.attach":return await fJ(this.ctx,i);case"session.detach":return await gJ(this.ctx,i);case"session.get":return await yJ(this.ctx,i);case"session.messages":return await vJ(this.ctx,i);case"session.compaction.get":return await wJ(this.ctx,i);case"session.list":{let u=await bJ(this.ctx,i);return{...u,payload:{...u.payload,activePluginRequests:this.pendingPluginCommands.size,activeCloudCommands:this.cloud.activeCommands}}}case"session.search":return await IJ(this.ctx,i);case"session.update":return await kJ(this.ctx,i);case"session.update_connection":return await SJ(this.ctx,i);case"session.mcp_apps.resolve_tool":return await C2(this.ctx,i);case"session.mcp_apps.read_resource":return await R2(this.ctx,i);case"session.mcp_apps.call_tool":return await P2(this.ctx,i);case"session.compaction.update":return await TJ(this.ctx,i);case"session.pending_prompts":return await EJ(this.ctx,i);case"session.steer_first_pending_prompt":return await AJ(this.ctx,i);case"session.update_pending_prompt":return await xJ(this.ctx,i);case"session.remove_pending_prompt":return await CJ(this.ctx,i);case"session.delete":return await _J(this.ctx,i);case"session.hook":return await j2(this.ctx,i);case"run.start":case"session.send_input":return await fh(this.ctx,i);case"run.enqueue":{if(!this.runQueue||!this.runExecutor)return{version:i.version,requestId:i.requestId,ok:!1,error:{code:"run_queue_unavailable",message:"This hub has no durable run queue; use run.start instead."}};return J2(this.ctx,i,this.runQueue,this.runExecutor)}case"run.list":{if(!this.runQueue)return ue(i,{runs:[]});return V2(i,this.runQueue)}case"hub.drain":return this.handleHubDrain(i);case"hub.status":return this.handleHubStatus(i);case"plugins.list":case"plugins.status":return ue(i,{plugins:this.plugins.list()});case"plugins.reload":return await this.handlePluginsReload(i);case"run.abort":return await F2(this.ctx,i);case"run.proceed_while_running":return await q2(this.ctx,i);case"capability.request":return await m2(this.ctx,i);case"approval.respond":return await o2(this.ctx,i);case"capability.respond":return h2(this.ctx,i);case"capability.progress":return p2(this.ctx,i);case"ui.notify":return this.publish(Vt("ui.notify",i.payload??{})),ue(i);case"ui.show_window":return this.publish(Vt("ui.show_window",i.payload??{})),ue(i);case"plugins.commands.list":case"plugins.commands.run":{let u=this.sessionHost.pluginCommands;if(!u)return{version:i.version,requestId:i.requestId,ok:!1,error:{code:"plugin_commands_unavailable",message:"This runtime does not support plugin commands"}};if(!l)throw Error("Plugin commands require a Hub-authorized workspace");let c=typeof i.payload?.workspacePath==="string"?i.payload.workspacePath:l.workspaceContext?.workspaceRoot;if(!c)throw Error("workspacePath is required");if(!l.crossWorkspace&&vp(c)!==vp(l.workspaceContext?.workspaceRoot??""))throw Error("Plugin workspace is outside the connection's authority");let g=i.sessionId,b={workspacePath:c,...g?{sessionId:g}:{}},I=Promise.resolve().then(async()=>i.command==="plugins.commands.list"?{catalog:await u.list(b)}:{result:await u.run({...b,prompt:String(i.payload?.prompt??"")})});this.pendingPluginCommands.add(I);try{return{version:i.version,requestId:i.requestId,ok:!0,payload:await I}}finally{this.pendingPluginCommands.delete(I)}}case"settings.list":return await this.handleSettingsList(i);case"settings.toggle":return await this.handleSettingsToggle(i);case"connector.channels":case"connector.configure":case"connector.delete_config":case"connector.start":case"connector.stop":case"connector.supervised":return await x2(this.ctx,i);case"settings.get":case"settings.patch":return{version:i.version,requestId:i.requestId,ok:!1,error:{code:"not_implemented",message:`${i.command} is not implemented yet.`}};default:{let u=await this.scheduleCommands.handleCommand(i,l);if(u.ok){let c=LJ(i.command);if(c)this.publish(Vt(c,u.payload))}return u}}}captureFailedReply(i,l){if(l.ok||!l.error||!zJ(l.error.code))return;B(this.options.telemetry,{component:"core",operation:"hub.command_reply",error:Error(l.error.message),severity:l.error.code==="session_not_found"?"warn":"error",handled:!0,context:{...this.commandTelemetryContext(i),errorCode:l.error.code}})}commandTelemetryContext(i){return{command:i.command,requestId:i.requestId,clientId:i.clientId,sessionId:typeof i.payload?.sessionId==="string"?i.payload.sessionId:i.sessionId}}async handleSettingsList(i){try{let l=await this.settings.list(oE(i.payload));return{version:i.version,requestId:i.requestId,ok:!0,payload:{snapshot:l}}}catch(l){return{version:i.version,requestId:i.requestId,ok:!1,error:{code:"settings_list_failed",message:l instanceof Error?l.message:String(l)}}}}async handleSettingsToggle(i){try{let l=await this.settings.toggle(BJ(i.payload));return this.publish(Vt("settings.changed",{types:l.changedTypes,snapshot:l.snapshot})),{version:i.version,requestId:i.requestId,ok:!0,payload:{snapshot:l.snapshot,changedTypes:l.changedTypes}}}catch(l){return{version:i.version,requestId:i.requestId,ok:!1,error:{code:"settings_toggle_failed",message:l instanceof Error?l.message:String(l)}}}}handleHubDrain(i){let l=i.payload?.draining!==!1,u=typeof i.payload?.reason==="string"?i.payload.reason:void 0;if(this.draining!==l)this.draining=l,this.publish(Vt("hub.drain_changed",{draining:this.draining,...u?{reason:u}:{}})),Ae("info","hub.drain_changed",{draining:this.draining,reason:u});return ue(i,this.describeStatus())}async handlePluginsReload(i){let l=typeof i.payload?.plugin==="string"?i.payload.plugin.trim():"";if(!l)return ve(i,"invalid_plugin","plugins.reload requires a plugin name or path");let u=await this.plugins.reload(l);if(u.length===0)return ve(i,"plugin_not_found",`No loaded plugin matches "${l}"`);return ue(i,{plugins:u})}handleHubStatus(i){return ue(i,this.describeStatus())}describeStatus(){let i=0;for(let l of this.activeRpcTurnCountBySession.values())i+=l;return{hubId:this.hubId,draining:this.draining,activeRpcTurns:i,activeCloudCommands:this.cloud.activeCommands,activePluginRequests:this.pendingPluginCommands.size,pendingRuns:this.runQueue?.countPending()??0,eventLog:this.eventLog?{lastSequence:this.eventLog.lastSequence()}:void 0,idle:i===0&&this.cloud.activeCommands===0&&this.pendingPluginCommands.size===0&&(this.runQueue?.countPending()??0)===0}}isDraining(){return this.draining}replayEventsAfter(i,l){if(!this.eventLog)return[];return this.eventLog.listAfter(i,{sessionId:l.sessionId},l.limit)}lastEventSequence(){return this.eventLog?.lastSequence()??0}subscribe(i,l,u){let c=this.listeners.get(i)??new Set,g={sessionId:u?.sessionId,listener:l};c.add(g),this.listeners.set(i,c);let b=this.cloud.snapshot();queueMicrotask(()=>{if(!this.listeners.get(i)?.has(g))return;try{g.listener(Vt("cloud.event",{...b,snapshots:g.sessionId?b.snapshots.filter((k)=>k.sessionId===g.sessionId):b.snapshots,...g.sessionId?{sessionId:g.sessionId}:{}},g.sessionId))}catch(k){Ni("listener threw while recovering cloud state",k)}});let I=n2(this.ctx,u?.sessionId);return queueMicrotask(()=>{if(!this.listeners.get(i)?.has(g))return;let k=[...I,...u2(this.ctx,i,u?.sessionId)];for(let T of k)try{g.listener(T)}catch(E){Ni("listener threw while re-issuing pending request",E)}}),()=>{let k=this.listeners.get(i);if(!k)return;if(k.delete(g),k.size===0)this.listeners.delete(i)}}detachClientFromSessions(i){for(let[l,u]of this.sessionState.entries()){if(u.participants.delete(i),u.createdByClientId===i)u.createdByClientId=void 0;if(u.participants.size===0)this.sessionState.delete(l)}Jl(this.ctx,(l)=>l.targetClientId===i,ju)}publish(i){if(this.eventLog&&i.event!=="cloud.event")try{i=this.eventLog.append(i)}catch(l){Ni(`event log append failed for ${i.event}`,l)}for(let l of this.listeners.values())for(let u of l){if(u.sessionId&&u.sessionId!==i.sessionId)continue;try{u.listener(i)}catch(c){Ni(`listener threw while publishing ${i.event}`,c),B(this.options.telemetry,{component:"core",operation:"hub.publish",error:c,severity:"warn",handled:!0,context:{event:i.event,sessionId:i.sessionId}})}}}}function zJ(i){return i==="session_not_found"||i==="session_messages_not_found"||i==="hub_command_timeout"||i.endsWith("_failed")}var VJ=200,YJ=1000;function tm(i){return{command:i.envelope.command,requestId:i.envelope.requestId,clientId:i.envelope.clientId,sessionId:i.envelope.sessionId}}function wl(i,l,u){return{version:i.envelope.version,requestId:i.envelope.requestId,ok:!1,error:{code:l,message:u}}}function QJ(i,l,u=!1){let c=i.envelope.payload??{},g=i.envelope.clientId?.trim(),b=c.clientId?.trim()||g;if(!b||g&&b!==g)throw Error("Registration clientId must match the command connection");let I=c.workspaceContext?.workspaceRoot?.trim(),k=u?I||l?.trim():l?.trim();if(!k)return{clientId:b};let T=em(k);if(!u&&I&&em(I)!==T)throw Error("Registration workspace must match the Hub-authorized workspace");let E=em(c.workspaceContext?.cwd?.trim()||T),A=XJ(T,E);if(A===".."||A.startsWith(`..${JJ}`)||GJ(A))throw Error("Registration cwd must be inside its workspace");return{clientId:b,workspaceContext:{workspaceRoot:T,cwd:E},...u?{crossWorkspace:!0}:{}}}class lE{transport;telemetry;workspaceRoot;constructor(i,l,u){this.transport=i,this.telemetry=l,this.workspaceRoot=u}attach(i,l={}){let u=new Map,c=new Set,g,b=!1,I=(A)=>{try{i.send(JSON.stringify(A))}catch(C){console.error(`[hub] failed to send websocket frame: ${C instanceof Error?C.stack||C.message:String(C)}`)}},k=(A)=>{if(A.event==="cloud.event"&&!g)return;I({kind:"event",envelope:A})},T=async(A)=>{try{let C=JSON.parse(A.data);switch(C.kind){case"command":{let N;if(g&&C.envelope.command==="client.register"){I({kind:"reply",envelope:wl(C,"client_already_registered","This connection already owns a registered client.")});break}if(g&&C.envelope.clientId?.trim()!==g.clientId){I({kind:"reply",envelope:wl(C,"client_authority_mismatch","Command clientId does not belong to this connection.")});break}if(C.envelope.command==="client.register")try{N=QJ(C,this.workspaceRoot,l.allowRegisteredWorkspace)}catch(ee){I({kind:"reply",envelope:wl(C,"invalid_client_registration",ee instanceof Error?ee.message:String(ee))});break}let O=performance.now(),L=!1,D=tm(C);Ae("info","command.start",D);let U=setTimeout(()=>{if(L)return;Ae("warn","command.slow",{...D,elapsedMs:Math.round(performance.now()-O)})},fs),F=this.transport.command(C.envelope,g??null);F.then((ee)=>{if(!L)return;Ae(ee.ok?"warn":"error","command.late_end",{...D,elapsedMs:Math.round(performance.now()-O),ok:ee.ok,errorCode:ee.error?.code,errorMessage:ee.error?.message})},(ee)=>{if(!L)return;Ae("error","command.late_error",{...D,elapsedMs:Math.round(performance.now()-O),error:ee})});let j=!1,H,Q,z=ei(C.envelope.command,C.envelope.timeoutMs);try{Q=z===null?await F:await Promise.race([F,new Promise((ee)=>{H=setTimeout(()=>{j=!0,B(this.telemetry,{component:"core",operation:"hub.command_timeout",error:Error(`Hub command ${C.envelope.command} did not complete within ${z}ms.`),severity:"error",handled:!0,context:{...D,timeoutMs:z}}),ee(wl(C,"hub_command_timeout",`Hub command ${C.envelope.command} did not complete within ${z}ms. Check hub-daemon.log for command.start/command.slow logs with requestId ${C.envelope.requestId}.`))},z)})])}catch(ee){if(clearTimeout(U),H)clearTimeout(H);throw ee}if(L=j,clearTimeout(U),H)clearTimeout(H);let W=Math.round(performance.now()-O);if(j)Ae("error","command.timeout",{...D,durationMs:W,timeoutMs:z});else Ae(Q.ok?"info":"warn","command.end",{...D,durationMs:W,ok:Q.ok,errorCode:Q.error?.code,errorMessage:Q.error?.message});if(C.envelope.command==="client.register"&&Q.ok){if(N)c.add(N.clientId),g=N}else if(C.envelope.command==="client.unregister"&&Q.ok){let ee=C.envelope.clientId?.trim();if(ee)c.delete(ee),g=void 0}I({kind:"reply",envelope:Q});break}case"stream.subscribe":{let N=`${C.clientId}:${C.sessionId??"*"}`;if(u.has(N))break;let O=typeof C.sinceSequence==="number"&&Number.isFinite(C.sinceSequence)&&C.sinceSequence>=0?Math.floor(C.sinceSequence):void 0;if(O===void 0||typeof this.transport.replayEventsAfter!=="function"){let z=await this.transport.subscribe(C.clientId,k,{sessionId:C.sessionId});u.set(N,z);break}let L=!1,D=O,U=[],F=new Set,j=(z)=>{if(typeof z.sequence==="number"){if(z.sequence<=D)return;D=z.sequence}if(z.eventId&&F){if(F.has(z.eventId))return;F.add(z.eventId)}k(z)},H=(z)=>{if(!L){U.push(z);return}j(z)},Q=await this.transport.subscribe(C.clientId,H,{sessionId:C.sessionId});u.set(N,Q);try{let z=0;while(!b&&z<YJ){let W=D,ee=this.transport.replayEventsAfter(D,{sessionId:C.sessionId,limit:VJ});if(ee.length===0)break;for(let te of ee)j(te);if(D<=W)break;z+=1,await new Promise((te)=>setTimeout(te,0))}}finally{L=!0;for(let z of U)j(z);U.length=0,F=void 0}break}case"stream.unsubscribe":{let N=`${C.clientId}:${C.sessionId??"*"}`;u.get(N)?.(),u.delete(N);break}case"reply":case"event":break}}catch(C){let N=typeof A.data==="string"?$t(A.data):void 0;if(!N||N.kind!=="command"){Ae("error","rejected malformed websocket frame",{error:C});return}Ae("error","command.error",{...tm(N),error:C}),B(this.telemetry,{component:"core",operation:"hub.websocket_command",error:C,severity:"error",handled:!0,context:tm(N)}),I({kind:"reply",envelope:wl(N,"command_failed",C instanceof Error?C.message:"Unknown hub error")})}},E=()=>{if(b)return;b=!0;for(let A of u.values())A();u.clear();for(let A of c)this.transport.command({version:"v1",command:"client.unregister",clientId:A});c.clear(),i.removeEventListener("message",T),i.removeEventListener("close",E)};return i.addEventListener("message",T),i.addEventListener("close",E),E}}class dE{transport;constructor(i){this.transport=i}command(i,l){return this.transport.handleCommand(i,l)}subscribe(i,l,u){return this.transport.subscribe(i,l,u)}replayEventsAfter(i,l){return this.transport.replayEventsAfter?.(i,l)??[]}}function uE(i){if(typeof i==="string")return i;if(i instanceof Uint8Array)return Buffer.from(i).toString();if(i instanceof ArrayBuffer)return Buffer.from(i).toString();if(Array.isArray(i))return Buffer.concat(i.map((l)=>Buffer.from(l))).toString();return String(i)}function ZJ(i){return{send(l){i.send(l)},addEventListener(l,u){if(l==="message"){i.on("message",(c)=>{u({data:uE(c)})});return}i.on("close",u)},removeEventListener(){}}}function eV(i){try{i.write(`HTTP/1.1 400 Bad Request\r
|
|
1137
|
+
Connection: close\r
|
|
1138
|
+
Content-Length: 0\r
|
|
1139
|
+
\r
|
|
1140
|
+
`),i.end()}catch{i.destroy()}}function tV(i){try{i.write(`HTTP/1.1 401 Unauthorized\r
|
|
1141
|
+
Connection: close\r
|
|
1142
|
+
Content-Length: 0\r
|
|
1143
|
+
\r
|
|
1144
|
+
`),i.end()}catch{i.destroy()}}function rV(i){try{i.write(`HTTP/1.1 503 Service Unavailable\r
|
|
1145
|
+
Connection: close\r
|
|
1146
|
+
Content-Length: 0\r
|
|
1147
|
+
\r
|
|
1148
|
+
`),i.end()}catch{i.destroy()}}function Md(i,l){if(!i||!l)return!1;let u=Buffer.from(i,"utf8"),c=Buffer.from(l,"utf8");return u.length===c.length&&WJ(u,c)}function Qb(i,l){let u=i&&typeof i==="object"&&"code"in i&&typeof i.code==="string"?i.code:void 0,c=i instanceof Error?i.message:typeof i==="string"?i:"Unknown startup error",g=`Failed to start hub server on ${l.host}:${l.port}${l.pathname}: ${c}`,b=Error(u?`${g} (${u})`:g);if(u)i.code=u,b.code=u;if(i instanceof Error&&i.stack)b.stack=`${b.name}: ${b.message}
|
|
1149
|
+
Caused by: ${i.stack}`;return b}var rm=new Map,Zb="cline-hub-auth.",sV=30000,eI=2000;async function tI(i,l){let u;try{return await Promise.race([i.then(()=>!0,()=>!0),new Promise((c)=>{u=setTimeout(()=>c(!1),l)})])}finally{if(u)clearTimeout(u)}}function eg(i){return Array.isArray(i)?i.join(","):i??""}function rI(i){return i===32||i===9}function sm(i){let l=eg(i).trim(),u="bearer";if(l.length<=6||l.slice(0,6).toLowerCase()!=="bearer"||!rI(l.charCodeAt(6)))return null;let c=7;while(c<l.length&&rI(l.charCodeAt(c)))c+=1;return l.slice(c).trim()||null}function iV(i){for(let l of eg(i).split(",")){let u=l.trim();if(u.startsWith(Zb))return u.slice(Zb.length).trim()||null}return null}function cE(i){let l=i.trim().toLowerCase();return l==="localhost"||l==="127.0.0.1"||l==="::1"||l==="[::1]"}function nV(i){let l=eg(i).trim();if(!l)return!1;try{return cE(new vh(l).hostname)}catch{return!1}}async function oV(i){let l=i.owner??_T(),u=i.host??"127.0.0.1",c=i.pathname??"/hub",g=i.port??gT(),b=g,I=$u(u,g,c),k=Qo(),T=kT(),E=gz(),A=$l.acquire(rz(l.discoveryPath));if(!A.held)Ae("warn","instance_lock.unavailable",{lockFile:A.lockFile});let C;try{C=new aE({...i,owner:l}),await C.start()}catch(G){throw A.release(),G}let N=C.getHubId(),O=new lE(new dE(C),i.telemetry,i.workspaceRoot),L=new Set,D=new Date().toISOString(),U={protocolVersion:zi,minClientProtocolVersion:va,maxClientProtocolVersion:wa,capabilities:hs,coreVersion:zl.version,buildId:k,buildEpochMs:T,pid:process.pid,startedAt:D},F=new Set,j,H,Q,z=!1,W=()=>{if(H)return H;if(Q){let le=rm.get(l.discoveryPath);if(le?.server===Q)le.state="closing"}if(j)clearInterval(j),j=void 0;let G=new Promise((le,Ie)=>{oe.close((we)=>{if(we){Ie(we);return}le()})}),se=new Promise((le,Ie)=>{te.close((we)=>{if(we){Ie(we);return}le()})}),Pe=Promise.resolve().then(()=>C.stop()),Le=Pe.then(async()=>{await kz(l.discoveryPath,N)}),Te=(async()=>{let le=(await Promise.allSettled([G,se,Pe,Le])).flatMap((Ie)=>Ie.status==="rejected"?[Ie.reason]:[]);if(le.length>0)throw AggregateError(le,"hub server close failed")})().finally(()=>{if(rm.get(l.discoveryPath)?.server===Q)rm.delete(l.discoveryPath);A.release()});H={transportStopped:Pe,closed:Te};for(let le of F)le.terminate?.();F.clear();for(let le of L)le();return L.clear(),H},ee=()=>W().closed,te=KJ.createServer((G,se)=>{if(!z){se.statusCode=503,se.end("Starting");return}if((G.url??"/")==="/health"){let Le=JSON.stringify({ok:!0,hubId:N,protocolVersion:U.protocolVersion,minClientProtocolVersion:U.minClientProtocolVersion,maxClientProtocolVersion:U.maxClientProtocolVersion,coreVersion:U.coreVersion,buildId:U.buildId,buildEpochMs:U.buildEpochMs,draining:C.isDraining(),host:u,port:b,url:I});se.statusCode=200,se.setHeader("content-type","application/json"),se.end(Le);return}if((G.url??"/")==="/status"){if(!Md(sm(G.headers.authorization),E)){se.statusCode=401,se.end("Unauthorized");return}let Le=JSON.stringify({hubId:N,...U,authToken:E,host:u,port:b,url:I,updatedAt:new Date().toISOString()});se.statusCode=200,se.setHeader("content-type","application/json"),se.end(Le);return}if((G.url??"/")==="/version"){se.statusCode=200,se.setHeader("content-type","application/json"),se.end(JSON.stringify(U));return}let Pe=new vh(G.url??"/",`http://${u}:${b}`);if(Pe.pathname==="/drain"&&G.method==="POST"){if(!Md(sm(G.headers.authorization),E)){se.statusCode=401,se.end("Unauthorized");return}let Le=Pe.searchParams.get("off")===null;C.handleCommand({version:zi,command:"hub.drain",payload:{draining:Le,reason:Pe.searchParams.get("reason")??"authenticated HTTP drain request"}}).then((Te)=>{se.statusCode=Te.ok?200:500,se.setHeader("content-type","application/json"),se.end(JSON.stringify(Te.payload??{ok:Te.ok}))},()=>{se.statusCode=500,se.end("Drain failed")});return}if(Pe.pathname==="/shutdown"&&G.method==="POST"){if(!Md(sm(G.headers.authorization),E)){se.statusCode=401,se.end("Unauthorized");return}let Le=!1,Te=()=>{if(Le)return;Le=!0;try{Promise.resolve(i.onShutdownRequested?.()).catch(()=>{return})}catch{}finally{ee().catch(()=>{return})}};se.statusCode=202,se.setHeader("content-type","application/json"),se.setHeader("connection","close");let le=setTimeout(Te,1000);le.unref?.(),se.end(JSON.stringify({ok:!0}),()=>{setImmediate(()=>{clearTimeout(le),Te()})});return}se.statusCode=404,se.end("Not found")}),oe=new Zo.default({noServer:!0});j=setInterval(()=>{for(let G of F){if(G.isAlive===!1){G.heartbeatTerminated=!0;try{G.terminate?.()}catch{}F.delete(G);continue}G.isAlive=!1;try{G.ping?.()}catch{try{G.terminate?.()}catch{}F.delete(G)}}},sV),te.on("upgrade",(G,se,Pe)=>{if(!z){rV(se);return}if(new vh(G.url??"/",`http://${u}:${b}`).pathname!==c){se.destroy();return}let Le=Md(iV(G.headers["sec-websocket-protocol"]),E);if(!(Le||cE(u)&&nV(G.headers.origin))){tV(se);return}try{oe.handleUpgrade(G,se,Pe,(Te)=>{let le=Te;le.isAlive=!0,le.on("pong",()=>{le.isAlive=!0}),F.add(le),le.once("close",(we,He)=>{Ae("info","socket.closed",{code:we,reason:uE(He).slice(0,200)||void 0,heartbeatTerminated:le.heartbeatTerminated??!1,serverClosing:H!==void 0})});let Ie=O.attach(ZJ(Te),{allowRegisteredWorkspace:Le});L.add(Ie),Te.once("close",()=>{F.delete(le),Ie(),L.delete(Ie)})})}catch{eV(se)}});try{await new Promise((G,se)=>{te.once("error",(Pe)=>{se(Qb(Pe,{host:u,port:g,pathname:c}))}),te.listen(g,u,()=>{let Pe=te.address();if(!Pe||typeof Pe==="string"){se(Qb(Error("Failed to resolve hub port"),{host:u,port:g,pathname:c}));return}b=Pe.port,I=$u(u,b,c),G()})})}catch(G){if(j)clearInterval(j),j=void 0;if(G instanceof Error)G.hubInstanceLockHeld=A.held;throw await tI(Promise.resolve().then(()=>C.stop()),eI),A.release(),G}try{await ET(l.discoveryPath,{hubId:N,protocolVersion:zi,minClientProtocolVersion:va,maxClientProtocolVersion:wa,capabilities:[...U.capabilities],coreVersion:zl.version,buildId:k,buildEpochMs:T,authToken:E,host:u,port:b,url:I,pid:process.pid,startedAt:D,updatedAt:D}),z=!0}catch(G){if(!await tI(W().closed,eI))try{te.closeAllConnections(),te.unref()}catch{}throw G}return Q={host:u,port:b,url:I,authToken:E,beginClose:W,close:ee},Q}var lV=5000,dV=2000;function uV(i){let l=[];for(let u of i.split(/\r?\n/))if(u.startsWith("p"))l.push(u.slice(1));else if(u.startsWith("c")&&l.length>0)l[l.length-1]+=` ${u.slice(1)}`;return l}function cV(i){let[l,u]=process.platform==="win32"?["powershell",["-NoProfile","-NonInteractive","-Command",`Get-NetTCPConnection -LocalPort ${i} -State Listen -ErrorAction SilentlyContinue | Select-Object -ExpandProperty OwningProcess -Unique | ForEach-Object { $p = Get-CimInstance Win32_Process -Filter "ProcessId=$_"; "$_\`t$($p.Name) $($p.ExecutablePath)" }`]]:["lsof",["-nP",`-iTCP:${i}`,"-sTCP:LISTEN","-Fpc"]],c=aV(l,u,{encoding:"utf8",timeout:lV,windowsHide:!0});if(c.error||!c.stdout.trim()&&c.stderr.trim())return;let g=c.stdout.split(/\r?\n/).filter((b)=>b.trim());return process.platform==="win32"?g:uV(c.stdout)}function pV(i){return i.replace(/\/Users\/[^/\s]+/g,"/Users/[redacted]").replace(/\/home\/[^/\s]+/g,"/home/[redacted]").replace(/([A-Za-z]:[\\/]+Users[\\/]+)[^\\/\s]+/g,"$1[redacted]")}async function mV(i,l){let u={bind_port:l.port,instance_lock_held:i.hubInstanceLockHeld},c=cV(l.port);u.port_owners=c?pV(c.join(" | ")).slice(0,600):"unavailable";let g=await Cf($u(l.host,l.port,l.pathname),{signal:AbortSignal.timeout(dV)});if(u.occupant_is_hub=g!==void 0,g)u.occupant_hub_build_id=g.buildId,u.occupant_hub_core_version=g.coreVersion,u.occupant_hub_pid=g.pid;return u}var sI=2000;function hV(i){let l="idle",u=0,c,g,b=!1,I=(T)=>{if(b)return;b=!0,i.exit(T)},k=(T)=>{if(u=Math.max(u,T.exitCode),l==="forced"||l==="finished")return;if(l="forced",g)clearTimeout(g),g=void 0;try{i.onForcedExit?.({...T,exitCode:u})}finally{I(u)}};return{request:(T)=>{if(u=Math.max(u,T.exitCode),c)return c;return l="shutting_down",g=setTimeout(()=>{k({reason:`shutdown deadline exceeded after ${T.reason}`,exitCode:u})},i.deadlineMs),c=(async()=>{try{await Promise.resolve().then(()=>i.cleanup())}catch(E){u=Math.max(u,1),i.onCleanupError?.(E)}finally{if(g)clearTimeout(g),g=void 0;if(l==="shutting_down")l="finished",I(u)}})(),c},force:k,getState:()=>l}}class vE{name;metadata;meter;logger;enabled;distinctId;commonProperties;counters=new Map;histograms=new Map;gauges=new Map;gaugeValues=new Map;meterProvider;loggerProvider;constructor(i){this.name=i.name??"OpenTelemetryAdapter",this.metadata={...i.metadata},this.meterProvider=i.meterProvider,this.loggerProvider=i.loggerProvider,this.meter=i.meterProvider?.getMeter("cline")??null,this.logger=i.loggerProvider?.getLogger("cline")??null,this.enabled=i.enabled??!0,this.distinctId=i.distinctId,this.commonProperties=i.commonProperties?{...i.commonProperties}:{}}emit(i,l){if(!this.isEnabled())return;this.emitLog(i,l,!1)}emitRequired(i,l){this.emitLog(i,l,!0)}recordCounter(i,l,u,c,g=!1){if(!this.meter||!g&&!this.isEnabled())return;let b=this.counters.get(i);if(!b)b=this.meter.createCounter(i,c?{description:c}:void 0),this.counters.set(i,b);b.add(l,this.flattenProperties(this.buildAttributes(u)))}recordHistogram(i,l,u,c,g=!1){if(!this.meter||!g&&!this.isEnabled())return;let b=this.histograms.get(i);if(!b)b=this.meter.createHistogram(i,c?{description:c}:void 0),this.histograms.set(i,b);b.record(l,this.flattenProperties(this.buildAttributes(u)))}recordGauge(i,l,u,c,g=!1){if(!this.meter||!g&&!this.isEnabled())return;let b=this.buildAttributes(u),I=JSON.stringify(b),k=this.gaugeValues.get(i);if(l===null){if(k){if(k.delete(I),k.size===0)this.gaugeValues.delete(i),this.gauges.delete(i)}return}let T=k;if(!T)T=new Map,this.gaugeValues.set(i,T);if(!this.gauges.has(i)){let E=this.meter.createObservableGauge(i,c?{description:c}:void 0);E.addCallback((A)=>{for(let C of this.snapshotGaugeSeries(i))A.observe(C.value,this.flattenProperties(C.attributes))}),this.gauges.set(i,E)}T.set(I,{value:l,attributes:b})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}setDistinctId(i){this.distinctId=i}setCommonProperties(i){this.commonProperties={...i}}updateCommonProperties(i){this.commonProperties={...this.commonProperties,...i}}async flush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.()])}emitLog(i,l,u){if(!this.logger)return;let c=this.flattenProperties(this.buildAttributes(l,u)),g=gV(c.severity);this.logger.emit({severityText:g.text,severityNumber:g.number,body:i,attributes:c})}buildAttributes(i,l=!1){return{...this.commonProperties,...this.metadata,...i,...this.distinctId?{distinct_id:this.distinctId}:{},...l?{_required:!0}:{}}}snapshotGaugeSeries(i){let l=this.gaugeValues.get(i);if(!l)return[];return Array.from(l.values(),(u)=>({value:u.value,attributes:u.attributes?{...u.attributes}:void 0}))}flattenProperties(i,l="",u=new WeakSet,c=0){if(!i)return{};let g={},b=100,I=10;for(let[k,T]of Object.entries(i)){if(k==="__proto__"||k==="constructor"||k==="prototype")continue;let E=l?`${l}.${k}`:k;if(T===null||T===void 0){g[E]=String(T);continue}if(Array.isArray(T)){let A=T.length>b?T.slice(0,b):T;try{g[E]=JSON.stringify(A)}catch{g[E]="[UnserializableArray]"}if(T.length>b)g[`${E}_truncated`]=!0,g[`${E}_original_length`]=T.length;continue}if(typeof T==="object"){if(T instanceof Date){g[E]=T.toISOString();continue}if(T instanceof Error){g[E]=T.message;continue}if(u.has(T)){g[E]="[Circular]";continue}if(c>=I){g[E]="[MaxDepthExceeded]";continue}u.add(T),Object.assign(g,this.flattenProperties(T,E,u,c+1));continue}if(yV(T)){g[E]=T;continue}try{g[E]=JSON.stringify(T)}catch{g[E]=String(T)}}return g}}function gV(i){switch(typeof i==="string"?i.toLowerCase():i){case"trace":return{text:"TRACE",number:Bi.SeverityNumber.TRACE};case"debug":return{text:"DEBUG",number:Bi.SeverityNumber.DEBUG};case"warn":case"warning":return{text:"WARN",number:Bi.SeverityNumber.WARN};case"error":return{text:"ERROR",number:Bi.SeverityNumber.ERROR};case"fatal":return{text:"FATAL",number:Bi.SeverityNumber.FATAL};default:return{text:"INFO",number:Bi.SeverityNumber.INFO}}}function yV(i){return typeof i==="string"||typeof i==="number"||typeof i==="boolean"}class wE{name;logger;enabled;constructor(i={}){this.name=i.name??"TelemetryLoggerSink",this.logger=i.logger,this.enabled=i.enabled??!0}emit(i,l){if(!this.isEnabled())return;this.logger?.log("telemetry.event",{telemetrySink:this.name,event:i,properties:l})}emitRequired(i,l){this.logger?.log("telemetry.required_event",{telemetrySink:this.name,severity:"warn",event:i,properties:l})}recordCounter(i,l,u,c,g){if(!g&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:i,value:l,attributes:u,description:c,required:g===!0})}recordHistogram(i,l,u,c,g){if(!g&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:i,value:l,attributes:u,description:c,required:g===!0})}recordGauge(i,l,u,c,g){if(!g&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:i,value:l,attributes:u,description:c,required:g===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class tg{adapters;metadata;distinctId;deviceId;commonProperties;constructor(i={}){if(this.adapters=[...i.adapters??[]],i.logger)this.adapters.push(new wE({logger:i.logger}));this.metadata={...i.metadata??{}},this.distinctId=i.distinctId,this.deviceId=i.deviceId??bq(),this.commonProperties={...i.commonProperties??{}}}addAdapter(i){this.adapters.push(i)}setDistinctId(i){this.distinctId=i}setMetadata(i){this.metadata={...i}}updateMetadata(i){this.metadata={...this.metadata,...i}}setCommonProperties(i){this.commonProperties={...i}}updateCommonProperties(i){this.commonProperties={...this.commonProperties,...i}}isEnabled(){return this.adapters.some((i)=>i.isEnabled())}capture(i){let l=this.buildAttributes(i.properties);for(let u of this.adapters)u.emit(i.event,l)}captureRequired(i,l){let u=this.buildAttributes(l);for(let c of this.adapters)c.emitRequired(i,u)}recordCounter(i,l,u,c,g=!1){let b=this.buildAttributes(u);for(let I of this.adapters)I.recordCounter(i,l,b,c,g)}recordHistogram(i,l,u,c,g=!1){let b=this.buildAttributes(u);for(let I of this.adapters)I.recordHistogram(i,l,b,c,g)}recordGauge(i,l,u,c,g=!1){let b=this.buildAttributes(u);for(let I of this.adapters)I.recordGauge(i,l,b,c,g)}async flush(){await Promise.all(this.adapters.map((i)=>i.flush()))}async dispose(){await Promise.all(this.adapters.map((i)=>i.dispose()))}buildAttributes(i){let l=typeof i?.distinct_id==="string"&&i.distinct_id.trim()?i.distinct_id.trim():this.distinctId,u={...this.commonProperties,...this.metadata,...i,...l?{distinct_id:l}:{},device_id:this.deviceId};return Object.fromEntries(Object.entries(u).filter(([,c])=>c!==void 0))}}class bE{distinctId;metadata;commonProperties;constructor(i={}){this.distinctId=i.distinctId,this.metadata={...i.metadata??{}},this.commonProperties={...i.commonProperties??{}}}setDistinctId(i){this.distinctId=i}setMetadata(i){this.metadata={...i}}updateMetadata(i){this.metadata={...this.metadata,...i}}setCommonProperties(i){this.commonProperties={...i}}updateCommonProperties(i){this.commonProperties={...this.commonProperties,...i}}isEnabled(){return!1}capture(i){this.resolveProperties(i.properties)}captureRequired(i,l){this.resolveProperties(l)}recordCounter(){}recordHistogram(){}recordGauge(){}async flush(){}async dispose(){}resolveProperties(i){let l=typeof i?.distinct_id==="string"&&i.distinct_id.trim()?i.distinct_id.trim():this.distinctId,u={...this.commonProperties,...this.metadata,...i,...l?{distinct_id:l}:{}};return Object.fromEntries(Object.entries(u).filter(([,c])=>c!==void 0))}}class IE{meterProvider;loggerProvider;tracerProvider;options;constructor(i={}){this.options=i;let l=gE.resourceFromAttributes({...i.resourceAttributes,[yc.ATTR_SERVICE_NAME]:i.serviceName??"cline",...i.serviceVersion?{[yc.ATTR_SERVICE_VERSION]:i.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(l),this.loggerProvider=this.createLoggerProvider(l),this.tracerProvider=this.createTracerProvider(l),this.meterProvider)kn.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)pE.logs.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(i="cline",l){return Di.getTracer(i,l??this.options.serviceVersion)}createAdapter(i){return new vE({...i,meterProvider:this.meterProvider,loggerProvider:this.loggerProvider})}createTelemetryService(i){let l=this.createAdapter({name:i.name,enabled:this.options.enabled,metadata:i.metadata});return new tg({...i,adapters:[l],distinctId:ac(i.distinctId)})}async forceFlush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.(),this.tracerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.(),this.tracerProvider?.shutdown?.()])}createMeterProvider(i){let l=im(this.options.metricsExporter);if(l.length===0)return null;let u=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),c=Math.min(30000,Math.floor(u*0.8)),g=l.map((b)=>SV(b,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:u,timeout:c})).filter((b)=>b!==null);if(g.length===0)return null;return new Tn.MeterProvider({resource:i,readers:g})}createTracerProvider(i){let l=im(this.options.tracesExporter);if(l.length===0)return null;let u=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,c=this.options.otlpTracesHeaders??this.options.otlpHeaders,g=[],b=!1;for(let k of l){let T=kV(k,{endpoint:u,headers:c,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(T){if(g.push(T),k!=="console")b=!0}}if(g.length===0)return null;let I=new yE.NodeTracerProvider({resource:i,spanProcessors:b?[new $i,...g]:g});if(b)Gn(I);return I}createLoggerProvider(i){let l=im(this.options.logsExporter);if(l.length===0)return null;let u=l.map((c)=>{let g=IV(c,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!g)return null;return new ea.BatchLogRecordProcessor(g,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((c)=>c!==null);if(u.length===0)return null;return new ea.LoggerProvider({resource:i,processors:u})}}function vV(i){let l=new IE(i),u=l.createTelemetryService(i),c=()=>{u.captureRequired("telemetry.provider_created",{provider:"opentelemetry",enabled:i.enabled??!0,logsExporter:Array.isArray(i.logsExporter)?i.logsExporter.join(","):i.logsExporter,metricsExporter:Array.isArray(i.metricsExporter)?i.metricsExporter.join(","):i.metricsExporter,tracesExporter:Array.isArray(i.tracesExporter)?i.tracesExporter.join(","):i.tracesExporter,otlpProtocol:i.otlpProtocol,hasOtlpEndpoint:Boolean(i.otlpEndpoint),serviceName:i.serviceName,serviceVersion:i.serviceVersion})};if(!i.deferProviderCreatedEvent)c();return{provider:l,telemetry:u,emitProviderCreated:c}}function wV(i){if(YA())return{telemetry:new bE(i)};if(i.enabled!==!0)return{telemetry:new tg({...i,distinctId:ac(i.distinctId)})};return vV(i)}function bV(i){let{telemetry:l,provider:u,emitProviderCreated:c}=wV(i);return{telemetry:l,provider:u,flush:async()=>{let g=u;if(g&&typeof g.forceFlush==="function")try{await g.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([l.dispose(),u?.dispose()])},...i.deferProviderCreatedEvent&&c?{emitProviderCreated:c}:{}}}function im(i){if(!i)return[];return(Array.isArray(i)?i:i.split(",")).map((l)=>l.trim()).filter((l)=>l==="console"||l==="otlp")}function IV(i,l){if(i==="console")return new ea.ConsoleLogRecordExporter;if(!l.endpoint)return null;let u=rg(l.endpoint,"/v1/logs");return new mE.OTLPLogExporter({url:u,headers:l.headers})}function kV(i,l){if(i==="console")return new ra.SimpleSpanProcessor(new ra.ConsoleSpanExporter);if(!l.endpoint)return null;let u=rg(l.endpoint,"/v1/traces");return new ra.BatchSpanProcessor(new fE.OTLPTraceExporter({url:u,headers:l.headers}))}function SV(i,l){if(i==="console")return new Tn.PeriodicExportingMetricReader({exporter:new Tn.ConsoleMetricExporter,exportIntervalMillis:l.interval,exportTimeoutMillis:l.timeout});if(!l.endpoint)return null;let u=rg(l.endpoint,"/v1/metrics");return new Tn.PeriodicExportingMetricReader({exporter:new hE.OTLPMetricExporter({url:u,headers:l.headers}),exportIntervalMillis:l.interval,exportTimeoutMillis:l.timeout})}function rg(i,l){let u=new URL(i),c=u.pathname.endsWith("/")?u.pathname.slice(0,-1):u.pathname;return u.pathname=c.endsWith(l)?c:`${c}${l}`,u.toString()}var iI=ic,TV=300000,_V=5000;function EV(i=Lm(),l={}){let u=l.buildId??Qo(),c=l.execPath??process.execPath??"";return{"cline.hub.build_id":u,"cline.hub.runtime":(c.split(/[\\/]/).pop()??"").replace(/\.exe$/i,""),"cline.hub.launcher.client":i?.client??"unknown","cline.hub.launcher.version":i?.version??"unknown","cline.hub.launcher.transport":i?.transport??"local"}}function AV(){let i=Qf(),l=Ir({serviceName:"cline-hub-daemon",serviceVersion:iI,metadata:{extension_version:iI,cline_type:"hub",platform:"cline-hub-daemon",platform_version:process.version,os_type:process.platform,os_version:fV()}}),u=bV({...l,resourceAttributes:EV(i)}),c,g=()=>{try{return c??=new ci,c.getProviderSettings("cline")?.auth}catch{return null}},b,I=()=>{let T=g();if(T===null)return;let E=T?.accountId?.trim();if(!T||!E){if(b!==void 0)b=void 0,TA(u.telemetry,ac());return}let A=`${E}:${T.organizationId??""}`;if(A===b)return;b=A,Gu(u.telemetry,{id:E,provider:"cline",organizationId:T.organizationId,organizationName:T.organizationName,memberId:T.memberId})};I();let k=setInterval(I,TV);return k.unref?.(),{telemetry:u.telemetry,launcher:i,dispose:async()=>{clearInterval(k);let T;await Promise.race([(async()=>{await u.flush(),await u.dispose()})(),new Promise((E)=>{T=setTimeout(E,_V),T.unref?.()})]),clearTimeout(T)}}}ty(process.env.CLINE_VCR);var kE,sg,xV=new Promise((i,l)=>{kE=i,sg=l});xV.catch(()=>{return});var CV=5000,RV=250;function SE(i){return i instanceof Error&&i.code==="EADDRINUSE"}async function PV(i,l){for(;;)try{return await oV(l)}catch(u){if(!SE(u)&&!Ef(u)||Date.now()>=i)throw u;await new Promise((c)=>setTimeout(c,RV))}}function MV(i){let l=!0,u=process.cwd(),c,g,b;for(let I=0;I<i.length;I+=1){let k=i[I],T=i[I+1];if(k==="--no-connectors"){l=!1;continue}if(k==="--cwd"&&T){u=T,I+=1;continue}if(k==="--host"&&T){c=T,I+=1;continue}if(k==="--port"&&T){let E=Number(T);if(Number.isFinite(E))g=E;I+=1;continue}if(k==="--pathname"&&T)b=T,I+=1}return{cwd:u,host:c,port:g,pathname:b,manageConnectors:l}}function NV(i){if(i instanceof cc)return!0;if(i instanceof Error){if(i.name==="AbortError")return!0;if(i.code==="ABORT_ERR")return!0}return!1}async function OV(){Xe();let i=MV(process.argv.slice(2));process.chdir(i.cwd);let l=yT({host:i.host,port:i.port,pathname:i.pathname}),u=AV(),c=(D)=>D instanceof Error?D.stack||D.message:String(D),g,b,I,k=(D)=>{if(g)return g.request(D);if(!b||D.exitCode>b.exitCode)b=D;if(!I)I=setTimeout(()=>{let U=b??D;try{process.stderr.write(`[hub-daemon] startup did not reach shutdown coordination after ${U.reason}; forcing process exit
|
|
1150
|
+
`)}finally{process.exit(U.exitCode)}},sI);return},T=!1,E=(D,U)=>{if(T)return;T=!0,process.stderr.write(`[hub-daemon] ${D}: ${c(U)}
|
|
1151
|
+
`),k({reason:D,exitCode:1})},A=0,C=(D)=>{if(A+=1,A>1){if(g){g.force({reason:`second termination signal (${D})`,exitCode:0});return}if(I)clearTimeout(I),I=void 0;process.exit(b?.exitCode??0);return}k({reason:D,exitCode:0})};process.on("SIGINT",()=>C("SIGINT")),process.on("SIGTERM",()=>C("SIGTERM")),process.on("uncaughtException",(D)=>{E("uncaughtException",D)}),process.on("unhandledRejection",(D)=>{if(NV(D)){let U=D instanceof Error?D.message:String(D);process.stderr.write(`[hub-daemon] ignored abort rejection: ${U}
|
|
1152
|
+
`);return}E("unhandledRejection",D)});let N=Date.now()+CV,O;try{O=await PV(N,{workspaceRoot:i.cwd,onShutdownRequested:()=>{k({reason:"authenticated HTTP shutdown request",exitCode:0})},host:l.host,port:l.port,pathname:l.pathname,owner:re()==="production"?Rf():hc(),telemetry:u.telemetry,runtimeHandlers:BH({telemetry:u.telemetry}),cronOptions:{workspaceRoot:i.cwd}})}catch(D){if(!Ef(D)){let U=SE(D)?await mV(D,l):void 0;if(U)process.stderr.write(`[hub-daemon] port ${l.port} is in use: ${JSON.stringify(U)}
|
|
1153
|
+
`);B(u.telemetry,{component:"hub",operation:"hub.daemon.startup",error:D,handled:!1,severity:"fatal",context:U})}throw await u.dispose().catch(()=>{return}),D}let L=i.manageConnectors?new ZI({cleanupInstance:(D,U)=>EC(D,U)}):void 0;if($g(L),g=hV({deadlineMs:sI,cleanup:async()=>{let D=[];try{L?.dispose()}catch(F){D.push(F)}finally{$g(void 0)}let U=O.beginClose();await Promise.allSettled([U.transportStopped]);try{await u.dispose()}catch(F){D.push(F)}try{await U.closed}catch(F){D.push(F)}if(D.length>0)throw AggregateError(D,"hub daemon shutdown cleanup failed")},exit:(D)=>process.exit(D),onCleanupError:(D)=>{process.stderr.write(`[hub-daemon] shutdown cleanup failed: ${c(D)}
|
|
1154
|
+
`)},onForcedExit:({reason:D})=>{process.stderr.write(`[hub-daemon] ${D}; forcing process exit
|
|
1155
|
+
`)}}),b){if(I)clearTimeout(I),I=void 0;sg(Error("Hub daemon shutdown was requested before readiness")),await g.request(b);return}kE(),$V(i.cwd);try{if(L)L.adoptRunningConnectors(),await WC()}catch(D){let U=D instanceof Error?D.stack||D.message:String(D);process.stderr.write(`[hub-daemon] connector reconnect failed: ${U}
|
|
1156
|
+
`)}await new Promise(()=>{})}async function $V(i){if(Vu()==="sandbox")return;try{let l=Dh({workspacePath:i,cwd:i}),u=(await rd().preload({pluginPaths:l.paths,disabledPluginPaths:l.disabledPaths,discoveryFailures:l.discoveryFailures})).filter((c)=>c.state==="failed");for(let c of u)process.stderr.write(`[hub-daemon] plugin "${c.name}" failed (${c.lastError?.phase}): ${c.lastError?.message}
|
|
1157
|
+
`)}catch(l){let u=l instanceof Error?l.stack||l.message:String(l);process.stderr.write(`[hub-daemon] plugin preload failed: ${u}
|
|
1158
|
+
`)}}OV().catch((i)=>{if(sg(i),Ef(i))process.stderr.write(`[hub-daemon] another live Hub owns this data directory: ${i.message}
|
|
1159
|
+
`),process.exit(tz);let l=i instanceof Error?i.stack||i.message:String(i);process.stderr.write(`[hub-daemon] fatal: ${l}
|
|
1160
|
+
`),process.exit(1)});export{xV as hubDaemonReady,NV as isAbortRejection};
|