@cline/core 0.0.95 → 0.2.0-nightly.1793312794
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/account/types.d.ts +2 -0
- package/dist/artifacts/cloud/fetch.d.ts +8 -0
- package/dist/artifacts/cloud/publish.d.ts +6 -0
- package/dist/artifacts/publish.d.ts +30 -0
- package/dist/cline-core/runtime-services.d.ts +4 -2
- package/dist/cloud/computer-use-prompt.d.ts +9 -0
- package/dist/cloud/controller.d.ts +26 -4
- package/dist/cloud/hub-client.d.ts +53 -0
- package/dist/cloud/hub-protocol.d.ts +32 -0
- package/dist/cloud/index.d.ts +5 -0
- package/dist/cloud/index.js +34 -17
- 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 +248 -229
- package/dist/hub/daemon/index.d.ts +2 -0
- package/dist/hub/index.d.ts +1 -0
- package/dist/hub/index.js +238 -219
- package/dist/hub/runtime-host/hub-runtime-host.d.ts +6 -0
- package/dist/hub/server/cloud-session-service.d.ts +52 -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/handlers/session-handlers.d.ts +4 -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 +10 -5
- package/dist/index.js +284 -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-bdvd54cj.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/anthropic-d88t4w67.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/bedrock-4rh6dw0e.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/cline-dex049wz.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/cloud/index.js +38 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/community-adrseffv.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/foundation-models-embedding-model-strategy-SAVQFBF4-vf44v1q1.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/foundation-models-language-model-strategy-BPQO66W7-np6pavev.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-bsd-1xg0n8py.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-bsd-2h2811k3.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-darwin-918h9zb6.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-darwin-9g9qz8kw.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-linux-8p52y0t4.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-linux-cr4wnstr.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-unsupported-aa72jh2v.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-unsupported-k2y10eep.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-win-1hvm2h6v.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/getMachineId-win-7nqbajdc.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/google-nqn5r579.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/hub/daemon/entry.js +1166 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/hub/index.js +1153 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-0ahmqye5.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-1jwj53tz.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-3qy7846d.js +14 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-418gvd4a.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-4etvmc8g.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-4pm9q9we.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-4tgv599k.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-5hwscy9s.js +15 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-6dpcn5cw.js +9 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-7ycwqbm0.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-8qjtgvqw.js +9 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-8zb5grad.js +1210 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-94jdgxt6.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-9g67p34k.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-a9d2sjh0.js +85 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-agemt17a.js +3 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-bhf7enwn.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-bnwxdgvg.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-brjxtvsh.js +4 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-bvb7f701.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-bwet95hr.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-cadyf2yp.js +14 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-cxfnnrmh.js +9 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-cyyvppz9.js +6 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-d4pbedxj.js +137 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-ddwn220p.js +12 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-edf1hmcw.js +62 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-ejyd73x5.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-f25bf131.js +4 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-f4rfmj6q.js +3 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-fet3kwk6.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-ffna8yzn.js +121 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-g2y6ptdc.js +213 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-ge184xvn.js +6 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-gevnedsc.js +13 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-hkmarmve.js +190 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-kqacxn3s.js +39 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-m3gtj35r.js +14 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-neczvge6.js +21 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-p5k5hnam.js +75 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-sdvqs19c.js +20 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-t75m2pgm.js +146 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-v4-qqb2kabr.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-v6mehmme.js +12 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-v80fh3x3.js +16 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-vd605jwp.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-vryppqt1.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-w55v4n1n.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-w9n2kgjk.js +140 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-yjbp9r76.js +142 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/index-ztb3cjfh.js +3 -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-kj4rdeey.js +473 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/jiti-y9tt7gmq.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/langfuse-stream-telemetry-bg81k3qh.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/langfuse-telemetry-tkbfbx5w.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/mistral-mkw95amh.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/multipart-parser-9z19cm6q.js +2 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/ollama-sjp09b7p.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/openai-1eyn4hw0.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/openai-compatible-f99c7syq.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/orchestration-embedding-model-strategy-GT27AFII-19936r1a.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/orchestration-language-model-strategy-YEQPUCOT-eavx3zc3.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-04d0mwe8.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/token-util-mt7pvm61.js +1 -0
- package/dist/plugin-runtime/node_modules/@cline/core/dist/vertex-6armtc3s.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/cloud-handoff/git-preparation.d.ts +22 -0
- package/dist/services/global-settings.d.ts +6 -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,1166 @@
|
|
|
1
|
+
import{Jt,Mn,yo,xo,bo,vo,wo,Zo,er,Wt,pi,To,tr,ir,nr,_o,Nt,ar,Ge,Lt,Ti,va,ji,wa,Ta,as,Pt,os,pe,ye,_a,rs,Xt,ko,or,xe,Io,me,Wn,rr,dn,So,di,mi,sr,Nn,$i,Ut,Eo,Ln,cr,Un,Ve,Ue,qi,Bt,ne,Ft,_t,Ro,zi,lr,ur,Bn,he,y,S,Fn,Ke,pr,jn,$n,dr,mr,hr,re,Me,kt,qn,Gi,_e,Zt,Xc,Zc,zn,xf,km,jt,bf,Ao,Ze,gr,fr,yr,xr,br,vr,wr,Gn,U,Vn,Tr,Kn,P,_r,Hn,_i,ki,ss,mn,cs,ls,us,ka,Ia,Sa,ps,Ea,Ra,Aa,Oa,Ca,Pa,Da,Ma,Wa,Na,La,Ua,Ba,Fa,ja,ds,Et,Vi,Ki,ms,hs,gs,$a,fs,ys,xs,bs,vs,qa,ws,k,Ii,kf,za,et,Hi,gt,$t,Ga,Va,Si,Z,He,hn,Qn,Ts,be,Ka,Ha,Qa,Ya,Dt,Ja,Xa,ei,gn,Za,kr,Ir,Yn,Sr,Er,eo,to,Qi,Xn,ti,Rr,tt,Ei,Zn,io,fn,ct,yn,ft,Mt,Ri,K,Ji,ao,oo,st,qt,xn,ge,hi,ii,bn,ea,Xi,zt,Zi}from"../../index-ffna8yzn.js";import"../../index-hkmarmve.js";import{R,kn,Wi}from"../../index-w9n2kgjk.js";import"../../index-ddwn220p.js";import"../../index-kqacxn3s.js";import"../../index-p5k5hnam.js";import"../../index-sdvqs19c.js";import"../../index-a9d2sjh0.js";import{X}from"../../index-d4pbedxj.js";import{wi,ns,xa,Jo,ba}from"../../index-3qy7846d.js";import{pc,Cn,Y,ga,q,un,ot,go,Ko,Ho,x,rt,f,h,wt,V,Qo,Je}from"../../index-yjbp9r76.js";import{Xo}from"../../index-6dpcn5cw.js";import{Yo}from"../../index-9g67p34k.js";import{Xr,ui,Zr,es,ts,is,Pn,Dn}from"../../index-cadyf2yp.js";import{fo}from"../../index-m3gtj35r.js";import{ya,pn}from"../../index-bwet95hr.js";import"../../index-418gvd4a.js";import"../../index-gevnedsc.js";import"../../index-f25bf131.js";import"../../index-f4rfmj6q.js";import"../../index-5hwscy9s.js";import"../../index-cyyvppz9.js";import"../../index-ztb3cjfh.js";import{oa,xi}from"../../index-bhf7enwn.js";import{v,e,n,r,m,o,t,ae,p,w,W,d,sn,s,a,J,je}from"../../index-edf1hmcw.js";import{randomUUID as XE}from"node:crypto";import{existsSync as mI,mkdirSync as am,readFileSync as hI,renameSync as Sh,rmdirSync as JE,rmSync as lm,statSync as VE,unlinkSync as fI,writeFileSync as gI}from"node:fs";import{dirname as yI,join as ug}from"node:path";import{setTimeout as YE}from"node:timers/promises";import{existsSync as Xu,readFileSync as vA,statSync as wA}from"node:fs";import{basename as RI,dirname as ru,extname as bA,join as Ju,resolve as Fl}from"node:path";import{mkdirSync as IA,readFileSync as kA,statSync as SA,writeFileSync as TA}from"node:fs";import{dirname as _A}from"node:path";import{existsSync as fx,readFileSync as gx}from"node:fs";import{basename as yx,dirname as Tg,extname as vx,join as wx,resolve as Fd}from"node:path";import{existsSync as nn,readFileSync as FI}from"node:fs";import{builtinModules as bx,createRequire as Ix}from"node:module";import{dirname as qI,extname as jI,isAbsolute as kx,relative as UY,resolve as ht}from"node:path";import{fileURLToPath as BI}from"node:url";import{existsSync as Eg}from"node:fs";import{dirname as Ag,join as iu,resolve as Sx}from"node:path";import{fileURLToPath as Tx}from"node:url";import{existsSync as jl}from"node:fs";import{createRequire as zI}from"node:module";import{dirname as nu,join as Vs}from"node:path";import{fileURLToPath as Ux}from"node:url";import{spawn as Fx}from"node:child_process";import{basename as qx}from"node:path";import{Worker as Mg}from"node:worker_threads";import{spawn as MC}from"node:child_process";import{spawn as LC}from"node:child_process";import{openSync as DC}from"node:fs";import{existsSync as UC,readdirSync as FC,readFileSync as qC}from"node:fs";import{join as Lg}from"node:path";import{readdirSync as tR}from"node:fs";import{homedir as rR}from"node:os";import{isAbsolute as sR,join as Nc,resolve as li}from"node:path";import{setTimeout as Bg}from"node:timers/promises";import{createHash as iR}from"node:crypto";import{createHash as EP}from"node:crypto";import{createHash as BM}from"node:crypto";import{spawn as Ty}from"node:child_process";import{randomUUID as Zk}from"node:crypto";import{createWriteStream as AN,existsSync as xN,mkdtempSync as CN,renameSync as _y,rmSync as mu,writeFileSync as RN}from"node:fs";import{readdir as PN,readFile as MN,rm as Bd,stat as Ey}from"node:fs/promises";import{tmpdir as eS}from"node:os";import{join as Qs}from"node:path";import{StringDecoder as NN}from"node:string_decoder";import{execFile as ON,spawnSync as ZQ}from"node:child_process";import{readFile as Ay}from"node:fs/promises";import*as Pr from"node:fs/promises";import*as zr from"node:path";import*as pS from"node:os";import*as Es from"node:fs/promises";import*as ks from"node:path";import{createReadStream as UO}from"node:fs";import*as nc from"node:fs/promises";import*as ni from"node:path";import{createInterface as FO}from"node:readline";import{Readable as qO}from"node:stream";import{randomUUID as jO}from"node:crypto";import{spawn as yS}from"node:child_process";import*as vS from"node:fs/promises";import*as oc from"node:path";import{mkdir as JO}from"node:fs/promises";import{mkdir as YO,writeFile as QO}from"node:fs/promises";import{join as ZO}from"node:path";import{spawn as s$}from"node:child_process";import{realpathSync as i$}from"node:fs";import{readdir as n$}from"node:fs/promises";import o$ from"node:os";import fu from"node:path";import{isMainThread as wS,parentPort as jy,Worker as a$}from"node:worker_threads";import{stat as b$}from"node:fs/promises";import co from"node:path";import{randomUUID as B$}from"node:crypto";import{mkdirSync as tL,writeFileSync as rL}from"node:fs";import{dirname as sL}from"node:path";import{createHash as EL}from"node:crypto";import{lstat as AL,readdir as JS,readFile as pf,realpath as mf,stat as Wl}from"node:fs/promises";import{validateHeaderName as xL,validateHeaderValue as CL}from"node:http";import{isIP as RL}from"node:net";import{basename as J8,dirname as PL,isAbsolute as VS,join as Fs,relative as YS,resolve as vn}from"node:path";import{chmodSync as dv,existsSync as tp,mkdirSync as JL,readFileSync as VL,renameSync as YL,rmSync as QL,writeFileSync as ZL}from"node:fs";import{basename as uv,dirname as Nm}from"node:path";import{existsSync as xD,mkdirSync as CD,readFileSync as RD,renameSync as PD,rmSync as MD,writeFileSync as ND}from"node:fs";import{dirname as r0,join as OD}from"node:path";import{existsSync as XD,readFileSync as JD}from"node:fs";import{dirname as VD,join as Um}from"node:path";import{createHash as gU}from"node:crypto";import{resolve as yU}from"node:path";import{setTimeout as vU}from"node:timers/promises";import{existsSync as bU,mkdirSync as IU,readFileSync as kU,writeFileSync as SU}from"node:fs";import{dirname as TU}from"node:path";import{execFile as DU,spawn as UU}from"node:child_process";import{createHash as FU}from"node:crypto";import{mkdir as qU,readdir as jU,rm as Tu,stat as BU,writeFile as HU}from"node:fs/promises";import{join as Kl}from"node:path";import{promisify as zU}from"node:util";import{appendFileSync as tF,readFileSync as rF}from"node:fs";import{join as sF}from"node:path";import{existsSync as nF,readdirSync as oF}from"node:fs";import{basename as aF,extname as lF,join as dF}from"node:path";import{spawn as fF}from"node:child_process";import{execFile as $F}from"node:child_process";import{basename as LF,resolve as DF}from"node:path";import{performance as Av}from"node:perf_hooks";import{promisify as UF}from"node:util";import{createHash as XF}from"node:crypto";import{createHash as lq}from"node:crypto";import{resolve as dq}from"node:path";import{existsSync as Gd,mkdirSync as pq,readdirSync as mq,rmdirSync as hq,rmSync as fq,unlinkSync as gq}from"node:fs";import{dirname as Mv,join as sl}from"node:path";import{existsSync as kq,mkdirSync as Sq,readFileSync as Tq,writeFileSync as _q}from"node:fs";import{resolve as Eq}from"node:path";var Aq=v(Xr(),1);import{execFile as Oq}from"node:child_process";import{randomUUID as $q}from"node:crypto";import{promisify as Lq}from"node:util";import{appendFileSync as Xq}from"node:fs";import{join as Jq}from"node:path";import{existsSync as Yq,readdirSync as Qq,readFileSync as Zq}from"node:fs";import{basename as Lv,extname as ej,join as tj}from"node:path";import{createHash as Pj}from"node:crypto";import{watch as Mj}from"node:fs";import{readdir as Nj,readFile as Oj,stat as $j}from"node:fs/promises";import{join as Lj}from"node:path";import{readdir as If,readFile as Uj,realpath as pp,stat as Uo}from"node:fs/promises";import{basename as Hs,dirname as Fj,extname as Ru,isAbsolute as qj,join as Cr,relative as jj,resolve as Bs}from"node:path";import{createHash as aB}from"node:crypto";import{spawn as SB}from"node:child_process";import{mkdir as TB}from"node:fs/promises";import{StringDecoder as sT}from"node:string_decoder";import{randomUUID as _B}from"node:crypto";import{appendFileSync as BB,existsSync as ro,mkdirSync as aw,readdirSync as HB,readFileSync as hp,renameSync as lw,statSync as zB,writeFileSync as dw}from"node:fs";import{join as fp}from"node:path";import{existsSync as WB,mkdirSync as KB}from"node:fs";import{join as GB}from"node:path";import{existsSync as hH}from"node:fs";import{readFile as fH}from"node:fs/promises";import{readFile as IH,stat as kH}from"node:fs/promises";import{existsSync as CH,mkdirSync as RH}from"node:fs";import{join as PH}from"node:path";import{existsSync as MH,mkdirSync as NH}from"node:fs";import{dirname as OH}from"node:path";import{appendFileSync as $H,existsSync as LH,mkdirSync as Tw,readFileSync as DH,writeFileSync as _w}from"node:fs";import{readFile as Ew,rm as UH}from"node:fs/promises";import{dirname as Aw,join as FH}from"node:path";import{randomUUID as qH}from"node:crypto";import{mkdir as jH,open as wT,rename as BH,rm as HH}from"node:fs/promises";import{dirname as xw}from"node:path";import{chmodSync as oz,existsSync as az,mkdirSync as lz}from"node:fs";import{dirname as dz}from"node:path";import{join as mz}from"node:path";import{createHash as hz,randomBytes as _T}from"node:crypto";import{mkdir as Qm,open as Rw,readFile as ET,rename as fz,rm as fc,writeFile as gz}from"node:fs/promises";import{dirname as AT,join as $f}from"node:path";import{resolve as kp}from"node:path";import{basename as Wz}from"node:path";import{mkdirSync as Kz,writeFileSync as Gz}from"node:fs";import{isAbsolute as Xz,join as LT}from"node:path";import{existsSync as dW,readdirSync as uW,readFileSync as cW,statSync as pW}from"node:fs";import{relative as mW}from"node:path";import{randomUUID as ul}from"node:crypto";import{createHash as PW}from"node:crypto";import{existsSync as XW,mkdirSync as JW,realpathSync as VW,watch as YW}from"node:fs";import{relative as QW,resolve as ZW}from"node:path";import{isAbsolute as tK,relative as rK,resolve as ho,sep as sK}from"node:path";import{stat as oK}from"node:fs/promises";import{join as aK}from"node:path";import{existsSync as Co,readdirSync as vK,readFileSync as wK}from"node:fs";import{basename as Go,dirname as ih,extname as nh,isAbsolute as ZT,join as zf,relative as e_,resolve as oh}from"node:path";import{readFile as bK,writeFile as IK}from"node:fs/promises";import{isAbsolute as _K,relative as EK,resolve as Vw}from"node:path";import{existsSync as lh,realpathSync as BK,statSync as HK,watch as zK}from"node:fs";import{relative as WK}from"node:path";import{existsSync as Yr,linkSync as KK,lstatSync as Pp,mkdirSync as GK,readdirSync as XK,readFileSync as JK,realpathSync as tb,renameSync as VK,rmSync as rb,writeFileSync as YK}from"node:fs";import{basename as QK,dirname as ZK,isAbsolute as dh,join as Mp,relative as l_,resolve as sb,sep as eG}from"node:path";import{createHash as tG}from"node:crypto";import{existsSync as Np,realpathSync as ib}from"node:fs";import{dirname as rG,isAbsolute as Wf,relative as Kf,resolve as d_,sep as sG}from"node:path";import{randomUUID as db}from"node:crypto";import{resolve as ub}from"node:path";import{resolve as bb}from"node:path";import{realpathSync as uh,statSync as EG}from"node:fs";import{isAbsolute as f_,relative as AG,sep as g_}from"node:path";import{randomUUID as zG}from"node:crypto";import{isAbsolute as Eb}from"node:path";import{randomUUID as KG}from"node:crypto";import{randomUUID as t2}from"node:crypto";import{posix as qu}from"node:path";var R_=v(ns(),1),P_=v(Xo(),1);import{spawn as r2}from"node:child_process";import{closeSync as s2,mkdirSync as i2,openSync as n2,readFileSync as o2,unlinkSync as a2}from"node:fs";import{basename as l2,dirname as d2,join as u2}from"node:path";import{fileURLToPath as c2}from"node:url";import{execFile as pX}from"node:child_process";import{join as nJ}from"node:path";import{join as XJ}from"node:path";import{resolve as iI}from"node:path";import{timingSafeEqual as dV}from"node:crypto";import uV from"node:http";import{URL as kh}from"node:url";import{isAbsolute as cV,relative as pV,resolve as rm,sep as mV}from"node:path";import{spawnSync as _V}from"node:child_process";import{release as NV}from"node:os";var IE=v(ui(),1),kE=v(Zr(),1),SE=v(es(),1),TE=v(fo(),1),_E=v(ya(),1),aa=v(ts(),1),Sn=v(is(),1),la=v(pn(),1),EE=v(Yo(),1);var Ui=v(ui(),1),qE=(i,l,u)=>()=>{if(i)try{l=i(i=0)}catch(c){u=[c]}if(u)throw u[0];return l};async function jE(i,l,u,c){let g=BE(l),b=await zE(u,c);if(g.length===0&&!b)return i;let I=[{type:"text",text:i},...g];if(b)I.push(...b);return I}function BE(i){if(!i||i.length===0)return[];let l=[];for(let u of i){let c=HE(u);if(c)l.push(c)}return l}function HE(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 zE(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 T=I instanceof Error?I.message:String(I);return{type:"file",path:b,content:`Error fetching content: ${T}`}}}));if(c.length===0)return;return c}function WE(i){return i.trim().split(/[\\/]/).at(-1)?.toLowerCase().replace(/\.(?:cmd|exe)$/i,"")??""}function KE(i){if(WE(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 GE(i){return i.type==="stdio"?KE(i)??i:i}function kc(i){if(!i)return;if(i==="http")return"streamableHttp";return i}function ln(){return gn()}function QE(i,l){am(yI(i),{recursive:!0});let u=`${i}.tmp.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}`;try{gI(u,l,{encoding:"utf8",flag:"wx"}),Sh(u,i)}catch(c){try{fI(u)}catch{}throw c}}function ZE(i){Atomics.wait(xI,0,0,i)}function eA(i){return`${i}.lock`}function vI(){return`${process.pid}.${Date.now()}.${XE()}`}function wI(i,l){am(yI(i),{recursive:!0});let u=`${i}.tmp.${l}`;lm(u,{recursive:!0,force:!0}),am(u,{recursive:!0}),gI(ug(u,`owner.${l}`),l,{encoding:"utf8",flag:"wx"});try{return Sh(u,i),{lockDir:i,ownerFile:ug(i,`owner.${l}`)}}catch(c){if(lm(u,{recursive:!0,force:!0}),mI(i))return;throw c}}function bI(i,l){let u;try{u=Date.now()-VE(i).mtimeMs}catch(g){if(g.code==="ENOENT")return;throw g}if(u<_h)return;l.logger?.log(`[mcp-settings] Stale lock directory at ${i} (age ${u}ms); reclaiming.`,{severity:"warn"});let c=`${i}.stale.${vI()}`;try{Sh(i,c)}catch(g){if(g.code==="ENOENT")return;throw g}lm(c,{recursive:!0,force:!0})}function tA(i){try{fI(i.ownerFile)}catch(l){if(l.code!=="ENOENT")throw l}try{JE(i.lockDir)}catch(l){let u=l.code;if(u!=="ENOENT"&&u!=="ENOTEMPTY"&&u!=="EEXIST")throw l}}function II(i){let l=eA(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:vI()}}function rA(i,l){let{lockDir:u,token:c}=II(i),g=l.timeoutMs??_h,b=Date.now();while(!0){let I=wI(u,c);if(I)return Ql.add(u),I;if(Date.now()-b>g)throw new Th(`Timed out waiting for MCP settings lock at ${u} after ${g}ms.`);bI(u,l),ZE(AI)}}async function sA(i,l){let{lockDir:u,token:c}=II(i),g=l.timeoutMs??_h,b=Date.now();while(!0){let I=wI(u,c);if(I)return Ql.add(u),I;if(Date.now()-b>g)throw new Th(`Timed out waiting for MCP settings lock at ${u} after ${g}ms.`);bI(u,l),await YE(AI)}}function kI(i,l,u){try{let c=oA(l),g=aA(c,u);return QE(l,`${JSON.stringify(c,null,2)}
|
|
2
|
+
`),g}finally{Ql.delete(i.lockDir),tA(i)}}function iA(i,l,u={}){let c=rA(i,u);return kI(c,i,l)}async function nA(i,l,u={}){let c=await sA(i,u);return kI(c,i,l)}function oA(i){let l=dA(i);if(!l.mcpServers||typeof l.mcpServers!=="object"||Array.isArray(l.mcpServers))l.mcpServers={};return l}function aA(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 um("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 um("MCP settings mutator must be deterministic and free of side effects; repeated calls produced different return values.");return I}function lA(i){let l=hI(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 dA(i){try{return lA(i)}catch(l){if(l.code==="ENOENT")return{};throw l}}function SI(i,l){if(!Object.hasOwn(i,l))return;let u=i[l];if(!u||typeof u!=="object"||Array.isArray(u))return;return u}function uA(i,l,u){Object.defineProperty(i,l,{value:u,enumerable:!0,configurable:!0,writable:!0})}function TI(i={}){let l=i.filePath??ln(),u=hI(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=EI.safeParse(c);if(!g.success){let b=g.error.issues.map((I)=>{let T=I.path.join(".");return T?`${T}: ${I.message}`:I.message}).join("; ");throw Error(`Invalid MCP settings at "${l}": ${b}`)}return g.data}function Ku(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 cA(i){if(i===void 0)return;let l=$d.safeParse(i);if(!l.success)return;return Ku(l.data)}function _I(i={}){let l=i.filePath??ln();return mI(l)}function dm(i={}){let l=TI(i);return Object.entries(l.mcpServers).map(([u,c])=>pA(u,c))}function pA(i,l){return{name:i,transport:GE(l.transport),disabled:l.disabled,timeoutSeconds:l.timeoutSeconds,metadata:l.metadata,oauthClient:l.oauthClient,oauth:l.oauth}}function mA(i){let l=i.filePath??ln(),u=i.name.trim();if(!u)throw Error("MCP server settings toggle requires a server name.");iA(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=SI(b,u);if(!I)throw Error(`Unknown MCP server: ${u}`);let T={...I};if(i.disabled)T.disabled=!0;else delete T.disabled;uA(b,u,T),c.mcpServers=b})}function hA(i,l={}){let u=TI(l);if(!Object.hasOwn(u.mcpServers,i))return;return Ku(u.mcpServers[i]?.oauth)}function fA(i,l,u){return(c)=>{let g=c.mcpServers,b=SI(g,i);if(!b)throw Error(`Unknown MCP server: ${i}`);if(u.expectedOAuthClient!==void 0){let _=Ld.safeParse(b.oauthClient),E=_.success?_.data:void 0,A=u.expectedOAuthClient??void 0;if(E?.clientId!==A?.clientId||E?.clientSecret!==A?.clientSecret)throw new Gu(i)}let I=cA(b.oauth)??{},T=Ku(l(I));if(T)b.oauth=T;else delete b.oauth;return T??{}}}async function gA(i,l,u={}){let c=u.filePath??ln();return nA(c,fA(i,l,u))}async function yA(i,l={}){let u=dm(l);for(let c of u)await i.registerServer(c);return u}var _n,Sc,Tc,$d,Ld,cg,pg,mg,hg,fg,gg,_c,yg,vg,wg,EI,Gu,Th,um,_h=1e4,AI=25,xI,Ql,CI=qE(()=>{_n=d(e(),e()),Sc=d(e(),m()),Tc=je((i)=>Ve(i)?Ue(i):void 0,n().optional()),$d=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(),Ld=t({clientId:e().min(1),clientSecret:e().min(1).optional()}).strip(),cg=t({type:a("stdio"),command:e().min(1),args:o(e()).optional(),cwd:e().min(1).optional(),env:_n.optional()}),pg=t({type:a("sse"),url:e().url(),headers:_n.optional()}),mg=t({type:a("streamableHttp"),url:e().url(),headers:_n.optional()}),hg=w("type",[cg,pg,mg]),fg=t({transport:hg,disabled:r().optional(),timeout:Tc,metadata:Sc.optional(),oauthClient:Ld.optional(),oauth:$d.optional()}).transform((i)=>({transport:i.transport,disabled:i.disabled,timeoutSeconds:i.timeout,metadata:i.metadata,oauthClient:i.oauthClient,oauth:i.oauth})),gg=s(["stdio","sse","http","streamableHttp"]).optional(),_c=t({type:s(["stdio","sse","streamableHttp"]).optional(),transportType:gg,disabled:r().optional(),timeout:Tc,metadata:Sc.optional(),oauthClient:Ld.optional(),oauth:$d.optional()}),yg=_c.extend({command:e().min(1),args:o(e()).optional(),cwd:e().min(1).optional(),env:_n.optional()}).superRefine((i,l)=>{let u=i.type??kc(i.transportType);if(u&&u!=="stdio")l.addIssue({code:oa.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})),vg=_c.extend({url:e().url(),headers:_n.optional()}).superRefine((i,l)=>{let u=i.type??kc(i.transportType)??"sse";if(u!=="sse"&&u!=="streamableHttp")l.addIssue({code:oa.custom,message:'Expected type "sse" or "streamableHttp" for URL-based MCP server',path:["type"]})}).transform((i)=>{if((i.type??kc(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}}),wg=p([fg,yg,vg]),EI=t({mcpServers:d(e(),wg)}).passthrough(),Gu=class extends Error{constructor(l){super(`OAuth client configuration changed while authorizing MCP server "${l}". Start authorization again.`);this.name="McpOAuthClientChangedError"}},Th=class extends Error{constructor(l){super(l);this.name="McpSettingsLockTimeoutError"}},um=class extends Error{constructor(l){super(l);this.name="McpSettingsMutatorPurityError"}},xI=new Int32Array(new SharedArrayBuffer(4)),Ql=new Set}),EA=500,Pe={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:gr},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:fr,PROVIDER_STREAM_STARTED:yr,FIRST_CHUNK_RECEIVED:xr,PROVIDER_STREAM_FAILED:br,MAX_TOKENS_RECOVERY:wr,CANCELLED:vr,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:Gn,TOOL_TIMEOUT:"sdk.tool_timeout",PLAN_MODE_COMMAND_BLOCKED:"sdk.plan_mode_command_blocked"},FEATURE_FLAGS:{FLAG_CALLED:"$feature_flag_called"}};function Oe(i,l,u){i?.capture({event:l,properties:u})}function Eh(i){if(!i)return;return i.substring(0,EA)}function AA(i){if(typeof i==="string")return"Error";return i.name?.trim()||i.constructor?.name||"Error"}function xA(i){return typeof i==="string"?i:i.message}function bg(i,l){return i.some((u)=>l.has(u.trim().toLowerCase()))}function CA(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:bg(u,new Set(["git"])),has_mercurial:bg(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;Oe(i,Pe.WORKSPACE.INITIALIZED,c)}function RA(i,l,u){Oe(i,Pe.WORKSPACE.INIT_ERROR,{error_type:AA(l),error_message:Eh(xA(l)),fallback_to_single_root:u.fallback_to_single_root,workspace_count:u.workspace_count??0})}function Ah(i,l){Oe(i,Pe.USER.AUTH_STARTED,{provider:l})}function xh(i,l,u){Oe(i,Pe.USER.AUTH_SUCCEEDED,{provider:l,...u})}function su(i,l,u,c){Oe(i,Pe.USER.AUTH_FAILED,{provider:l,errorMessage:Eh(u),...c?.requestId?{request_id:c.requestId}:{}})}function Ch(i,l,u,c){Oe(i,Pe.USER.AUTH_LOGGED_OUT,{provider:l,reason:u,...c})}function ql(i,l,u){Oe(i,Pe.USER.AUTH_REFRESH_SOFT_FAILURE,{provider:l,...u})}function PA(i,l,u){Oe(i,Pe.USER.AUTH_RUN_RETRY,{provider:l,recovered:u?.recovered})}function MA(i,l){i?.captureRequired(Pe.USER.TELEMETRY_OPT_OUT,l)}function Vu(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 NA(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 OA(i,l){Oe(i,Pe.TASK.CREATED,l)}function $A(i,l){Oe(i,Pe.TASK.RESTARTED,l)}function Ig(i,l){Oe(i,Pe.TASK.COMPLETED,l)}function PI(i,l){Oe(i,Pe.TASK.CONVERSATION_TURN,{...l,timestamp:new Date().toISOString()})}function LA(i,l){Oe(i,Pe.TASK.TOKEN_USAGE,l)}function DA(i,l,u){Oe(i,Pe.TASK.MODE_SWITCH,{ulid:l,mode:u})}function ra(i,l){Oe(i,Pe.TASK.TOOL_USED,l)}function UA(i,l){Oe(i,Pe.TASK.SKILL_USED,l)}function FA(i,l){Oe(i,Pe.TASK.DIFF_EDIT_FAILED,l)}function qA(i,l){Oe(i,Pe.TASK.MISTAKE_LIMIT_REACHED,{...l,timestamp:new Date().toISOString()})}function kg(i,l){Oe(i,Pe.TASK.CAPABILITY_OWNER_GONE,l)}function jA(i,l){Oe(i,Pe.TASK.RUN_IDLE,Rh(l))}function BA(i,l){Oe(i,Pe.SDK.TOOL_TIMEOUT,Rh(l))}function HA(i,l){Oe(i,Pe.SDK.PLAN_MODE_COMMAND_BLOCKED,Rh(l))}function Rh(i){let l={};for(let[u,c]of Object.entries(i))if(c!==void 0)l[u]=c;return l}function zA(i,l,u){Oe(i,Pe.TASK.MENTION_USED,{mentionType:l,contentLength:u,timestamp:new Date().toISOString()})}function WA(i,l,u,c){Oe(i,Pe.TASK.MENTION_FAILED,{mentionType:l,errorType:u,errorMessage:Eh(c),timestamp:new Date().toISOString()})}function KA(i,l,u,c,g){Oe(i,Pe.TASK.MENTION_SEARCH_RESULTS,{queryLength:l.length,resultCount:u,searchType:c,isEmpty:g,timestamp:new Date().toISOString()})}function Ph(i,l){Oe(i,Pe.TASK.AGENT_CREATED,{...l,timestamp:new Date().toISOString()})}function GA(i,l){Oe(i,Pe.TASK.AGENT_TEAM_CREATED,{...l,timestamp:new Date().toISOString()})}function Sg(i,l){Oe(i,l.event==="ended"?Pe.TASK.SUBAGENT_COMPLETED:Pe.TASK.SUBAGENT_STARTED,{...l,timestamp:new Date().toISOString()})}function XA(i,l){Oe(i,Pe.HOOKS.DETACHED_RUNTIME,{hookName:l.hookName,durationMs:l.durationMs,exitCode:l.exitCode??void 0,exited:l.exited,timestamp:new Date().toISOString()})}function JA(i,l,u,c){Oe(i,Pe.HOOKS.DISCOVERY_COMPLETED,{hookName:l,globalCount:u,workspaceCount:c,totalCount:u+c,timestamp:new Date().toISOString()})}function VA(i,l){Oe(i,Pe.TASK.COMPACTION_EXECUTED,{...l,timestamp:new Date().toISOString()})}function YA(i,l){Oe(i,Pe.TASK.COMPACTION_SKIPPED,{...l,timestamp:new Date().toISOString()})}function QA(i,l){Oe(i,Pe.TASK.COMPACTION_BUDGET_EMERGENCY,{...l,timestamp:new Date().toISOString()})}function ZA(i,l){Oe(i,Pe.SESSION.ERROR_RECORDED,l)}function da(i,l){try{Oe(i,l.phase==="started"?Pe.SCHEDULE.RUN_STARTED:Pe.SCHEDULE.RUN_FINISHED,{triggerKind:l.triggerKind,attemptCount:l.attemptCount,startDelayMs:l.startDelayMs,...l.phase==="finished"?{outcome:l.outcome,durationMs:l.durationMs}:{}})}catch{}}var Ec=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}),ex=s(["basic","agentic"]).catch("agentic"),tx=sn(s($i),t({enabled:r()}).strip()).optional(),rx=s(["plan","act"]),Mh=t({telemetryOptOut:r().default(!1).catch(!1),autoUpdateEnabled:r().default(!0).catch(!0),compactionStrategy:ex.optional(),compactionEnabled:r().optional().catch(void 0),planActMode:rx.optional().catch(void 0),toolAutoApprove:r().optional().catch(void 0),tuiTheme:e().optional().catch(void 0),cloudModelId:e().optional().catch(void 0),disabledTools:Ec.optional(),tools:tx,disabledPlugins:Ec.optional(),disabledAgentPlugins:Ec.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.cloudModelId?.trim())l.cloudModelId=i.cloudModelId.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 Dd(){return Mh.parse({})}var Ud;function sx(){Ud=void 0}function ix(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 nx(i){let l;try{l=kA(i,"utf8")}catch{return{value:Dd(),loadFailed:!0}}try{let u=Mh.safeParse(JSON.parse(l));return u.success?{value:u.data,loadFailed:!1}:{value:Dd(),loadFailed:!0}}catch{return{value:Dd(),loadFailed:!0}}}function MI(){let i=ei(),l=SA(i,{throwIfNoEntry:!1}),u=l?.mtimeMs??0,c=l?.size??0,g=Ud;if(g&&g.path===i&&g.mtimeMs===u&&g.size===c)return g;let b=l?nx(i):{value:Dd(),loadFailed:!1},I=ix(b.value);return Ud={path:i,mtimeMs:u,size:c,value:I,loadFailed:b.loadFailed},Ud}function _s(){return MI().value}function Zl(i,l={}){let u=ei(),c=_s();IA(_A(u),{recursive:!0});let g=Mh.parse(i);if(!c.telemetryOptOut&&g.telemetryOptOut)MA(l.telemetry);TA(u,`${JSON.stringify(g,null,2)}
|
|
3
|
+
`,"utf8"),sx()}function ox(){return _s().telemetryOptOut}function ed(i){return new Set(i??_s().disabledTools??[])}function NI(i){return new Set(i??_s().disabledPlugins??[])}function Nh(i){return new Set(i??_s().disabledAgentPlugins??[])}function OI(i){return $i.includes(i)}function ax(){let i=MI();return{web_search:{enabled:!i.loadFailed},...i.value.tools}}function $I(i){return ax()[i]?.enabled===!0}function lx(i,l){let u=_s();Zl({...u,tools:{...u.tools,[i]:{enabled:l}}})}function dx(i){if(OI(i)){let g=$I(i);return lx(i,!g),g}let l=_s(),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 ux(i,l){let u=[...new Set(i.map((I)=>I.trim()).filter(Boolean))];if(u.length===0)return;let c=_s(),g=ed(c.disabledTools),b={...c.tools};for(let I of u){if(OI(I)){b[I]={enabled:!l};continue}if(l)g.add(I);else g.delete(I)}Zl({...c,disabledTools:[...g],tools:b})}function cx(i,l){return ux([i],l),l}function px(i,l){let u=i.trim();if(!u)return;let c=_s(),g=NI(c.disabledPlugins);if(l)g.add(u);else g.delete(u);Zl({...c,disabledPlugins:[...g]})}function mx(i,l){let u=i.trim();if(!u)return;let c=_s(),g=Nh(c.disabledAgentPlugins);if(l)g.add(u);else g.delete(u);Zl({...c,disabledAgentPlugins:[...g]})}function LI(i,l){let u=NI(l);if(u.size===0)return[...i];return i.filter((c)=>!u.has(c))}function Yu(i,l){let u=ed(l);if(u.size===0)return[...i];return i.filter((c)=>!u.has(c.name))}function hx(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 DI=new WeakSet;function UI(i){return DI.add(i),i}function _g(i){return DI.has(i)}var xg="CLINE_PLUGIN_RUNTIME_DIR",Cg=!1,Rg;function Pg(i){return Eg(iu(i,"plugin-sandbox-bootstrap.js"))&&Eg(iu(i,"node_modules","@cline","core","package.json"))}function _x(){let i=process.env[xg]?.trim();if(i){let u=Sx(i);if(!Pg(u))throw Error(`${xg} does not contain a complete plugin runtime: ${i}`);return u}if(typeof __CLINE_PLUGIN_RUNTIME_DIR__<"u")return __CLINE_PLUGIN_RUNTIME_DIR__;if(Cg)return Rg;Cg=!0;let l=Ag(Tx(import.meta.url));for(;;){for(let c of[l,iu(l,"plugin-runtime"),iu(l,"dist","plugin-runtime")])if(Pg(c))return Rg=c,c;let u=Ag(l);if(u===l)return;l=u}}var Ex;function Ax(){return Ex}var xx=qI(BI(import.meta.url)),zY=Ix(import.meta.url),Cx=ht(xx,"..","..","..","..",".."),WY=Px(Cx),KY=new Set(bx.flatMap((i)=>[i,i.replace(/^node:/,"")])),qd=new Set(ar),Rx=["development","node","import","require","default"];function Px(i){let l={},u={"@cline/sdk":ht(i,"packages/sdk/src/index.ts"),"@cline/agents":ht(i,"packages/agents/src/index.ts"),"@cline/core":ht(i,"packages/core/src/index.ts"),"@cline/llms":ht(i,"packages/llms/src/index.ts"),"@cline/shared":ht(i,"packages/shared/src/index.ts"),"@cline/shared/storage":ht(i,"packages/shared/src/storage/index.ts"),"@cline/shared/db":ht(i,"packages/shared/src/db/index.ts")};for(let[c,g]of Object.entries(u))if(nn(g))l[c]=g;for(let c of["agents","core","llms","shared"]){let g=ht(i,"packages",c),b=ht(g,"package.json");if(!nn(b))continue;try{let I=JSON.parse(FI(b,"utf8"));if(typeof I.name!=="string"||!I.exports)continue;if(typeof I.exports==="string"){let T=ht(g,I.exports);if(nn(T))l[I.name]=T;continue}if(typeof I.exports!=="object")continue;for(let[T,_]of Object.entries(I.exports)){let E=Mx(g,_);if(!E)continue;let A=T==="."?I.name:`${I.name}/${T.replace(/^\.\//,"")}`;l[A]=E}}catch{}}return l}function Mx(i,l){let u=HI(l);if(!u)return null;let c=Nx(i,u);for(let g of c)if(nn(g))return g;return null}function HI(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 Rx){let g=HI(u[c],l);if(g)return g}return null}function Nx(i,l){let u=l.replace(/^\.\//,""),c=[ht(i,l)];if(u.startsWith("dist/")){let g=u.replace(/^dist\//,"src/").replace(/\.(mjs|cjs|js)$/,"");return[ht(i,`${g}.ts`),ht(i,`${g}.tsx`),ht(i,`${g}.mts`),ht(i,`${g}.cts`),...c]}return c}function Ox(i){return!(i.startsWith(".")||i.startsWith("/")||i.startsWith("file:")||i.startsWith("data:")||i.startsWith("http:")||i.startsWith("https:"))}function $x(i,l){let u=l.startsWith("file:")?BI(l):kx(l)?l:ht(qI(i),l);if(nn(u)&&qd.has(jI(u)))return u;for(let c of qd){let g=`${u}${c}`;if(nn(g))return g}for(let c of qd){let g=ht(u,`index${c}`);if(nn(g))return g}return null}function Lx(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 Oh(i){let l=[],u=(c,g)=>{if(g.has(c))return;g.add(c);let b;try{b=FI(c,"utf8")}catch{l.push(`${c}:missing`);return}if(l.push(`${c}:${b.length}:${Dx(b)}`),!qd.has(jI(c)))return;for(let I of Lx(b)){if(Ox(I))continue;let T=$x(c,I);if(T)u(T,g)}};return u(i,new Set),l.join("|")}function Dx(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 ou=2147483647;function WI(i){return typeof i==="number"&&Number.isInteger(i)&&i>0&&i<=2147483647?i:void 0}var jx=300;function Ac(i){if(i instanceof Error)return i;return Error(String(i))}function cm(i){return i.exitCode===null&&i.signalCode===null}function ad(i){return cm(i)&&i.connected}var Bx="CLINE_JS_RUNTIME_PATH";function pm(i){let l=i?.trim();if(!l)return!1;let u=qx(l).toLowerCase();return u==="node"||u==="node.exe"||u==="bun"||u==="bun.exe"}function $h(i,l={}){let u=l.isBunRuntime??typeof globalThis.Bun<"u",c=l.selfExecPath??process.execPath;return u&&!!i&&i===c&&!pm(i)}function KI(i={}){let l=i.env??process.env,u=i.runtimeExecutable?.trim()||l[Bx]?.trim();if(u)return u;let c=i.execPath?.trim()||process.execPath;if(pm(c))return c;for(let g of[l.BUN_EXEC_PATH,l.npm_node_execpath,l.NODE]){let b=g?.trim();if(b&&pm(b))return b}if($h(c,i.host))return c;return"node"}function Hx(i,l={}){if(l.launcher)return[l.launcher.command,...l.launcher.argsPrefix,...i];let u=KI({env:l.env,execPath:l.execPath,runtimeExecutable:l.runtimeExecutable}),c=$h(u)?["--use-system-ca",...i]:i;return kt([u,...c],{env:l.env,execArgv:l.execArgv,debugRole:l.name==="plugin-sandbox"?"plugin-sandbox":"sandbox"})}class GI{options;idleTimeoutMs;process=null;requestCounter=0;pending=new Map;idleTimer;shutdowns=new Map;constructor(i){if(this.options=i,this.idleTimeoutMs=WI(i.idleTimeoutMs),i.idleTimeoutMs!==void 0&&this.idleTimeoutMs===void 0)throw RangeError(`idleTimeoutMs must be an integer between 1 and ${ou}`)}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&&cm(i))this.shutdownProcess(i).catch(()=>{});let l=this.options.bootstrapFile?[this.options.bootstrapFile]:["-e",this.options.bootstrapScript??""],u=Hx(l,{name:this.options.name,runtimeExecutable:this.options.runtimeExecutable,launcher:this.options.launcher}),c=u[0]??KI(this.options),g={...Me(process.env)};if(this.options.launcher)delete g.BUN_BE_BUN;else if($h(c))g.BUN_BE_BUN="1";let b=Fx(c,u.slice(1),{stdio:["ignore","ignore","pipe","ipc"],env:g,windowsHide:!0});this.process=b;let I="",T=(_)=>{let E=I+_;I=E.length>4000?E.slice(-4000):E};b.stderr?.setEncoding("utf8"),b.stderr?.on("data",(_)=>{T(_)}),b.on("message",(_)=>{this.onMessage(b,_)}),b.on("error",(_)=>{this.failPendingForProcess(b,Error(`${this.processLabel} process error: ${Ac(_).message}`))}),b.on("exit",(_,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(_)}, 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,T)=>{let _={child:c,resolve:(E)=>I(E),reject:T};if((u.timeoutMs??0)>0)_.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,_);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}": ${Ac(E).message}`))})}catch(E){this.clearPendingRequest(g),T(Ac(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(!cm(i)){this.failPendingForProcess(i,Error(`${this.processLabel} shutdown`));return}await new Promise((l)=>{let u=setTimeout(()=>{try{i.kill("SIGKILL")}catch{}l()},jx);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 xc(i){if(i instanceof Error)return i;return Error(String(i))}class XI{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=WI(i.idleTimeoutMs),i.idleTimeoutMs!==void 0&&this.idleTimeoutMs===void 0)throw RangeError(`idleTimeoutMs must be an integer between 1 and ${ou}`)}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 Mg(this.options.bootstrapFile,this.workerOptions(!1)):new Mg(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=xc(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:Me(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 T={worker:i,resolve:(_)=>b(_),reject:I};if((c.timeoutMs??0)>0)T.timeout=setTimeout(()=>{let _=this.clearPendingRequest(g);if(!_)return;this.shutdownWorker(_.worker).catch(()=>{}),_.reject(Error(`${this.label} call timed out after ${c.timeoutMs}ms: ${l}`))},c.timeoutMs);this.pending.set(g,T);try{let _={type:"call",id:g,method:l,args:u},E=this.outboxes.get(i);if(E)E.push({id:g,message:structuredClone(_)});else i.postMessage(_)}catch(_){this.clearPendingRequest(g),I(xc(_))}})}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(xc(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 zx="CLINE_PLUGIN_IDLE_TIMEOUT_MS",JI="CLINE_PLUGIN_BOOTSTRAP_PATH",Wx=1800000,Kx="__cline_tool_update",Gx="__cline_setup_started";function Xx(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 Jx(){return`@cline/cli-${process.platform==="win32"?"windows":process.platform}-${process.arch}`}function Vx(){let i=process.env.CLINE_WRAPPER_PATH?.trim();if(!i)return;try{let l=zI(i).resolve(`${Jx()}/package.json`),u=Vs(nu(l),"extensions","plugin-sandbox-bootstrap.js");return jl(u)?u:void 0}catch{return}}function Yx(){let i=process.execPath?.trim();if(!i)return;let l=Vs(nu(nu(i)),"extensions","plugin-sandbox-bootstrap.js");return jl(l)?l:void 0}function Qx(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=nu(Ux(import.meta.url)),l=zI(import.meta.url),u=process.env[JI]?.trim();if(u&&jl(u))return{file:u};let c=Vs(i,"plugin-sandbox-bootstrap.ts"),g=jl(c)?void 0:_x();if(g)return{file:Vs(g,"plugin-sandbox-bootstrap.js")};let b=Qx({siblingCandidates:[Vs(i,"plugin-sandbox-bootstrap.js"),Vs(i,"plugin-sandbox-bootstrap.mjs"),Vs(i,"extensions","plugin-sandbox-bootstrap.js"),Vs(i,"agents","plugin-sandbox-bootstrap.js")],sourceBootstrapPath:c,installedCandidates:[Vx(),Yx()]});if(!b||"file"in b)return b;let I=b.sourcePath,T="jiti";try{T=l.resolve("jiti")}catch{}return{sourcePath:I,script:[`const createJiti = require(${JSON.stringify(T)});`,`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 Cc,eC=!1;function tC(){if(eC)throw new au;if(Cc??=Zx(),!Cc)throw new au;return Cc}class au extends Error{constructor(){super(`This build does not ship plugin-sandbox-bootstrap.js, so plugins cannot run. Set ${JI} to a copy of the file, or reinstall Cline.`);this.name="PluginBootstrapMissingError"}}function rC(i,l){return{extensions:[],pluginPaths:[],disabledByPolicy:[],warnings:[],failures:i.map((u)=>({pluginPath:u,phase:"load",message:l.message,stack:l.stack})),shutdown:async()=>{}}}function ua(i,l,u){if(typeof i==="number"&&Number.isInteger(i)&&i>0&&i<=ou)return i;if(u){let c=process.env[u];if(c){let g=Number(c);if(Number.isInteger(g)&&g>0&&g<=ou)return g}}return l}async function Lh(i){let l=ua(i.idleTimeoutMs,Wx,zx),u;try{u=tC()}catch(F){if(F instanceof au)return rC(i.pluginPaths,F);throw F}let c="file"in u?{bootstrapFile:u.file}:{bootstrapScript:u.script},g=ua(i.importTimeoutMs,4000,"CLINE_PLUGIN_IMPORT_TIMEOUT_MS"),b=ua(i.hookTimeoutMs,3000),I=i.setupTimeoutMs===void 0?void 0:ua(i.setupTimeoutMs,4000),T=g+(I??0),_=new Map,E=(F)=>{let j=F.payload;if(F.name===Kx){_.get(String(j?.callId))?.(j?.update);return}if(F.name===Gx){i.onSetupStarted?.(String(j?.pluginPath));return}i.onEvent?.(F)},A=i.transport==="worker"?new XI({name:"plugin-worker",...c,idleTimeoutMs:l,onEvent:E,onUnexpectedExit:i.onUnexpectedExit,disposeMethod:"dispose",disposeTimeoutMs:b}):new GI({name:"plugin-sandbox",launcher:"bootstrapFile"in c?Ax():void 0,...c,idleTimeoutMs:l,onEvent:E}),C=ua(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},M,O=()=>(M??=A.call("initialize",N,{timeoutMs:T}).finally(()=>{M=void 0}),M),L;try{L=await A.call("initialize",N,{timeoutMs:T})}catch(F){throw await A.shutdown().catch(()=>{}),F}let D=L.plugins.map(Xx);return{extensions:D.map((F)=>{let j={name:F.name,__clinePluginPath:F.pluginPath,manifest:F.manifest,setup:(B)=>{nC(B,A,F,C,O,_),oC(B,A,F,C,O),aC(B,A,F,C,O),dC(B,A,F,C,O),lC(B,F)}};return j.hooks=cC(A,F,b,O),j}),disabledByPolicy:L.disabledByPolicy??[],failures:L.failures,pluginPaths:D.map((F)=>F.pluginPath),shutdown:async()=>{await A.shutdown()},warnings:L.warnings}}function sC(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 mm(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)=>mm(g,l)??null);let c={};for(let[g,b]of Object.entries(i)){let I=mm(b,l);if(I!==void 0)c[g]=I}return c}finally{l.delete(i)}}var Ng=new Set;function VI(i,l,u){let c=`${i}:${l}`;if(Ng.has(c))return;Ng.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 YI(i,l,u){try{return await i(l)}catch(c){if(!sC(c))throw c;return u(c),await i(mm(l))}}var iC=0;function nC(i,l,u,c,g,b){for(let I of u.contributions?.tools??[]){let T={...I.definition??{},name:I.name,description:I.description??"",inputSchema:I.inputSchema??{type:"object",properties:{}},timeoutMs:I.timeoutMs,retryable:I.retryable,execute:async(_,E)=>{let{signal:A,emitUpdate:C,emitEvent:N,...M}=E??{},O=`${u.pluginId}:${++iC}`;if(C)b.set(O,C);let L=()=>{l.call("abortToolCall",{callId:O,reason:A?.reason instanceof Error?A.reason.message:void 0}).catch(()=>{})};A?.addEventListener("abort",L,{once:!0});let D=async(F)=>{let{input:j,context:B}=F,Q=()=>({pluginId:u.pluginId,contributionId:I.id,input:j,context:B,callId:O,aborted:A?.aborted===!0});try{return await l.call("executeTool",Q(),{timeoutMs:I.timeoutMs??c})}catch(H){if(!td(H))throw H;return await g(),await l.call("executeTool",Q(),{timeoutMs:I.timeoutMs??c})}};try{return await YI(D,{input:_,context:M},(F)=>VI("tool",I.name,F))}finally{A?.removeEventListener("abort",L),b.delete(O)}}};i.registerTool(T)}}function oC(i,l,u,c,g){for(let b of u.contributions?.commands??[])i.registerCommand(UI({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(T){if(!td(T))throw T;return await g(),await l.call("executeCommand",{pluginId:u.pluginId,contributionId:b.id,input:I},{timeoutMs:c})}}}))}function aC(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 lC(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 dC(i,l,u,c,g){for(let b of u.contributions?.messageBuilders??[])i.registerMessageBuilder({name:b.name,async build(I){try{let T=await l.call("buildMessages",{pluginId:u.pluginId,contributionId:b.id,messages:I},{timeoutMs:c});return Og(T)?T:I}catch(T){if(!td(T))throw T;await g();let _=await l.call("buildMessages",{pluginId:u.pluginId,contributionId:b.id,messages:I},{timeoutMs:c});return Og(_)?_:I}}})}function Og(i){return Array.isArray(i)&&i.every((l)=>typeof l==="object"&&l!==null&&("role"in l)&&("content"in l))}function uC(i,l,u,c,g){return async(b)=>await YI(async(I)=>{try{return await i.call("invokeHook",{pluginId:l,hookName:u,payload:I},{timeoutMs:c})}catch(T){if(!td(T))throw T;return await g(),await i.call("invokeHook",{pluginId:l,hookName:u,payload:I},{timeoutMs:c})}},b,(I)=>VI("hook",u,I))}function cC(i,l,u,c){let g={};for(let b of l.hooks??[])g[b]=uC(i,l.pluginId,b,u,c);return Object.keys(g).length>0?g:void 0}var pC=4000,mC=4000,hC=3000,fC=60000,gC=5,yC="CLINE_PLUGIN_IMPORT_TIMEOUT_MS";class Dh extends Error{label;timeoutMs;constructor(i,l){super(`${i} timed out after ${l}ms`);this.label=i,this.timeoutMs=l,this.name="PluginCallTimeoutError"}}function vC(i){let l=process.env[i]?.trim();if(!l)return;let u=Number(l);return Number.isFinite(u)&&u>0?u:void 0}function Rc(i){if(i instanceof Error)return{message:i.message,stack:i.stack};return{message:String(i)}}function QI(i){let l=Tg(i);for(let u=0;u<4;u++){let c=wx(l,"package.json");if(fx(c)){try{let b=JSON.parse(gx(c,"utf8"));if(b&&typeof b==="object"&&"cline"in b)return l}catch{}return i}let g=Tg(l);if(g===l)break;l=g}return i}function bl(i,l){return l===i?yx(i,vx(i)):Qi(i,l)}function wC(i){let l=Fd(i);return bl(l,QI(l))}function Pc(i,l,u){return new Promise((c,g)=>{let b=!1,I=setTimeout(()=>{b=!0,g(new Dh(u,l))},l);I.unref?.(),Promise.resolve().then(i).then((T)=>{if(b)return;b=!0,clearTimeout(I),c(T)},(T)=>{if(b)return;b=!0,clearTimeout(I),g(T)})})}function bC(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 IC(i){return{extension:void 0,importId:i,setupFailed:!1,closed:!1,disposers:[]}}class Uh{entries=new Map;listeners=new Set;logger;defaults;failureThreshold;constructor(i={}){this.logger=i.logger,this.defaults={import:i.importTimeoutMs??vC(yC)??pC,setup:i.setupTimeoutMs??mC,hook:i.hookTimeoutMs??hC,call:i.toolTimeoutMs??fC},this.failureThreshold=i.failureThreshold??gC}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 M of this.recordDiscovery(i,c))l.push(this.toInitializationFailure(M));let I=[];for(let M of i.pluginPaths){let O=this.ensureEntry(Fd(M));if(O.exportName=i.exportName,this.refreshEntry(O),O.nameResolved&&!this.isEnabledForSession(O,i)){c.push(this.policyIssue(O));continue}if(O.blocked){l.push(this.toInitializationFailure(O)),c.push(this.toIssue(O,"error"));continue}I.push(O)}let T=await Promise.all(I.map((M)=>this.startWorkerCopy(M,i,b,g))),_=new Map,E=0;for(let M of T){let{entry:O}=M;if("error"in M){if(M.importId!==O.importId){c.push(this.staleIssue(O,M.phase,M.error,g));continue}if(M.phase==="setup")this.recordFailure(O,"setup",M.error,{sessionId:g,state:"failed"});else this.recordFailure(O,"import",M.error,{fatal:!0,sessionId:g});l.push(this.toInitializationFailure(O)),c.push(this.toIssue(O,"error"));continue}if("policyDisabled"in M){c.push(this.policyIssue(O));continue}if(!M.instance)continue;let{instance:L}=M;if(!this.isEnabledForSession(O,i)){c.push(this.policyIssue(O)),await L.shutdown?.().catch(()=>{});continue}let D=_.get(O.name);if(D)u.push({type:"duplicate_plugin_override",pluginName:O.name,pluginPath:O.pluginPath,overriddenPluginPath:D.entry.pluginPath,message:`Plugin "${O.name}" from ${O.pluginPath} overrides ${D.entry.pluginPath}`}),await D.instance.shutdown?.().catch(()=>{});_.set(O.name,{entry:O,instance:L,order:E++})}let A=[..._.values()].sort((M,O)=>M.order-O.order);if(g)for(let{entry:M}of A)M.sessions.set(g,i.onIssue);let C=A.map(({entry:M,instance:O})=>this.wrapForSession(M,O,i,b)),N;return{extensions:C,pluginPaths:A.map(({entry:M})=>M.pluginPath),failures:l,warnings:u,issues:c,release:()=>(N??=Promise.all(A.map(({entry:M,instance:O})=>this.releaseInstance(M,O,g,b))).then(()=>{return}),N)}}refreshEntry(i){let l=Oh(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=IC(g),I=!1,T=!1,_=l.setupContext,E=Date.now(),A;try{A=await Lh({transport:"worker",pluginPaths:[i.pluginPath],exportName:l.exportName,importTimeoutMs:u.import,setupTimeoutMs:u.setup,hookTimeoutMs:u.hook,contributionTimeoutMs:u.call,onEvent:l.emitEvent,onSetupStarted:()=>{T=!0},policy:l.policy,policyNames:{[i.pluginPath]:[bl(i.pluginPath,i.pluginRoot)]},onUnexpectedExit:(O)=>{if(!I||b.closed)return;this.recordFailure(i,"uncaught",O,{fatal:!0,instance:b,sessionId:c})},providerId:l.providerId,modelId:l.modelId,cwd:l.cwd,workspaceInfo:_?.workspaceInfo,session:_?.session,client:_?.client,user:_?.user,logger:_?.logger,telemetryAvailable:Boolean(_?.telemetry)})}catch(O){return{entry:i,error:O,phase:T?"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],M=A.extensions?.[0];if(N||!M){if(await A.shutdown().catch(()=>{}),!N)return{entry:i};let O=Error(N.message);if(N.stack)O.stack=N.stack;return{entry:i,error:O,phase:N.phase==="setup"?"setup":"import",importId:g}}if(I=!0,b.extension=M,b.shutdown=A.shutdown,g===i.importId){if(i.name=M.name,i.nameResolved=!0,i.extension=M,!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}=Rc(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 bC(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=Fd(l);return[...this.entries.values()].filter((c)=>c.pluginPath===u||c.name===l||bl(c.pluginPath,c.pluginRoot)===l)}ensureEntry(i){let l=Fd(i),u=this.entries.get(l);if(!u){let c=QI(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?(T,_)=>u.emitEvent?.({name:T,payload:_}):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(T,_)=>{if(!this.isUsable(i,l))return;let E={...u.setupContext?.session??{},..._.session??{}},A={...u.setupContext??{},..._,session:Object.keys(E).length>0?E:void 0,cwd:u.cwd??_.cwd,emitEvent:b,onDispose:(C)=>{if(typeof C==="function")l.disposers.push(C)}};await this.runSetup(i,l,(C)=>I.call(g,C,A),T,u,c)}:void 0}}async runSetup(i,l,u,c,g,b){let I={tools:[],commands:[],calls:[]},T=new Set(l.extension.manifest.capabilities),_=(N,M)=>{if(!T.has(N))throw Error(`${M} requires the "${N}" capability`)},E={registerTool:(N)=>{I.tools.push(N)},registerCommand:(N)=>{I.commands.push(N)},registerRule:(N)=>{_("rules","registerRule");let M=this.wrapRule(i,l,N,g,b);I.calls.push((O)=>O.registerRule(M))},registerMessageBuilder:(N)=>{let M=this.wrapMessageBuilder(i,l,N,g,b);I.calls.push((O)=>O.registerMessageBuilder(M))},registerProvider:(N)=>{I.calls.push((M)=>M.registerProvider(N))},registerAutomationEventType:(N)=>{_("automationEvents","registerAutomationEventType"),I.calls.push((M)=>M.registerAutomationEventType(N))},registerMcpServer:(N)=>{_("mcp","registerMcpServer"),I.calls.push((M)=>M.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 Pc(()=>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,T]of Object.entries(u)){if(typeof T!=="function")continue;let _=`hook:${I}`;b[I]=async(...E)=>{if(!this.isUsable(i,l))return;try{return await this.guardedCall(i,l,_,g.hook,c,()=>T.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,T)=>(this.assertUsable(i,l,`tool "${u.name}"`),this.guardedCall(i,l,b,u.timeoutMs??g.call,c,()=>u.execute(I,{...T,cwd:T.cwd??c.cwd,emitEvent:T.emitEvent??l.emitEvent}),()=>T.signal?.aborted===!0))}}wrapCommand(i,l,u,c,g){let b=u.handler;if(typeof b!=="function")return u;let I={...u,handler:async(T)=>(this.assertUsable(i,l,`command "/${u.name}"`),this.guardedCall(i,l,`command:${u.name}`,g.call,c,()=>b.call(u,T)))};return UI(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 T=Date.now();try{let _=await Pc(b,c,`Plugin "${i.name}" ${u}`);if(l.importId===i.importId)i.consecutiveFailures=0;return this.warnIfSlow(i,u,T,c,g),_}catch(_){if(!I?.())this.recordFailure(i,u,_,{instance:l,sessionId:g.sessionId});throw _}}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 Pc(g,c.hook,`Plugin "${i.name}" dispose`)}catch(b){let{message:I,stack:T}=Rc(b);this.log("warn","plugin.error",i,{phase:"dispose",sessionId:u,errorMessage:I,stack:T})}await l.shutdown?.().catch(()=>{})}recordFailure(i,l,u,c){let{message:g,stack:b}=Rc(u),I=u instanceof Dh,T=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:T,stack:b});let _={phase:l,message:`${c.messagePrefix??""}${g}`,...b?{stack:b}:{},pluginPath:i.pluginPath,timestamp:Date.now(),...c.sessionId?{sessionId:c.sessionId}:{},...I?{timedOut:I}:{}};if(T){let O=c.notify??(c.sessionId?i.sessions.get(c.sessionId):void 0);try{O?.({name:i.name,pluginPath:i.pluginPath,state:c.state??"degraded",reason:"error",lastError:_})}catch{}return}if(i.errorCount+=1,I)i.timeoutCount+=1;i.consecutiveFailures+=1,i.lastError=_;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"),M=[];if(C&&!c.state){for(let O of i.sessions.values())if(O)M.push(O)}if(c.notify&&!M.includes(c.notify))M.push(c.notify);for(let O of M)try{O(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 kC(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 $g;function rd(){return $g??=new Uh,$g}var Fh="package.json",SC="package";function ZI(i){return eo(i)}function ek(i){return Xn(i)}function TC(i){try{return Xu(i)&&wA(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 tk(i){let l=sd(i);return LI(l)}function qh(i){return ZI(i).flatMap((l)=>ek(l)).filter((l)=>Xu(l))}function _C(i,l){let u=[];for(let c of i)try{u.push(...ti([c],l))}catch{}return u}function Mc(i){return typeof i==="object"&&i!==null}function EC(i){try{let l=JSON.parse(vA(Ju(i,Fh),"utf8"));if(!Mc(l)||!Mc(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(!Mc(g)||!Array.isArray(g.paths))continue;for(let b of g.paths)if(typeof b==="string")c.push(b)}return c}catch{return[]}}function rk(i,l){let u=Fl(l);return EC(i).some((c)=>Fl(i,c)===u)}function AC(i,l){return RI(i)===SC&&Xu(Ju(ru(i),Fh))&&rk(ru(i),l)}function xC(i){let l=Fl(i),u=[],c=ru(l);while(!0){if(AC(c,l)){u.push(c);break}if(Xu(Ju(c,Fh))){if(rk(c,l))u.push(c);break}let g=ru(c);if(g===c)break;c=g}return sd(u)}function jh(i={}){let l=i.cwd??process.cwd(),u=[],c=[];for(let T of i.pluginPaths??[])try{c.push(...ti([T],l))}catch(_){u.push({pluginPath:Fl(l,T),error:_})}let g=sd([...c,...qh(i.workspacePath)]);if(i.includeDisabled)return{paths:g,disabledPaths:[],discoveryFailures:u};let b=LI(g),I=new Set(b);return{paths:b,disabledPaths:g.filter((T)=>!I.has(T)),discoveryFailures:u}}function Bh(i={}){let l=i.cwd??process.cwd(),u=qh(i.workspacePath),c=[...ti(i.pluginPaths??[],l),...u];return i.includeDisabled?sd(c):tk(c)}function CC(i={}){let l=i.cwd??process.cwd(),u=qh(i.workspacePath),c=_C(i.pluginPaths??[],l);return tk([...c,...u])}function Qu(i){let l=[];for(let u of i)for(let c of xC(u)){let g=Ju(c,et);if(TC(g))l.push(g)}return sd(l)}function RC(i={}){return Qu(CC(i))}var PC="CLINE_PLUGIN_MODE";function Zu(i){let l=process.env[PC]?.trim();return i??(l==="sandbox"?l:"worker")}async function sk(i={}){if(Zu(i.mode)==="worker"){let c=jh(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=Bh(i);if(l.length===0)return{extensions:[],failures:[],warnings:[],pluginPaths:[],issues:[]};let u=await Lh({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??RI(c.pluginPath,bA(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 NC=/^CLINE_(?:CONNECTOR_DETACHED_CHILD|[A-Z0-9]+_CONNECT_CHILD)$/;function ik(i=process.env){let l={...i};delete l[Zt],delete l[Xc];for(let u of Object.keys(l))if(NC.test(u))delete l[u];return l}var OC=15000;async function $C(i,l,u={}){let c="launchSpec"in u?u.launchSpec:Ao();if(!c)throw Error("connector CLI launch information is unavailable");let g=u.spawnProcess??MC,b=u.timeoutMs??OC;await new Promise((I,T)=>{let _=!1,E,A=(M)=>{if(_)return;if(_=!0,E)clearTimeout(E);if(M)T(M);else I()},C;try{C=g(c.launcher,[...c.connectArgsPrefix,"--cleanup-instance",l,i],{cwd:c.cwd,env:ik(),stdio:["ignore","ignore","pipe"],windowsHide:!0})}catch(M){A(M instanceof Error?M:Error(String(M)));return}let N="";C.stderr?.setEncoding("utf8"),C.stderr?.on("data",(M)=>{N+=String(M)}),E=setTimeout(()=>{try{C.kill("SIGKILL")}catch{}A(Error(`cleanup timed out after ${b}ms`))},b),E.unref?.(),C.once("error",(M)=>{A(M instanceof Error?M:Error(String(M)))}),C.once("close",(M)=>{if(M===0||M===null){A();return}A(Error(`cleanup exited with code ${M}${N.trim()?`: ${N.trim()}`:""}`))})})}var Dg={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},jC={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 BC(i){if(!Number.isInteger(i)||i<=0)return!1;try{return process.kill(i,0),!0}catch{return!1}}function HC(i,l){let u;try{let _=JSON.parse(qC(l,"utf8"));if(!_||typeof _!=="object"||Array.isArray(_))return;u=_}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||!BC(c))return;let b=jC[i];if(!b)return;let I={};for(let _ of b.required){let E=Dg[_](u);if(!E||typeof E==="string"&&!E.trim())return;I[_]=E}for(let _ of b.optional){let E=Dg[_](u);if(E!==void 0)I[_]=E}let T=i==="telegram"?I.botUsername:i==="discord"?I.applicationId:i==="whatsapp"&&typeof u.instanceKey==="string"?u.instanceKey:I.userName;if(!T)return;return{id:`${i}:${T}`,type:i,instanceId:T,pid:c,hubUrl:g,...I}}function nk(){let i=[];for(let{name:l}of pi()){let u=Lg(Qn(),l);if(!UC(u))continue;for(let c of FC(u)){if(!c.endsWith(".json")||c.endsWith(".threads.json"))continue;let g=HC(l,Lg(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 zC(i,l){try{Je((u)=>{if(i)u.setEnabled(i,!1,l);else u.disableAll()})}catch{}}function Ug(i,l){try{return Je((u)=>u.getConnection(i,l))}catch{return}}async function WC(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 T=await i.start(g);if(c.push({channel:b,instanceId:I,ok:T}),!T)l(`[connect] failed to reconnect ${b} connector ${I}`)}catch(T){let _=T instanceof Error?T.message:String(T);c.push({channel:b,instanceId:I,ok:!1,error:_}),l(`[connect] failed to reconnect ${b} connector ${I}: ${_}`)}}return c}var KC=1000,GC=60000,XC=5,JC=60000,Fg=5000,VC=5000,YC=2000,QC=100;function ai(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 qg(i){return i===void 0?void 0:new Date(i).toISOString()}class ok{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??Ao,this.spawnProcess=i.spawnProcess??LC,this.isProcessRunning=i.isProcessRunning??ZC,this.killProcess=i.killProcess??((l,u)=>process.kill(l,u)),this.listActive=i.listActive??nk,this.cleanupInstance=i.cleanupInstance,this.isAutostartEnabled=i.isAutostartEnabled??((l,u)=>Ug(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=ai(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(ai(i.channel,i.instanceId),()=>this.startLocked(i))}async startLocked(i){let{channel:l,instanceId:u}=i,c=ai(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(ai(i.channel,i.instanceId),()=>this.stopLocked(i))}async stopLocked(i){let l=ai(i.channel,i.instanceId),u=this.entries.get(l);if(i.disableAutostart!==!1)zC(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,VC))this.signal(c,"SIGKILL"),await this.waitForProcessExit(c,YC)}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,QC)})}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=Ts(i.channel,i.instanceId),c=["ignore","ignore","ignore"];try{Rr(u);let g=DC(u,"a");c=["ignore",g,g]}catch{}try{let g=this.spawnProcess(l.launcher,[...l.connectArgsPrefix,i.channel,...i.args],{cwd:l.cwd,env:{...ik(),[Zc]:"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>=JC)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=ai(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>=XC){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(KC*2**i.restarts,GC);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=ai(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=Ug(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,Fg)};this.pollTimer=this.setTimer(i,Fg)}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:qg(i.startedAt)},...i.nextRestartAt===void 0?{}:{nextRestartAt:qg(i.nextRestartAt)},...i.lastExitCode===void 0?{}:{lastExitCode:i.lastExitCode},...i.lastExitSignal===void 0?{}:{lastExitSignal:i.lastExitSignal},...i.lastError===void 0?{}:{lastError:i.lastError}}}}var ak;function jg(i){ak=i}function lk(){return ak}async function eR(i=(u)=>process.stderr.write(`[hub-daemon] ${u}
|
|
6
|
+
`),l=lk()){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=bf();return await WC({isHealthy:({channel:g,instanceId:b})=>c?.channel===g&&c.instanceId===b,start:async({channel:g,instanceId:b,args:I})=>{let T=u.has(`${g}\x00${b}`);if(T)i(`[connect] restarting surviving ${g} connector ${b} for the new hub session`);let _=await l.start({channel:g,instanceId:b,args:I,restart:T});if(!_.started&&_.reason==="already_running")i(`[connect] ${g} connector ${b} is already running under this hub`);return _.started},log:i})}var nR;function Ls(i){if(typeof i!=="string"||i.length===0)return"unset";return iR("sha256").update(i).digest("hex").slice(0,8)}function lt(i){try{nR?.debug(i)}catch{}}function oR(){let i;return{promise:new Promise((l)=>{i=l}),resolve:i}}async function Hh(i){let l=await import("node:http"),u=i.host??"127.0.0.1",c=i.timeoutMs??300000,g=i.successHtml??aR,b=oR(),I=!1,T=null,_=null,E=null,A=(M)=>{if(I)return;I=!0,b.resolve(M)},C=()=>{if(T)clearTimeout(T),T=null;let M=E;if(E=null,_)_.close(),_.closeAllConnections?.(),_=null;if(M!==null&&i.onClose)Promise.resolve(i.onClose({host:u,port:M})).catch(()=>{})},N=async()=>(T=setTimeout(()=>{C(),A(null)},c),b.promise);for(let M of i.ports){let O=l.createServer((D,F)=>{try{let j=new URL(D.url||"",`http://${u}:${M}`);if(j.pathname!==i.callbackPath){F.statusCode=404,F.end("Not found");return}let B={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(B.error){F.statusCode=400,F.end(`Authentication failed: ${B.error}`),C(),A(B);return}if(!B.code){F.statusCode=400,F.end("Missing authorization code");return}if(i.expectedState&&B.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(B)}catch{F.statusCode=500,F.end("Internal error")}}),L=await new Promise((D)=>{let F=(j)=>{O.off("error",F),D({bound:!1,error:j})};O.once("error",F),O.listen(M,u,()=>{O.off("error",F),_=O,D({bound:!0})})});if(L.error){if(L.error.code==="EADDRINUSE")continue;throw C(),L.error}if(L.bound){E=M;let D=`http://${u}:${M}${i.callbackPath}`;if(i.onListening)await Promise.resolve(i.onListening({host:u,port:M,callbackUrl:D})).catch(()=>{});return{callbackUrl:D,waitForCallback:N,cancelWait:()=>{C(),A(null)},close:()=>{C(),A(null)}}}}return{callbackUrl:"",waitForCallback:async()=>null,cancelWait:()=>{},close:()=>{}}}var aR=`<!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 dk(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 lR(i){let l=new TextEncoder().encode(i),u=await crypto.subtle.digest("SHA-256",l);return new Uint8Array(u)}function dR(i=32){let l=new Uint8Array(i);return crypto.getRandomValues(l),dk(l)}async function uk(){let i=dR(),l=dk(await lR(i));return{verifier:i,challenge:l}}function zh(i){return i.endsWith("/")?i.slice(0,-1):i}function sa(i,l){return new URL(l,`${zh(i)}/`).toString()}function lu(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 ec(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 Wh(i,l){return Date.now()>=i.expires-l}async function Kh(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 lu(l,i.parseOptions);if(await c,u)throw u;if(l)return lu(l,i.parseOptions);return{}}var tc={authorize:"/api/v1/auth/authorize",token:"/api/v1/auth/token",register:"/api/v1/auth/register",refresh:"/api/v1/auth/refresh"},ck={deviceAuthorization:"/user_management/authorize/device",authenticate:"/user_management/authenticate"},pk="https://api.workos.com",uR="/auth",Hg=Array.from({length:11},(i,l)=>48801+l),cR=300000,pR=30000,id=30000,mR=300,hR=5;class Hr 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 fR(i){let l=Date.parse(i);if(Number.isNaN(l))throw Error(`Invalid expiresAt value: ${i}`);return l}function Gh(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:fR(i.expiresAt),accountId:c??void 0,email:i.userInfo.email||u.email,metadata:b}}async function Xh(i){if(!i)return{};return typeof i==="function"?await i():i}function zg(i,l){if(typeof i!=="number"||!Number.isFinite(i)||i<=0)return l;return Math.floor(i)}function gR(i){return typeof i==="string"&&i.trim()||void 0}function yR(i){let l=ne(i);if(!l)return{};return{sessionId:gR(l.sid)}}function vR(i){let l={},u=i.metadata?.sessionStartedAtMs;if(typeof u==="number"&&Number.isFinite(u)&&u>0)l.sessionDurationMs=Date.now()-u;return l}function mk(i){return{...yR(i.access),...vR(i)}}function Jh(i,l){if(!i.success||!i.data?.accessToken)throw Error(l);return i.data}async function wR(i,l){let u=await fetch(sa(pk,ck.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 Hr(`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:zg(c.expires_in,mR),pollIntervalSeconds:zg(c.interval,hR)}}async function bR(i){let l=Date.now()+i.expiresInSeconds*1000,u=Math.max(1,i.initialPollIntervalSeconds);while(Date.now()<=l){let c=await fetch(sa(i.workosApiBaseUrl,ck.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 Bg(u*1000,void 0,{signal:i.signal});break}case"slow_down":{u+=1,await Bg(u*1000,void 0,{signal:i.signal});break}case"access_denied":case"expired_token":case"invalid_grant":throw new Hr(g.error_description||"WorkOS authorization failed",{status:c.status,errorCode:g.error,requestId:c.headers.get("x-request-id")??void 0});default:throw new Hr(`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 IR(i,l,u,c){let g={accessToken:i.accessToken,refreshToken:i.refreshToken},b=await fetch(sa(l.apiBaseUrl,tc.register),{method:"POST",headers:{"Content-Type":"application/json",...await Xh(l.headers)},body:JSON.stringify(g),signal:AbortSignal.any([AbortSignal.timeout(l.requestTimeoutMs??id),...c?[c]:[]])});if(!b.ok){let T=await b.text().catch(()=>""),_=ec(T);throw new Hr(`Token registration failed: ${b.status}${_.message?` - ${_.message}`:""}`,{status:b.status,errorCode:_.code,requestId:b.headers.get("x-request-id")??void 0})}let I=await b.json();return Gh(Jh(I,"Invalid token exchange response"),u??l.provider,{metadata:{sessionStartedAtMs:Date.now()}})}async function kR(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(sa(u.apiBaseUrl,tc.token),{method:"POST",headers:{"Content-Type":"application/json",...await Xh(u.headers)},body:JSON.stringify(g),signal:AbortSignal.timeout(u.requestTimeoutMs??id)});if(!b.ok){let T=await b.text().catch(()=>""),_=ec(T);throw new Hr(`Token exchange failed: ${b.status}${_.message?` - ${_.message}`:""}`,{status:b.status,errorCode:_.code,requestId:b.headers.get("x-request-id")??void 0})}let I=await b.json();return Gh(Jh(I,"Invalid token exchange response"),c??u.provider,{metadata:{sessionStartedAtMs:Date.now()}})}async function SR(i){Ah(i.telemetry,i.provider??"cline");let l=i.useWorkOSDeviceAuth??!0,u=i.callbackPorts?.length?i.callbackPorts:Hg,c=i.callbackPath??uR,g=l?null:await Hh({ports:u,callbackPath:c,onListening:i.callbacks.onServerListening,onClose:i.callbacks.onServerClose}),b=g?.callbackUrl||`http://127.0.0.1:${u[0]??Hg[0]}${c}`;try{let I;if(l){let T=_e().workOsClientId,_=await wR(T,i);i.callbacks.onAuth({url:_.verificationUriComplete??_.verificationUri,instructions:`Enter this code in your browser: ${_.userCode}`});let E=await bR({clientId:T,deviceCode:_.deviceCode,expiresInSeconds:_.expiresInSeconds,initialPollIntervalSeconds:_.pollIntervalSeconds,requestTimeoutMs:i.requestTimeoutMs??id,workosApiBaseUrl:pk,onProgress:i.callbacks.onProgress});I=await IR(E,i,i.provider)}else{let T=new URL(sa(i.apiBaseUrl,tc.authorize));T.searchParams.set("client_type","extension"),T.searchParams.set("callback_url",b),T.searchParams.set("redirect_uri",b),i.callbacks.onAuth({url:T.toString(),instructions:"Continue the authentication process in your browser."});let _,E=i.provider,A=await Kh({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(_=A.code,E=A.provider??E,!_){let C=await i.callbacks.onPrompt({message:"Paste the authorization code (or full redirect URL):"}),N=lu(C,{includeProvider:!0});_=N.code,E=N.provider??E}if(!_)throw Error("Missing authorization code");I=await kR(_,b,i,E)}return xh(i.telemetry,i.provider??"cline",mk(I)),Vu(i.telemetry,{id:I.accountId,email:I.email,provider:i.provider??"cline"}),I}catch(I){throw su(i.telemetry,i.provider??"cline",I instanceof Error?I.message:String(I),{requestId:I instanceof Hr?I.requestId:void 0}),I}finally{g?.close()}}async function TR(i,l){let u=sa(l.apiBaseUrl,tc.refresh);lt(`cline.refresh.request url=${u} refreshTokenHash=${Ls(i.refresh)}`);let c=await fetch(u,{method:"POST",headers:{"Content-Type":"application/json",...await Xh(l.headers)},body:JSON.stringify({refreshToken:i.refresh,grantType:"refresh_token"}),signal:AbortSignal.timeout(l.requestTimeoutMs??id)});if(!c.ok){let T=await c.text().catch(()=>""),_=ec(T),E=c.headers.get("x-request-id")??void 0;throw lt(`cline.refresh.error status=${c.status} errorCode=${_.code??"none"} message=${_.message??"none"} requestId=${E??"none"}`),new Hr(`Token refresh failed: ${c.status}${_.message?` - ${_.message}`:""}`,{status:c.status,errorCode:_.code,requestId:E})}let g=await c.json(),b=i.metadata?.provider??l.provider,I=Gh(Jh(g,"Invalid token refresh response"),b,i);return lt(`cline.refresh.success newAccessTokenHash=${Ls(I.access)} newRefreshTokenHash=${Ls(I.refresh)} expires=${I.expires}`),I}async function _R(i,l,u){if(!i)return lt("cline.getCredentials outcome=no_current_credentials"),null;let c=u?.refreshBufferMs??cR,g=u?.retryableTokenGraceMs??pR,b=u?.forceRefresh===!0;if(!b&&!Wh(i,c))return lt(`cline.getCredentials outcome=still_valid forceRefresh=${b}`),i;lt(`cline.getCredentials outcome=needs_refresh forceRefresh=${b} accessTokenHash=${Ls(i.access)}`);try{return await TR(i,l)}catch(I){let T=mk(i),_=I instanceof Hr&&I.requestId?{request_id:I.requestId}:{},E={status:I instanceof Hr?I.status:void 0,errorCode:I instanceof Hr?I.errorCode:void 0,..._,...T,errorName:I instanceof Error?I.name:void 0};if(I instanceof Hr&&I.isLikelyInvalidGrant())return lt(`cline.getCredentials outcome=invalid_grant status=${I.status} errorCode=${I.errorCode??"none"}`),Ch(l.telemetry,l.provider??"cline","token_invalid",{status:I.status,errorCode:I.errorCode,..._,...T}),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 Mo 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 ER(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 AR(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=ec(c);throw new Mo(`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 Mo)throw l;return{type:"failed"}}}async function xR(i="pi"){let{verifier:l,challenge:u}=await uk(),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 CR(){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 RR(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 T=b[0];if(typeof T?.id==="string"&&T.id.length>0)return T.id}let I=c?.chatgpt_account_id;if(typeof I==="string"&&I.length>0)return I;return null}function hk(i,l){let u=RR(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 PR(i){Ah(i.telemetry,"openai-codex");let l=CR(),{verifier:u,state:c,url:g}=await xR(i.originator),b=await Hh({host:l.host,ports:[l.port],callbackPath:l.callbackPath,expectedState:c});if(!b.callbackUrl&&!i.onManualCodeInput){let T=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 su(i.telemetry,"openai-codex",T.message),T}i.onAuth({url:g,instructions:"Continue the authentication process in your browser."});let I;try{let T=await Kh({waitForCallback:b.waitForCallback,cancelWait:b.cancelWait,onManualCodeInput:i.onManualCodeInput,parseOptions:{allowHashCodeState:!0}});if(T.error)throw Error(`OAuth error: ${T.error}`);if(T.state&&T.state!==c)throw Error("State mismatch");if(I=T.code,!I){let A=await i.onPrompt({message:"Paste the authorization code (or full redirect URL):"}),C=lu(A,{allowHashCodeState:!0});if(C.state&&C.state!==c)throw Error("State mismatch");I=C.code}if(!I)throw Error("Missing authorization code");let _=await ER(I,u,l.redirectUri);if(_.type!=="success")throw Error("Token exchange failed");let E=hk(_);return xh(i.telemetry,"openai-codex"),Vu(i.telemetry,{id:E.accountId,email:E.email,provider:"openai-codex"}),E}catch(T){throw su(i.telemetry,"openai-codex",T instanceof Error?T.message:String(T)),T}finally{b.close()}}async function MR(i,l){let u=await AR(i);if(u.type!=="success")throw Error("Failed to refresh OpenAI Codex token");let c=hk(u,l);if(!c.refresh)throw Error("Failed to refresh OpenAI Codex token: missing refresh token");return c}async function NR(i,l){if(!i)return null;let u=l?.refreshBufferMs??ut.refreshBufferMs,c=l?.retryableTokenGraceMs??ut.retryableTokenGraceMs;if(l?.forceRefresh!==!0&&!Wh(i,u))return i;try{return await MR(i.refresh,i)}catch(g){let b={status:g instanceof Mo?g.status:void 0,errorCode:g instanceof Mo?g.errorCode:void 0,errorName:g instanceof Error?g.name:void 0};if(g instanceof Mo&&g.isLikelyInvalidGrant())return Ch(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 fk{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 OR="a8331954c0cf48ba99b5dd223a14c6ea",$R="https://idcs-9dc693e80d9b469480d7afe00e743931.identity.oraclecloud.com",LR="openid offline_access",gk="https://code-internal.aiservice.us-chicago-1.oci.oraclecloud.com/20250206/app/litellm",DR="c1aba3deed5740659981a752714eba33",UR="https://login-ext.identity.oraclecloud.com",FR="openid offline_access",yk="https://code.aiservice.us-chicago-1.oci.oraclecloud.com/20250206/app/litellm",qR="/auth/oca",jR=Array.from({length:11},(i,l)=>48801+l),BR=300000,HR=30000,vk=30000,zR=600000;class No 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 Ws={internal:{clientId:OR,idcsUrl:$R,scopes:LR,baseUrl:gk},external:{clientId:DR,idcsUrl:UR,scopes:FR,baseUrl:yk}},Bl=new Map,WR=86400000,KR=300000,GR=32,Oc=new fk(WR,GR);function wk(i){if(typeof i==="function")return i();return i??"internal"}function bk(i){return{internal:{clientId:i?.internal?.clientId??Ws.internal.clientId,idcsUrl:i?.internal?.idcsUrl??Ws.internal.idcsUrl,scopes:i?.internal?.scopes??Ws.internal.scopes,baseUrl:i?.internal?.baseUrl??Ws.internal.baseUrl},external:{clientId:i?.external?.clientId??Ws.external.clientId,idcsUrl:i?.external?.idcsUrl??Ws.external.idcsUrl,scopes:i?.external?.scopes??Ws.external.scopes,baseUrl:i?.external?.baseUrl??Ws.external.baseUrl}}}function XR(i=Date.now()){let l=i-zR;for(let[u,c]of Bl.entries())if(c.createdAt<l)Bl.delete(u)}function JR(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 Ik(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),T=b?.sub??I?.sub,_=b?.email??I?.email;return{access:c,refresh:g,expires:JR(i,c,i.id_token),accountId:T??u?.accountId,email:_??u?.email,metadata:{...u?.metadata??{},provider:"oca",mode:l,subject:T,idToken:i.id_token}}}async function kk(i,l){let u=zh(i),c=Oc.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 T=`${u}/oauth2/v1/token`;return Oc.set(u,T,Date.now(),KR),T}let I=(await b.json()).token_endpoint||`${u}/oauth2/v1/token`;return Oc.set(u,I),I}function Sk(i){return{code:i.error,message:i.error_description}}async function VR(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 kk(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 _=Sk(I);throw new No(`Token exchange failed: ${b.status}${_.message?` - ${_.message}`:""}`,{status:b.status,errorCode:_.code})}let T=ne(I.id_token);if(!I.id_token||!T)throw Error("No ID token received from OCA");if(T.nonce!==l.nonce)throw Error("OIDC nonce verification failed");return Ik(I,i.mode)}function YR(i){let l=i.mode==="external"?i.config.external:i.config.internal,u=new URL(`${zh(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 QR(i){Ah(i.telemetry,"oca");let l=bk(i.config),u=wk(i.mode),c=i.callbackPorts?.length?i.callbackPorts:jR,g=i.callbackPath??qR,b=i.requestTimeoutMs??vk,I=await Hh({ports:c,callbackPath:g,onListening:i.callbacks.onServerListening,onClose:i.callbacks.onServerClose}),T=I.callbackUrl;if(!T)throw Error("Unable to bind local OAuth callback server");let _=R(16),E=R(16),{verifier:A,challenge:C}=await uk();XR(),Bl.set(_,{verifier:A,nonce:E,mode:u,redirectUri:T,createdAt:Date.now()});let N=YR({callbackUrl:T,mode:u,state:_,nonce:E,challenge:C,config:l});i.callbacks.onAuth({url:N,instructions:"Continue the authentication process in your browser."});try{let M=await Kh({waitForCallback:I.waitForCallback,cancelWait:I.cancelWait,onManualCodeInput:i.callbacks.onManualCodeInput}),{code:O,state:L}=M;if(M.error)throw Error(`OAuth error: ${M.error}`);if(!O){if(!i.callbacks.onManualCodeInput)throw Error("Timed out waiting for OCA callback");throw Error("Missing authorization code")}if(!L||L!==_)throw Error("State mismatch");let D=await VR({code:O,state:L,mode:u,config:l,requestTimeoutMs:b});return xh(i.telemetry,"oca"),Vu(i.telemetry,{id:D.accountId,email:D.email,provider:"oca"}),D}catch(M){throw su(i.telemetry,"oca",M instanceof Error?M.message:String(M)),M}finally{I.close()}}async function ZR(i,l={}){let u=bk(l.config),c=l.requestTimeoutMs??vk,g=i.metadata?.mode,b=g==="internal"||g==="external"?g:wk(l.mode),I=b==="external"?u.external:u.internal,T=await kk(I.idcsUrl,c),_=new URLSearchParams({grant_type:"refresh_token",refresh_token:i.refresh,client_id:I.clientId}),E=await fetch(T,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:_,signal:AbortSignal.timeout(c)}),A=await E.json();if(!E.ok){let C=Sk(A);throw new No(`Token refresh failed: ${E.status}${C.message?` - ${C.message}`:""}`,{status:E.status,errorCode:C.code})}return Ik(A,b,i)}async function eP(i,l,u){if(!i)return null;let c=l?.refreshBufferMs??u?.refreshBufferMs??BR,g=l?.retryableTokenGraceMs??u?.retryableTokenGraceMs??HR;if(l?.forceRefresh!==!0&&!Wh(i,c))return i;try{return await ZR(i,u)}catch(b){let I=u?.telemetry??l?.telemetry,T={status:b instanceof No?b.status:void 0,errorCode:b instanceof No?b.errorCode:void 0,errorName:b instanceof Error?b.name:void 0};if(b instanceof No&&b.isLikelyInvalidGrant())return Ch(I,"oca","invalid_grant",{status:b.status,errorCode:b.errorCode}),null;let _=i.expires-Date.now()<=g;if(ql(I,"oca",{...T,tokenExpired:_}),!_)return i;throw b}}var du="workos:";function tP(i){let l=i.trim();return l.toLowerCase().startsWith(du)?l:`${du}${l}`}function rP(i){let l=i.trim();return l.toLowerCase().startsWith(du)?l.slice(du.length):l}function sP(i){let l=ne(i)?.exp;if(typeof l==="number"&&l>0)return l*1000;return null}function iP(i,l){let u=i.auth?.expiresAt;if(typeof u==="number"&&Number.isFinite(u)&&u>0)return u;let c=sP(l);if(c)return c;return Date.now()-1}function nP(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:iP(i,g),accountId:i.auth?.accountId,metadata:i.auth?.metadata}}function oP(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 hm(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 oP({...u,storageProviderId:l,formatAccessToken:i.formatAccessToken})},isConfigured(u){return!!u?.auth?.accessToken},normalizeStoredAccessToken:i.normalizeStoredAccessToken}}function Wg(i){return hm({providerId:i.providerId,storageProviderId:i.storageProviderId,formatAccessToken:tP,normalizeStoredAccessToken:rP,login:({settings:l,callbacks:u,telemetry:c})=>SR({apiBaseUrl:l?.baseUrl?.trim()||_e().apiBaseUrl,useWorkOSDeviceAuth:!0,callbacks:u,telemetry:c}),refresh:({settings:l,credentials:u,forceRefresh:c,telemetry:g})=>_R(u,{apiBaseUrl:l.baseUrl?.trim()||_e().apiBaseUrl,telemetry:g},{forceRefresh:c})})}var aP=[Wg({providerId:"cline"}),Wg({providerId:"cline-pass",storageProviderId:"cline"}),hm({providerId:"oca",login:({settings:i,callbacks:l,telemetry:u})=>QR({mode:i?.oca?.mode,callbacks:l,telemetry:u}),refresh:({settings:i,credentials:l,forceRefresh:u,telemetry:c})=>eP(l,{forceRefresh:u,telemetry:c},{mode:i.oca?.mode,telemetry:c})}),hm({providerId:"openai-codex",login:({callbacks:i,telemetry:l})=>PR({onAuth:i.onAuth,onPrompt:i.onPrompt,onProgress:i.onProgress,onManualCodeInput:i.onManualCodeInput,telemetry:l}),refresh:({credentials:i,forceRefresh:l,telemetry:u})=>NR(i,{forceRefresh:l,telemetry:u})})],lP=new Map(aP.map((i)=>[i.providerId,i]));function ri(i){return lP.get(i.trim().toLowerCase())}function Kg(i){return ri(i)!==void 0}function Gg(i,l){let u=ri(i);if(!u)return null;return nP(l,{normalizeAccessToken:u.normalizeStoredAccessToken})}function dP(i){let l=ri(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 uP(i,l){let u=ri(i);if(u)return u.getApiKey(l);return l?.auth?.accessToken?.trim()||l?.apiKey?.trim()||l?.auth?.apiKey?.trim()||void 0}function Tk(i){if(typeof i==="string")return i;if(Array.isArray(i))return i;return JSON.stringify(i)}function cP(i){if(i.metadata?.displayOnly===!0)return[];let l=mP(i.content),u=[],c=i.id??gP(),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,T=!1,_=(C)=>{if(I===void 0)return i.metadata;if(C&&!T)return T=!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(hP),createdAt:i.ts??Date.now(),metadata:_(!0),modelInfo:i.modelInfo,metrics:Xg(i.metrics)}),b=[]};if(l.length===0)return u.push({id:c,role:i.role,content:[{type:"text",text:sr}],createdAt:i.ts??Date.now(),metadata:i.metadata,modelInfo:i.modelInfo,metrics:Xg(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:[Ek(C)],createdAt:i.ts??Date.now(),metadata:_(!1)})}return E(),u}function $c(i){return i.flatMap(cP)}function pP(i){let l=i.content.map(Ak).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:fP(i.metrics)}}function ld(i){return i.map(pP)}function _k(i){let l=[];for(let u of i){let c=u.content.map(Ak).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 mP(i){if(typeof i==="string")return i.trim().length>0?[{type:"text",text:i}]:[];return[...i]}function hP(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 Ek(i)}}function Ek(i){return{type:"tool-result",toolCallId:i.tool_use_id,toolName:i.name,output:i.content,isError:i.is_error}}function Ak(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:Tk(i.output),is_error:i.isError}}}function Xg(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 fP(i){if(!i)return;return{inputTokens:i.inputTokens,outputTokens:i.outputTokens,cacheReadTokens:i.cacheReadTokens,cacheWriteTokens:i.cacheWriteTokens,cost:i.cost}}var Jg=0;function gP(){return Jg+=1,`msg_${Date.now().toString(36)}_${Jg.toString(36)}`}function yP(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:vP(i),error:i.error,...i.error?{errorClass:hi(i.error)}:{}}];default:return[]}}function vP(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 wP(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=_k(l.messages),I=l.tools.map((T)=>({name:T.name,description:T.description,inputSchema:T.inputSchema}));for await(let T of g.createMessage(l.systemPrompt??"",b,I))for(let _ of yP(T)){if(_.type==="finish")u=!0;else if(_.type==="tool-call-delta")c=!0;yield _}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:hi(g)}}}}}}}function bP(i){let l=Object.fromEntries(Object.entries(i).filter(([,u])=>u!==void 0));return Object.keys(l).length>0?l:void 0}function IP(i){return i.providerId==="openai-compatible"||i.clientType==="openai-compatible"}function kP(i){let l={region:i.region,apiLine:i.apiLine,openRouterProviderSorting:i.openRouterProviderSorting,modelCatalog:i.modelCatalog};if(IP(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 bP(l)}function SP(i){return typeof i==="number"&&Number.isFinite(i)&&i>0?Math.floor(i):void 0}function xk(i){let l=i.providerConfig,u=l?.knownModels?l.knownModels:i.knownModels??ge[i.providerId]?.models??void 0,c=SP(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 TP(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:Ji(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 Ck(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 _P(i,l,u){let c={...Ck(i),knownModels:xk(i),maxOutputTokens:i.maxTokensPerTurn,temperature:i.temperature,reasoningEffort:i.reasoningEffort,thinkingBudgetTokens:i.thinkingBudgetTokens,thinking:i.thinking,logger:l,extensionContext:i.extensionContext};if(Xi(K(c.providerId)))return wP(()=>zt(c));let g=bn({fetch:c.fetch,providerConfigs:[{providerId:c.providerId,apiKey:c.apiKey,baseUrl:c.baseUrl,headers:c.headers,timeoutMs:c.timeoutMs,fetch:c.fetch,options:kP(c),models:c.knownModels?Object.entries(c.knownModels).map(([I,T])=>TP(I,T)):void 0}],logger:l,telemetry:u??i.telemetry??i.extensionContext?.telemetry}),b=ea(c);if(b)g.registerProvider(b);return g.createAgentModel({providerId:c.providerId,modelId:c.modelId},{maxTokens:c.maxOutputTokens,temperature:c.temperature})}function AP(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 xP=J(AP),Vh=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(xP),system_prompt:e().optional()});function Rk(i){return i.filter((l)=>l.metadata?.displayOnly!==!0)}function fm(i){return JSON.parse(JSON.stringify(i))}function Pk(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 Mk(i){if(i.includes(":"))throw TypeError("Message role cannot contain ':' in compaction boundary keys")}function CP(i){let l=Pk(i);return Mk(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 Nk(i){if(!i)return"";let l=Pk(i);if(typeof l.id==="string"&&l.id.trim())return`id:${l.id.trim()}`;if(Mk(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 Ok(i,l=i.length){let u=EP("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(CP(c))),u.update(`
|
|
50
|
+
`);return`sha256:${u.digest("hex")}`}function Vg(i){let l=Rk(i.sourceMessages),u=l.at(-1),c=Nk(u);return Vh.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:Ok(l),...c?{source_last_message_key:c}:{},messages:fm(i.compactedMessages),...i.systemPrompt!==void 0?{system_prompt:i.systemPrompt}:{}})}function gm(i,l){if(l=Rk(l),!(i.source_message_count<=l.length))return;let u=!!i.source_prefix_hash&&Ok(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&&Nk(c)===i.source_last_message_key;if(!(u||g))return;return[...fm(i.messages),...fm(l.slice(i.source_message_count))]}function rc(i){let l=Vh.safeParse(i);return l.success?l.data:void 0}var RP=new Set(["auto_compaction","compaction_budget_emergency","completion_reminder","loop_detection_notice","manual_compaction","mistake_stop_notice","recovery_notice"]);function PP(i){switch(i){case"user":case"assistant":case"tool":case"system":case"status":case"error":return i;default:return"assistant"}}function MP(i){return i.metadata&&typeof i.metadata==="object"&&!Array.isArray(i.metadata)?i.metadata:void 0}function NP(i){let l=i?.userRunSpan;return typeof l==="number"&&Number.isInteger(l)&&l>=0?l:void 0}function OP(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 $P(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(PP(i.role)!=="user")return 0;let l=MP(i),u=typeof l?.kind==="string"?l.kind:void 0,c=NP(l);if(u==="compaction"||u==="compaction_summary")return c??1;if(c!==void 0)return c;if(u&&RP.has(u))return 0;let g=OP(i);if(!g.hasAttachment&&!me(g.text))return 0;if(!g.hasAttachment&&$P(g.text))return 0;return 1}function LP(i){return nd(i)>0}function ym(i){let l=0;for(let u of i??[])l+=nd(u);return l}var DP=128000,UP=0.9,En=0.9,FP=4,qP=0.7,jP=20000,Yg=8192,Qg=2000,$k=2000;function uu(i){return typeof i==="number"&&Number.isFinite(i)&&i>0}function vm(i){let l=uu(i.contextWindow)?i.contextWindow:void 0,u=uu(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*UP}function Al(i,l){if(i.length<=l)return i;return`${i.slice(0,l)}
|
|
52
|
+
...[truncated ${i.length-l} chars]`}function BP(i){let l=vm({maxInputTokens:i.maxInputTokens??i.modelInfo?.maxInputTokens,contextWindow:i.modelInfo?.contextWindow});if(l!==void 0)return l;let u=i.knownModels?.[i.modelId];return vm({maxInputTokens:u?.maxInputTokens,contextWindow:u?.contextWindow})}function HP(i){let l=zP(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 zP(i){if(typeof i==="string")return Al(i,Qg);return i.map((l)=>{switch(l.type){case"text":return{...l,text:Al(l.text,Qg)};case"file":return{...l,content:Al(l.content,$k)};case"image":return l;default:return l}})}function WP(i){return Object.entries(i).map(([l,u])=>`${l}=${JSON.stringify(u)}`).join(", ")}function Lk(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}(${WP(u.input)})`);break;case"tool_result":l.push(`[Tool result]: ${HP(u.content)}`);break;case"file":l.push(`[${i.role==="user"?"User":"Bot"} file ${u.path}]: ${Al(u.content,$k)}`);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 KP(i){return i.map(Lk).join(`
|
|
57
|
+
|
|
58
|
+
`).trim()}function GP(){let i=new WeakMap;return(l)=>{let u=l,c=i.get(u);if(typeof c==="number")return c;let{replacer:g,imageCount:b}=Ln(),I,T=0;try{I=JSON.stringify(l,g),T=b()}catch{I=Lk(l)}let _=Ut(I.length)+T*Eo;return i.set(u,_),_}}function Yh(i){return i.metadata?.kind==="compaction_summary"}function Dk(i){if(!Yh(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 XP(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 Us(i){return i.role==="user"&&i.metadata?.userRunSpan!==0&&!XP(i)&&!Yh(i)}function JP(i){for(let l=i.length-1;l>=0;l-=1)if(Us(i[l]))return l;return 0}function Uk(i){for(let l=i.length-1;l>=0;l-=1)if(Yh(i[l]))return l;return-1}function VP(i){return i.role==="assistant"||Us(i)}function YP(i,l,u){let c=0,g=i.length;for(let T=i.length-1;T>=0;T-=1)if(c+=u(i[T]),g=T,c>=l)break;if(g<=0)return 0;let b=JP(i),I=b>0?Math.min(g,b):g;while(I>0&&!VP(i[I]))I-=1;return I}function Fi(i){if(typeof i==="string"&&i.trim().length>0)return[i];if(Array.isArray(i))return i.flatMap((l)=>Fi(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(...Fi(l[c]));if(Array.isArray(l.files)){for(let c of l.files)if(c&&typeof c==="object")u.push(...Fi(c.path))}if(Array.isArray(l.file_paths))u.push(...Fi(l.file_paths));return u}return[]}function ca(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 Zg(i){let l=[],u=[];for(let c of i){let g=Dk(c);if(g){l=ca(l,g.details.readFiles),u=ca(u,g.details.modifiedFiles);continue}if(!Array.isArray(c.content))continue;for(let b of c.content){if(b.type==="file"){l=ca(l,[b.path]);continue}if(b.type!=="tool_use")continue;let I=Fi(b.input);if(b.name==="read_files"){l=ca(l,I);continue}if(b.name==="editor"||b.name==="apply_patch")u=ca(u,I)}}return{readFiles:l,modifiedFiles:u}}var ey=100;function ty(i){return i.readFiles.length>0||i.editedFiles.length>0||i.commands.length>0}function pa(i,l){let u=l.trim();if(u&&!i.includes(u))i.push(u)}function QP(i){if(i.length<=ey)return i;return`${i.slice(0,ey)}...`}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 eM(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 ry(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 T=I.input??{};if(I.name==="read_files"){if(Array.isArray(T.files)){for(let _ of T.files)if(_&&typeof _==="object"){let E=ZP(_);if(E)pa(l,E)}}else for(let _ of Fi(T))pa(l,_);continue}if(I.name==="editor"||I.name==="apply_patch"){let _=Fi(T)[0];if(_)g.set(I.id,_);continue}if(I.name==="run_commands"){let _=Array.isArray(T.commands)?T.commands:[];for(let E of _)if(typeof E==="string"&&E.trim())pa(c,QP(E.trim()))}continue}if(I.type==="tool_result"){let T=g.get(I.tool_use_id);if(!T)continue;let _=eM(I.content);pa(u,_?`${T}:${_.start}-${_.end}`:T),g.delete(I.tool_use_id)}}}for(let b of g.values())pa(u,b);return{readFiles:l,editedFiles:u,commands:c}}function tM(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 rM(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 sM(i,l){if(/^## Files$/im.test(i))return i.trim();return`${i.trim()}
|
|
74
|
+
|
|
75
|
+
${rM(l)}`.trim()}function sy(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 iM(i){if(uu(i.maxOutputTokens))return Math.floor(i.maxOutputTokens);let l=i.modelInfo?.maxTokens??i.knownModels?.[i.modelId]?.maxTokens;if(uu(l))return Math.min(Yg,Math.floor(l));return Yg}function nM(i){let l=i.summarizer,u=(g)=>{if(g.providerId==="openai-codex"){let{maxOutputTokens:b,...I}=g;return{...I,thinking:!1}}return{...g,maxOutputTokens:iM(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 oM(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 aM(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 iy(i){return i.map((l)=>({...l,content:Array.isArray(l.content)?l.content.map((u)=>({...u})):l.content,...l.metadata?{metadata:{...l.metadata}}:{}}))}function $s(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 Lc(i){for(let l=i.length-1;l>=0;l-=1){let u=i[l];if(Us(u))return l}return-1}function lM(i){for(let l=0;l<i.length;l+=1){let u=i[l];if(Us(u))return l}return-1}function Qh(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 dM(i){let l=new Map;for(let u=0;u<i.length;u+=1)for(let c of Qh(i[u])){let g=l.get(c);if(g)g.add(u);else l.set(c,new Set([u]))}return l}function Dc(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 uM(i,l){let u=dM(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 Qh(i[b]))for(let T of u.get(I)??[])if(!c.has(T))g.push(T)}return c}function cM(i){return i.type==="image"||i.type==="media"||i.type==="redacted_thinking"}function pM(i){return i.type==="image"}function mM(i,l,u){if(l.dropThinkingBlocks&&i.type==="thinking")return!0;return l.dropUnsafeOutsideLiveTail&&!u&&cM(i)}function ny(i,l,u,c="over_budget"){let g=[],b=[];for(let I=0;I<i.length;I+=1){let T=i[I];if(Array.isArray(T.content)&&T.content.length===0){u.push({kind:"dropped_message",path:{messageIndex:l[I]},reason:c,originalSize:$s(T),finalSize:0});continue}g.push(T),b.push(l[I])}return{messages:g,originalIndexes:b}}function hM(i,l,u,c,g,b){return i.map((I,T)=>{if(!Array.isArray(I.content))return I;let _=!1,E=T===c||T>=g,A=I.content.flatMap((C,N)=>{if(mM(C,b,E))return _=!0,u.push({kind:"dropped_block",path:{messageIndex:l[T],blockIndex:N},reason:"unsafe_to_truncate",originalSize:$s(C),finalSize:0}),[];if(C.type==="tool_result"&&Array.isArray(C.content)){let M=C.content.filter((O)=>{if(b.dropUnsafeOutsideLiveTail&&!E&&pM(O))return!1;return!0});if(M.length!==C.content.length){_=!0;let O={...C,content:M};return u.push({kind:"dropped_block",path:{messageIndex:l[T],blockIndex:N},reason:"unsafe_to_truncate",originalSize:$s(C),finalSize:$s(O)}),[O]}}return[C]});return _?{...I,content:A}:I})}function fM(i,l,u){return i.map((c,g)=>{if(!Array.isArray(c.content))return c;let b=!1,I=c.content.filter((T,_)=>{if(T.type!=="thinking")return!0;return b=!0,u.push({kind:"dropped_block",path:{messageIndex:l[g],blockIndex:_},reason:"unsafe_to_truncate",originalSize:$s(T),finalSize:0}),!1});return b?{...c,content:I}:c})}function Oo(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 oy(i,l){if(typeof i==="string")return Oo(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=Oo(c.text,u);return u-=g.length,{...c,text:g}}if(c.type==="file"){let g=Oo(c.content,u);return u-=g.length,{...c,content:g}}return c})}function gM(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 yM(i,l){if(typeof i.content==="string")return{...i,content:Oo(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:oy(c.content,0)};return c}if(c.type==="text"){let g=Oo(c.text,u);return u-=g.length,{...c,text:g}}if(c.type==="file"){let g=Oo(c.content,u);return u-=g.length,{...c,content:g}}if(c.type==="tool_result"){let g=oy(c.content,u);return u-=gM(g),{...c,content:g}}return c})}}function vM(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 wM(i,l,u){return{messages:i.filter((c,g)=>!u.has(g)),originalIndexes:l.filter((c,g)=>!u.has(g))}}function bM(i,l){if(l<0)return!1;for(let u of i)if(u>=l)return!0;return!1}function ay(i,l){return l>=0&&i.has(l)}function Fk(i){let l=[],u=[],c=aM(i.policyIntent);if(i.targetTokens<=0)return{status:"failed",messages:iy(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=iy(i.messages),b=g.map((E,A)=>A);if(c.dropThinkingBlocks){let E=ny(fM(g,b,l),b,l,"unsafe_to_truncate");g=E.messages,b=E.originalIndexes}let I=c.protectLatestTypedUser?Lc(g):-1,T=c.protectLiveTailFromDrop?Dc(g):g.length;if(c.dropUnsafeOutsideLiveTail){let E=ny(hM(g,b,l,I,T,c),b,l);g=E.messages,b=E.originalIndexes}let _=dd(g,i.estimateMessageTokens);if(_<=i.targetTokens)return{status:"ok",messages:g,actions:l,liveTailHandling:l.length>0?"included_degraded":"included_verbatim",estimatedTokens:_,warnings:u};for(let E=g.length-1;E>=0&&_>i.targetTokens;E-=1){let A=Lc(g);if(E===A)continue;if(c.protectLiveTailFromDrop&&E>=Dc(g))continue;if(!vM(g[E]))continue;let C=$s(g[E]),N=Math.max(1,C/Math.max(1,i.estimateMessageTokens(g[E]))),M=Math.max(16,Math.floor(i.targetTokens*N/Math.max(1,g.length)));g[E]=yM(g[E],M),l.push({kind:"truncated_text",path:{messageIndex:b[E]},reason:"over_budget",originalSize:C,finalSize:$s(g[E])}),_=dd(g,i.estimateMessageTokens)}for(let E=0;E<g.length&&_>i.targetTokens;){let A=lM(g),C=Lc(g),N=c.protectLiveTailFromDrop?Dc(g):g.length;if(E===A||E===C){l.push({kind:"preserved",path:{messageIndex:b[E]},reason:"protected_live_tail",originalSize:$s(g[E]),finalSize:$s(g[E])}),E+=1;continue}let M=uM(g,E);if(ay(M,A)){E+=1;continue}if(ay(M,C)){E+=1;continue}if(bM(M,N)){E+=1;continue}for(let L of M)l.push({kind:"dropped_message",path:{messageIndex:b[L]},reason:M.size>1||Qh(g[L]).size>0?"tool_pair_boundary":"over_budget",originalSize:$s(g[L]),finalSize:0});let O=wM(g,b,M);g=O.messages,b=O.originalIndexes,_=dd(g,i.estimateMessageTokens)}if(_>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:_,warnings:u};return{status:"ok",messages:g,actions:l,liveTailHandling:l.length>0?"included_degraded":"included_verbatim",estimatedTokens:_,warnings:u}}async function IM(i){i.signal?.throwIfAborted();let l=await zt(i.signal?{...i.providerConfig,abortSignal:i.signal}:i.providerConfig);i.signal?.throwIfAborted();let u="",c=0,g=!1,b=!1,I;for await(let T of l.createMessage(i.systemPrompt,[{role:"user",content:i.request}]))if(i.signal?.throwIfAborted(),T.type==="text"){if(u+=T.text,i.maxOutputChars&&u.length>i.maxOutputChars)throw Error("Summary exceeded its output limit.")}else if(T.type==="reasoning")c+=T.reasoning?.length??0;else if(T.type==="done"){if(!T.success&&T.error)throw Error(T.error);I=T.incompleteReason??I,g||=!T.success}else if(T.type==="tool_calls")b=!0;return i.signal?.throwIfAborted(),{text:u,reasoningChars:c,failed:g,usedTools:b,incompleteReason:I}}var Uc=1024;function kM(i){return Fk({messages:i.messages,targetTokens:Math.max(1,i.targetTokens),policyIntent:"agentic_summary",estimateMessageTokens:i.estimateMessageTokens})}function SM(i){try{return JSON.stringify(i).length}catch{return String(i).length}}async function TM(i){let l=i.context.messages;if(l.length<2)return;let u=YP(l,i.preserveRecentTokens,i.estimateMessageTokens);if(u<=0||u>=l.length)return;let c=l.slice(0,u),g=Uk(c),b=g>=0?Dk(c[g])?.summary:void 0,I=g>=0?c.slice(g+1):c;if(I.length===0)return;let T=Zg(c),_=nM({activeProviderConfig:i.providerConfig,summarizer:i.summarizer}),E=BP(_),A=i.summarizer===void 0,C=Math.max(i.context.budget.request.maxInputTokens,i.context.budget.request.triggerTokens,Uc);if(E===void 0&&!A)i.logger?.log("Agentic compaction summarizer has no known input limit; using conservative summary budget",{severity:"warn",summarizerProviderId:_.providerId,summarizerModelId:_.modelId,fallbackInputLimit:Uc});let N=E??(A?C:Uc),M=Ut(sy({previousSummary:b,conversationText:"",fileOps:T}).length),O=N-M;if(O<=0){i.logger?.debug("Skipped agentic compaction: summarizer budget exhausted",{summarizerProviderId:_.providerId,summarizerModelId:_.modelId,summarizerInputLimit:N,summaryRequestOverheadTokens:M});return}let L=kM({messages:I,targetTokens:O,estimateMessageTokens:i.estimateMessageTokens});if(L.status==="failed"){i.logger?.log("Skipped agentic compaction: summary input budget failed",{severity:"warn",budgetWarnings:L.warnings.map((G)=>G.code),summaryInputEstimatedTokens:L.estimatedTokens,targetTokens:O,summarizerProviderId:_.providerId,summarizerModelId:_.modelId});return}let D=Zg(L.messages),F=KP(L.messages),j=sy({previousSummary:b,conversationText:F,fileOps:D});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:Ut(j.length),newMessagesJsonChars:SM(I),summaryInputEstimatedTokens:L.estimatedTokens,summaryInputActions:L.actions.length,summaryInputWarnings:L.warnings.map((G)=>G.code),summaryRequestOverheadTokens:M,summarizerProviderId:_.providerId,summarizerModelId:_.modelId,summarizerInputLimit:N,maxInputTokens:i.context.budget.request.maxInputTokens,triggerTokens:i.context.budget.request.triggerTokens});let B=await IM({providerConfig:_,systemPrompt:"Summarize the provided coding session into a concise continuation note with detailed next steps.",request:j});i.logger?.debug("Generated compaction summary",{outputChars:B.text.length,reasoningChars:B.reasoningChars,incompleteReason:B.incompleteReason,modelId:_.modelId,providerId:_.providerId});let Q=B.text.trim();if(!Q){i.logger?.log("Skipped agentic compaction: summarizer returned no summary text",{severity:"warn",summarizerProviderId:_.providerId,summarizerModelId:_.modelId,summarizerMaxOutputTokens:_.maxOutputTokens,reasoningChars:B.reasoningChars,incompleteReason:B.incompleteReason,likelyCause:B.reasoningChars>0?"output_budget_consumed_by_reasoning":"empty_response"});return}let H=sM(Q,D),z=l.reduce((G,se)=>G+i.estimateMessageTokens(se),0),te=[oM({summary:H,fileOps:D,tokensBefore:z,userRunSpan:ym(c)}),...l.slice(u)],ee=te.reduce((G,se)=>G+i.estimateMessageTokens(se),0);i.logger?.debug("Performed agentic compaction",{messagesBefore:l.length,messagesAfter:te.length,messagesSummarized:u,messagesPreserved:l.length-u,tokensBefore:z,tokensAfter:ee,maxInputTokens:i.context.budget.request.maxInputTokens});let oe=L.actions.filter((G)=>G.reason==="over_budget"||G.reason==="tool_pair_boundary").length;return{messages:te,budget:{policyIntent:"agentic_summary",actionCount:oe,warningCount:L.warnings.length,liveTailHandling:L.liveTailHandling}}}function ly(i,l){return i.reduce((u,c)=>u+l(c),0)}function _M(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 EM(i,l){return JSON.stringify(i)!==JSON.stringify(l)}var AM=3;function dy(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 uy(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
|
+
${tM(i)}${u}</SYSTEM_NOTICE>`}}function jd(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 xM(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<AM;E-=1)if(dy(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 M=dy(l[N]);if(M)C.push(M)}return C},I=-1;for(let E=i.length-1;E>=0;E-=1)if(Us(i[E])){I=E;break}let T=[],_=0;while(_<i.length){if(!Us(i[_])){let C=c(i[_]);T.push({message:i[_],firstOriginalIndex:C,lastOriginalIndex:C,isTypedUser:!1}),_+=1;continue}let E=_;while(E+1<i.length&&Us(i[E+1]))E+=1;let A=i[_];if(E>_){let C=[],N=0;for(let M=_;M<=E;M+=1){if(N+=nd(i[M]),M>_){let O=c(i[M-1]),L=c(i[M]);if(O!==void 0&&L!==void 0&&L>O+1){let D=ry(l.slice(O+1,L)),F=b(O+1,L);if(ty(D)||F.length>0)C.push(uy(D,F))}}C.push(...jd(i[M],M===I))}A={...i[_],content:C,metadata:{...i[_].metadata,userRunSpan:N}}}else{let C=jd(A,_===I);if(Array.isArray(A.content)&&C.length!==A.content.length)A={...A,content:C}}T.push({message:A,firstOriginalIndex:c(i[_]),lastOriginalIndex:c(i[E]),isTypedUser:!0}),_=E+1}for(let E=0;E<T.length;E+=1){let A=T[E];if(!A.isTypedUser||A.lastOriginalIndex===void 0)continue;let C=T[E+1],N=C?C.firstOriginalIndex:l.length;if(N===void 0||N<=A.lastOriginalIndex+1)continue;let M=ry(l.slice(A.lastOriginalIndex+1,N)),O=b(A.lastOriginalIndex+1,N);if(!ty(M)&&O.length===0)continue;A.message={...A.message,content:[...jd(A.message,!0),uy(M,O)]}}return T.map((E)=>E.message)}function cy(i){if(!i.metrics)return i;let{metrics:l,...u}=i;return u}function CM(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 RM(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 PM(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 qk="preserved";function jk(i){return i.metadata?.compaction===qk}function MM(i){if(jk(i))return i;return{...i,metadata:{...i.metadata,compaction:qk}}}function NM(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 OM(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 z=0;z<l.length;z+=1)if(Us(l[z]))g.push(z);let b=new Map;for(let z of g){let te=_M(l[z]);if(te)b.set(z,te)}if(b.size===0)return;let I=g[g.length-1],T=0;for(let[z,te]of b)T+=u({...te,content:jd(te,z===I)});let _=new Set;for(let z=0;z<l.length;z+=1){if(b.has(z))continue;if(jk(l[z]))_.add(z),T+=u(l[z])}let E=new Set;{let z=l.length,te=0;for(let ee=l.length-1;ee>I;ee-=1){if(_.has(ee))break;let oe=u(l[ee]);if(T+te+oe>c)break;te+=oe,z=ee}while(z<l.length&&l[z].role!=="assistant")z+=1;for(let ee=z;ee<l.length;ee+=1)E.add(ee),T+=u(l[ee])}let A=new Map;for(let z=g.length-2;z>=0;z-=1){let te=g[z]+1,ee=g[z+1];for(let oe=ee-1;oe>=te;oe-=1){let G=l[oe];if(_.has(oe))break;if(G.role!=="assistant")continue;if(Array.isArray(G.content)&&G.content.some((Ne)=>Ne.type==="tool_use"))continue;let se=NM(G);if(se){let Ne=u(se);if(T+Ne<=c)A.set(oe,se),T+=Ne}break}}let C=[];for(let z=0;z<l.length;z+=1){let te=b.get(z);if(te){C.push(te);continue}if(_.has(z)||E.has(z)){C.push(l[z]);continue}let ee=A.get(z);if(ee)C.push(ee)}let N=ly(l,i.estimateMessageTokens),M=Math.min(Math.max(c,T),Math.max(1,i.context.budget.messages.triggerTokens)),O=Fk({messages:C,targetTokens:M,policyIntent:"basic_compaction_projection",estimateMessageTokens:i.estimateMessageTokens});if(O.status==="failed")i.logger?.debug("Basic compaction returned best-effort projection",{budgetWarnings:O.warnings.map((z)=>z.code),projectedTokens:O.estimatedTokens,targetTokens:c,maxInputTokens:i.context.budget.request.maxInputTokens});let L=xM(O.messages,l);if(!EM(l,L))return;let D=PM(L[0]),F=RM(D.usageBefore,CM(l)),j={kind:"compaction",reason:i.context.mode==="manual"?"manual_compaction":i.context.mode==="overflow_recovery"?"overflow_recovery_compaction":"auto_compaction",displayRole:"system",messagesRemoved:D.messagesRemoved+(l.length-L.length),...F?{usageBefore:F}:{}},B=L.map((z,te)=>{if(te===0&&Us(z))return cy({...z,metadata:{...z.metadata,...j,userRunSpan:nd(z)}});return cy(Us(z)?z:MM(z))}),Q=ly(B,i.estimateMessageTokens),H=O.actions.filter((z)=>z.reason==="over_budget"||z.reason==="tool_pair_boundary").length;return i.logger?.debug("Performed basic compaction",{messagesBefore:l.length,messagesAfter:B.length,messagesRemoved:l.length-B.length,tokensBefore:N,tokensAfter:Q,budgetStatus:O.status,budgetActions:H,budgetWarnings:O.warnings.map((z)=>z.code),targetTokens:c,maxInputTokens:i.context.budget.request.maxInputTokens}),{messages:B,budget:{policyIntent:"basic_compaction_projection",actionCount:H,warningCount:O.warnings.length,liveTailHandling:O.liveTailHandling}}}var $M=0.5;function py(i,l){if(l.aborted)return!0;return i instanceof Error&&(i.name==="AbortError"||i.name==="AgentRuntimeAbortError")}function wm(i){return i instanceof Error?{errorName:i.name,errorMessage:i.message}:{errorMessage:String(i)}}function Bk(i){try{return JSON.stringify(i).length}catch{return String(i).length}}function LM(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=Bk(b.content);l+=1,u+=I,c=Math.max(c,I)}}return{toolResultCount:l,toolResultSerializedChars:u,maxToolResultSerializedChars:c}}var Fc={basic:({context:i,estimateMessageTokens:l,logger:u})=>OM({context:i,estimateMessageTokens:l,logger:u}),agentic:({context:i,providerConfig:l,compaction:u,estimateMessageTokens:c,logger:g})=>TM({context:i,providerConfig:l,summarizer:u?.summarizer,preserveRecentTokens:Math.min(u?.preserveRecentTokens??jP,i.budget.messages.targetTokens),estimateMessageTokens:c,logger:g})};function DM(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 UM(i){let l=i.messagePairCount>=5&&typeof i.modelMaxTokens==="number"&&Number.isFinite(i.modelMaxTokens)&&i.modelMaxTokens<i.maxInputTokens?Math.floor(i.maxInputTokens*$M):Math.floor(i.triggerTokens*qP),u=Math.max(1,i.triggerTokens-1);return Math.max(1,Math.min(l,i.maxInputTokens,u))}function my(i,l){return Math.max(1,Math.floor(i-l))}function FM(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 Hk(i,l={}){let u={...i.compaction,...l.compaction};if(u.enabled!==!0)return;let c=GP(),g=u?.strategy??"agentic",b=Fc[g],I=l.mode??"auto",T=u?.compact?"custom":g;return async(_)=>{let E=_.overflowRecovery?"overflow_recovery":I,A=_.apiMessages.reduce((ve,Se)=>ve+c(Se),0),C=cr({systemPrompt:_.systemPrompt,messages:_.apiMessages,tools:_.tools}),N=_.messages.reduce((ve,Se)=>ve+c(Se),0),M=Math.max(0,C-A),O=vm({maxInputTokens:_.model.info?.maxInputTokens,contextWindow:_.model.info?.contextWindow});if(E==="auto"&&O===void 0)return;let L=O??DP,D=typeof _.previousRequestInputTokens==="number"&&_.previousRequestInputTokens>0?_.previousRequestInputTokens:0,F=D>0&&C>0?Math.min(FP,Math.max(1,D/C)):1,j=L/F,B=j*En,Q=my(B,M),H=C>=B;if(i.logger?.debug("Context compaction diagnostics",{mode:E,strategy:g,iteration:_.iteration,providerId:i.providerId,modelId:i.modelId,requestInputTokens:C,apiMessageTokens:A,messageInputTokens:N,requestOverheadTokens:M,maxInputTokens:j,rawMaxInputTokens:L,actualPreviousInputTokens:D,underestimateFactor:F,requestTriggerTokens:B,messageTriggerTokens:Q,thresholdRatio:En,shouldCompact:H,messageCount:_.messages.length,apiMessageCount:_.apiMessages.length,apiMessagesJsonChars:Bk(_.apiMessages),...LM(_.apiMessages)}),E==="auto"&&!H)return;let z,te;if(E==="auto")z=UM({maxInputTokens:j,modelMaxTokens:_.model.info?.maxTokens,triggerTokens:B,messagePairCount:FM(_.messages)}),te=my(z,M);else te=DM({messageInputTokens:N,messageTriggerTokens:Q,manualTargetRatio:l.manualTargetRatio}),z=M+te;let ee={agentId:_.agentId,conversationId:_.conversationId,parentAgentId:_.parentAgentId,iteration:_.iteration,messages:_.messages,model:_.model,mode:E,abortSignal:_.abortSignal,budget:{request:{inputTokens:C,maxInputTokens:j,triggerTokens:B,targetTokens:z,overheadTokens:M,thresholdRatio:En,utilizationRatio:j>0?C/j:0},messages:{inputTokens:N,triggerTokens:Q,targetTokens:te}}},oe=E==="manual"?"manual_compaction":E==="overflow_recovery"?"overflow_recovery_compaction":"auto_compaction",G=E==="manual"?"":E==="overflow_recovery"?"overflow-recovery-":"auto-";_.emitStatusNotice?.(`${G}compacting`,{kind:oe,reason:oe,phase:"started",iteration:_.iteration,triggerTokens:B,targetTokens:z,maxInputTokens:j,messageTargetTokens:te});let se=_.messages.length,Ne=Date.now(),De={context:ee,providerConfig:{...Ck(i),abortSignal:_.abortSignal},compaction:u,estimateMessageTokens:c,logger:i.logger},Te=T,le;if(E==="overflow_recovery"){if(u?.compact){try{le=await u.compact(ee)}catch(ve){if(py(ve,_.abortSignal))throw ve;i.logger?.log("Custom compaction failed during overflow recovery; falling back to basic compaction",{severity:"warn",...wm(ve)}),le=void 0}if(le?.messages){let ve=le.messages.reduce((Se,Ee)=>Se+c(Ee),0);if(!(le.messages.length>0&&ve<N&&ve<=te))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:ve,messageTargetTokens:te}),le=void 0}}if(!le?.messages)Te="basic",le=await Fc.basic(De)}else if(u?.compact)le=await u.compact(ee);else try{le=await b(De)}catch(ve){if(g!=="agentic"||py(ve,_.abortSignal))throw ve;i.logger?.log("Agentic compaction failed; falling back to basic compaction",{severity:"warn",...wm(ve)}),Te="basic",le=await Fc.basic(De)}let ke=Date.now()-Ne,we=i.sessionId??_.conversationId,Xe={agentId:_.agentId,conversationId:_.conversationId,parentAgentId:_.parentAgentId??void 0};if(le?.messages){let ve=le.messages.reduce((Ee,Ae)=>Ee+c(Ae),0),Se=M+ve;if(i.logger?.log("Context compaction completed",{severity:"info",strategy:Te,maxInputTokens:j,messageInputTokens:N,apiInputTokens:A,requestInputTokens:C,requestOverheadTokens:M,afterMessageTokens:ve,afterRequestTokens:Se,tokensSaved:C-Se,utilizationBefore:`${(C/j*100).toFixed(1)}%`,utilizationAfter:`${(Se/j*100).toFixed(1)}%`,thresholdTrigger:`${(En*100).toFixed(1)}%`,messagesBefore:se,messagesAfter:le.messages.length,messagesRemoved:se-le.messages.length}),_.emitStatusNotice?.(`${G}compacted`,{kind:oe,reason:oe,phase:"completed",iteration:_.iteration,tokensBefore:C,tokensAfter:Se,messagesBefore:se,messagesAfter:le.messages.length,maxInputTokens:j}),VA(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:B,maxInputTokens:j,thresholdRatio:En,durationMs:ke,provider:i.providerId,modelId:i.modelId,...Xe}),le.budget&&(le.budget.actionCount>0||le.budget.warningCount>0))QA(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,...Xe}),_.emitStatusNotice?.("compaction-budget-adjusted",{kind:"compaction_budget_emergency",reason:"compaction_budget_emergency",iteration:_.iteration,policyIntent:le.budget.policyIntent,actionCount:le.budget.actionCount,warningCount:le.budget.warningCount})}else _.emitStatusNotice?.(`${G}compaction-skipped`,{kind:oe,reason:oe,phase:"skipped",iteration:_.iteration,maxInputTokens:j}),YA(i.telemetry,{ulid:we,strategy:Te,mode:E,reason:"no_result",tokensBefore:C,triggerTokens:B,maxInputTokens:j,thresholdRatio:En,durationMs:ke,provider:i.providerId,modelId:i.modelId,...Xe});return le}}function qM(i){let l=Hk(i.config,{mode:"manual",compaction:{enabled:!0,strategy:"agentic",preserveRecentTokens:0}}),u=l!==void 0;return async(c)=>{if(u&&l&&Uk(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,...wm(g)})}return i.next?.(c)}}function jM(i){return async(l)=>{let u=i.getState?.(),c=u?gm(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,T=Vg({sourceMessages:l.messages,compactedMessages:b.messages,conversationId:l.conversationId,systemPrompt:I});return await i.saveState?.(T,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=Vg({sourceMessages:l.messages,compactedMessages:g.messages,conversationId:l.conversationId,systemPrompt:g.systemPrompt});await i.saveState?.(b,l.messages)}return g}}var hy=64,HM=/[^a-zA-Z0-9_-]+/g,zk=8,zM=1,WM="mcp_tool";function KM(i){return BM("sha1").update(i).digest("hex").slice(0,zk)}function GM(i){return i.replace(HM,"_")}var Zh=({serverName:i,toolName:l})=>{let u=`${i}__${l}`,c=GM(u);if(c===u&&u.length<=hy)return u;let g=KM(u),b=hy-zM-zk;return`${c.slice(0,b)||WM}_${g}`},XM=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"]),JM=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"]),VM=new Set(["add","remove","rm","install","uninstall","update","new","init","publish"]),YM=new Set(["install","uninstall","update","cleanup"]),QM=new Set(["install","require","remove","update"]),ZM=new Set(["install","get"]),eN=new Set(["add","remove"]),tN=new Set(["install","uninstall","upgrade"]),rN=new Set(["install","update","delete","push"]),ci=new Set(["install","reinstall","remove","purge","uninstall","upgrade","autoremove","add","del"]),sN={git:JM,npm:ud,pnpm:ud,yarn:ud,bun:ud,pip:Il,pip3:Il,pipx:Il,uv:Il,cargo:VM,apt:ci,"apt-get":ci,dnf:ci,yum:ci,apk:ci,brew:ci,snap:ci,gem:YM,composer:QM,go:ZM,dotnet:eN,winget:tN,nuget:rN},iN={stash:new Set(["list","show"]),worktree:new Set(["list"]),submodule:new Set(["status","summary"])},nN=new Set(["sudo","doas","env","command","builtin","nohup","time","nice","stdbuf","timeout","xargs"]),oN=new Set(["if","then","else","elif","fi","while","until","do","done","for","case","esac","!","{","}"]),fy=/^[A-Za-z_][A-Za-z0-9_]*\+?=/;function Wk(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 gy(i){return(i.replace(/["']/g,"").split(/[/\\]/).pop()??i).toLowerCase().replace(/\.exe$/,"")}function aN(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 bm(i){let l=0;while(l<i.length&&(fy.test(i[l])||oN.has(i[l])))l+=1;while(l<i.length&&nN.has(gy(i[l]))){l+=1;while(l<i.length&&(i[l].startsWith("-")||i[l]==="{}"||fy.test(i[l])||/^\d+[smhd]?$/.test(i[l])))l+=1}if(l>=i.length)return;let u=gy(i[l]),c=i.slice(l+1);if(u==="tee")return c.filter((I)=>!I.startsWith("-")).some((I)=>!Wk(I))?"`tee`":void 0;if(XM.has(u))return`\`${u}\``;let g=sN[u];if(g){if(u==="git"&&c.some((_)=>_==="--help"||_==="-h"))return;let I=0;while(I<c.length&&c[I].startsWith("-"))I+=u==="git"&&/^-[cC]$/.test(c[I])?2:1;let T=c[I]?.toLowerCase();if(T&&g.has(T)){let _=c[I+1]?.toLowerCase();if(u==="git"&&_!==void 0&&iN[T]?.has(_))return;return`\`${u} ${T}\``}if(u==="yarn"&&c.length===0)return"`yarn` (install)";return}if(/^python[\d.]*$/.test(u)){let I=c.indexOf("-m"),T=I===-1?void 0:c[I+1]?.toLowerCase();if(T==="pip"||T==="pip3"){let _=c.slice(I+2).find((E)=>!E.startsWith("-"))?.toLowerCase();if(_&&Il.has(_))return`\`pip ${_}\``}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,T)=>(I==="-i"||I==="--include")&&c[T+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,T)=>I==="--spider"||/^-[A-Za-z]*O-$/.test(I)||I==="--output-document=-"||I==="-O"&&c[T+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 T=[];for(let E=I+1;E<c.length&&c[E]!==";"&&c[E]!=="+";E+=1)T.push(c[E]);let _=bm(T);if(_)return _}return}return}function lN(i){if(typeof i!=="string")return bm([i.command,...i.args??[]]);let l=aN(i),u=l.matchAll(/(?:^|[^<>])(?:>{1,2}|&>{1,2})\s*([^\s;&|<>()]+)/g);for(let c of u)if(!Wk(c[1]))return`output redirection (\`> ${c[1]}\`)`;for(let c of l.split(/[\n;|&()`]+/)){let g=bm(c.trim().split(/\s+/).filter(Boolean));if(g)return g}return}function dN(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 Kt={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"},uN=[Kt.READ_FILES,Kt.SEARCH_CODEBASE,Kt.RUN_COMMANDS,Kt.FETCH_WEB_CONTENT,Kt.APPLY_PATCH,Kt.EDITOR,Kt.SKILLS,Kt.ASK,Kt.SUBMIT_AND_EXIT],Bi=6000,Yi=e().describe("The absolute path of a text file to read content from"),cu=t({start_line:xi.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:xi.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"),Kk=t({path:Yi,start_line:cu.shape.start_line,end_line:cu.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"),Gk=t({files:o(Kk).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.")}),yy={start_line:cu.shape.start_line,end_line:cu.shape.end_line},An=p([Kk,t({file_path:Yi,...yy}).transform(({file_path:i,...l})=>({path:i,...l})),t({filePath:Yi,...yy}).transform(({filePath:i,...l})=>({path:i,...l}))]),cN=p([Gk,An,o(An),o(e()),e(),t({files:o(p([Yi,An]))}),t({files:An}),t({files:Yi}),t({file_paths:o(Yi)}),t({file_paths:e()}),t({paths:o(p([Yi,An]))}),t({paths:An}),t({paths:e()})]),Xk=t({queries:o(e()).describe("Array of regex search queries to execute")}),pN=p([Xk,o(e()),e(),t({queries:e()})]),pu=e().describe(`The non-interactive shell command to execute - MUST keep input short and concise (within ${Bi*2} characters) to avoid timeouts.`),Im=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.")}),Jk=p([pu,Im]),Vk=t({commands:o(pu).min(1).describe("Array of complete shell command strings to execute.")}),mN=t({commands:o(Jk)}),hN=p([Vk,mN,t({commands:Jk}),o(Im),Im,t({command:pu}),t({cmd:pu}),o(e()),e()]),fN=t({url:e().describe("The URL to fetch"),prompt:e().min(2).describe("Analysis prompt for the fetched content")}),vy=t({requests:o(fN).describe("Array of the URLs for the web fetch requests")}),wy=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 ${Bi} 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 ${Bi} 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:xi.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."),Yk=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."),gN=p([Yk,e()]),by=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")}),Iy=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")}),ky=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 ia(i){if(i instanceof Error)return i.message;return String(i)}function yN(i){if(typeof i.old_text==="string"&&i.old_text.length>Bi)return`Editor input too large: old_text was ${i.old_text.length} characters, exceeding the recommended limit of ${Bi}. 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>Bi)return`Editor input too large: new_text was ${i.new_text.length} characters, exceeding the recommended limit of ${Bi}. Split the edit into smaller tool calls so later tool calls are less likely to be truncated or time out.`;return null}class sc extends Error{timeoutMs;constructor(i,l){super(i);this.name="TimeoutError",this.timeoutMs=l}}function si(i,l,u){return Promise.race([i,new Promise((c,g)=>{setTimeout(()=>g(new sc(u,l)),l)})])}function qc(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 vN(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 wN=new Set(["start_line","end_line"]);function bN(i){if(i===null||typeof i!=="object"||Array.isArray(i))return!1;let l=Object.keys(i);return l.length>0&&l.every((u)=>wN.has(u))}function Sy(i){let l=[];for(let u of i){if(bN(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 IN(i){if(Array.isArray(i))return Sy(i);if(i!==null&&typeof i==="object")for(let l of["files","paths"]){let u=i[l];if(Array.isArray(u))return{...i,[l]:Sy(u)}}return i}function Qk(i){let l=kN(y(hN,i));if(l.length===0)throw Error("run_commands requires at least one command; the commands list was empty.");return l}function kN(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 SN(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 jc=200;function TN(i){let l=SN(i);if(l.length<=jc)return l;let u=l.length-jc;return`${l.slice(0,jc)} ... [command truncated: ${u} more chars; full command is in the tool call input]`}var _N="core.plan-mode-command-guard";function EN(i={}){return{name:_N,manifest:{capabilities:["hooks"]},hooks:{beforeTool:(l)=>{if(l.tool.name!==Kt.RUN_COMMANDS)return;let u;try{u=Qk(l.input)}catch{return}for(let c of u){let g=lN(c);if(g)return HA(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:dN(g)}}return}}}}var $N=2000,LN=4096;function DN(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 tS(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 Bc(i){return tS(i)==="missing"?{status:"missing"}:{status:"unavailable"}}function UN(i){let l=i.trim();return l?{status:"found",token:`${process.platform}:${l}`}:void 0}function FN(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 ef(i){if(!Number.isSafeInteger(i)||i<=0)return{status:"missing"};if(process.platform==="linux"){let u;try{u=await Ay(`/proc/${i}/stat`,"utf8")}catch{return Bc(i)}let c=FN(u);if(c.status!=="running")return c;try{let g=(await Ay("/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=tS(i);if(l!=="running")return{status:l};try{let u=DN(i);return await new Promise((c)=>{ON(u.file,u.args,{encoding:"utf8",env:u.env,maxBuffer:LN,timeout:$N,windowsHide:!0},(g,b)=>{let I=!g&&typeof b==="string"?UN(b):void 0;c(I??Bc(i))})})}catch{return Bc(i)}}var Hl=48000;function xy(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 Hd=2000,Sm=2000,rS=48000,zd=48000,Cy=10485760,qN=86400000,jN=60000,sS="cline-command-",iS="output.log",nS="active-command.json",oS="completed-at",BN=48,HN=1000;function aS(i){return typeof i==="number"&&Number.isFinite(i)?Math.max(0,i):qN}function zN(i){return typeof i==="number"&&Number.isFinite(i)?Math.max(1,i):jN}function WN(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 Tm(i,l){let u=`${i}.${Zk()}.tmp`;try{RN(u,l,"utf8");try{_y(u,i)}catch(c){if(c instanceof Error&&"code"in c&&["EEXIST","EPERM"].includes(String(c.code)))mu(i,{force:!0}),_y(u,i);else throw c}}finally{mu(u,{force:!0})}}function KN(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 Ry(i){try{return await MN(i,"utf8")}catch(l){if(l instanceof Error&&"code"in l&&l.code==="ENOENT")return;throw l}}async function lS(i,l){let u=Qs(i,nS),c=Qs(i,oS),g=await Ry(c),b=KN(g,l.nowMs),I=await Ry(u);if(b!==void 0){if(I!==void 0)await Bd(u,{force:!0})}else if(I!==void 0){let _=WN(I);if(_){let E;try{E=await l.probeProcessStartToken(_.pid)}catch{E={status:"unavailable"}}if(E.status==="found"&&E.token===_.processStartToken)return Py(i,l),!1;if(E.status==="unavailable")return Py(i,l),!1}Tm(c,String(l.nowMs)),await Bd(u,{force:!0}),b=l.nowMs}if(b===void 0)try{b=(await Ey(Qs(i,iS))).mtimeMs}catch{b=(await Ey(i)).mtimeMs}let T=l.nowMs-l.retentionMs;if(b>T)return uS(i,Math.max(0,b+l.retentionMs-l.nowMs)),!1;return await Bd(i,{recursive:!0,force:!0}),!0}function Py(i,l,u=l.activeCommandPollIntervalMs){setTimeout(()=>{lS(i,{...l,nowMs:Date.now()}).catch(()=>{return})},u).unref()}async function GN(i={}){let l=i.tempDirectory??eS(),u=aS(i.retentionMs),c=i.nowMs??Date.now(),g=i.processStartTokenProbe??ef,b=zN(i.activeCommandPollIntervalMs),I;try{I=await PN(l,{withFileTypes:!0})}catch{return 0}let T=0;for(let _ of I){if(!_.isDirectory()||!_.name.startsWith(sS))continue;let E=Qs(l,_.name);try{if(await lS(E,{retentionMs:u,nowMs:c,probeProcessStartToken:g,activeCommandPollIntervalMs:b}))T+=1}catch{}}return T}class tf extends Error{exitCode;output;constructor(i,l){super(`Command exited with code ${i}`);this.exitCode=i,this.output=l,this.name="CommandExitError"}}function Wd(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 rf extends Error{signal;output;constructor(i,l){super(Wd(null,i));this.signal=i,this.output=l,this.name="CommandTerminationError"}}class dS 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&&!xN(l.cwd))this.missing="cwd";else this.missing="executable"}}function My(i){let l=Math.ceil(i/2),u=Math.max(1,i-l),c=new NN("utf8"),g="",b="",I=0,T=(_)=>{if(!_)return;I+=_.length;let E=l-g.length;if(E>0){g+=_.slice(0,E),b=(b+_.slice(E)).slice(-u);return}b=(b+_).slice(-u)};return{append(_){let E=c.write(_);return T(E),E},current(){return{text:g+b,totalChars:I,dropped:I>g.length+b.length}},snapshot(){let _=c.end();return T(_),{text:g+b,totalChars:I,dropped:I>g.length+b.length,finalChunk:_}}}}function XN(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={},T=[],_,E=!1,A=()=>{if(!_)return;clearTimeout(_),_=void 0},C=()=>{if(A(),!g){I={},T=[];return}let M=I,O=T;I={},T=[];for(let L of O){let D=M[L];if(!D?.chunk)continue;let F=D.droppedChars>0?`\x1B[0m[${D.droppedChars} command-output characters skipped while streaming]
|
|
119
|
+
`:"",j=F.length<b?F+D.chunk.slice(-(b-F.length)):D.chunk.slice(-b);g({stream:L,chunk:j,executionId:l,detachable:u(),...D.droppedChars>0?{truncated:!0,droppedChars:D.droppedChars}:{}})}},N=()=>{if(!g||_||E)return;_=setTimeout(C,BN),_.unref()};return{append(M,O){if(!g||E||!O)return;let L=I[M];if(!L)L={chunk:"",droppedChars:0},I[M]=L,T.push(M);if(O.length>=b)L.droppedChars+=L.chunk.length+O.length-b,L.chunk=O.slice(-b);else{let D=L.chunk.length+O.length-b;if(D>0)L.droppedChars+=D,L.chunk=L.chunk.slice(D);L.chunk+=O}N()},flush:C,stop(M={}){if(E)return;if(M.flush)C();else A(),I={},T=[];E=!0}}}function uS(i,l){setTimeout(()=>{Bd(i,{recursive:!0,force:!0}).catch(()=>{return})},l).unref()}function JN(i,l){let u=CN(Qs(eS(),sS)),c=Qs(u,iS),g=Qs(u,nS),b=Qs(u,oS);try{Tm(g,`${JSON.stringify(l)}
|
|
120
|
+
`)}catch(O){throw mu(u,{recursive:!0,force:!0}),O}let I=AN(c,{encoding:"utf8"}),T=0,_=!1,E=!0,A=!1,C=!1,N=!1,M=()=>{if(N)return;N=!0,uS(u,i)};return I.on("error",()=>{E=!1}),I.once("close",()=>{if(E=!1,A=!0,C)M()}),{path:c,write(O){if(!O||_||!E)return;let L=Cy-T;if(L<=0){_=!0,E=!1,I.end();return}let D=Buffer.from(O,"utf8"),F=D.length<=L?D:D.subarray(0,L);if(I.write(F),T+=F.length,F.length<D.length||T>=Cy)_=!0,E=!1,I.end()},complete:()=>{if(C)return;C=!0;try{Tm(b,String(Date.now()))}catch{}try{mu(g,{force:!0})}catch{}if(A){M();return}E=!1,I.end()}}}function VN(i,l,u,c,g,b,I,T=ef){if(l.signal?.aborted)return Promise.reject(Error("Command was aborted"));return new Promise((_,E)=>{let A=process.platform==="win32",C=Ty(i.executable,i.args,{cwd:i.cwd,env:{...process.env,...i.env},stdio:["pipe","pipe","pipe"],detached:!A,windowsHide:!0}),N=C.pid,M=My(c),O=My(c),L=Zk(),D=Boolean(I&&l.sessionId),F=!1,j,B=!1,Q=!1,H=!1,z,te=!1,ee,oe=()=>{},G=XN(l,L,()=>F,c),se=(ve)=>{if(Q)return;Q=!0,ve()},Ne=async()=>{if(!N)return;if(A){await new Promise((ve)=>{let Se=!1,Ee,Ae=()=>{if(Se)return;Se=!0,clearTimeout(Be),ve()};try{Ee=Ty("taskkill.exe",["/PID",String(N),"/T","/F"],{stdio:"ignore",shell:!1,windowsHide:!0})}catch{C.kill(),ve();return}let Be=setTimeout(()=>{Ee.kill(),C.kill(),Ae()},5000);Ee.once("error",()=>{C.kill(),Ae()}),Ee.once("close",(Ye)=>{if(Ye!==0)C.kill();Ae()})});return}try{process.kill(-N,"SIGKILL")}catch{C.kill("SIGKILL")}},De,Te=()=>ke(Error("Command was aborted")),le=()=>{if(clearTimeout(De),z)clearTimeout(z);l.signal?.removeEventListener("abort",Te),oe()},ke=(ve)=>{if(B||Q)return;B=!0,G.stop({flush:!0}),le(),Ne().finally(()=>se(()=>E(ve)))};if(De=setTimeout(()=>ke(new sc(`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||B||Q||!N||C.exitCode!==null||C.signalCode!==null)return!1;if(!j)return!1;let ve=JN(b,{version:1,executionId:L,pid:N,processStartToken:j,detachedAtMs:Date.now()});G.stop({flush:!0}),te=!0,ee=ve;let Se=M.current(),Ee=O.current();if(ee.write(Se.text),Ee.text)ee.write(`
|
|
121
|
+
[stderr]
|
|
122
|
+
${Ee.text}`);le(),C.unref(),C.stdout?.unref?.(),C.stderr?.unref?.();let Ae=[`[Command is still running. Output will continue in ${ee.path}]`,g?Se.text+(Ee.text?`
|
|
123
|
+
[stderr]
|
|
124
|
+
${Ee.text}`:""):Se.text].filter(Boolean).join(`
|
|
125
|
+
`);return se(()=>_(Ae)),!0};C.once("spawn",()=>{if(B)return;l.emitUpdate?.({stream:"stdout",chunk:"",executionId:L,detachable:!1});let ve=l.sessionId;if(!D||!N||!ve||!I)return;(async()=>{let Se=await T(N);if(Se.status!=="found"||B||Q||C.exitCode!==null||C.signalCode!==null)return;j=Se.token,F=!0,oe=I.register({executionId:L,sessionId:ve,toolCallId:l.toolCallId,detach:we}),l.emitUpdate?.({stream:"stdout",chunk:"",executionId:L,detachable:!0})})().catch(()=>{return})}),C.stdout?.on("data",(ve)=>{let Se=M.append(ve);if(!Se)return;if(te){ee?.write(Se);return}G.append("stdout",Se)}),C.stderr?.on("data",(ve)=>{let Se=O.append(ve);if(!Se)return;if(te){ee?.write(Se);return}G.append("stderr",Se)});let Xe=(ve,Se,Ee)=>{let Ae=M.snapshot(),Be=O.snapshot();if(Ae.finalChunk)G.append("stdout",Ae.finalChunk);if(Be.finalChunk)G.append("stderr",Be.finalChunk);if(G.stop({flush:!0}),le(),ve!==0){let Ye=g?Ae.text+(Be.text?`
|
|
126
|
+
[stderr]
|
|
127
|
+
${Be.text}`:""):Ae.text,xt=Ae.dropped||g&&Be.dropped,vt=g?Ae.totalChars+Be.totalChars:Ae.totalChars;if(xt||Ye.length>c)Ye=xy(Ye,{maxChars:c,totalChars:vt});let Nr=`[${Wd(ve,Se)}]`,bt=Ye.length>0?`${Nr}
|
|
128
|
+
${Ye}`:Nr,Ct=Ee?`${bt}
|
|
129
|
+
${Ee}`:bt;se(()=>E(ve===null?new rf(Se,Ct):new tf(ve,Ct)))}else{let Ye=g?Ae.text+(Be.text?`
|
|
130
|
+
[stderr]
|
|
131
|
+
${Be.text}`:""):Ae.text;if(Ae.dropped||g&&Be.dropped||Ye.length>c){let xt=g?Ae.totalChars+Be.totalChars:Ae.totalChars;Ye=xy(Ye,{maxChars:c,totalChars:xt})}se(()=>_(Ee?`${Ye}
|
|
132
|
+
${Ee}`:Ye))}};C.on("close",(ve,Se)=>{if(B||H)return;let Ee=M.snapshot(),Ae=O.snapshot();if(te){if(z)clearTimeout(z);ee?.write(Ee.finalChunk),ee?.write(Ae.finalChunk),ee?.write(`
|
|
133
|
+
[${Wd(ve,Se)}]
|
|
134
|
+
`),ee?.complete();return}Xe(ve,Se??null,"")}),C.on("exit",(ve,Se)=>{if(B)return;z=setTimeout(()=>{if(B||H)return;if(te){let Ee=M.snapshot(),Ae=O.snapshot();ee?.write(Ee.finalChunk),ee?.write(Ae.finalChunk),ee?.write(`
|
|
135
|
+
[${Wd(ve,Se)}]
|
|
136
|
+
`),ee?.complete();return}if(Q)return;H=!0,C.stdout?.unref?.(),C.stderr?.unref?.(),C.unref(),Xe(ve,Se??null,"[Command completed with background processes still running; their output is no longer captured]")},HN)}),C.on("error",(ve)=>{if(B)return;if(te){ee?.write(`
|
|
137
|
+
[Command failed: ${ve.message}]
|
|
138
|
+
`),ee?.complete();return}G.stop({flush:!0}),le(),se(()=>E(new dS(ve,{cwd:i.cwd})))}),C.stdin?.on("error",(ve)=>{if(B||Q)return;ke(Error(`Failed to write command input: ${ve.message}`))}),C.stdin?.end(i.input,"utf8")})}function YN(i={}){let{shell:l=_t(process.platform),timeoutMs:u=30000,env:c={},combineOutput:g=!0,executionController:b,processStartTokenProbe:I=ef}=i,T=aS(i.detachedLogRetentionMs),_=i.maxOutputChars??i.maxOutputBytes??Hl;return(E,A,C)=>{let N=typeof E!=="string"&&"args"in E?{executable:E.command,args:E.args??[]}:lr(l,typeof E==="string"?E:E.command);return VN({executable:N.executable,args:N.args,cwd:A,env:c,input:N.input},C,u,_,g,T,b,I)}}function Ny(i,l){let u=i.metadata?.[l];return typeof u==="string"?u:void 0}function QN(i,l,u){BA(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:Ny(l,"mode"),source:Ny(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 eO(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((T,_)=>_>u&&T.trim()===g);if(b===-1){l.push(c);continue}let I=[c];while(u<b){u+=1;let T=i[u];I.push(T)}l.push(I.join(`
|
|
139
|
+
`))}return l}function tO(i){let l=[],u=[],c=()=>{if(u.length>0)l.push(...eO(u)),u=[]};for(let g of i){if(typeof g==="string"){u.push(g);continue}c(),l.push(g)}return c(),l}async function rO(i,l){let{executor:u,cwd:c,context:g,timeoutMs:b,timeoutSource:I,telemetry:T}=l;return Promise.all(i.map(async(_,E)=>{let A=Date.now(),C=TN(_),N=g.emitUpdate?{...g,emitUpdate:(M)=>{let O=M&&typeof M==="object"&&!Array.isArray(M)?M:{update:M};g.emitUpdate?.({...O,commandIndex:E,query:C})}}:g;try{let M=await si(u(_,c,N),b,`Command timed out after ${b}ms`);return{query:C,result:M,success:!0}}catch(M){if(M instanceof sc)QN(T,g,{effectiveTimeoutMs:M.timeoutMs,timeoutSource:I,commandCount:i.length,durationMs:Date.now()-A});if(M instanceof tf||M instanceof rf)return{query:C,result:M.output,error:M.message,success:!1};let O=ia(M);return{query:C,result:"",error:`Command failed: ${O}`,success:!1}}}))}function sO(i,l={}){let u=l.fileReadTimeoutMs??1e4;return k({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 ${Hd} lines / ~${Math.round(rS/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(Gk),timeoutMs:u*2,retryable:!0,maxRetries:1,execute:async(c,g)=>{let b=y(cN,IN(c)),I;if(typeof b==="string")I=[{path:b}];else if(Array.isArray(b))I=b.map((T)=>typeof T==="string"?{path:T}:T);else if("files"in b)I=(Array.isArray(b.files)?b.files:[b.files]).map((T)=>typeof T==="string"?{path:T}:T);else if("file_paths"in b)I=(Array.isArray(b.file_paths)?b.file_paths:[b.file_paths]).map((T)=>({path:T}));else if("paths"in b)I=(Array.isArray(b.paths)?b.paths:[b.paths]).map((T)=>typeof T==="string"?{path:T}:T);else I=[b];return Promise.all(I.map(async(T)=>{let _=vN(T);if(_)return{query:qc(T),result:"",error:`Invalid file range: ${_}`,success:!1};try{let E=await si(i(T,g),u,`File read timed out after ${u}ms`);return{query:qc(T),result:E,success:!0}}catch(E){let A=ia(E);return{query:qc(T),result:"",error:`Error reading file: ${A}`,success:!1}}}))}})}function iO(i,l={}){let u=l.searchTimeoutMs??30000,c=l.cwd??process.cwd();return k({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(zd/1000)}k characters per query is middle-truncated; narrow patterns beat broad ones.`,inputSchema:S(Xk),timeoutMs:u*2,retryable:!0,maxRetries:1,execute:async(g,b)=>{let I=y(pN,g),T=Array.isArray(I)?I:typeof I==="object"?Array.isArray(I.queries)?I.queries:[I.queries]:[I];return Promise.all(T.map(async(_)=>{try{let E=await si(i(_,c,b),u,`Search timed out after ${u}ms`);return{query:_,result:E,success:!0}}catch(E){let A=ia(E);return{query:_,result:"",error:`Search failed: ${A}`,success:!1}}}))}})}var Oy="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. ",nO="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 oO(i,l){let u=Ro(i);if(u==="powershell"||u==="cmd"){let g=zi(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,T=`${b} ${u==="powershell"?"-Command":"/c"}`,_=u==="powershell"?"';'":"'&&'";return`Run non-interactive shell commands from the root of the workspace${l?" in Windows environment":""}. `+Oy+`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 ${_} to sequence commands. Write commands directly; do not wrap them in another ${T} invocation. `+(u==="powershell"?nO:"")+"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. "+Oy+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 aO(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,T=typeof I==="function"?I:()=>I??_t(process.platform),_=()=>oO(T(),b),E=k({name:"run_commands",description:_(),inputSchema:S(Vk),timeoutMs:u*2,retryable:!1,maxRetries:0,execute:async(A,C)=>{let N=tO(Qk(A));return rO(N,{executor:i,cwd:g,context:C,timeoutMs:u,timeoutSource:c,telemetry:l.telemetry})}});if(typeof I==="function")Object.defineProperty(E,"description",{get:_,enumerable:!0});return E}function lO(i,l={}){let u=l.webFetchTimeoutMs??30000;return k({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(vy),timeoutMs:u*2,retryable:!0,maxRetries:2,execute:async(c,g)=>{let b=y(vy,c);return Promise.all(b.requests.map(async(I)=>{try{let T=await si(i(I.url,I.prompt,g),u,`Web fetch timed out after ${u}ms`);return{query:I.url,result:T,success:!0}}catch(T){let _=ia(T);return{query:I.url,result:"",error:`Error fetching web content: ${_}`,success:!1}}}))}})}var dO=`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 uO(i,l={}){let u=l.applyPatchTimeoutMs??30000,c=l.cwd??process.cwd();return k({name:"apply_patch",description:dO,inputSchema:S(Yk),timeoutMs:u,retryable:!1,maxRetries:0,execute:async(g,b)=>{let I=y(gN,g),T=typeof I==="string"?I:I.input;try{return{query:"apply_patch",result:await si(i({input:T},c,b),u,`apply_patch timed out after ${u}ms`),success:!0}}catch(_){return{query:"apply_patch",result:"",error:`apply_patch failed: ${ia(_)}`,success:!1}}}})}function cO(i,l={}){let u=l.editorTimeoutMs??30000,c=l.cwd??process.cwd();return k({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(wy),timeoutMs:u,retryable:!1,maxRetries:0,execute:async(g,b)=>{let I=y(wy,g),T=I.insert_line==null?"edit":"insert",_=yN(I);if(_)return{query:`${T}:${I.path}`,result:"",error:_,success:!1};try{let E=await si(i(I,c,b),u,`Editor operation timed out after ${u}ms`);return{query:`${T}:${I.path}`,result:E,success:!0}}catch(E){let A=ia(E);return{query:`${T}:${I.path}`,result:"",error:`Editor operation failed: ${A}`,success:!1}}}})}function ic(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=k({name:"skills",description:c,inputSchema:S(by),timeoutMs:u,retryable:!1,maxRetries:0,execute:async(b,I)=>{let T=y(by,b);return si(i(T.skill,T.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 pO(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 mO(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(Iy),retryable:!1,maxRetries:0,execute:async(l,u)=>{let c=y(Iy,l),g=await i(c.question,c.options,u);return pO(g)}}}function hO(i,l={}){let u=l.submitTimeoutMs??15000;return k({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(ky),lifecycle:{completesRun:!0},timeoutMs:u,retryable:!1,maxRetries:0,execute:async(c,g)=>{let b=y(ky,c);return si(i(b.summary,b.verified,g),u,`submit_and_exit timed out after ${u}ms`)}})}function fO(i){let{executors:l,enableReadFiles:u=!0,enableSearch:c=!0,enableBash:g=!0,enableWebFetch:b=!0,enableApplyPatch:I=!1,enableEditor:T=!0,enableSkills:_=!0,enableAskQuestion:E=!0,enableSubmitAndExit:A=!1,...C}=i,N=[];if(u&&l.readFile)N.push(sO(l.readFile,C));if(c&&l.search)N.push(iO(l.search,C));if(g&&l.bash)N.push(aO(l.bash,C));if(b&&l.webFetch)N.push(lO(l.webFetch,C));if(T&&l.editor)N.push(cO(l.editor,C));else if(I&&l.applyPatch)N.push(uO(l.applyPatch,C));if(_&&l.skills)N.push(ic(l.skills,C));let M=A?l.submit:void 0;if(E&&l.askQuestion&&!M)N.push(mO(l.askQuestion));if(M)N.push(hO(M,C));return N}var $e={BEGIN:"*** Begin Patch",END:"*** End Patch",ADD:"*** Add File: ",UPDATE:"*** Update File: ",DELETE:"*** Delete File: ",MOVE:"*** Move to: ",SECTION:"@@",END_FILE:"*** End of File"},gO=["%%bash","apply_patch","EOF","```"];class yt extends Error{constructor(i){super(i);this.name="DiffError"}}function jr(i){let l={"‐":"-","‑":"-","‒":"-","–":"-","—":"-","−":"-","“":'"',"”":'"',"„":'"',"«":'"',"»":'"',"‘":"'","’":"'","‛":"'"," ":" "," ":" "};return i.normalize("NFC").replace(/./gu,(u)=>l[u]??u).replace(/\\`/g,"`").replace(/\\'/g,"'").replace(/\\"/g,'"')}class cS{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($e.BEGIN))this.index++}hasMoreLines(){return this.index<this.lines.length}isEndMarker(){return this.lines[this.index]?.startsWith($e.END)??!1}parseNextAction(){let i=this.lines[this.index];if(i?.startsWith($e.UPDATE)){this.parseUpdate(i.substring($e.UPDATE.length).trim());return}if(i?.startsWith($e.DELETE)){this.parseDelete(i.substring($e.DELETE.length).trim());return}if(i?.startsWith($e.ADD)){this.parseAdd(i.substring($e.ADD.length).trim());return}throw new yt(`Unknown line while parsing: ${i}`)}checkDuplicate(i,l){if(i in this.patch.actions)throw new yt(`Duplicate ${l} for file: ${i}`)}parseUpdate(i){this.checkDuplicate(i,"update"),this.currentPath=i,this.index++;let l=this.lines[this.index]?.startsWith($e.MOVE)?(this.lines[this.index++]??"").substring($e.MOVE.length).trim():void 0;if(!(i in this.currentFiles))throw new yt(`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=[$e.END,$e.UPDATE,$e.DELETE,$e.ADD,$e.END_FILE];while(!b.some((I)=>this.lines[this.index]?.startsWith(I.trim()))){let I=this.lines[this.index],T=I?.startsWith("@@ ")?I.substring(3):void 0;if(T!==void 0||(I==="@@"?I:void 0)!==void 0)this.index++;else if(g!==0)throw new yt(`Invalid Line:
|
|
177
|
+
${this.lines[this.index]}`);if(T?.trim()){let L=jr(T.trim());for(let D=g;D<c.length;D++){let F=c[D];if(F&&(jr(F)===L||jr(F.trim())===L)){if(g=D+1,jr(F.trim())===L&&jr(F)!==L)this.fuzz++;break}}}let[_,E,A,C]=wO(this.lines,this.index),[N,M,O]=vO(c,_,g,C);if(N===-1){let L=_.join(`
|
|
178
|
+
`);this.addWarning({path:this.currentPath||l,chunkIndex:u.chunks.length,message:`Could not find matching context (similarity: ${O.toFixed(2)}). Chunk skipped.`,context:L.length>200?`${L.substring(0,200)}...`:L}),this.index=A}else{this.fuzz+=M;for(let L of E)L.origIndex+=N,u.chunks.push(L);g=N+_.length,this.index=A}}return u}parseDelete(i){if(this.checkDuplicate(i,"delete"),!(i in this.currentFiles))throw new yt(`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 yt(`Add File Error: File already exists: ${i}`);this.index++;let l=[],u=[$e.END,$e.UPDATE,$e.DELETE,$e.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 yt(`Invalid Add File line (missing '+'): ${c}`);l.push(c.substring(1))}this.patch.actions[i]={type:"add",newFile:l.join(`
|
|
179
|
+
`),chunks:[]}}}function $y(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=yO(c,u);return(u.length-g)/u.length}function yO(i,l){let u=l.length+1,c=i.length+1,g=Array(u*c).fill(0),b=(T,_)=>g[T*c+_]??0,I=(T,_,E)=>{g[T*c+_]=E};for(let T=0;T<=l.length;T++)I(T,0,T);for(let T=0;T<=i.length;T++)I(0,T,T);for(let T=1;T<=l.length;T++)for(let _=1;_<=i.length;_++)if(l[T-1]===i[_-1])I(T,_,b(T-1,_-1));else I(T,_,1+Math.min(b(T-1,_-1),b(T,_-1),b(T-1,_)));return b(l.length,i.length)}function vO(i,l,u,c){if(l.length===0)return[u,0,1];let g=0,b=(I)=>{let T=jr(l.join(`
|
|
180
|
+
`));for(let E=I;E<i.length;E++){let A=jr(i.slice(E,E+l.length).join(`
|
|
181
|
+
`));if(A===T)return[E,0,1];let C=$y(A,T);if(C>g)g=C}for(let E=I;E<i.length;E++){let A=jr(i.slice(E,E+l.length).map((N)=>N.trimEnd()).join(`
|
|
182
|
+
`)),C=jr(l.map((N)=>N.trimEnd()).join(`
|
|
183
|
+
`));if(A===C)return[E,1,1]}for(let E=I;E<i.length;E++){let A=jr(i.slice(E,E+l.length).map((N)=>N.trim()).join(`
|
|
184
|
+
`)),C=jr(l.map((N)=>N.trim()).join(`
|
|
185
|
+
`));if(A===C)return[E,100,1]}let _=0.66;for(let E=I;E<i.length;E++){let A=jr(i.slice(E,E+l.length).join(`
|
|
186
|
+
`)),C=$y(A,T);if(C>=_)return[E,1000,C];if(C>g)g=C}return[-1,0,g]};if(c){let[I,T,_]=b(i.length-l.length);if(I!==-1)return[I,T,_];return[I,T,_]=b(u),[I,T+1e4,_]}return b(u)}function wO(i,l){let u=l,c=[],g=[],b=[],I=[],T="keep",_=["@@",$e.END,$e.UPDATE,$e.DELETE,$e.ADD,$e.END_FILE];while(u<i.length){let E=i[u];if(!E||_.some((N)=>E.startsWith(N.trim())))break;if(E==="***")break;if(E.startsWith("***"))throw new yt(`Invalid line: ${E}`);u++;let A=T,C=E;if(C[0]==="+")T="add";else if(C[0]==="-")T="delete";else if(C[0]===" ")T="keep";else T="keep",C=` ${C}`;if(C=C.slice(1),T==="keep"&&A!==T){if(b.length||g.length)I.push({origIndex:c.length-g.length,delLines:g,insLines:b});g=[],b=[]}if(T==="delete")g.push(C),c.push(C);else if(T==="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]===$e.END_FILE)return u++,[c,I,u,!0];return[c,I,u,!1]}function mS(i){if(pS.EOL===`\r
|
|
187
|
+
`&&!i.includes("\r"))return i.replaceAll(`
|
|
188
|
+
`,`\r
|
|
189
|
+
`);return i}function sf(i){return i.includes(`\r
|
|
190
|
+
`)?`\r
|
|
191
|
+
`:`
|
|
192
|
+
`}function _m(i,l){return i.split(/\r\n|\n/).join(l)}function hu(i,l,u){let c=zr.isAbsolute(l),g=c?zr.normalize(l):zr.resolve(i,l);if(!u||c)return g;let b=zr.relative(i,g);if(b.startsWith("..")||zr.isAbsolute(b))throw new yt(`Path must stay within cwd: ${l}`);return g}function bO(i){return i.split(`
|
|
193
|
+
`).map((l)=>l.replace(/\r$/,""))}function Ly(i){if(i.trim()==="")return!1;return gO.some((l)=>i.startsWith(l))}function IO(i){let l=0,u=i.length;while(l<u&&Ly(i[l]??""))l++;while(u>l&&Ly(i[u-1]??""))u--;return i.slice(l,u)}function kO(i){let l=bO(i),u=l.findIndex((b)=>b.startsWith($e.BEGIN)),c=-1;for(let b=l.length-1;b>=0;b--)if(l[b]?.startsWith($e.END)){c=b;break}if(u!==-1||c!==-1){if(u===-1||c===-1||c<u)throw new yt("Invalid patch text - incomplete sentinels. Try breaking it into smaller patches.");return{lines:l.slice(u,c+1)}}let g=IO(l);while(g.length>0&&g[0]==="")g.shift();while(g.length>0&&g[g.length-1]==="")g.pop();return{lines:[$e.BEGIN,...g,$e.END]}}function Dy(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 SO(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 yt(`${u}: chunk.origIndex ${I.origIndex} > lines.length ${c.length}`);if(b>I.origIndex)throw new yt(`${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 TO(i,l,u,c){let g=Dy(i,[$e.UPDATE,$e.DELETE]),b={},I={};for(let T of g){let _=hu(l,T,c),E;try{E=await Pr.readFile(_,u)}catch{throw new yt(`File not found: ${T}`)}b[T]=E.replace(/\r\n/g,`
|
|
196
|
+
`),I[T]=sf(E)}for(let T of Dy(i,[$e.ADD])){let _=hu(l,T,c);try{b[T]=await Pr.readFile(_,u)}catch{}}return{files:b,eols:I}}function _O(i,l){let u={},c=l.files,g=(b,I)=>I===void 0?void 0:_m(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 yt("ADD action without file content");u[b]={type:"add",newContent:mS(I.newFile)};break;case"update":u[b]={type:"update",oldContent:g(b,c[b]),newContent:g(b,SO(c[b]??"",I.chunks,b)),movePath:I.movePath};break}return u}function EO(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 AO(i,l,u,c){let g=[];for(let[b,I]of Object.entries(i)){let T=hu(l,b,c);switch(I.type){case"delete":await Pr.rm(T,{force:!0}),g.push(`${b}: [deleted]`);break;case"add":if(I.newContent===void 0)throw new yt(`Cannot create ${b} with no content`);await Pr.mkdir(zr.dirname(T),{recursive:!0}),await Pr.writeFile(T,I.newContent,{encoding:u}),g.push(b);break;case"update":{if(I.newContent===void 0)throw new yt(`UPDATE change for ${b} has no new content`);if(I.movePath){let _=hu(l,I.movePath,c);await Pr.mkdir(zr.dirname(_),{recursive:!0}),await Pr.writeFile(_,I.newContent,{encoding:u}),await Pr.rm(T,{force:!0}),g.push(`${b} -> ${I.movePath}`)}else await Pr.writeFile(T,I.newContent,{encoding:u}),g.push(b);break}}}return g}async function xO(i,l,u={}){let{encoding:c="utf-8",restrictToCwd:g=!0}=u,b=kO(i),I=await TO(b.lines,l,c,g),T=new cS(b.lines,I.files),{patch:_,fuzz:E}=T.parse();if(_.warnings&&_.warnings.length>0)throw new yt(EO(_.warnings));return{changes:_O(_,I),fuzz:E}}function CO(i={}){let{encoding:l="utf-8",restrictToCwd:u=!0}=i;return async(c,g,b)=>{let{changes:I,fuzz:T}=await xO(c.input,g,{encoding:l,restrictToCwd:u}),_=await AO(I,g,l,u),E=["Successfully applied patch to the following files:"];for(let A of _)E.push(A);if(T>0)E.push(`Note: Patch applied with fuzz factor ${T}`);return E.join(`
|
|
200
|
+
`)}}function RO(i,l,u){let c=ks.isAbsolute(l),g=c?ks.normalize(l):ks.resolve(i,l);if(!u)return g;if(c)return g;let b=ks.relative(i,g);if(b.startsWith("..")||ks.isAbsolute(b))throw Error(`Path must stay within cwd: ${l}`);return g}function PO(i,l){if(l.length===0)return 0;return i.split(l).length-1}function MO(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,T=g.length;while(I>b&&T>b&&c[I-1]===g[T-1])I--,T--;let _=I-b,E=T-b,A=_,C=E;if(_+E>u)A=Math.min(_,Math.max(Math.ceil(u/2),u-E)),C=Math.min(E,u-A);let N=["```diff"];for(let L=b;L<b+A;L++)N.push(`-${L+1}: ${c[L]}`);for(let L=b;L<b+C;L++)N.push(`+${L+1}: ${g[L]}`);let M=_-A,O=E-C;if(M>0||O>0)N.push(`... diff truncated (${M} more removed, ${O} more added lines) ...`);return N.push("```"),N.join(`
|
|
201
|
+
`)}async function NO(i,l,u){return await Es.mkdir(ks.dirname(i),{recursive:!0}),await Es.writeFile(i,mS(l),{encoding:u}),`File created successfully at: ${i}`}async function OO(i){try{return await Es.access(i),!0}catch{return!1}}async function $O(i,l,u,c,g){let b=await Es.readFile(i,c),I=sf(b),T=_m(l,I),_=_m(u??"",I),E=PO(b,T);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(T,()=>_);await Es.writeFile(i,A,{encoding:c});let C=MO(b,A,g);return`Edited ${i}
|
|
202
|
+
${C}`}async function LO(i,l,u,c){let g=await Es.readFile(i,c),b=sf(g),I=g.split(/\r\n|\n/),T=I.length+1;if(l<1||l>T)throw Error(`Invalid insert_line: ${l}. insert_line must be a positive one-based boundary line in the range 1-${T}. Use ${T} to append at EOF.`);let _=l-1;return I.splice(_,0,...u.split(/\r\n|\n/)),await Es.writeFile(i,I.join(b),{encoding:c}),`Inserted content at line ${l} in ${i}.`}function DO(i={}){let{encoding:l="utf-8",restrictToCwd:u=!0,maxDiffLines:c=200}=i;return async(g,b,I)=>{let T=RO(b,g.path,u);if(g.insert_line!=null)return LO(T,g.insert_line,g.new_text,l);if(!await OO(T))return NO(T,g.new_text,l);if(g.old_text==null)throw Error(`${T} 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 $O(T,g.old_text,g.new_text,l,c)}}var BO=16777216,HO=5,hS="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 nf{sessionId;maxBytes;entries=new Map;referencesByToolCall=new Map;iteration=0;bytes=0;constructor(i,l=BO){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=jO(),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(hS);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>=HO)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 fS(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 gS(i){let{textual:l,images:u}=fS(i);return{text:typeof l==="string"?l:JSON.stringify(l,null,2),images:u}}function zO(i){let{textual:l,images:u}=fS(i);return{text:typeof l==="string"?l:l===void 0?void 0:X.stringify(l,{blockQuote:"literal",lineWidth:0}),images:u}}var WO=new Map([[".gif","image/gif"],[".png","image/png"],[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".webp","image/webp"]]),KO={maxFileSizeBytes:1e7,encoding:"utf-8",includeLineNumbers:!0},Uy=1e8,GO=50000;function Fy(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 qy(i,l,u,c,g){if(g?.aborted)throw i.destroy(),Fy(g);let b=Math.max(u??1,1),I=c??Number.POSITIVE_INFINITY,T=Number.isFinite(I),_=T?I:b+GO-1,E=[],A=0,C=0,N=!1,M=!1,O=Number.isFinite(I)?Math.min(I,b+Hd-1):b+Hd-1,L=l?String(O).length+3:0,D=FO({input:i,crlfDelay:Number.POSITIVE_INFINITY}),F=g?()=>i.destroy(Fy(g)):void 0;if(g&&F)g.addEventListener("abort",F,{once:!0});try{for await(let te of D){if(C+=1,C>I){C=I;break}if(!T&&N&&C>=_){M=!0;break}if(C<b||N)continue;if(E.length>=Hd){N=!0;continue}let ee=te;if(ee.length>Sm)ee=`${ee.slice(0,Sm)} [line truncated]`;let oe=A+ee.length+L+1;if(oe>rS&&E.length>0){N=!0;continue}E.push({lineNumber:C,text:ee}),A=oe}}finally{if(g&&F)g.removeEventListener("abort",F);D.close(),i.destroy()}let j=String(E[E.length-1]?.lineNumber??C).length,B=E.map(({lineNumber:te,text:ee})=>l?`${String(te).padStart(j," ")} | ${ee}`:ee).join(`
|
|
203
|
+
`),Q=E[E.length-1]?.lineNumber;if(Q===void 0)return B;let H=Math.min(I,C);if(Q>=H)return B;let z=M?`${C}+ lines`:H;return`${B}
|
|
204
|
+
|
|
205
|
+
[Showing lines ${b}-${Q} of ${z}. Use start_line/end_line to read other sections.]`}function XO(i={}){let{maxFileSizeBytes:l,encoding:u,includeLineNumbers:c}={...KO,...i};return async(g,b)=>{let{path:I,start_line:T,end_line:_}=g;if(I.startsWith("cline://")){b.signal?.throwIfAborted();let O=b.metadata?.toolResultCache;if(!(O instanceof nf))throw Error(hS);return qy(qO.from([O.read(I)]),c,T,_,b.signal)}let E=ni.isAbsolute(I)?ni.normalize(I):ni.resolve(process.cwd(),I),A=za(E)??E,C=ni.extname(A).toLowerCase(),N=WO.get(C),M=await nc.stat(A);if(!M.isFile())throw Error(`Path is not a file: ${A}`);if(N){if(M.size>l)throw Error(`Image file too large: ${M.size} bytes (max: ${l} bytes).`);if(b.metadata?.modelSupportsImages!==!0)throw Error("Current model does not support image input");let O=await nc.readFile(A);return[{type:"text",text:"Successfully read image"},{type:"image",data:O.toString("base64"),mediaType:N}]}if(M.size>Uy)throw Error(`Text file too large to stream safely: ${M.size} bytes (max: ${Uy} bytes). Use a targeted command such as sed, grep, head, or tail to inspect specific sections.`);return qy(UO(A,{encoding:u}),c,T,_,b.signal)}}async function VO(){let i=Qa();return await JO(i,{recursive:!0,mode:448}),i}var e$=`# 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 t$(){let i=Ga();await YO(i,{recursive:!0,mode:448});let l=ZO(i,gt);try{await QO(l,e$,{flag:"wx"})}catch(u){if(u.code!=="EEXIST")throw u}return i}async function r$(i){let l=i.cwd?.trim()??"",u=i.workspaceRoot?.trim()??"",c=l||u||await t$();return{...i,cwd:l||c,workspaceRoot:u||c}}var l$=15000,d$=600000,u$=1000,c$=new Set([".git","node_modules","vendor","dist","build",".next","coverage",".turbo",".cache","target","out"]);function By(i){let l=i&&typeof i==="object"&&"code"in i?String(i.code??""):"";return l==="EACCES"||l==="EPERM"||l==="ENOENT"}var $o=new Map;function p$(){if(!wS)return!1;return!0}function m$(i){if($o.size<=1)return;for(let[l,u]of $o.entries()){if(u.pending)continue;if(i-u.lastAccessedAt>d$)$o.delete(l)}}async function h$(i){let l=(await new Promise((u,c)=>{let g=s$("rg",["--files","--hidden","-g","!.git"],{cwd:i,stdio:["ignore","pipe","pipe"],windowsHide:!0}),b="",I="";g.stdout.on("data",(T)=>{b+=T.toString()}),g.stderr.on("data",(T)=>{I+=T.toString()}),g.on("error",c),g.on("close",(T)=>{if(T===0){u(b);return}c(Error(I||`rg exited with code ${T}`))})})).split(/\r?\n/).map((u)=>u.trim()).filter((u)=>u.length>0).map((u)=>u.replace(/\\/g,"/"));return new Set(l)}async function bS(i,l,u){let c;try{c=await n$(l,{withFileTypes:!0})}catch(g){if(By(g))return;throw g}for(let g of c){let b=fu.join(l,g.name);if(g.isDirectory()){if(c$.has(g.name))continue;try{await bS(i,b,u)}catch(I){if(By(I))continue;throw I}continue}if(g.isFile())u.add(Ft(fu.relative(i,b)))}}async function f$(i){let l=new Set;return await bS(i,i,l),l}function g$(i){let l=(c)=>{try{return i$.native(c)}catch{return fu.resolve(c)}},u=l(i);return u===l(o$.homedir())||u===fu.parse(u).root}async function Kd(i){if(g$(i))return new Set;try{return await h$(i)}catch{return f$(i)}}function y$(){if(wS||!jy)return;let i=jy;i.on("message",(l)=>{if(l.type!=="index")return;Kd(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 IS{worker=new a$(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)},u$);I.unref(),this.pending.set(l,{resolve:(T)=>{clearTimeout(I),g(T)},reject:(T)=>{clearTimeout(I),b(T)}})}),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)}}y$();var Hc;function v$(){if(!p$())return null;if(Hc===void 0)Hc=new IS;return Hc}async function w$(i){let l=v$();if(!l)return Kd(i);try{let u=await l.requestIndex(i);if(u===null)return Kd(i);return new Set(u)}catch{return Kd(i)}}async function kS(i,l={}){let u=l.ttlMs??l$,c=Date.now();m$(c);let g=$o.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=w$(i).then((I)=>($o.set(i,{files:I,lastBuiltAt:Date.now(),lastAccessedAt:Date.now(),pending:null}),I));return $o.set(i,{files:g?.files??new Set,lastBuiltAt:g?.lastBuiltAt??0,lastAccessedAt:c,pending:b}),b}var I$=new Set("),.:;!?`'\""),k$=/^[(`'"]+/;function S$(i){let l=i.length;while(l>0&&I$.has(i.charAt(l-1)))l-=1;return i.slice(0,l)}function T$(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=S$(g.replace(k$,""));if(b.length===0||b.includes("@"))continue;u.push(b)}return Array.from(new Set(u))}function _$(i,l){let u=i.replace(/\\/g,"/"),c=co.isAbsolute(u)?co.resolve(u):co.resolve(l,u),g=co.relative(l,c);if(g.startsWith("..")||co.isAbsolute(g))return;return Ft(g)}async function E$(i,l,u={}){let c=T$(i);if(c.length===0)return{prompt:i,mentions:[],matchedFiles:[],ignoredMentions:[]};let{maxFiles:g,maxFileBytes:b,maxTotalBytes:I}=u,T=await kS(l,{ttlMs:u.ttlMs}),_=[],E=[],A=[],C=0;for(let N of c){if(g&&A.length>=g){E.push(N);continue}let M=_$(N,l);if(!M||!T.has(M)){E.push(N);continue}if(!b||!I){_.push(M);continue}let O=co.join(l,M);try{if(!(await b$(O)).isFile()){E.push(N);continue}let L=C+b;if(L>I){E.push(N);continue}C=L,_.push(M)}catch{E.push(N)}}return{prompt:i,mentions:c,matchedFiles:_,ignoredMentions:E}}var A$=10485760,x$=["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"],C$=["node_modules","vendor",".git","dist","build",".next","coverage","__pycache__",".venv","venv",".cache",".turbo",".output","out","target","bin","obj"],fi=null;function R$(){if(fi!==null)return Promise.resolve(fi);return new Promise((i)=>{let l=yS("rg",["--version"],{stdio:["ignore","pipe","pipe"],windowsHide:!0});l.on("close",(u)=>{fi=u===0,i(fi)}),l.on("error",()=>{fi=!1,i(!1)}),setTimeout(()=>{if(!l.killed)l.kill("SIGTERM");if(fi===null)fi=!1,i(!1)},1000)})}function P$(i,l,u,c,g=5000,b){return new Promise((I)=>{let T=yS("rg",["--json",`--context=${c}`,"--max-count=1","-i",i],{cwd:l,stdio:["ignore","pipe","pipe"],windowsHide:!0}),_="",E=!1,A=()=>{if(!T.killed)T.kill("SIGTERM")},C=setTimeout(()=>{if(!E)E=!0,A(),I(null)},g),N=(M)=>{if(!E)E=!0,clearTimeout(C),A(),I(M)};if(b?.aborted){A(),I(null);return}b?.addEventListener("abort",()=>{N(null)}),T.stdout.on("data",(M)=>{if(_.length>A$)return;_+=M.toString()}),T.stderr.on("data",()=>{}),T.on("close",(M)=>{if(M===0||M===1){try{let O=[],L=_.slice(0,_.lastIndexOf(`
|
|
224
|
+
`)+1).split(`
|
|
225
|
+
`).filter((D)=>D.trim());for(let D of L){if(O.length>=u)break;let F=JSON.parse(D);if(F.type==="match"){let j=F.data,B=[];if(F.data.submatches&&F.data.submatches.length>0){let Q=F.data.submatches[0];O.push({file:j.path.text,line:j.line_number,column:(Q?.start??0)+1,match:Q?.match?.text??"",context:B})}}else if(F.type==="context"&&O.length>0){let j=O[O.length-1],B=F.data.line_number===j.line?">":" ";j.context.push(`${B} ${F.data.line_number}: ${F.data.lines?.text??F.data.line?.text??""}`)}}N(O.length>0?O:null)}catch{N(null)}return}N(null)}),T.on("error",()=>{N(null)})})}function M$(i,l,u,c){let g=i.split("/"),b=g[g.length-1]??"";if(g.length-1>c)return!1;for(let T=0;T<g.length-1;T++)if(l.has(g[T]??""))return!1;let I=oc.posix.extname(b).slice(1).toLowerCase();return u.has(I)||!I&&!b.startsWith(".")}function N$(i={}){let{includeExtensions:l=x$,excludeDirs:u=C$,maxResults:c=100,contextLines:g=2,maxDepth:b=20}=i,I=new Set(u),T=new Set(l.map((_)=>_.toLowerCase()));return async(_,E,A)=>{if(A.signal?.aborted)throw Error("Search operation aborted");let C=await R$(),N=null;if(C)N=await P$(_,E,c,g,5000,A.signal);if(N){let j=[`Found ${N.length} result${N.length===1?"":"s"} for pattern: ${_}`,""];for(let B of N)j.push(`${B.file}:${B.line}:${B.column}`),j.push(...B.context),j.push("");if(N.length>=c)j.push(`(Showing first ${c} results. Refine your search for more specific results.)`);return Hy(j.join(`
|
|
226
|
+
`))}let M;try{M=new RegExp(_,"gim")}catch(j){throw Error(`Invalid regex pattern: ${_}. ${j instanceof Error?j.message:""}`)}let O=[],L=0,D=await kS(E);for(let j of D){if(A.signal?.aborted)throw Error("Search operation aborted");if(!M$(j,I,T,b))continue;if(O.length>=c)break;L++;let B=oc.join(E,j);try{let Q=(await vS.readFile(B,"utf-8")).split(`
|
|
227
|
+
`);for(let H=0;H<Q.length;H++){let z=Q[H];M.lastIndex=0;let te=M.exec(z);while(te!==null){if(O.length>=c)break;let ee=Math.max(0,H-g),oe=Math.min(Q.length-1,H+g),G=[];for(let se=ee;se<=oe;se++){let Ne=se===H?">":" ";G.push(`${Ne} ${se+1}: ${Q[se].slice(0,Sm)}`)}if(O.push({file:j,line:H+1,column:te.index+1,match:te[0],context:G}),te.index===M.lastIndex)M.lastIndex++;te=M.exec(z)}}}catch{}}if(O.length===0)return`No results found for pattern: ${_}
|
|
228
|
+
Searched ${L} files.`;let F=[`Found ${O.length} result${O.length===1?"":"s"} for pattern: ${_}`,`Searched ${L} files.`,""];for(let j of O)F.push(`${j.file}:${j.line}:${j.column}`),F.push(...j.context),F.push("");if(O.length>=c)F.push(`(Showing first ${c} results. Refine your search for more specific results.)`);return Hy(F.join(`
|
|
229
|
+
`))}}function Hy(i){if(i.length<=zd)return i;let l=Math.ceil(zd/2),u=Math.max(1,zd-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 O$(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 $$(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,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(_.signal)N=()=>A.abort(),_.signal.addEventListener("abort",N);try{let M=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&&M.status>=300&&M.status<400)return`Redirect to: ${M.headers.get("location")}`;if(!M.ok)throw Error(`HTTP ${M.status}: ${M.statusText}`);let O=M.headers.get("content-type")||"",L=M.body?.getReader();if(!L)throw Error("Failed to read response body");let D=[],F=0;while(!0){let{done:te,value:ee}=await L.read();if(te)break;if(F+=ee.length,F>u)throw L.cancel().catch(()=>{}),Error(`Response too large: exceeded ${u} bytes`);D.push(ee)}let j=new Uint8Array(F),B=0;for(let te of D)j.set(te,B),B+=te.length;let Q=new TextDecoder("utf-8").decode(j),H;if(O.includes("text/html")||O.includes("application/xhtml"))H=O$(Q);else if(O.includes("application/json"))try{let te=JSON.parse(Q);H=JSON.stringify(te,null,2)}catch{H=Q}else H=Q;let z=[`URL: ${I}`,`Content-Type: ${O}`,`Size: ${F} bytes`,"","--- Content ---",H.slice(0,50000)];if(H.length>50000)z.push(`
|
|
236
|
+
[Content truncated: showing first 50000 of ${H.length} characters]`);return z.push("","--- Analysis Request ---",`Prompt: ${T}`),z.join(`
|
|
237
|
+
`)}catch(M){if(clearTimeout(C),M instanceof Error){if(M.name==="AbortError")throw Error(`Request timed out after ${l}ms`);throw M}throw Error(`Fetch failed: ${String(M)}`)}finally{if(_.signal&&N)_.signal.removeEventListener("abort",N)}}}class SS{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 L$(i={}){return YN(i)}function D$(i={}){return{readFile:XO(i.fileRead),search:N$(i.search),bash:L$(i.bash),webFetch:$$(i.webFetch),applyPatch:CO(i.applyPatch),editor:DO(i.editor)}}var U$={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"},F$=[{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 zy(i,l){if(!l||l.length===0)return!0;let u=i.toLowerCase();return l.some((c)=>u.includes(c.toLowerCase()))}function q$(i,l,u,c){if(i.mode&&i.mode!=="any"&&i.mode!==c)return!1;return zy(l,i.providerIdIncludes)&&zy(u,i.modelIdIncludes)}function j$(i,l,u,c){if(!c||c.length===0)return{};let g=new Map;for(let I of c){if(!q$(I,i,l,u))continue;for(let T of I.disableTools??[])g.set(T,!1);for(let T of I.enableTools??[])g.set(T,!0)}let b={};for(let[I,T]of g.entries())b[U$[I]]=T;return b}var of={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 af(i){if(i.mode==="plan")return"plan";if(i.mode==="yolo")return"yolo";return"act"}var As=(i)=>new RegExp(i,"iu"),H$=[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(As),z$=As(String.raw`\b(?:stuck|hung|hanging|frozen|unresponsive|not\s+responding|no\s+response)\b|卡住|卡了|没反应|不动了`),W$=As(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}$`),K$=As(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`),G$=As(String.raw`^(?:hello+|hi+|hey+|ping|yo|你好|在吗)\s*[??!.]*$`),X$=As(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`),J$=As(String.raw`(?:[.!?:;)\]}"'\x60*>|_~。!?:)」』…]|[←-⯿\u{1F000}-\u{1FAFF}☀-➿️])\s*$`),V$=As(String.raw`\n\s*(?:[-*•]|\d+[.)])\s+\S[^\n]*$`),Y$=As(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`),Q$=As(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$=As(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 e1(i){let l=i.trim(),u=Array.from(l).length;if(!l||u>200)return"none";if(H$.some((c)=>c.test(l)))return"probe";if(u<=40&&z$.test(l))return"probe";if(u<=80&&W$.test(l))return"nudge";if(K$.test(l))return"nudge";if(G$.test(l))return"greeting";return"none"}function t1(i){let l=i.trimEnd();if(!l)return"empty_turn";if(l.length<600&&X$.test(l))return"api_error";if((l.split("```").length-1)%2===1)return"truncated_text";if(!J$.test(l)&&!V$.test(l))return"truncated_text";let u=l.slice(l.lastIndexOf(`
|
|
238
|
+
|
|
239
|
+
`)+1);if(Y$.test(u))return"async_promise";if(Q$.test(u)&&!Z$.test(u.slice(-300)))return"intent_without_action";return"none"}var Wy=60000;function r1(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 s1(i){return i.content.map((l)=>l.type==="text"?l.text:"").join("")}class TS{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?r1(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:t1(this.turnMessage?s1(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+Wy-Date.now();this.idleTimer=setTimeout(()=>{let l=Date.now()-this.lastEventAt;if(l<Wy){this.scheduleIdleCheck();return}this.idleReported=!0,this.idleTimer=void 0,jA(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 _S=8000,i1=50000,n1=6000000,o1=200000,a1=12000,l1=65536,xl=2000,Ky=40000,d1=8,zc={maxToolResultChars:"CLINE_MESSAGE_BUILDER_MAX_TOOL_RESULT_CHARS",maxTotalTextBytes:"CLINE_MESSAGE_BUILDER_MAX_TOTAL_TEXT_BYTES",minOutdatedRewriteBytes:"CLINE_MESSAGE_BUILDER_MIN_OUTDATED_REWRITE_BYTES"},u1=new Set(["read","read_files"]),gi="[outdated - see the latest file content]",Gy="Tool execution was interrupted before a result was produced.",Xy=(i)=>`
|
|
240
|
+
|
|
241
|
+
...[truncated ${i} chars]...
|
|
242
|
+
|
|
243
|
+
`,Cl=(i)=>`
|
|
244
|
+
|
|
245
|
+
...[truncated ${i} chars to fit provider request budget]...
|
|
246
|
+
|
|
247
|
+
`,c1=(i)=>`
|
|
248
|
+
|
|
249
|
+
...[assistant text truncated: omitted ${i} chars]...
|
|
250
|
+
|
|
251
|
+
`,Jy=(i)=>`
|
|
252
|
+
|
|
253
|
+
...[assistant text truncated: omitted ${i} chars to fit provider request budget]...
|
|
254
|
+
|
|
255
|
+
`,p1=(i)=>`
|
|
256
|
+
|
|
257
|
+
...[assistant text truncated: omitted ${i} chars due to repeated tool-call markup]...
|
|
258
|
+
|
|
259
|
+
`;function m1(i=process.env){return{maxToolResultChars:Yy(i[zc.maxToolResultChars]),maxTotalTextBytes:Yy(i[zc.maxTotalTextBytes]),minOutdatedRewriteBytes:f1(i[zc.minOutdatedRewriteBytes])}}class ES{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=ma(i.maxToolResultChars,_S),this.maxFileContentChars=ma(i.maxFileContentChars,i1),this.maxTotalTextBytes=ma(i.maxTotalTextBytes,n1),this.mediaBudget=i.mediaBudget??{},this.maxAssistantTextChars=ma(i.maxAssistantTextChars,o1),this.maxAssistantToolMarkupChars=ma(i.maxAssistantToolMarkupChars,a1),this.minOutdatedRewriteBytes=g1(i.minOutdatedRewriteBytes,l1)}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=xe(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 T=this.transformBlock(I,c.role);if(T!==I)g=!0;return T});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=xe(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,Xy);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}=gS(i.content);if(typeof b==="string"&&b.length>this.maxToolResultChars){let T=[{type:"text",text:this.truncateMiddle(b)},...I];if(c.uri){let _={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=ze(_.text);if(this.recoveryNoticeBytes+E<=this.maxTotalTextBytes/2)this.recoveryNoticeBytes+=E,this.recoveryNotices.add(_),T.push(_)}return{...i,content:T}}}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((T)=>b.has(this.toReadLocatorKey(T))&&this.isOutdatedReadLocator(T,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 T=this.extractLocatorsFromReadToolInput(b.input);if(T.length>0)this.readLocatorsByToolUseIdCache.set(b.id,T)}}else if(b.type==="tool_result"){let I=this.resolveToolName(b);if(!this.isReadTool(I)||b.is_error===!0)continue;let T=this.getReadLocators(b);for(let _ of T)if(this.latestReadToolUseByLocatorCache.set(this.toReadLocatorKey(_),b.tool_use_id),this.isFullFileRead(_))this.latestFullContentOwnerByPathCache.set(_.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 T=this.committedOutdatedRewrites.get(b.tool_use_id),_=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),!T?.has(N))_.add(N)}if(T){for(let C of T)if(!E.has(C))T.delete(C);if(T.size===0)this.committedOutdatedRewrites.delete(b.tool_use_id)}if(_.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 _)A.add(C);c+=this.estimateOutdatedReclaimBytes(b.content,_)}}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 T of b)I.add(T)}}estimateOutdatedReclaimBytes(i,l){let u=this.extractReadLocatorsFromToolResultContent(i),c=u.length>0&&u.every((_)=>l.has(this.toReadLocatorKey(_))),g=(_)=>{let E;try{E=JSON.parse(_)}catch{return c||u.length===0?ze(this.truncateMiddle(_)):0}let A=Array.isArray(E)?E:[E],C=0;for(let N of A){let M=this.extractLocatorFromResultEntry(N);if(M&&l.has(this.toReadLocatorKey(M)))C+=this.providerBoundEntryBytes(N)}return C};if(typeof i==="string")return g(i);let b=new Set(l),I=0;for(let _ of i)if(_.type==="text")I+=this.countOutdatedImageEntries(_.text,b);let T=0;for(let _ of i)if(_.type==="text")T+=g(_.text);else if(_.type==="image"){if(I>0)I-=1,T+=ze(_.data)}else if(Gs(_)){let E=this.extractLocatorFromResultEntry(_);if(E&&l.has(this.toReadLocatorKey(E)))T+=this.providerBoundEntryBytes(_)}else if(_.type==="file"){if(l.has(this.toReadLocatorKey({path:_.path,startLine:null,endLine:null})))T+=ze(this.truncateMiddle(_.content))}return T}providerBoundEntryBytes(i){let l=this.truncateNestedStrings(i);return ze(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=(T)=>{let _=u.at(-1);if(this.shouldMergeUserAfterToolResults(_,T)){u[u.length-1]={..._,content:[..._.content,...this.contentBlocksForUserMerge(T.content)]},g=!0;return}u.push(T)};for(let T of i){if(this.isToolResultOnlyMessage(T)){if(I(this.appendMissingToolResults(T,c)),c.size>0)c.clear(),g=!0;continue}if(Array.isArray(T.content)){let _=T.content.filter((A)=>A.type==="tool_result"),E=T.content.filter((A)=>A.type!=="tool_result");if(_.length>0){let A=this.appendMissingToolResults({...T,role:"user",content:_},c);if(I(A),c.size>0)c.clear();g=!0}if(E.length>0||_.length===0){if(_.length===0)b();let A=_.length>0?{...T,content:E}:T;if(I(A),A.role==="assistant")this.trackMissingToolCalls(A,l,c)}continue}b(),I(T)}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?`${Gy} Tool: ${i}.`:Gy}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(Gs(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)??gi;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:gi}}if(b.type==="image"){if(g===0)return b;return g-=1,{type:"text",text:gi}}if(Gs(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:gi};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,T=this.extractLocatorFromResultEntry(I);if(!T)continue;if(!l.has(this.toReadLocatorKey(T)))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=gi;else if(typeof c.content==="string")c.content=gi;else c.result=gi;return c}isReadTool(i){return!!i&&u1.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(Gs(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(lf(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,Xy)}truncateAssistantText(i){if(this.hasRepeatedToolCallMarkup(i))return kl(i,this.maxAssistantToolMarkupChars,p1);return kl(i,this.maxAssistantTextChars,c1)}hasRepeatedToolCallMarkup(i){if(i.length<=this.maxAssistantToolMarkupChars)return!1;let l=0;for(let u of i.matchAll(h1))if(l+=1,l>=d1)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 T=v1(I);if(I.type==="tool_result"&&T.type==="tool_result"&&Array.isArray(I.content)&&Array.isArray(T.content))I.content.forEach((_,E)=>{if(this.recoveryNotices.has(_))this.recoveryNotices.add(T.content[E])});return T})}}),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,T=Math.min(b.minBytes,g);if(I<=T)continue;let _=l-this.maxTotalTextBytes,E=Math.max(T,I-_),A=y1(b.get(),E,b.makeMarker);b.set(A),l-=I-ze(A)}return u}countMessageTextBytes(i){let l=0;for(let u of i){if(typeof u.content==="string"){l+=ze(u.content);continue}for(let c of u.content)if(c.type==="text")l+=ze(c.text);else if(c.type==="thinking")l+=ze(c.thinking);else if(c.type==="file")l+=ze(c.content);else if(c.type==="tool_use")l+=gu(c.input);else if(c.type==="tool_result"){if(typeof c.content==="string")l+=ze(c.content);else for(let g of c.content)if(g.type==="text")l+=ze(g.text);else if(g.type==="file")l+=ze(g.content);else if(Gs(g))l+=gu(g)}}return l}collectTruncationCandidates(i){let l=[],u=[];for(let c of i){if(c.role==="assistant"&&typeof c.content==="string"){l.push({byteLength:ze(c.content),minBytes:Ky,makeMarker:Jy,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"){yu(g.input,u);continue}if(c.role==="assistant"&&g.type==="text"){l.push({byteLength:ze(g.text),minBytes:Ky,makeMarker:Jy,get:()=>g.text,set:(b)=>{g.text=b}});continue}if(g.type!=="tool_result")continue;if(typeof g.content==="string"){l.push({byteLength:ze(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:ze(b.text),minBytes:xl,makeMarker:Cl,get:()=>b.text,set:(I)=>{b.text=I}});else if(b.type==="file")l.push({byteLength:ze(b.content),minBytes:xl,makeMarker:Cl,get:()=>b.content,set:(I)=>{b.content=I}});else if(Gs(b))yu(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=di(),c=!1,g=i.map((b)=>{if(!Array.isArray(b.content))return b;let I=!1,T=b.content.map((_)=>{let E=this.applyMediaBudgetToBlock(_,l,u);if(E!==_)I=!0;return E});if(!I)return b;return c=!0,{...b,content:T}});return c?g:i}resolveMediaBudget(){return So(this.mediaBudget)}applyMediaBudgetToBlock(i,l,u){if(Wc(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(Wc(i))return this.limitImageContent(i,l,u);if(Gs(i))return this.limitNestedMedia(i,l,u);return i}limitNestedMedia(i,l,u){if(Wc(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 T=this.limitNestedMedia(I,l,u);if(T!==I)c=!0;g[b]=T}return c?g:i}return i}limitImageContent(i,l,u){if(!AS(i))return{type:"text",text:dn};let c=mi(i.mediaType,i.data,{maxImageEncodedBytes:l.maxImageEncodedBytes,maxImageDecodedBytes:l.maxImageDecodedBytes,maxTotalMediaBytes:l.maxTotalMediaBytes},u);if(!c.ok)return{type:"text",text:dn};return{...i,data:c.base64,mediaType:c.mediaType}}}var Vy=String.raw`[\|\uFF5C]`,h1=new RegExp(String.raw`<\s*(?:${Vy}\s*)?DSML\s*(?:${Vy}\s*)?(?:tool_calls|invoke)\b[^>]*>|<\s*/?\s*(?:tool_calls?|tool_call|function_calls?|function_call|invoke)\b[^>]*>`,"gi");function ze(i){return Buffer.byteLength(i,"utf8")}function Yy(i){if(i===void 0)return;let l=Number.parseInt(i,10);return Number.isFinite(l)&&l>0?l:void 0}function f1(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 ma(i,l){return typeof i==="number"&&Number.isFinite(i)&&i>0?Math.floor(i):l}function g1(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),T=Math.max(0,Math.floor((l-I.length)/2)),_=i.slice(0,T),E=T>0?i.slice(-T):"";return`${_}${I}${E}`}function y1(i,l,u){if(ze(i)<=l)return i;let c=0,g=i.length,b="";while(c<=g){let I=c+g>>>1,T=kl(i,I,u);if(ze(T)<=l)b=T,c=I+1;else g=I-1}return b}function v1(i){if(i.type==="tool_use")return{...i,input:vu(i.input)};if(i.type!=="tool_result"||typeof i.content==="string")return{...i};return{...i,content:i.content.map((l)=>Gs(l)?vu(l):{...l})}}function Gs(i){if(i===null||typeof i!=="object")return!1;let l=i.type;return l!=="text"&&l!=="image"&&l!=="file"}function Wc(i){return i!==null&&typeof i==="object"&&i.type==="image"}function AS(i){return i!==null&&typeof i==="object"&&i.type==="image"&&typeof i.data==="string"&&typeof i.mediaType==="string"}function lf(i){return AS(i)}function gu(i){if(typeof i==="string")return ze(i);if(Array.isArray(i)){let l=0;for(let u of i)l+=gu(u);return l}if(i!==null&&typeof i==="object"){if(lf(i))return 0;let l=0;for(let u of Object.values(i))l+=gu(u);return l}return 0}function yu(i,l){if(Array.isArray(i)){i.forEach((u,c)=>{if(typeof u==="string")l.push({byteLength:ze(u),minBytes:xl,makeMarker:Cl,get:()=>i[c],set:(g)=>{i[c]=g}});else yu(u,l)});return}if(i!==null&&typeof i==="object"){if(lf(i))return;let u=i;for(let c of Object.keys(u)){let g=u[c];if(typeof g==="string")l.push({byteLength:ze(g),minBytes:xl,makeMarker:Cl,get:()=>u[c],set:(b)=>{u[c]=b}});else yu(g,l)}}}function vu(i){if(Array.isArray(i))return i.map(vu);if(i!==null&&typeof i==="object"){let l={};for(let[u,c]of Object.entries(i))l[u]=vu(c);return l}return i}function Kc(){return`conv_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}class xS{messages=[];conversationId=Kc();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=Kc(),this.sessionStarted=!1}clearHistory(){this.messages=[],this.conversationId=Kc(),this.sessionStarted=!1}restore(i){this.messages=[...i],this.sessionStarted=!1}isSessionStarted(){return this.sessionStarted}markSessionStarted(){this.sessionStarted=!0}}var ac="0.2.0-nightly.1793312794",zl={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:ac,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 w1(i){let{agentConfig:l}=i,u=b1(l),c=I1(l),g=i.hooks,b=k1(l.maxParallelToolCalls);return{distinctId:l.distinctId,clientName:l.extensionContext?.client?.name,clientVersion:l.extensionContext?.client?.version,clineCoreVersion:ac,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 b1(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 I1(i){let l=i.providerConfig?.family;return{id:i.modelId,provider:i.providerId,family:l}}function k1(i){if(i===void 0)return;return i>=2?"parallel":"sequential"}function df(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 S1(){return{lastToolName:"",lastToolSignature:"",consecutiveIdenticalCount:0}}function T1(i){i.lastToolName="",i.lastToolSignature="",i.consecutiveIdenticalCount=0}function Em(i){if(i==null||typeof i!=="object")return i;if(Array.isArray(i))return i.map(Em);let l={};for(let u of Object.keys(i).sort())l[u]=Em(i[u]);return l}function _1(i){if(i==null)return"null";if(typeof i==="string")return i;if(typeof i!=="object")return String(i);try{return JSON.stringify(Em(i))}catch{return String(i)}}function E1(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 Qy={softThreshold:3,hardThreshold:5};class CS{config;state=S1();constructor(i){this.config={softThreshold:i?.softThreshold??Qy.softThreshold,hardThreshold:i?.hardThreshold??Qy.hardThreshold}}inspect(i){let l=_1(i.input),u=E1(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(){T1(this.state)}}class RS{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 x1(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:A1({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 A1(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 x1(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 C1(i){switch(i){case"auto_compaction":case"manual_compaction":case"compaction_budget_emergency":return i;default:return}}function R1(i){let l=i.content.filter((u)=>u.type==="text");if(l.length===0)return;return l.map((u)=>u.text).join("")}function P1(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 M1(i){return i.content.find((l)=>l.type==="tool-result")}function N1(i){switch(i){case"completed":return"completed";case"aborted":return"aborted";case"failed":return"error"}}function O1(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 PS{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:C1(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=R1(i);if(u!==void 0)l.push({type:"content_end",contentType:"text",text:u});let c=P1(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=M1(i.message),g=c?.output,b=O1(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,T=this.lastUsage.reasoningTokenCount??0,_=(i.reasoningTokenCount??0)-T;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:_===0?void 0:Math.max(0,_),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:N1(i.status),text:i.outputText,iterations:i.iterations,usage:l}]}}var $1="session_run_in_progress";class MS extends Error{agentId;code=$1;constructor(i){super(`SessionRuntime.shutdown called while a run is in progress${i?` (agentId=${i})`:""}`);this.agentId=i,this.name="SessionRunInProgressError"}}function L1(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 D1(i){let l=(typeof i.content==="function"?await i.content():i.content).trim();return l.length>0?l:void 0}function U1(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 F1(i,l){let u=l?.["*"]??{},c=l?.[i]??{};return{...u,...c}.enabled!==!1}function q1(i,l){return i.filter((u)=>F1(u.name,l))}function Zy(i,l){return Yu(q1(i,l))}function j1(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((T)=>Boolean(T?.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:Nn(g?.options,I.options)},c={...c,...I.messages?{messages:I.messages}:{},...I.tools?{tools:I.tools}:{},...I.options?{options:Nn(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 lc{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 PS;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_${B$()}`,this.parentAgentId=i.parentAgentId,this.logger=l.logger??i.logger,this.telemetry=l.telemetry??i.telemetry,this.createAgentRuntimeImpl=l.createAgentRuntimeImpl??Cn,this.conversation=new xS(i.initialMessages),this.toolResultCache=new nf(i.sessionId??this.agentId);let u=m1();this.maxCachedResultChars=u.maxToolResultChars??_S,this.messageBuilder=new ES({...u,getToolResultRecovery:(I)=>this.cacheableToolNames.has(I.name??"")?{uri:this.toolResultCache.uriFor(I.tool_use_id)}:void 0}),this.contributionRegistry=Nt({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 RS({maxConsecutiveMistakes:c,onLimitReached:i.onConsecutiveMistakeLimitReached,onLimitTelemetry:(I)=>{qA(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,T,_)=>B1(this.logger,I,T,_),agentId:this.agentId,getConversationId:()=>this.conversation.getConversationId(),getActiveRunId:()=>this.activeRunId??"",appendRecoveryNotice:(I,T)=>{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 CS(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=df(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 MS(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 D1(u);if(c)l.push(c)}return U1(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||!Ii(l.text))return l;if(!await this.config.onAuthError().catch(()=>!1))return l;let u=await this.executeRunInternal({isContinue:!0});return PA(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 H=await z1(u,i.userImages,i.userFiles,this.config.userFileContentLoader);this.conversation.appendMessage({id:crypto.randomUUID(),role:"user",content:H})}let c=_P(this.config,this.logger,this.telemetry),g=new Map;for(let H of this.contributionRegistry.getRegisteredTools())g.set(H.name,H);let b=Zy([...g.values()],this.config.toolPolicies),I=new Map;for(let H of b)I.set(H.name,H);for(let H of this.config.tools)I.set(H.name,H);let T=this.conversation.getConversationId(),_=ev(this.config),E=Zo(_??{})||!er(_??{}),A=Zy(Array.from(I.values()),this.config.toolPolicies),C=E?[]:A,N=await this.composeSystemPrompt(new Set(C.map((H)=>H.name))),M=$c(this.conversation.getMessages());this.cacheableToolNames=new Set(C.filter((H)=>H.resultPolicy==="cache-oversized").map((H)=>H.name.toLowerCase()));let O=this.telemetry&&new TS(this.telemetry,{sessionId:this.config.sessionId,isSubagent:Boolean(this.parentAgentId),providerId:this.config.providerId,modelId:this.config.modelId}),L=w1({agentConfig:this.config,sessionId:this.config.sessionId,agentId:this.agentId,conversationId:T,parentAgentId:this.parentAgentId,model:c,logger:this.logger,telemetry:this.telemetry,runEndTelemetryProperties:O?()=>O.endProperties():void 0,tools:C,toolContextMetadata:{modelSupportsImages:Wt(_??{}),...this.config.toolContextMetadata,toolResultCache:this.toolResultCache},hooks:this.createRuntimeHooks(),prepareTurn:this.createRuntimePrepareTurn(_,C),initialMessages:M,completionPolicy:E?null:void 0,systemPrompt:N}),D=this.createAgentRuntimeImpl(L);this.activeRuntime=D;let F=D.subscribe((H)=>{if(H.type==="run-started"&&this.abortRequested)D.abort(this.abortReason);O?.observe(H),this.handleRuntimeEvent(H)});if(this.config.abortSignal)if(this.config.abortSignal.aborted)this.handleExternalAbort();else this.config.abortSignal.addEventListener("abort",this.handleExternalAbort,{once:!0});let j,B;try{if(i.isContinue)j=await D.continue(void 0);else j=await D.run("")}catch(H){B=H instanceof Error?H:Error(String(H))}finally{F(),O?.dispose(),this.config.abortSignal?.removeEventListener("abort",this.handleExternalAbort);try{await this.activeTrackerWork}catch(H){this.logger?.error?.("SessionRuntime tracker work failed during drain",{agentId:this.agentId,error:H})}this.activeRuntime=null,this.running=!1,this.abortRequested=!1,this.abortReason=void 0}if(j&&j.messages.length>0){let H=ld(j.messages);this.conversation.replaceMessages(H)}let Q=new Date;try{return this.buildLegacyResult({runResult:j,thrownError:B,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=j1([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}=gS(Tk(b.output));if(typeof I==="string"&&I.length>this.maxCachedResultChars){let{text:T}=zO(b.output);if(typeof T==="string")this.toolResultCache.store(u.toolCall.toolCallId,T)}}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:$c(I.messages)}:{},...I.systemPrompt!==void 0?{systemPrompt:I.systemPrompt}:{}}}}async prepareMessagesForModelRequest(i){let l=await this.prepareProviderMessagesForApi(_k(i));return $c(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((_)=>_.type==="tool-result"),b=g?.type==="tool-result"&&g.isError===!0,I=b?L1(g?.type==="tool-result"?g.output:void 0):void 0,T={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(T),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":H1(l),T=(l?.status==="failed"?l.error?.message:void 0)||l?.outputText||"",_=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=ev(this.config);if(u)throw u;return{text:T,usage:_,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 B1(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 H1(i){if(!i)return"error";switch(i.status){case"completed":return"completed";case"aborted":return"aborted";case"failed":return"error"}}async function z1(i,l,u,c){return await Promise.resolve(),jE(i,l,u,c)}function ev(i){return xk(i)?.[i.modelId]}function W1(i,l){let u=i.trim();if(l.providerId.toLowerCase()!=="cline")return u;return Ke({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 K1(i,l){let u=i.trim();if(l.providerId.toLowerCase()!=="cline")return u;return Ke({ide:l.clineIdeName||"Terminal",workspaceRoot:l.cwd?.trim()||"/",providerId:l.providerId,overridePrompt:u,metadata:l.workspaceMetadata,platform:l.clinePlatform})}function NS(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 OS(i){let l=i.configProvider.getRuntimeConfig(),u=i.kind==="teammate"?W1(i.prompt,l):K1(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 $S(i){let l=OS(i),u=new lc(l);if(l.onEvent)u.subscribeEvents(l.onEvent);return u}var G1=t({systemPrompt:e().describe("System prompt defining the sub-agent's behavior"),task:e().describe("Task for the sub-agent to complete")});function LS(i){return k({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(G1),execute:async(l,u)=>{let c=i.createSubAgentTools?await i.createSubAgentTools(l,u):i.subAgentTools??[],g=$S({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(),T=u.agentId;if(i.onSubAgentStart)try{await i.onSubAgentStart({subAgentId:b,conversationId:I,parentAgentId:T,input:l})}catch{}try{let _=await g.run(l.task),E={text:_.text,iterations:_.iterations,finishReason:_.finishReason,usage:{inputTokens:_.usage.inputTokens,outputTokens:_.usage.outputTokens}};if(i.onSubAgentEnd)try{await i.onSubAgentEnd({subAgentId:b,conversationId:I,parentAgentId:T,input:l,result:E,agentResult:_})}catch{}return E}catch(_){if(i.onSubAgentEnd)try{await i.onSubAgentEnd({subAgentId:b,conversationId:I,parentAgentId:T,input:l,error:_ instanceof Error?_:Error(String(_))})}catch{}throw _}},timeoutMs:300000,retryable:!1})}function Qr(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 DS(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 yi(i,l){if(i===void 0)throw Error(`Missing required field: ${l}`);return i}function X1(i){let l=i.result;if(!l)return;return{textPreview:DS(l.text,us),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 Gc(i){return{id:i.id,agentId:i.agentId,taskId:i.taskId,status:i.status,messagePreview:DS(i.message,ls),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:X1(i)}}function J1(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 V1=["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 US(i){let l=[];if(i.createBaseTools)l.push(...i.createBaseTools());l.push(...uf({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:OS({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 Y1(i){let l=i.leadAgentId??"lead",u=i.restoredFromPersistence===!0,c=uf({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;US({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 uf(i){let l=i.allowSpawn??!0,u=i.includeSpawnTool??!0,c=i.includeManagementTools??!0,g=[];if(u)g.push(k({name:"team_spawn_teammate",description:"Spawn a teammate with a required agentId and rolePrompt.",inputSchema:S(ka),execute:async(I)=>{let T=y(ka,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 _={agentId:T.agentId,rolePrompt:T.rolePrompt};if(US({runtime:i.runtime,requesterId:i.requesterId,teammateConfigProvider:i.teammateConfigProvider,createBaseTools:i.createBaseTools,spec:_}),!c)i.onLeadToolsUnlocked?.(uf({...i,includeSpawnTool:!1,includeManagementTools:!0,onLeadToolsUnlocked:void 0}));return y($a,{agentId:T.agentId,status:"spawned"})}}));if(!c)return g;g.push(k({name:"team_shutdown_teammate",description:"Shutdown a teammate by agentId.",inputSchema:S(Ia),execute:async(I)=>{let T=y(Ia,I);if(i.runtime.getMemberRole(i.requesterId)!=="lead")throw Error("Only the lead agent can manage teammates.");return i.runtime.shutdownTeammate(T.agentId,T.reason),y($a,{agentId:T.agentId,status:"stopped"})}})),g.push(k({name:"team_status",description:"Return a snapshot of team members, task counts, mailbox, and mission log stats.",inputSchema:S(Sa),execute:async(I)=>(y(Sa,I),y(ds,i.runtime.getSnapshot()))})),g.push(k({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(Ea),execute:async(I)=>{let T=y(Ea,I);switch(T.action){case"create":{let _=new Set(ps.create??[]),E=Object.entries(I).filter(([C,N])=>_.has(C)&&N!=null).map(([C])=>C),A=i.runtime.createTask({title:yi(T.title,"title"),description:yi(T.description,"description"),dependsOn:T.dependsOn,assignee:T.assignee,createdBy:i.requesterId});return y(Et,{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(Et,{action:"list",tasks:i.runtime.listTaskItems({status:T.status,assignee:T.assignee})});case"claim":{let _=i.runtime.claimTask(yi(T.taskId,"taskId"),i.requesterId);return y(Et,{action:"claim",taskId:_.id,status:_.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 _=i.runtime.completeTask(yi(T.taskId,"taskId"),i.requesterId,yi(T.summary,"summary"));return y(Et,{action:"complete",taskId:_.id,status:_.status})}case"block":{let _=i.runtime.blockTask(yi(T.taskId,"taskId"),i.requesterId,yi(T.reason,"reason"));return y(Et,{action:"block",taskId:_.id,status:_.status})}}}}));let b=new Map;return g.push(k({name:"team_run_task",description:"Route a delegated task to a teammate. Choose sync (wait) or async (run in background).",inputSchema:S(Ra),execute:async(I)=>{let T=y(Ra,I);if(T.runMode==="async"){let A=i.runtime.startTeammateRun(T.agentId,T.task,{taskId:T.taskId||void 0,fromAgentId:i.requesterId,continueConversation:T.continueConversation||void 0});return y(Vi,{agentId:T.agentId,mode:"async",status:"queued",dispatched:!0,message:`Task dispatched to ${T.agentId} and queued as ${A.id}.`,runId:A.id})}let _=b.get(T.agentId);if(_){let A=await _;return y(Vi,{...A,status:"joined",deduped:!0,message:`Task for ${T.agentId} was already dispatched in this tool batch; joined the existing in-flight run.`})}let E=i.runtime.routeToTeammate(T.agentId,T.task,{taskId:T.taskId||void 0,fromAgentId:i.requesterId,continueConversation:T.continueConversation||void 0}).then((A)=>y(Vi,{agentId:T.agentId,mode:"sync",status:"running",dispatched:!0,message:`Task dispatched to ${T.agentId} and completed in sync mode.`,text:A.text,iterations:A.iterations})).finally(()=>{b.delete(T.agentId)});return b.set(T.agentId,E),await E}})),g.push(k({name:"team_cancel_run",description:"Cancel one async teammate run.",inputSchema:S(Oa),execute:async(I)=>{let T=y(Oa,I),_=i.runtime.cancelRun(T.runId,T.reason);return y(fs,{runId:_.id,status:_.status})}})),g.push(k({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(Aa),execute:async(I)=>y(Ki.array(),i.runtime.listRuns(y(Aa,I)).map(Gc))})),g.push(k({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(Ca),timeoutMs:cs,execute:async(I)=>{let T=y(Ca,I);if(T.runId){let A=await i.runtime.awaitRun(T.runId);return J1(A),y(Ki,Gc(A))}let _=await i.runtime.awaitAllRuns(),E=_.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(Ki.array(),_.map(Gc))}})),g.push(k({name:"team_send_message",description:"Send a mailbox message to a specific teammate.",inputSchema:S(Pa),execute:async(I)=>{let T=y(Pa,I),_=i.runtime.sendMessage(i.requesterId,T.toAgentId,T.subject,T.body,T.taskId??void 0);return y(ys,{id:_.id,toAgentId:_.toAgentId})}})),g.push(k({name:"team_broadcast",description:"Broadcast a message to all teammates.",inputSchema:S(Da),execute:async(I)=>{let T=y(Da,I),_=i.runtime.broadcast(i.requesterId,T.subject,T.body,{taskId:T.taskId??void 0});return y(xs,{delivered:_.length})}})),g.push(k({name:"team_read_mailbox",description:"Read the current agent mailbox.",inputSchema:S(Ma),execute:async(I)=>{let T=y(Ma,I);return y(ms.array(),i.runtime.listMailbox(i.requesterId,{unreadOnly:T.unreadOnly,markRead:!0}))}})),g.push(k({name:"team_mission_log",description:"Append a mission log update for your team.",inputSchema:S(Wa),execute:async(I)=>{let T=y(Wa,I),_=i.runtime.appendMissionLog({agentId:i.requesterId,taskId:T.taskId||void 0,kind:T.kind,summary:T.summary,evidence:T.evidence?.length?T.evidence:void 0,nextAction:T.nextAction||void 0});return y(bs,{id:_.id})}})),g.push(k({name:"team_cleanup",description:"Clean up the team runtime. Fails if teammates are still running.",inputSchema:S(Na),execute:async(I)=>{if(y(Na,I),i.runtime.getMemberRole(i.requesterId)!=="lead")throw Error("Only the lead agent can run cleanup.");return i.runtime.cleanup(),y(vs,{status:"cleaned"})}})),g.push(k({name:"team_create_outcome",description:"Create a converged team outcome.",inputSchema:S(La),execute:async(I)=>{let T=y(La,I),_=i.runtime.createOutcome({title:T.title,requiredSections:T.requiredSections,createdBy:i.requesterId});return y(gs,{outcomeId:_.id,status:_.status,requiredSections:_.requiredSections})}})),g.push(k({name:"team_attach_outcome_fragment",description:"Attach a fragment to an outcome section.",inputSchema:S(Ua),execute:async(I)=>{let T=y(Ua,I),_=i.runtime.attachOutcomeFragment({outcomeId:T.outcomeId,section:T.section,sourceAgentId:i.requesterId,sourceRunId:T.sourceRunId||void 0,content:T.content});return y(qa,{fragmentId:_.id,status:_.status})}})),g.push(k({name:"team_review_outcome_fragment",description:"Review one outcome fragment.",inputSchema:S(Ba),execute:async(I)=>{let T=y(Ba,I),_=i.runtime.reviewOutcomeFragment({fragmentId:T.fragmentId,reviewedBy:i.requesterId,approved:T.approved});return y(qa,{fragmentId:_.id,status:_.status})}})),g.push(k({name:"team_finalize_outcome",description:"Finalize one outcome.",inputSchema:S(Fa),execute:async(I)=>{let T=y(Fa,I),_=i.runtime.finalizeOutcome(T.outcomeId);return y(ws,{outcomeId:_.id,status:_.status})}})),g.push(k({name:"team_list_outcomes",description:"List team outcomes.",inputSchema:S(ja),execute:async(I)=>(y(ja,I),y(hs.array(),i.runtime.listOutcomes()))})),g}function Q1(i){if(i==="vscode")return"vscode";if(i==="cli"||i?.startsWith("cline-cli"))return"cli";return}var Z1=[{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:LS({configProvider:{}}).description,headlessToolNames:["spawn_agent"]},{id:"teams",description:"Enable team collaboration tools for teammate management, task coordination, mailbox messaging, mission logs, and outcomes.",headlessToolNames:[...V1]}];function eL(i,l){if(!l)return!0;return!Z1.find((u)=>u.id===i||u.headlessToolNames.includes(i))?.unavailableClientTypes?.includes(l)}function FS(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={...D$(b),...u??{}};return fO({...c,shell:g,executors:I})}var iL=_r,nL=["idle","running","pending"];function oL(i){return!nL.includes(i)}function Ar(i){return!oL(i)}var Fr={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"},qS="sessionHistoryOrigin";function Lo(i){return typeof i==="string"&&i.trim()?i.trim():void 0}function aL(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 Fr.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 Fr.JETBRAINS;if(l.includes("neovim"))return Fr.NEOVIM;if(l.includes("kanban"))return Fr.KANBAN;if(l.includes("desktop"))return Fr.DESKTOP;if(l.includes("cline-platform"))return Fr.WEB;if(l.includes("cline-cli")||l.includes("cline-acp"))return Fr.CLI;if(l.includes("cline-sdk")||l.includes("cline-core"))return Fr.CORE;return}function Fo(i){let l=i?.[qS];if(!l||typeof l!=="object"||Array.isArray(l))return;let u=l,c=Lo(u.mode);if(!c)return;let g=Lo(u.version),b=Lo(u.trigger);return{mode:c,...g?{version:g}:{},...b?{trigger:b}:{}}}function cn(i,l){let u=Fo(i),c=Lo(l.mode)??u?.mode??"user",g=Lo(l.version)??u?.version,b=Lo(l.trigger)??u?.trigger;return{...i??{},[qS]:{mode:c,...g?{version:g}:{},...b?{trigger:b}:{}}}}function wu(i){return i.replace(/[^a-zA-Z0-9._-]+/g,"_")}function tv(i,l){let u=wu(i),c=wu(l),g=`${u}__${c}`;return g.length>180?g.slice(0,180):g}function lL(i,l){let u=wu(i),c=wu(l);return`${u}__teamtask__${c}__${R(6)}`}function cf(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 jS(i){if(cf(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 dL(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 uL=s(iL),bu=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:uL,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 cL(i){if(!i)return!1;return Object.values(i).some((l)=>typeof l==="function")}function rv(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 pL(i){return JSON.stringify(i,(l,u)=>{if(u instanceof Error)return{name:u.name,message:u.message,stack:u.stack};return u})}function qs(i){return typeof i==="string"&&i.trim()?i.trim():void 0}function Am(i,l){let u={...i};u.id=qs(u.id)??R();let c=u.modelInfo&&typeof u.modelInfo==="object"?{...u.modelInfo}:void 0,g={id:qs(c?.id)??qs(u.modelId)??qs(l?.id),provider:qs(c?.provider)??qs(u.providerId)??qs(l?.provider),family:qs(c?.family)??qs(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 xm(i){return i.map((l)=>Am(l))}function BS(i,l,u=[]){let c=i.map((_,E)=>{let A=u[E],C=A?.role===_.role&&JSON.stringify(A.content)===JSON.stringify(_.content)?{...A,..._}:{..._};return Am(C)}),g=u.length,b=[];for(let _=g;_<c.length;_+=1)if(c[_]?.role==="assistant"&&c[_]?.metadata?.displayOnly!==!0)b.push(_);if(b.length===0){let _=[...c].reverse().findIndex((E)=>E.role==="assistant"&&E.metadata?.displayOnly!==!0);if(_===-1)return c;b.push(c.length-1-_)}let I=b[b.length-1],T=b.some((_)=>c[_]?.metrics);for(let _ of b){let E=c[_],A=E.metrics;if(!A&&_===I&&!T){let C=l.usage;A={inputTokens:C.inputTokens,outputTokens:C.outputTokens,cacheReadTokens:C.cacheReadTokens??0,cacheWriteTokens:C.cacheWriteTokens??0,cost:C.totalCost}}c[_]={...Am(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 sv(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 mL=120;function Do(i){let l=i?.trim();return l?l.slice(0,mL):void 0}function HS(i){let l=Io(xe(i??"")).trim();if(!l)return;return Do(l.split(`
|
|
267
|
+
`)[0]?.trim())}function Xs(i){if(!i)return;let l={...i},u=Do(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 Cm(i){let l=Xs(i.metadata)??{},u=i.title!==void 0?Do(i.title):HS(i.prompt);if(u)l.title=u;return Object.keys(l).length>0?l:void 0}function iv(i){let l=Fo(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(cf(i.sessionId))return{agent:"teammate",sessionId:i.sessionId,taskType:"team",origin:u};if(jS(i.sessionId))return{agent:"subagent",sessionId:i.sessionId,taskType:"subagent_task",origin:u};return{agent:"lead",sessionId:i.sessionId,origin:u}}function zS(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:xm(i.messages),...i.systemPrompt?{system_prompt:i.systemPrompt}:{}}}function hL(i,l,u){tL(sL(i),{recursive:!0}),rL(i,`${JSON.stringify(zS({updatedAt:l,context:u,messages:[]}),null,2)}
|
|
268
|
+
`,"utf8")}function fL(i,l){return bu.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 gL(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 Br(){return{inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalCost:0}}function Qt(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 WS(i){let l=Br();for(let u of i)l=Qt(l,u);return l}function ha(i){return typeof i==="number"&&Number.isFinite(i)?i:0}function nv(i){let l=Br();for(let u of i){let c=u.metrics;if(!c)continue;l=Qt(l,{inputTokens:ha(c.inputTokens),outputTokens:ha(c.outputTokens),cacheReadTokens:ha(c.cacheReadTokens),cacheWriteTokens:ha(c.cacheWriteTokens),totalCost:ha(c.cost)})}return l}function yL(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 KS(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 qo(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 vL(i){return{inputTokens:i.inputTokens,outputTokens:i.outputTokens,cacheWriteTokens:i.cacheWriteTokens,cacheReadTokens:i.cacheReadTokens,totalCost:i.cost}}function wL(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 bL(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 Jc(i,l,u){let{sessionId:c,config:g,liveSession:b,emit:I}=i,T=g.telemetry,_=b?.runtime.teamRuntime,E=u?.isPrimaryAgentEvent??!0,A=KS(l),C=qo({agentId:u?.agentId??A.agentId,conversationId:u?.conversationId??A.conversationId,parentAgentId:u?.parentAgentId??A.parentAgentId,createdByAgentId:u?.createdByAgentId,teamId:u?.teamId??_?.getTeamId(),teamName:u?.teamName??_?.getTeamName(),teamRole:u?.teamRole,teamAgentId:u?.teamAgentId});if(l.type==="content_start"&&l.contentType==="tool"&&l.toolName==="skills"){let N=yL(l.input);if(N)UA(T,{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",M=!l.error;if(ra(T,{ulid:c,tool:N,autoApproved:void 0,success:M,modelId:g.modelId,provider:g.providerId,...C}),!M&&(N==="editor"||N==="apply_patch"))FA(T,{ulid:c,modelId:g.modelId,provider:g.providerId,errorType:l.error,...C})}if(l.type==="usage"&&b?.turnUsageBaseline){let N=vL(l);if(E){b.turnPrimaryUsage=Qt(b.turnPrimaryUsage??Br(),N);let O=Qt(b.turnUsageBaseline,b.turnPrimaryUsage);i.usageBySession.set(c,O),PI(T,{ulid:c,provider:g.providerId,model:g.modelId,source:"assistant",mode:g.mode,...C}),LA(T,{ulid:c,...wL(l),provider:g.providerId,model:g.modelId,...C})}else{let O=bL({isPrimaryAgentEvent:E,overrides:u,eventMetadata:A}),L=b.turnUsageByAgent??new Map;b.turnUsageByAgent=L,L.set(O,Qt(L.get(O)??Br(),N))}let M=Qt(b.turnPrimaryUsage??Br(),WS(b.turnUsageByAgent?.values()??[]));i.aggregateUsageBySession.set(c,Qt(b.turnAggregateUsageBaseline??b.turnUsageBaseline,M))}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:pL(l),ts:Date.now()}})}function js(i){return i.workspaceRoot??i.cwd}var IL=new Set(["name","description","license","compatibility","metadata","allowed-tools"]),Rm=64,kL=1024,SL=500;function GS(i){return typeof i==="object"&&i!==null&&!Array.isArray(i)}function fa(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 TL(i,l){let u=i.normalize("NFKC");if(u.length===0||u.length>Rm)throw Error(`Skill name must be between 1 and ${Rm} 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 _L(i){if(i===void 0)return;if(!GS(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 XS(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(!GS(c))throw Error("SKILL.md frontmatter must be a YAML mapping.");let g=Object.keys(c).filter((N)=>!IL.has(N)).sort();if(g.length>0)throw Error(`Unexpected frontmatter field${g.length===1?"":"s"}: ${g.join(", ")}.`);let b=fa(c.name,"name",{required:!0,maxLength:Rm}),I=TL(b,l),T=fa(c.description,"description",{required:!0,maxLength:kL}),_=fa(c.license,"license"),E=fa(c.compatibility,"compatibility",{maxLength:SL});if(c.compatibility!==void 0&&!E)throw Error("Frontmatter field 'compatibility' cannot be empty.");let A=fa(c["allowed-tools"],"allowed-tools"),C=_L(c.metadata);return{metadata:{name:I,description:T,..._!==void 0?{license:_}:{},...E!==void 0?{compatibility:E}:{},...C!==void 0?{metadata:C}:{},...A!==void 0?{"allowed-tools":A}:{}},instructions:u[2].trim(),frontmatter:c}}var Vc="https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",ov="https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",ML=new Set(["$schema","name","version","description","author","homepage","repository","license","keywords","extensions"]),NL=new Set(["name","email","url"]),OL=/^(?!.*(?:--|\.\.))[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$/,Yc="${PLUGIN_ROOT}",Qc="${PLUGIN_DATA}";function on(i){return typeof i==="object"&&i!==null&&!Array.isArray(i)}function Pm(i,l){let u=YS(i,l);return u===""||!u.startsWith("..")&&!VS(u)}function Tt(i){return i instanceof Error?i.message:String(i)}function hf(i){let l=i?.code;return l==="ENOENT"||l==="ENOTDIR"}function dt(i){return{level:i.level??"error",...i}}async function Mm(i){let l=await mf(i);if(!(await Wl(l)).isDirectory())throw Error("expected a directory");return l}async function Rl(i,l,u){let c=await mf(l);if(!Pm(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 av(i,l){let u=vn(l);if(!Pm(i,u))throw Error(`path resolves outside its permitted root: ${l}`);let c=u;while(!0)try{let g=await mf(c),b=vn(g,YS(c,u));if(!Pm(i,b))throw Error(`path resolves outside its permitted root: ${l}`);return b}catch(g){if(!hf(g))throw g;let b=PL(c);if(b===c)throw g;c=b}}async function lv(i){try{return await Wl(i),!0}catch(l){if(hf(l))return!1;throw l}}async function Iu(i){try{return await AL(i),!0}catch(l){if(hf(l))return!1;throw l}}async function $L(i){let l;try{l=await Mm(i)}catch{return[]}let u=[],c;try{c=await JS(l,{withFileTypes:!0})}catch{return[]}for(let g of c){let b=Fs(l,g.name),I;try{I=await Mm(b)}catch{continue}let T=!1;try{T=await Iu(Fs(I,$t))}catch{continue}if(T)u.push(I)}return u.sort((g,b)=>g.localeCompare(b))}async function LL(i,l){let u=vn(i.cwd??process.cwd()),c=[];for(let T of i.pluginPaths??[]){let _=T.trim();if(!_)continue;let E=vn(u,_);try{c.push(await Mm(E))}catch(A){l.push(dt({scope:"plugin",pluginPath:E,message:`Cannot load Agent Plugin directory: ${Tt(A)}`}))}}let g=i.searchPaths??to();for(let T of g)c.push(...await $L(T));let b=[],I=new Set;for(let T of c)if(!I.has(T))I.add(T),b.push(T);return b}function el(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 DL(i,l,u){if(!on(i))throw Error("plugin.json must contain a JSON object.");for(let I of Object.keys(i).filter((T)=>!ML.has(T)).sort())u.push(dt({level:"warning",scope:"manifest",pluginPath:l,message:`Ignoring unknown plugin.json field '${I}'.`}));if(i.$schema!==Vc)throw Error(`Unsupported or missing plugin.json $schema; expected '${Vc}'.`);if(typeof i.name!=="string")throw Error("Manifest field 'name' must be a string.");if(i.name.length<1||i.name.length>64||!OL.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(!on(i.author))throw Error("Manifest field 'author' must be an object.");let I=Object.keys(i.author).filter((T)=>!NL.has(T));if(I.length>0)throw Error(`Manifest author contains unknown field '${I.sort()[0]}'.`);for(let[T,_]of Object.entries(i.author))if(typeof _!=="string")throw Error(`Manifest author field '${T}' 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(on(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:Vc,name:i.name,...el(i,"version")!==void 0?{version:i.version}:{},...el(i,"description")!==void 0?{description:i.description}:{},...c?{author:c}:{},...el(i,"homepage")!==void 0?{homepage:i.homepage}:{},...el(i,"repository")!==void 0?{repository:i.repository}:{},...el(i,"license")!==void 0?{license:i.license}:{},...g?{keywords:g}:{},...b?{extensions:b}:{}}}async function UL(i,l){let u=Fs(i,$t),c=await Rl(i,u,"file"),g;try{g=JSON.parse(await pf(c,"utf8"))}catch(b){throw Error(`Invalid plugin.json: ${Tt(b)}`)}return{manifestPath:c,manifest:DL(g,i,l)}}async function FL(i,l,u){let c=Fs(i,et),g;try{g=await Iu(c)}catch(_){return u.push(dt({scope:"skills",pluginPath:i,pluginName:l,componentPath:c,message:`Cannot inspect Agent Plugin skills component: ${Tt(_)}`})),[]}if(!g)return[];let b;try{b=await Rl(i,c,"directory")}catch(_){return u.push(dt({scope:"skills",pluginPath:i,pluginName:l,componentPath:c,message:`Invalid Agent Plugin skills component: ${Tt(_)}`})),[]}let I=[],T;try{T=await JS(b,{withFileTypes:!0})}catch(_){return u.push(dt({scope:"skills",pluginPath:i,pluginName:l,componentPath:b,message:`Cannot read Agent Plugin skills component: ${Tt(_)}`})),[]}for(let _ of T.sort((E,A)=>E.name.localeCompare(A.name))){let E=Fs(b,_.name),A;try{A=await Rl(i,E,"directory")}catch(O){if(_.isSymbolicLink())u.push(dt({scope:"skill",pluginPath:i,pluginName:l,componentPath:E,componentName:_.name,message:`Skipping invalid Agent Plugin skill directory '${_.name}': ${Tt(O)}`}));continue}let C=Fs(A,"SKILL.md"),N;try{N=await Iu(C)}catch(O){u.push(dt({scope:"skill",pluginPath:i,pluginName:l,componentPath:C,componentName:_.name,message:`Cannot inspect Agent Plugin skill '${_.name}': ${Tt(O)}`}));continue}if(!N)continue;let M;try{M=await Rl(i,C,"file")}catch(O){u.push(dt({scope:"skill",pluginPath:i,pluginName:l,componentPath:C,componentName:_.name,message:`Skipping invalid Agent Plugin skill '${_.name}': ${Tt(O)}`}));continue}try{let O=XS(await pf(M,"utf8"),_.name);I.push({pluginName:l,pluginRoot:i,directoryPath:A,filePath:M,metadata:O.metadata})}catch(O){u.push(dt({scope:"skill",pluginPath:i,pluginName:l,componentPath:M,componentName:_.name,message:`Skipping invalid Agent Plugin skill '${_.name}': ${Tt(O)}`}))}}return I}function ff(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 qL(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 QS(i,l){if(i===void 0)return;if(!on(i)||!Object.values(i).every((u)=>typeof u==="string"))throw Error(`MCP field '${l}' must be an object of strings.`);return i}function ep(i,l,u){return i.replace(/\$\{PLUGIN_(ROOT|DATA)\}/g,(c,g)=>g==="ROOT"?l:u)}function jL(i,l,u){let c=EL("sha256").update(u).digest("hex").slice(0,12);return Fs(i,`${l}-${c}`)}function BL(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 HL(i){if(ff(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 av(i.pluginRoot,vn(i.pluginRoot,i.server.command)),await lv(l)){if(!(await Wl(l)).isFile())throw Error("stdio MCP 'command' must resolve to a regular file.")}}else{if(VS(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=qL(i.server.args,"args")?.map((T)=>ep(T,i.pluginRoot,i.pluginDataPath)),c=QS(i.server.env,"env")??{};for(let T of Object.keys(c))if(process.platform==="win32"?T.toUpperCase()==="PLUGIN_ROOT"||T.toUpperCase()==="PLUGIN_DATA":T==="PLUGIN_ROOT"||T==="PLUGIN_DATA")throw Error(`stdio MCP env cannot configure reserved key '${T}'.`);let g=Object.fromEntries(Object.entries(c).map(([T,_])=>[T,ep(_,i.pluginRoot,i.pluginDataPath)])),b=BL(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 T;if(i.server.cwd.startsWith("./"))T=i.pluginRoot;else if(i.server.cwd===Yc||i.server.cwd.startsWith(`${Yc}/`))T=i.pluginRoot;else if(i.server.cwd===Qc||i.server.cwd.startsWith(`${Qc}/`))T=i.pluginDataPath;else throw Error(`stdio MCP 'cwd' must begin with './', '${Yc}', or '${Qc}'.`);let _=ep(i.server.cwd,i.pluginRoot,i.pluginDataPath);if(I=await av(T,i.server.cwd.startsWith("./")?vn(i.pluginRoot,_):_),await lv(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 zL(i){let l=i.replace(/^\[|\]$/g,"").toLowerCase();if(l==="localhost"||l==="::1")return!0;if(RL(l)===4)return l.split(".")[0]==="127";return!1}function WL(i,l){if(ff(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:"&&!zL(u.hostname))throw Error(`${l} MCP endpoints must use HTTPS unless loopback.`);let c=QS(i.headers,"headers"),g=new Set;for(let[b,I]of Object.entries(c??{})){let T=b.toLowerCase();if(g.has(T))throw Error(`Duplicate case-insensitive MCP header '${b}'.`);g.add(T);try{xL(b),CL(b,I)}catch(_){throw Error(`Invalid MCP header '${b}': ${Tt(_)}`)}}return l==="sse"?{type:"sse",url:u.toString(),...c?{headers:c}:{}}:{type:"streamableHttp",url:u.toString(),...c?{headers:c}:{}}}async function KL(i){let l=Fs(i.pluginRoot,"mcp.json"),u;try{u=await Iu(l)}catch(T){return i.diagnostics.push(dt({scope:"mcp",pluginPath:i.pluginRoot,pluginName:i.pluginName,componentPath:l,message:`Cannot inspect Agent Plugin MCP component: ${Tt(T)}`})),[]}if(!u)return[];let c;try{c=await Rl(i.pluginRoot,l,"file")}catch(T){return i.diagnostics.push(dt({scope:"mcp",pluginPath:i.pluginRoot,pluginName:i.pluginName,componentPath:l,message:`Invalid Agent Plugin MCP component: ${Tt(T)}`})),[]}let g;try{g=JSON.parse(await pf(c,"utf8"))}catch(T){return i.diagnostics.push(dt({scope:"mcp",pluginPath:i.pluginRoot,pluginName:i.pluginName,componentPath:c,message:`Invalid mcp.json: ${Tt(T)}`})),[]}if(!on(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(ff(g,new Set(["$schema","mcpServers"]),"mcp.json"),g.$schema!==ov)throw Error(`Unsupported or mismatched mcp.json $schema; expected '${ov}'.`);if(!on(g.mcpServers))throw Error("mcp.json field 'mcpServers' must be an object.")}catch(T){return i.diagnostics.push(dt({scope:"mcp",pluginPath:i.pluginRoot,pluginName:i.pluginName,componentPath:c,message:`Invalid Agent Plugin MCP component: ${Tt(T)}`})),[]}let b=jL(i.pluginDataRoot,i.pluginName,i.pluginRoot),I=[];for(let[T,_]of Object.entries(g.mcpServers).sort(([E],[A])=>E.localeCompare(A)))try{if(!on(_))throw Error("server configuration must be an object.");if(_.type!=="stdio"&&_.type!=="streamable-http"&&_.type!=="sse")throw Error("server has an unsupported or missing transport type.");let E,A;if(_.type==="stdio")A=b,E=await HL({server:_,pluginRoot:i.pluginRoot,pluginDataPath:A});else E=WL(_,_.type);let C={name:`${i.pluginName}.${T}`,transport:E,metadata:{source:"agent-plugin",pluginName:i.pluginName,pluginPath:i.pluginRoot,serverName:T,...A?{pluginDataPath:A}:{}}};I.push({pluginName:i.pluginName,pluginRoot:i.pluginRoot,...A?{pluginDataPath:A}:{},serverName:T,registration:C})}catch(E){i.diagnostics.push(dt({scope:"mcp-server",pluginPath:i.pluginRoot,pluginName:i.pluginName,componentPath:c,componentName:T,message:`Skipping invalid Agent Plugin MCP server '${T}': ${Tt(E)}`}))}return I}async function GL(i,l){let u;try{u=await UL(i,l)}catch(b){l.push(dt({scope:"manifest",pluginPath:i,componentPath:Fs(i,$t),message:`Rejecting Agent Plugin: ${Tt(b)}`}));return}let{manifest:c,manifestPath:g}=u;return{rootPath:i,manifestPath:g,manifest:c}}async function XL(i,l,u){let{rootPath:c,manifest:g}=i,[b,I]=await Promise.all([FL(c,g.name,u),KL({pluginRoot:c,pluginName:g.name,pluginDataRoot:l,diagnostics:u})]);return{...i,skills:b,mcpServers:I}}async function ZS(i={}){let l=[],u=await LL(i,l),c=vn(i.pluginDataRoot??Fs(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 GL(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 XL(A,c,l))}let T=[],_=new Set;for(let E of b)for(let A of E.mcpServers){if(_.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}_.add(A.registration.name),T.push(A)}return{plugins:b,skills:b.flatMap((E)=>E.skills),mcpServers:T,diagnostics:l}}function eD(i){return Object.fromEntries(Object.entries(i).map(([l,u])=>[l,{...u}]))}function tD(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 rD=Object.values(ge).map((i)=>({id:i.provider.id,baseUrl:i.provider.baseUrl??"",modelsSourceUrl:i.provider.modelsSourceUrl,modelId:i.provider.defaultModelId,knownModels:eD(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})),sD=Object.fromEntries(rD.map((i)=>[i.id,i]));function iD(){return Object.fromEntries(Object.entries(sD).filter(([,i])=>tD(i)))}function nD(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 oD="https://models.dev/api.json",aD=600000,lD=5000,cv=new Map,rp=new Map;async function dD(i,l){let u=Object.assign((...c)=>{let[g,b]=c,I=AbortSignal.timeout(lD),T=b?.signal?AbortSignal.any([b.signal,I]):I;return globalThis.fetch(g,{...b,signal:T})},globalThis.fetch);return io(i,u,{includeClineCloudModels:l})}async function uD(i={}){let l=i.url??oD,u=i.cacheTtlMs??aD,c=i.includeClineCloudModels===!0,g=`${l}\x00cloud=${c}`,b=Date.now(),I=cv.get(g);if(I&&I.expiresAt>b)return I.data;let T=rp.get(g);if(T)return T;let _=dD(l,c).then((E)=>(cv.set(g,{data:E,expiresAt:b+u}),E)).finally(()=>{rp.delete(g)});return rp.set(g,_),_}function cD(i){return Object.fromEntries(Object.entries(i).map(([l,u])=>[l,{baseUrl:u.baseUrl,modelId:u.modelId,capabilities:nD(u.capabilities)}]))}var pD=cD(iD()),pv=Mt,mD=K,mv=e().min(1).regex(/^[a-z0-9][a-z0-9-]*$/i),hD=s(["anthropic","gemini","openai-chat","openai-responses","openai-r1","ai-sdk"]),fD=s(["anthropic","ai-sdk","ai-sdk-community","openai","openai-compatible","openai-r1","gemini","bedrock","custom","fetch","vertex"]),gD=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()}),yD=t({enabled:r().optional(),effort:Jt.optional(),budgetTokens:n().int().positive().optional()}),vD=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()}),wD=t({projectId:e().optional(),region:e().optional()}),bD=t({apiVersion:e().optional(),useIdentity:r().optional()}),ID=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()}),kD=t({mode:s(["internal","external"]).optional(),usePromptCache:r().optional()}),SD=t({loadLatestOnInit:r().optional(),includeClineCloudModels:r().optional(),loadPrivateOnAuth:r().optional(),url:e().url().optional(),cacheTtlMs:n().int().positive().optional(),failOnError:r().optional()}),e0=t({provider:mv,apiKey:e().optional(),auth:gD.optional(),model:e().optional(),protocol:hD.optional(),client:fD.optional(),routingProviderId:mv.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:yD.optional(),aws:vD.optional(),gcp:wD.optional(),azure:bD.optional(),sap:ID.optional(),oca:kD.optional(),region:e().optional(),apiLine:s(["china","international"]).optional(),capabilities:o(s(["reasoning","prompt-cache","streaming","tools","vision","computer-use","oauth","popular"])).optional(),modelCatalog:SD.optional()});function TD(i){return i.protocol==="openai-responses"||i.client==="openai"}function Om(i,l={}){let u=i.provider,c=mD(u),g=l.includeKnownModels!==!1,b=i.reasoning?.effort||"none",I=b==="none"?void 0:b,T=pD[c],_=ao(c),E=Object.keys(_)[0],A=uP(c,i),C=i.baseUrl??oo(c,i.apiLine)??(c==="oca"?i.oca?.mode==="internal"?gk:yk:T?.baseUrl),N=i.routingProviderId??(TD(i)&&c!==pv.OPENAI_NATIVE?pv.OPENAI_NATIVE:void 0),M=g?T?.knownModels??(Object.keys(_).length>0?_:void 0):void 0,O={providerId:u,clientType:i.client,routingProviderId:N,modelId:i.model??T?.modelId??E??"default",...g?{knownModels:M}:{},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??T?.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(O).filter(([L,D])=>D!==void 0))}var $m=e0,t0=t({providerId:e().min(1),modelId:e().min(1)}),_D=t({voiceInput:t0.optional()}),ED=t({bedrockProfile:r().optional()}),AD=t({settings:e0,updatedAt:e().datetime(),tokenSource:s(["manual","oauth","migration"]).default("manual")}),hv=t({version:a(1),lastUsedProvider:e().min(1).optional(),modes:_D.default({}),repairs:ED.optional(),providers:d(e(),AD)});function Lm(){return{version:1,modes:{},providers:{}}}var sp=n().finite().positive().optional().catch(void 0),tl=n().finite().nonnegative().optional().catch(void 0),$D=t({id:e().optional(),name:e().optional(),maxTokens:sp,contextWindow:sp,maxInputTokens:sp,capabilities:o(xo).optional(),supportsVision:r().optional(),supportsAttachments:r().optional(),supportsReasoning:r().optional(),operation:vo.optional(),operationModes:o(wo).optional(),modalities:bo.optional(),inputPrice:tl,outputPrice:tl,cacheReadsPrice:tl,cacheWritesPrice:tl,temperature:tl,apiFormat:yo.optional()}).passthrough(),LD=t({name:e(),baseUrl:e(),defaultModelId:e().optional(),protocol:mr.optional(),client:hr.optional(),capabilities:o(dr).optional(),modelsSourceUrl:e().optional()}).passthrough(),s0=t({provider:LD.optional(),models:d(e(),$D).optional(),discoveredModelIds:o(e()).optional()}).passthrough(),DD=t({version:a(1),providers:d(e(),s0)}),UD=t({version:a(1),providers:d(e(),m())}),fv=new Set,i0={apiKeyOptional:!0};function n0(i){return i.split(/[-_]/).filter(Boolean).map((l)=>l.charAt(0).toUpperCase()+l.slice(1)).join(" ")}function FD(i){return OD(r0(i.getFilePath()),"models.json")}function Dm(){return{version:1,providers:{}}}function qD(i){let l=UD.safeParse(i);if(!l.success)return lt("models.json content is not a valid models file envelope; starting from an empty registry"),Dm();let u={};for(let[c,g]of Object.entries(l.data.providers)){let b=s0.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 o0(i){if(!xD(i))return Dm();try{let l=RD(i,"utf8");return qD(JSON.parse(l))}catch{lt(`models.json at ${i} exists but is unreadable or invalid JSON; treating as an empty registry`)}return Dm()}function jD(i,l){CD(r0(i),{recursive:!0});let u=DD.parse(l),c=`${i}.${process.pid}.tmp`;try{ND(c,`${JSON.stringify(u,null,2)}
|
|
269
|
+
`,"utf8"),PD(c,i)}catch(g){throw MD(c,{force:!0}),g}}function a0(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 l0(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 BD(i){return i!=null&&typeof i.name==="string"&&typeof i.baseUrl==="string"}function d0(i,l){return i??l??"openai-chat"}function u0(i,l,u){return i??u??(l==="openai-responses"?"openai":"openai-compatible")}function c0(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 HD(i,l){let u=p0(i);for(let[c,g]of Object.entries(l??{})){let b=g.id?.trim()||c.trim();if(!b)continue;let I=u[b]?.capabilities,T=I&&g.capabilities?{...g,capabilities:[...new Set([...I,...g.capabilities])]}:g;xn(i,b,c0(b,T,I,I!==void 0))}}function zD(i,l,u){return{...l??{},id:i,name:l?.name??i,capabilities:l?.capabilities??u}}function p0(i){return Object.assign({},...Ei(i).map((l)=>ct(l)))}function WD(i){let l=i.provider.trim();if(!l||Ri(l))return;let u=i.baseUrl?.trim();if(!u)return;let c=ge[l],g=p0(l),b=l0(i.capabilities),I=b.length>0?b:void 0,T=i.model?.trim(),_={...g,...c?.models??{}};if(T)_[T]=zD(T,_[T],I);let E=Object.keys(_).filter(Boolean),A=T||E[0];if(!A)return;let C=d0(i.protocol,c?.provider.protocol),N=u0(i.client,C,c?.provider.client);qt({provider:{id:l,name:c?.provider.name??n0(l),description:c?.provider.description,protocol:C,client:N,baseUrl:u,modelsSourceUrl:c?.provider.modelsSourceUrl,defaultModelId:A,capabilities:a0(i.capabilities)??c?.provider.capabilities,source:"file",metadata:i0},models:_})}function ip(i){for(let l of Object.values(i.providers))WD(l.settings)}function KD(i,l){let u=l.models??{};if(!BD(l.provider)){HD(i,u);return}let c=l0(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=d0(l.provider.protocol,void 0),T=u0(l.provider.client,I,void 0),_=Object.fromEntries(g.map(({id:E,model:A})=>[E,{...c0(E,A,c.length>0?c:void 0),status:"active"}]));qt({provider:{id:i,name:l.provider.name.trim()||n0(i),protocol:I,client:T,baseUrl:l.provider.baseUrl,modelsSourceUrl:l.provider.modelsSourceUrl,defaultModelId:b,capabilities:a0(l.provider.capabilities),source:"file",metadata:i0},models:_})}function GD(i){let l=FD(i);if(fv.has(l))return;let u=o0(l);for(let[c,g]of Object.entries(u.providers))KD(c,g);fv.add(l)}var ku="openai",YD="openai-compatible",QD=128000;function m0(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 gv(i){if(!XD(i))return;try{let l=JD(i,"utf8"),u=JSON.parse(l);if(u&&typeof u==="object"&&!Array.isArray(u))return u}catch{}return}function eU(i){let l=i.dataDir??Z(),u=i.globalStatePath??Um(l,"globalState.json"),c=i.secretsPath??Um(l,"secrets.json"),g=gv(u),b=gv(c);if(!g&&!b)return;return{globalState:g??{},secrets:b??{}}}function Fm(i){return K(i)}function Su(i){if(i===ku)return i;return K(i)}function tU(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 rU(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=Jt.safeParse(g),I=b.success?b.data:void 0,T=typeof c==="number"&&Number.isInteger(c)&&c>0?c:void 0;if(!I&&T===void 0)return;return{...I?{effort:I}:{},...T!==void 0?{budgetTokens:T}:{}}}function sU(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 iU(i){let l=ct(i),u=st(i),c=u?.provider.defaultModelId;if(c&&(l[c]||u?.models?.[c]))return c;return Object.keys(l)[0]??void 0}function nU(i,l){if(!l||i!=="cline")return l;let u=st(i)?.models;if(!u)return l;if(u[l])return l;for(let c of ft){if(!l.startsWith(c.aliasPrefix))continue;let g=`${c.canonicalPrefix}${l.slice(c.aliasPrefix.length)}`;if(u[g])return g}return}function oU(i,l,u,c){let g=Fm(i),b=ie(c==="plan"?l.planModeApiProvider:l.actModeApiProvider),I=b?Su(b):void 0,T=nU(g,tU(l,i,c,I))??iU(g),_=rU(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,sU(u));if(i==="cline")try{let F=ie(u["cline:clineAccountId"]);if(F)C.auth={...C.auth??{},...m0(F)}}catch{}if(i===ku&&l.openAiHeaders)C.headers=l.openAiHeaders;if(i==="bedrock"){let F=ZD(l.awsAuthentication),j=ie(l.awsProfile),B=F==="profile"||l.awsUseProfile===!0||F===void 0&&j!==void 0,Q=B&&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:B?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===ku&&(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},M=ie(A[i]),O=ie(N[i]),L={provider:g,...M?{apiKey:M}:{},...T?{model:T}:{},...O?{baseUrl:O}:{},..._?{reasoning:_}:{},...E?{timeout:E}:{},...C},D=$m.safeParse(L);if(!D.success)return;return Object.keys(L).filter((F)=>F!=="provider").length>0?D.data:void 0}function rl(i){return typeof i==="number"&&Number.isFinite(i)&&i>0?i:void 0}function aU(i,l,u){if(i!==YD)return;if(!l.baseUrl||!l.model)return;let c=rl(u?.contextWindow)??QD,g=rl(u?.maxTokens),b=rl(u?.inputPrice),I=rl(u?.outputPrice),T=rl(u?.temperature),_=["streaming","tools"];if(u?.supportsImages!==!1)_.push("images");if(u?.supportsPromptCache===!0)_.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:_,...g!==void 0?{maxTokens:g}:{},...b!==void 0?{inputPrice:b}:{},...I!==void 0?{outputPrice:I}:{},...T!==void 0?{temperature:T}:{}}}}}function lU(i,l){let u=new Set;for(let g of[i.actModeApiProvider,i.planModeApiProvider]){let b=ie(g);if(b)u.add(Su(b))}if(ie(l.apiKey))u.add("anthropic");if(ie(l.openRouterApiKey))u.add("openrouter");if(ie(l.openAiApiKey))u.add(ku);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=m0(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 dU(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 uU(i){let l=i.providerSettingsManager.read(),u=eU(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",T=ie(b==="plan"?c.planModeApiProvider:c.actModeApiProvider),_=T?Su(T):void 0,E=ie(b==="plan"?c.actModeApiProvider:c.planModeApiProvider),A=E?Su(E):void 0,C=lU(c,g),N=Lm();N.providers={...l.providers},N.lastUsedProvider=l.lastUsedProvider,N.modes=l.modes,N.repairs=l.repairs;let M=new Date().toISOString(),O=0,L=Um(VD(i.providerSettingsManager.getFilePath()),"models.json"),D=o0(L),F=0;for(let H of C){let z=Fm(H);if(N.providers[z])continue;let te=H!==_&&H===A?I:b,ee=oU(H,c,g,te);if(!ee)continue;N.providers[z]={settings:ee,updatedAt:M,tokenSource:"migration"},O+=1;let oe=aU(z,ee,te==="plan"?c.planModeOpenAiModelInfo:c.actModeOpenAiModelInfo);if(oe&&!D.providers[z])D.providers[z]=oe,F+=1}let j=dU(N,c,M);if(O===0&&F===0&&!j)return{migrated:!1,providerCount:Object.keys(l.providers).length,lastUsedProvider:l.lastUsedProvider};let B=ie(b==="plan"?c.planModeApiProvider:c.actModeApiProvider),Q=B?Fm(B):void 0;if(N.lastUsedProvider=l.lastUsedProvider??(Q&&N.providers[Q]?Q:Object.keys(N.providers)[0]),i.providerSettingsManager.write(N),F>0)jD(L,D);return{migrated:O>0||F>0||j,providerCount:Object.keys(N.providers).length,lastUsedProvider:N.lastUsedProvider}}function cU(){return new Date().toISOString()}var pU="cline",mU="cline-pass",h0=/[\p{Cc}\p{Cf}]/gu;function Vr(i){if(typeof i!=="string")return i;let l=i.replace(h0,"").trim();return l.length>0?l:void 0}function hU(i){let l={...i,apiKey:Vr(i.apiKey)};if(i.auth)l.auth={...i.auth,apiKey:Vr(i.auth.apiKey),accessToken:Vr(i.auth.accessToken),refreshToken:Vr(i.auth.refreshToken)};if(i.aws)l.aws={...i.aws,accessKey:Vr(i.aws.accessKey),secretKey:Vr(i.aws.secretKey),sessionToken:Vr(i.aws.sessionToken)};if(i.gcp)l.gcp={...i.gcp,projectId:Vr(i.gcp.projectId),region:Vr(i.gcp.region)};if(i.sap)l.sap={...i.sap,clientId:Vr(i.sap.clientId),clientSecret:Vr(i.sap.clientSecret)};if(i.headers)l.headers=Object.fromEntries(Object.entries(i.headers).map(([u,c])=>[u,c.replace(h0,"").trim()]));return l}function fU(i){if(uv(i)!=="providers.json")return;let l=Nm(i);if(uv(l)!=="settings")return;return Nm(l)}class oi{filePath;dataDir;constructor(i={}){if(this.filePath=i.filePath??Xa(),this.dataDir=i.dataDir??fU(this.filePath),this.dataDir||!i.filePath)uU({providerSettingsManager:this,dataDir:this.dataDir});if(GD(this),ip(this.read()),tp(this.filePath))try{dv(this.filePath,384)}catch{}}getFilePath(){return this.filePath}read(){if(!tp(this.filePath))return Lm();try{let i=VL(this.filePath,"utf8"),l=JSON.parse(i),u=hv.safeParse(l);if(u.success){ip(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=${Ls(c?.accessToken)} clineRefreshTokenHash=${Ls(c?.refreshToken)}`),u.data}}catch{}return Lm()}write(i){let l=hv.parse(i),u=Nm(this.filePath);if(!tp(u))JL(u,{recursive:!0,mode:448});let c=`${this.filePath}.${process.pid}.tmp`;try{ZL(c,`${JSON.stringify(l,null,2)}
|
|
270
|
+
`,{encoding:"utf8",mode:384}),YL(c,this.filePath)}catch(g){throw QL(c,{force:!0}),g}try{dv(this.filePath,384)}catch{}ip(l)}saveProviderSettings(i,l={}){let u=hU($m.parse(i)),c=this.read(),g=u.provider,b=l.setLastUsed!==!1,I=c.providers[g],T=l.tokenSource??I?.tokenSource??"manual",_={...c,providers:{...c.providers,[g]:{settings:u,updatedAt:cU(),tokenSource:T}},lastUsedProvider:b?g:c.lastUsedProvider};this.write(_);let E=c.providers.cline?.settings?.auth,A=u.provider==="cline"?u.auth:_.providers.cline?.settings?.auth,C=!!E?.accessToken&&!A?.accessToken;return lt(`providers.save providerId=${g} tokenSource=${T} clineAuthWasPresent=${!!E?.accessToken} clineAuthIsPresent=${!!A?.accessToken} authDropped=${C}`),_}resolveProviderSettings(i,l){let u=i.providers[l]?.settings,c=ri(l)?.storageProviderId;if(!c||c===l)return u;let g=i.providers[c]?.settings;if(!g)return u;return $m.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=t0.parse(i);else delete l.modes.voiceInput;return this.write(l),l}resolveLastUsedProviderId(i,l){let u=i.lastUsedProvider;if(u===mU&&l.isClinePassEnabled===!1)return pU;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 Om(u,l)}getLastUsedProviderConfig(i={}){let l=this.getLastUsedProviderSettings(i);if(!l)return;return Om(l,i)}async refreshCatalog(){try{await uD({})}catch{}}}async function wU(i,l,u){let c=gU("sha256").update(l).digest("hex"),g=V(`${yU(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(T){let _=T instanceof Error?T.message:String(T),E=T?.code;if(!(E==="SQLITE_BUSY"||E==="SQLITE_LOCKED"||/SQLITE_BUSY|SQLITE_LOCKED|database is locked/.test(_)))throw T;if(Date.now()>=I)throw Error("Timed out waiting for another process to refresh OAuth credentials.");await vU(25)}return await u()}finally{try{if(b)g.exec("ROLLBACK;")}finally{g.close?.()}}}function np(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 dc{providerSettingsManager;telemetry;onCredentialsRefreshed;refreshInFlight=new Map;constructor(i){this.providerSettingsManager=i?.providerSettingsManager??new oi,this.telemetry=i?.telemetry,this.onCredentialsRefreshed=i?.onCredentialsRefreshed}async resolveProviderApiKey(i){let l=ri(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||!Gg(i,g))return null;let b=g.auth,I=wU(this.providerSettingsManager.getFilePath(),l,()=>this.resolveProviderApiKeyInternal(i,l,u&&np(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=ri(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=Gg(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=${Ls(b.access)} refreshTokenHash=${Ls(b.refresh)}`);let I=await c.refresh({settings:g,credentials:b,forceRefresh:u,telemetry:this.telemetry}),T=this.providerSettingsManager.getProviderSettings(l);if(!np(g.auth,T?.auth))return null;if(!I)throw lt(`oauth.resolve providerId=${i} outcome=refresh_returned_null`),new od(i);let _=dP({manager:this.providerSettingsManager,providerId:i,settings:{...g,...T},credentials:I,setLastUsed:!1,save:!1}),E=!np(g.auth,_.auth);if(E)lt(`oauth.resolve.refreshed providerId=${i} newAccessTokenHash=${Ls(I.access)} newRefreshTokenHash=${Ls(I.refresh)} savingToDisk=true`),this.providerSettingsManager.saveProviderSettings(_,{setLastUsed:!1,tokenSource:"oauth"}),this.onCredentialsRefreshed?.(g,_);else lt(`oauth.resolve providerId=${i} outcome=not_refreshed`);return{apiKey:c.getApiKey(_)??I.access,accountId:I.accountId,refreshed:E}}}var _U=3600000,EU=604800000,yv=2;class f0{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??_U,this.cacheFilePath=i.cacheFilePath,this.persistentCacheMaxAgeMs=i.persistentCacheMaxAgeMs??EU,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||!bU(this.cacheFilePath))return;let i=JSON.parse(kU(this.cacheFilePath,"utf8"));if(!i||typeof i!=="object")return;let l=i;if(l.version!==yv||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;IU(TU(this.cacheFilePath),{recursive:!0,mode:448});let i=this.getCacheSnapshot(),l={version:yv,updatedAt:i.updateTime,userId:i.userId,flagsPayload:i.flagsPayload};SU(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??Lt[i]??void 0;if(!this.cache.has(i)||this.cache.get(i)!==c)this.telemetry?.capture({event:Pe.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}),Lt[i]??!1}}getBooleanFlagEnabled(i){return this.cache.get(i)===!0}getFlagPayload(i){return this.cache.get(i)??Lt[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 Rn;function vv(){return new oi().getProviderSettings("cline")?.auth?.accountId?.trim()||void 0}async function gf(i){let l=vv(),u=process.env.TELEMETRY_SERVICE_API_KEY;if(!l||!u)return Rn=void 0,!1;if(Rn?.accountId!==l||Rn.apiKey!==u)Rn={accountId:l,apiKey:u,service:new f0({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"),T=new I({client:b(u),config:{}});try{return await T.getAllFlagsAndPayloads(g)}finally{await T.dispose()}}}})};let c=Rn;try{return c.pending??=c.service.poll().finally(()=>{c.pending=void 0}),await c.pending,Rn===c&&vv()===l&&c.service.getCacheSnapshot().flagsPayload?.featureFlags?.[i]===!0}catch{return!1}}var S5=RU(AU(yn)??{recommended:[],free:[],clinePass:[]},fn());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 AU(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),T=g.map(pd).filter((E)=>E!==null),_=(Array.isArray(l.clineCloud)?l.clineCloud:[]).map(pd).filter((E)=>E!==null);if(b.length===0&&I.length===0&&T.length===0)return null;return{recommended:b,free:I,clinePass:T,clineCloud:_}}function op(i){return i.replace(/\s*\(free\)\s*$/i,"").replace(/:free$/i,"").trim()}function xU(i){let l=[i];for(let u of ft)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 CU(i,l){for(let g of l)for(let b of xU(i.id)){let I=g?.[b]?.name?.trim();if(I)return op(I)}let u=i.name?.trim();if(u&&u!==i.id)return op(u);let c=i.id.split("/").at(-1)??i.id;return op(c)}function RU(i,l){let u=(c,g)=>c.map((b)=>({...b,name:CU(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 PU(i){let l=i?.auth?.accessToken?.trim()||i?.apiKey?.trim();return l&&l.length>0?l:void 0}var wv=["COMPOSIO_SEARCH_TOOLS","COMPOSIO_MANAGE_CONNECTIONS","COMPOSIO_WAIT_FOR_CONNECTIONS","COMPOSIO_MULTI_EXECUTE_TOOL"];async function MU(i,l){let u;try{let c=i("/api/v1/connectors/meta-tools/sessions",{method:"POST",signal:AbortSignal.timeout(5000)}),g=new Promise((N,M)=>{u=setTimeout(()=>M(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]),T=I?.data?.sessionId,_=I?.data?.tools;if(typeof T!=="string"||!T||!Array.isArray(_))return;let E=_.filter((N)=>typeof N?.slug==="string"&&wv.some((M)=>M===N.slug)),A=new Set(E.map((N)=>N.slug)),C=wv.filter((N)=>!A.has(N));if(C.length>0){l?.log?.(`composio-tools: meta-tool session missing required tools: ${C.join(", ")}`);return}return{sessionId:T,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 NU(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(_){return{successful:!1,error:`Cline connectors request failed: ${_ instanceof Error?_.message:String(_)}`}}let I=await b.text(),T;try{T=I?JSON.parse(I):void 0}catch{T=void 0}if(!b.ok){let _=T!==void 0?JSON.stringify(T).slice(0,600):I.slice(0,600);return{successful:!1,error:`Cline connectors proxy returned HTTP ${b.status} for ${u}${_?`: ${_}`:""}`}}return T??{successful:!0}}var OU=120000;function Pl(){return new oi().getProviderSettings("cline")?.auth?.accountId?.trim()||void 0}var bv;async function g0(i){let l=new oi,u;try{bv??=new dc,u=(await bv.resolveProviderApiKey({providerId:"cline"}))?.apiKey??void 0}catch(c){if(c instanceof od)return}if(u??=PU(l.getProviderSettings("cline")),!u||Pl()!==i)return;return{baseUrl:(l.getProviderSettings("cline")?.baseUrl?.trim()||_e().apiBaseUrl).replace(/\/+$/,""),token:u}}async function $U(i){if(Pl()!==i)return{error:{successful:!1,error:"The Cline account changed. Start a new session to use connector tools."}};if(!await gf(Ge.CLINE_COMPOSIO_BETA))return{error:{successful:!1,error:"Composio connectors are not enabled for this account."}};let l=await g0(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 Iv(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 LU(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 gf(Ge.CLINE_COMPOSIO_BETA))return;if(Pl()!==u)return;let T=await g0(u);if(!T)return;c=Iv(T),g=async()=>{let _=await $U(u);if("error"in _)return _;return{request:Iv(_.auth)}}}let b=await MU(c,{log:(T)=>i?.logger?.log?.(T)});if(!b?.tools.length)return;let I;try{I=b.tools.map((T)=>k({name:T.slug.toLowerCase(),resultPolicy:"cache-oversized",description:T.description||T.name||T.slug,inputSchema:T.input_parameters??{type:"object",properties:{}},timeoutMs:OU,retryable:!1,execute:async(_)=>{let E=await g();if("error"in E)return E.error;return NU(E.request,b.sessionId,T.slug,_)}}))}catch(T){i?.logger?.log?.(`composio-tools: invalid meta-tool schemas: ${T instanceof Error?T.message:String(T)}`);return}return{name:"composio-tools",manifest:{capabilities:["tools"]},setup(T){if(!l&&Pl()!==u)return;for(let _ of I)T.registerTool(_);i?.logger?.log?.(`composio-tools: registered ${I.length} meta tool(s) for this session`)}}}var _u=zU(DU),y0="cline checkpoint session=",qm=67108864,WU=1209600000;function KU(i){return i.includes(y0)}function v0(){return Kl(Z(),"checkpoint-scratch")}function w0(i,l){let u=FU("sha256").update(`${i}\x00${l}`).digest("hex").slice(0,32);return Kl(v0(),u)}async function GU(){try{let i=v0(),l=Date.now()-WU,u=await jU(i,{withFileTypes:!0});await Promise.all(u.map(async(c)=>{if(!c.isDirectory())return;let g=Kl(i,c.name);try{if((await BU(g)).mtimeMs<l)await Tu(g,{recursive:!0,force:!0})}catch{}}))}catch{}}function ap(i,l){i?.log(l,{severity:"warn"})}function XU(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 Ot(i,l){let u=await _u("git",["-C",i,...l],{windowsHide:!0});return{stdout:u.stdout.trim(),stderr:u.stderr.trim()}}var yf=["-c","core.ignorestat=false","-c","core.splitIndex=false"];async function md(i,l,u){return(await _u("git",["-C",i,...yf,...u],{windowsHide:!0,maxBuffer:qm,env:{...process.env,GIT_INDEX_FILE:l}})).stdout.trim()}function JU(i,l,u,c){return new Promise((g,b)=>{let I=UU("git",["-C",i,...yf,...u],{windowsHide:!0,env:{...process.env,GIT_INDEX_FILE:l},stdio:["pipe","ignore","pipe"]}),T="";I.stderr.on("data",(_)=>{T+=_}),I.on("error",b),I.on("close",(_)=>{if(_===0)g();else b(Error(`git ${u[0]} exited with ${_}: ${T.trim()}`))}),I.stdin.on("error",()=>{}),I.stdin.end(c)})}async function VU(i,l){let u=(await _u("git",["-C",i,"ls-files","--others","--exclude-standard","-z"],{windowsHide:!0,maxBuffer:qm})).stdout.split("\x00").filter(Boolean);if(u.length===0)return;await qU(l,{recursive:!0,mode:448});let c=Kl(l,"index"),g=Kl(l,"pathspec");await HU(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 Tu(c,{force:!0}),await Tu(`${c}.lock`,{force:!0}),await md(i,c,b)}let I=await _u("git",["-C",i,...yf,"ls-files","-z"],{windowsHide:!0,maxBuffer:qm,env:{...process.env,GIT_INDEX_FILE:c}}),T=new Set(u.map((A)=>A.endsWith("/")?A.slice(0,-1):A)),_=I.stdout.split("\x00").filter(Boolean).filter((A)=>!T.has(A));if(_.length>0)await JU(i,c,["update-index","-z","--force-remove","--stdin"],`${_.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 YU(i,l,u){let c=(await Ot(i,["stash","create",u])).stdout,g=await VU(i,l);if(c){if(!g)return c;let _=(await Ot(i,["rev-parse",`${c}^{tree}`])).stdout,E=(await Ot(i,["rev-parse",`${c}^1`])).stdout,A=(await Ot(i,["rev-parse",`${c}^2`])).stdout;if(!_||!E||!A)return c;return(await Ot(i,["commit-tree",_,"-p",E,"-p",A,"-p",g,"-m",u])).stdout||c}if(!g)return;let b=(await Ot(i,["rev-parse","HEAD"])).stdout,I=(await Ot(i,["rev-parse","HEAD^{tree}"])).stdout;if(!b||!I)return;let T=(await Ot(i,["commit-tree",I,"-p",b,"-m","index on cline checkpoint"])).stdout;if(!T)return;return(await Ot(i,["commit-tree",I,"-p",b,"-p",T,"-p",g,"-m",u])).stdout||void 0}async function kv(i,l){if(!i)return;await Tu(w0(i,l),{recursive:!0,force:!0}).catch(()=>{return});let u=`refs/cline/checkpoints/${l}/`;try{let{stdout:c}=await Ot(i,["for-each-ref","--format=%(refname)",u]),g=c.trim().split(`
|
|
272
|
+
`).filter(Boolean);await Promise.allSettled(g.map((b)=>Ot(i,["update-ref","-d",b])))}catch{}}async function QU(i,l,u){if(!i||u.length===0)return;await Promise.allSettled(u.map((c)=>Ot(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 eF(i){GU();let l,u,c=async()=>{if(l===!0)return!0;try{l=(await Ot(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(),T=(N)=>{i.telemetry?.capture({event:"checkpoint.snapshot",properties:{sessionId:i.sessionId,runCount:b,outcome:N,durationMs:Date.now()-I}})},_=async(N)=>{try{let M=(await Ot(i.cwd,["rev-parse","HEAD"])).stdout.trim();if(!M)return;return{ref:M,createdAt:Date.now(),runCount:b,kind:"commit"}}catch(M){ap(i.logger,`${N}: ${M instanceof Error?M.message:String(M)}`);return}},E=`${y0}${i.sessionId} run=${b}`,A="";try{A=await YU(i.cwd,w0(i.cwd,i.sessionId),E)??""}catch(N){ap(i.logger,`Checkpoint snapshot failed after ${Date.now()-I}ms: ${N instanceof Error?N.message:String(N)}`);let M=await _("Checkpoint HEAD fallback failed");return T(M?"head_fallback":"skipped"),M}if(!A){let N=await _("Checkpoint HEAD fallback failed");return T(N?"head_clean":"skipped"),N}let C=`refs/cline/checkpoints/${i.sessionId}/${b}`;try{await Ot(i.cwd,["update-ref",C,A])}catch(N){ap(i.logger,`Checkpoint store failed: ${N instanceof Error?N.message:String(N)}`),T("skipped");return}return T("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 T=ym(b.messages);if(T<1)return;let _=await i.readSessionMetadata(),E=XU(_),A=ym(I)>=1,C=E?.history.some((O)=>O.runCount===T)??!1;if(!A&&C)return;let N=await g(T);if(!N)return;if(E?.latest.ref===N.ref)return;let M=ZU(E?.history??[],N);await i.writeSessionMetadata({..._??{},checkpoint:{latest:N,history:M}});return}}}function iF(i,l){if(!l)return;return{name:i,manifest:{capabilities:["hooks"]},hooks:l}}function uF(i){return kr(i)}var b0;((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"})(b0||={});var cF={["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"},pF=new Map(Object.values(b0).map((i)=>[i.toLowerCase(),i])),mF=new Set(["",".sh",".bash",".zsh",".js",".mjs",".cjs",".ts",".mts",".cts",".py",".ps1"]);function hF(i){let l=lF(i).toLowerCase();if(!mF.has(l))return;let u=aF(i,l).trim().toLowerCase();return pF.get(u)}function I0(i){let l=[],u=new Set,c=uF(i).filter((g)=>nF(g));for(let g of c)try{for(let b of oF(g,{withFileTypes:!0})){if(!b.isFile())continue;let I=hF(b.name);if(!I)continue;let T=dF(g,b.name);if(u.has(T))continue;u.add(T),l.push({fileName:I,hookEventName:cF[I],path:T})}}catch{}return l.sort((g,b)=>g.path.localeCompare(b.path))}var gF=30000,yF=1000;function vF(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 Sv(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 wF(i){for(let l of[i.stdin,i.stdout,i.stderr]){if(!l||l.destroyed)continue;l.removeAllListeners("data"),l.destroy()}}async function bF(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()},T=(E)=>{let A=E.code;return A==="EPIPE"||A==="EOF"||A==="ERR_STREAM_DESTROYED"},_=(E)=>{if(T(E)){I(c);return}I(()=>g(E))};u.on("error",_),u.once("close",()=>u.off("error",_)),u.end(l,(E)=>{if(E){if(T(E)){I(c);return}I(()=>g(E));return}I(c)})})}async function Tv(i,l){let u=kt(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=fF(u[0],u.slice(1),{cwd:l.cwd,env:Me(l.env),stdio:c?["pipe","ignore","ignore"]:["pipe","pipe","pipe"],detached:c,windowsHide:!0}),b="",I="",T=!1,_;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",(M)=>N(Sv(M,u)))}),A=new Promise((C,N)=>{let M=!1,O,L=()=>{if(_)clearTimeout(_);if(O)clearTimeout(O)},D=(F)=>{if(M)return;M=!0,L();let{parsedJson:j,parseError:B}=vF(b);C({exitCode:F,stdout:b,stderr:I,parsedJson:j,parseError:B,timedOut:T})};if(g.once("error",(F)=>{L(),N(Sv(F,u))}),g.once("close",(F)=>D(F)),!c)g.once("exit",(F)=>{O=setTimeout(()=>{D(F),wF(g)},yF),O.unref?.()})});if(c)A.catch(()=>{return});if(!c&&(l.timeoutMs??0)>0)_=setTimeout(()=>{T=!0,g.kill("SIGKILL")},l.timeoutMs);if(c&&l.onDetachedSettled){let C=Date.now(),N=l.onDetachedSettled,M=!1,O,L=(F)=>{if(M)return;if(M=!0,O)clearTimeout(O);N({command:u,...F})},D=l.detachedObservationMs??gF;O=setTimeout(()=>L({durationMs:D,exitCode:null,exited:!1}),D),O.unref?.(),A.then((F)=>L({durationMs:Date.now()-C,exitCode:F.exitCode,exited:!0})).catch(()=>{if(M=!0,O)clearTimeout(O)})}if(await Promise.race([Promise.all([E,bF(g,JSON.stringify(i))]),A]),c){g.unref();return}return await A}var lp=50000;function IF(i){if(i===void 0||i.length<=lp)return i;return`${i.slice(0,lp)}
|
|
274
|
+
[hook context truncated: exceeded ${lp} characters]`}var j5=t({contextModification:e().optional(),cancel:r().optional(),review:r().optional(),errorMessage:e().optional(),context:e().optional(),overrideInput:m().optional()}).passthrough();function Eu(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 kF(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 SF(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:IF(u??c),cancelReason:g===!0?c??u:void 0,overrideInput:Object.hasOwn(l,"overrideInput")?l.overrideInput:void 0}}function jm(i){let l=String(i??"").toLowerCase();return l.includes("cancel")||l.includes("abort")||l.includes("interrupt")}function It(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 Bm(i,l){if(l.command.length===0)throw Error("runHookCommand requires non-empty command");try{return await Tv(i,l)}catch(u){let c=EF(l.command,process.platform,u);if(!c)throw u;return await Tv(i,{...l,command:c})}}function TF(i){try{let l=rF(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 _F(i){return!!(i&&typeof i==="object"&&("code"in i)&&i.code==="ENOENT")}function EF(i,l=process.platform,u){if(l!=="win32"||!_F(u))return;if(i[0]!=="py"||i[1]!=="-3")return;return["python",...i.slice(2)]}function k0(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 k0(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 AF(i){let l=TF(i);if(l&&l.length>0)return[...k0(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 kt(["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 xF(i){let l={};for(let u of I0(i)){if(!u.hookEventName)continue;let c=u.hookEventName,g=l[c]??[];g.push(AF(u.path)),l[c]=g}return l}async function dp(i){let l;for(let u of i.commands){let c=u.join(" ");try{let g=await Bm(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=kF(l,SF(g?.parsedJson))}catch(g){Ml(i.logger,`hook command failed: ${c}`,g)}}return l}async function On(i){if(i.detached){let l=i.onHookRuntime,u=i.payload.hookName;for(let c of i.commands){let g=c.join(" ");Bm(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 Bm(i.payload,{command:l,cwd:i.cwd,env:process.env,detached:i.detached})}catch(c){Ml(i.logger,`hook command failed: ${u}`,c)}}))}function Zs(i){return{agentId:i.agentId,conversationId:i.conversationId??i.runId??i.agentId,parentAgentId:i.parentAgentId??null}}function Hm(i,l){return{...Zs(i.snapshot),userMessage:l}}function S0(i){return{...Zs(i.snapshot),iteration:i.snapshot.iteration,call:{id:i.toolCall.toolCallId,name:i.toolCall.toolName,input:i.input}}}function T0(i){return{...Zs(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 _0(i){return i.filter((l)=>l.type==="text"&&typeof l.text==="string").map((l)=>l.text).join("")}function CF(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 _v(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 RF(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)??sF(tt(),"hooks.jsonl");tt(b),tF(b,g,"utf8")};return{beforeRun:async(c)=>{let g=Hm(c,"");u({...It(g,l),hookName:"agent_start",taskStart:{taskMetadata:{}}});return},beforeTool:async(c)=>{let g=S0(c);u({...It(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:Eu(g.call.input)}});return},afterTool:async(c)=>{let g=T0(c);u({...It(g,l),hookName:"tool_result",iteration:g.iteration,tool_result:g.record,postToolUse:{toolName:g.record.name,parameters:Eu(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=Zs(c);if(g.status==="completed"){u({...It(b,l),hookName:"agent_end",iteration:g.iterations,turn:{outputText:g.outputText,status:g.status},taskComplete:{taskMetadata:{}}});return}if(g.status==="aborted"||jm(g.error?.message)){u({...It(b,l),hookName:"agent_abort",reason:g.error?.message,taskCancel:{taskMetadata:{}}});return}if(g.error)u({...It(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=Hm({snapshot:c.snapshot},_0(c.message.content));u({...It(g,l),hookName:"prompt_submit",userPromptSubmit:{prompt:g.userMessage,attachments:[]}})}}}function PF(i){let l=xF(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 M=C==="agent_resume"?{...It(A,i),hookName:C,taskResume:{taskMetadata:{},previousState:{}}}:{...It(A,i),hookName:C,taskStart:{taskMetadata:{}}};if(!i.blockingRunStartHooks){await On({commands:N,cwd:i.cwd,logger:i.logger,detached:i.detachAsyncHooks??!0,onHookRuntime:i.onHookRuntime,payload:M});return}return dp({commands:N,cwd:i.cwd,logger:i.logger,timeoutMs:i.toolCallTimeoutMs??120000,payload:M})},c=async(A)=>{let C=l.prompt_submit??[];if(C.length>0)await On({commands:C,cwd:i.cwd,logger:i.logger,detached:i.detachAsyncHooks??!0,onHookRuntime:i.onHookRuntime,payload:{...It(A,i),hookName:"prompt_submit",userPromptSubmit:{prompt:A.userMessage,attachments:[]}}})},g=async(A)=>{let C=l.tool_call??[];if(C.length===0)return;return dp({commands:C,cwd:i.cwd,logger:i.logger,timeoutMs:i.toolCallTimeoutMs??120000,payload:{...It(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:Eu(A.call.input)}}})},b=async(A)=>{let C=l.tool_result??[];if(C.length===0)return;return dp({commands:C,cwd:i.cwd,logger:i.logger,timeoutMs:i.toolCallTimeoutMs??120000,payload:{...It(A,i),hookName:"tool_result",iteration:A.iteration,tool_result:A.record,postToolUse:{toolName:A.record.name,parameters:Eu(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 On({commands:C,cwd:i.cwd,logger:i.logger,detached:i.detachAsyncHooks??!0,onHookRuntime:i.onHookRuntime,payload:{...It(A,i),hookName:"agent_end",iteration:A.iteration,turn:A.turn,taskComplete:{taskMetadata:{}}}})},T=async(A)=>{let C=l.agent_error??[];if(C.length===0)return;await On({commands:C,cwd:i.cwd,logger:i.logger,detached:i.detachAsyncHooks??!0,onHookRuntime:i.onHookRuntime,payload:{...It(A,i),hookName:"agent_error",iteration:A.iteration,error:{name:A.error.name,message:A.error.message,stack:A.error.stack}}})},_=async(A)=>{if(jm(A.reason)){let N=l.agent_abort??[];if(N.length>0)await On({commands:N,cwd:i.cwd,logger:i.logger,detached:i.detachAsyncHooks??!0,onHookRuntime:i.onHookRuntime,payload:{...It(A,i),hookName:"agent_abort",reason:A.reason,taskCancel:{taskMetadata:{}}}})}let C=l.session_shutdown??[];if(C.length===0)return;await On({commands:C,cwd:i.cwd,logger:i.logger,detached:i.detachAsyncHooks??!0,onHookRuntime:i.onHookRuntime,payload:{...It(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(Zs(A.snapshot),C);return _v(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(Hm({snapshot:A.snapshot},_0(A.message.content)))}}if((l.tool_call?.length??0)>0)E.beforeTool=async(A)=>{let C=await g(S0(A));return CF(C)};if((l.tool_result?.length??0)>0)E.afterTool=async(A)=>{let C=await b(T0(A));return _v(C)};if((l.agent_end?.length??0)>0)E.afterRun=async({snapshot:A,result:C})=>{if(C.status!=="completed")return;await I({...Zs(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:M}=C;if(M.status==="aborted"||jm(M.error?.message)){await _({...Zs(N),reason:M.error?.message});return}if(M.error)await T({...Zs(N),iteration:M.iterations,error:M.error})}}return E}function MF(i){return iF("core.hook_config_files",PF(i))}function vi(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 T=I,_=[g?.appendContext,T.appendContext].filter((E)=>typeof E==="string"&&E.length>0).join(`
|
|
278
|
+
|
|
279
|
+
`);if(T.stop===!0)return{...g??{},...T,stop:!0};g={...g??{},...T,stop:g?.stop===!0||T.stop===!0?!0:T.stop,appendContext:_||void 0,options:g?.options||T.options?{...g?.options??{},...T.options??{}}:void 0}}return g}}function Ev(i){let l=i.filter((u)=>u!==void 0);if(l.length===0)return;return{beforeRun:vi(l,"beforeRun"),afterRun:vi(l,"afterRun"),beforeModel:vi(l,"beforeModel"),afterModel:vi(l,"afterModel"),beforeTool:vi(l,"beforeTool"),afterTool:vi(l,"afterTool"),onEvent:vi(l,"onEvent")}}function zm(...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 Ms(i){let l=i?.trim();return l?l:void 0}function NF(i){let l=i.client,u=aL(l)??Ms(i.source),c=Ms(l.version),g=Ms(l.platform)??Ms(l.name),b=Ms(l.platformVersion)??c,I={cline_type:u,extension_version:c,platform:g,platform_version:b};if(i.user?.accountId===void 0)return I;let T=typeof i.user.accountId==="string"?Ms(i.user.accountId):void 0;return{...I,distinct_id:T??Ms(i.user.distinctId),user_id:T,account_id:T,account_email:T?Ms(i.user.email):void 0,organization_id:T?Ms(i.user.organizationId):void 0}}function E0(i,l){let u={},c={},g,b=(I)=>({...l,...c,...u,...I,...g?{distinct_id:g}:{}});return{setDistinctId(I){g=Ms(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,T)=>i.captureRequired(I,b(T)),recordCounter:(I,T,_,E,A)=>i.recordCounter(I,T,b(_),E,A),recordHistogram:(I,T,_,E,A)=>i.recordHistogram(I,T,b(_),E,A),recordGauge:(I,T,_,E,A)=>i.recordGauge(I,T,b(_),E,A),flush:()=>i.flush(),dispose:async()=>{}}}function OF(i,l){return E0(i,NF(l))}var FF=UF($F);function qF(i,l){return FF("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 jF(i){if(!i||typeof i!=="object"||!("stderr"in i))return"";return typeof i.stderr==="string"?i.stderr.trim():""}function BF(i){if(!i||typeof i!=="object"||!("code"in i))return;return typeof i.code==="number"?i.code:void 0}function A0(i){let l=Au(i.cwd),u=i.git??qF,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(BF(b)===128&&/not a git repository|Kein Git-Repository/i.test(jF(b)))return!1;throw b}},remotes:()=>wi({baseDir:l}).getRemotes(!0),displayBranch:async()=>(await wi({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 HF(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 xv(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 zF(i,l){let u=HF(i);return u.url===l.url&&u.branch===l.branch}function x0(i){let l=i.find(({name:u})=>u==="origin")??i[0];return(l?.refs.fetch||l?.refs.push)?.trim()||void 0}function Au(i){return DF(i)}async function C0(i){return(await R0(i)).info}function Cv(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 R0(i){let l=Au(i),u={rootPath:l,hint:LF(l)||void 0},c={},g;try{let b=A0({cwd:l});if(!await b.isInsideWorkTree())return{info:u,vcsType:"none",gitState:c};try{let I=await b.remotes();if(I.length>0){let T=I.map((E)=>{let A=E.refs.fetch||E.refs.push;return`${E.name}: ${A}`});u.associatedRemoteUrls=T;let _=x0(I);if(_)c.url=_}}catch(I){g??=hd(I)}try{let I=await b.headSha();if(I.length>0)u.latestGitCommitHash=I}catch(I){if(!Cv(I))g??=hd(I)}try{let I=await b.displayBranch();if(I.length>0)u.latestGitBranchName=I,c.branch=I}catch(I){if(!Cv(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 WF(i){try{let l=A0({cwd:i});if(!await l.isInsideWorkTree())return{};let[u,c]=await Promise.all([l.remotes(),l.displayBranch()]),g=x0(u);return{...g?{url:g}:{},...c?{branch:c}:{}}}catch{return}}async function KF(i){let l=await C0(i);return Fn(l)}async function GF(i){let l=Av.now(),u=await R0(i),c=Av.now()-l,g=u.info;return{workspaceInfo:g,workspaceMetadata:Fn(g),durationMs:c,vcsType:u.vcsType,gitState:u.gitState,initError:u.error}}class P0{manifest;listeners=new Set;constructor(i){this.manifest=ki.parse(i??{workspaces:{}})}async addWorkspacePath(i){let l=await C0(i);return this.manifest=ss(this.manifest,l),this.emit({type:"workspace_added",workspace:l}),l}async switchWorkspace(i){let l=Au(i),u=this.manifest.workspaces[l];if(u)return this.manifest=ki.parse({...this.manifest,currentWorkspacePath:l}),this.emit({type:"workspace_switched",workspace:u}),u;let c=await this.addWorkspacePath(l);return this.manifest=ki.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=Au(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 Rv=new Set,Pv=new Set;function JF(i,l){return XF("sha256").update(i).update("\x00").update(l?.trim()??"").digest("hex")}function VF(i){if(i.vcsTypes&&i.vcsTypes.length>0)return i.vcsTypes;return[i.vcsType==="git"?"git":"none"]}function YF(i){if(!i.telemetry)return;let l=JF(i.rootPath,i.dedupeScope),u=i.rootCount??1;if(!Rv.has(l))Rv.add(l),CA(i.telemetry,{root_count:u,vcs_types:VF(i),init_duration_ms:i.durationMs,feature_flag_enabled:i.featureFlagEnabled??!0,is_remote_workspace:i.isRemoteWorkspace});if(i.initError&&!Pv.has(l)){Pv.add(l);let c=Error(i.initError.message);c.name=i.initError.errorType||"Error",RA(i.telemetry,c,{fallback_to_single_root:!0,workspace_count:u})}}function QF(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(QF).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 eq(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 tq(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 rq(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 sq(i,l,u){if(i.systemPrompt?.trim())return i.systemPrompt;return Ke({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 iq(i,l,u,c,g,b){let I=c.getProviderSettings(i.providerId),T=g||I?.modelCatalog?{...g??{},...I?.modelCatalog??{}}:void 0,_=i.providerConfig?.providerId===i.providerId?i.providerConfig:void 0,E=Zn({providerId:i.providerId,sessionId:l,source:u,defaultSource:Fr.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:ac,openAiCodex:{accountId:_?.accountId??I?.auth?.accountId,accessToken:_?.accessToken??i.apiKey??I?.auth?.accessToken??I?.apiKey,userAgentVersion:process.env.npm_package_version},headers:{stored:I?.headers,config:i.headers,session:_?.headers}}),A={...I??{},provider:i.providerId,model:i.modelId,apiKey:i.apiKey??I?.apiKey,baseUrl:i.baseUrl??I?.baseUrl,headers:void 0,reasoning:rq(i,I?.reasoning),modelCatalog:T},C={...Om(A),..._??{}};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 nq(i){let{input:l,sessionId:u,sessionOrigin:c,providerSettingsManager:g,defaultTelemetry:b,defaultLogger:I,defaultCapabilities:T,defaultToolPolicies:_,defaultFetch:E,connectorsRequest:A,onPluginEvent:C,onPluginIssue:N,onTeamEvent:M,createSubAgentLifecycleCallbacks:O,createSpawnTool:L,localRuntime:D,readSessionMetadata:F,writeSessionMetadata:j}=i,B=js(l.config),{modelCatalogDefaults:Q,userInstructionService:H,configExtensions:z,onTeamRestored:te,...ee}=D??{},oe=Object.keys(ee).length>0?ee:void 0,{workspaceInfo:G,workspaceMetadata:se,gitState:Ne,durationMs:De,vcsType:Te,initError:le}=await GF(B),ke=oe?.extensionContext,we=ke?.client?void 0:tq(l.config.headers),Xe=ke?.client??we,ve=ke?.telemetry??oe?.telemetry??(b&&Xe?OF(b,{client:Xe,source:l.source,user:ke?.user}):b),Se=ve&&c?E0(ve,{session_origin:c.mode,session_origin_trigger:c.trigger}):ve,Ee={...ke??{},...we?{client:we}:{},workspace:{...G,...ke?.workspace??{}},session:{...ke?.session??{},sessionId:u},logger:ke?.logger??oe?.logger??I,telemetry:Se};YF({telemetry:Ee.telemetry,rootPath:G.rootPath,dedupeScope:Ee.client?.name??l.source,workspaceInfo:G,rootCount:1,vcsType:Te,durationMs:De,initError:le,featureFlagEnabled:!0});let Ae=fd(z,"hooks")?MF({cwd:l.config.cwd,workspacePath:B,rootSessionId:u,logger:oe?.logger,workspaceInfo:G,onHookRuntime:(Qe)=>XA(Ee.telemetry,Qe)}):void 0,Be=cL(oe?.hooks)?void 0:RF({rootSessionId:u,workspacePath:B,workspaceInfo:G}),Ye=Ev([oe?.hooks,Be]),xt,vt,Nr=[];if(fd(z,"plugins"))try{vt=await sk({pluginPaths:oe?.pluginPaths,workspacePath:B,cwd:l.config.cwd,onEvent:C,providerId:l.config.providerId,modelId:l.config.modelId,workspaceInfo:G,session:Ee.session,client:Ee.client,user:Ee.user,logger:Ee.logger,telemetry:Ee.telemetry,automation:Ee.automation,policy:l.plugins,hookErrorMode:l.config.hookErrorMode,onIssue:N}),Nr.push(...vt.issues??[]),xt=vt.failures.length?vt.failures.map((Qe)=>Qe.message).join("; "):void 0,ZF(vt.failures,vt.warnings,oe?.logger??Ee.logger)}catch(Qe){let zs=Qe instanceof Error?Qe.message:String(Qe);(oe?.logger??Ee.logger)?.log(`Plugin loading failed; the session has no plugins: ${zs}`,{severity:"error",sessionId:u}),xt=zs,Nr.push({name:"plugins",pluginPath:B,state:"failed",reason:"error",lastError:{phase:"discover",message:zs,stack:Qe instanceof Error?Qe.stack:void 0,pluginPath:B,timestamp:Date.now(),sessionId:u}})}let bt;if(fd(z,"plugins"))try{bt=await ZS({pluginPaths:l.config.agentPluginPaths,cwd:l.config.cwd,disabledPluginNames:[...Nh()]}),eq(bt.diagnostics,Ee.logger)}catch(Qe){let zs=Qe instanceof Error?Qe.message:String(Qe);Ee.logger?.log(`[agent-plugins] Package discovery failed; continuing without Agent Plugins: ${zs}`,{severity:"error"})}let Ct=await LU({request:A,logger:oe?.logger}),Kr=[...Ae?[Ae]:[],...Ct?[Ct]:[]],Or=Kr.length>0?Kr:void 0,Cs=rv(Or,rv(oe?.extensions,hx(vt?.extensions))),Re=fd(z,"plugins")?Qu(vt?.pluginPaths??[]):void 0,Rt={...l.config,...oe??{},sessionId:u,hooks:Ye,extensions:Cs,extensionContext:Ee,telemetry:Ee.telemetry,logger:Ee.logger},Gr=iq(Rt,u,l.source,g,Q,E),de=Ev([Rt.hooks,Rt.checkpoint?.enabled===!0?eF({cwd:Rt.cwd,sessionId:u,logger:Rt.logger,createCheckpoint:Rt.checkpoint?.createCheckpoint,telemetry:Rt.telemetry,readSessionMetadata:F,writeSessionMetadata:j}):void 0]),Fe={...Rt,providerConfig:Gr,workspaceMetadata:se,systemPrompt:sq(Rt,G,se),hooks:de},mt=l.toolPolicies??Rt.toolPolicies??_,Ie=zm(T,l.capabilities),Le=Ie?.requestToolApproval,Jr=Ie?.toolExecutors,Tn=O?.(Fe),bc=new P0({currentWorkspacePath:G.rootPath,workspaces:{[G.rootPath]:G}});return{effectiveInput:l,config:Fe,providerConfig:Gr,workspaceMetadata:se,workspaceInfo:G,gitState:Ne,extensions:Cs,hooks:de,toolPolicies:mt,requestToolApproval:Le,pluginSandboxShutdown:vt?.shutdown,pluginIssues:Nr,pluginCommandError:xt,runtimeBuilderInput:{config:Fe,hooks:de,extensions:Cs,onTeamEvent:M,createSpawnTool:L,onTeamRestored:te,onSubAgentEvent:Tn?.onSubAgentEvent,onSubAgentStart:Tn?.onSubAgentStart,onSubAgentEnd:Tn?.onSubAgentEnd,userInstructionService:H,pluginSkillDirectories:Re,agentPluginSkills:bt?.skills,agentPluginMcpServers:bt?.mcpServers,configExtensions:z,toolExecutors:Jr,toolPolicies:mt,workspaceManager:bc,logger:Fe.logger,telemetry:Fe.telemetry,requestToolApproval:Le}}}function vf(i){return i.trim().replace(/^\/+/,"").toLowerCase()}function oq(i){let l=i.trimStart().match(/^\/(\S+)([\s\S]*)$/);return l?{name:vf(l[1]),input:l[2].trim()}:void 0}function aq(i){let l=typeof i==="string"?{reply:i}:i;return{reply:l?.reply?.trim()||void 0,submitPrompt:l?.submitPrompt?.trim()||void 0}}function M0(i){let l=new Map;for(let u of i){let c=vf(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 N0(i,l,u={}){let c=oq(l);if(!c)return;let g=i.find((I)=>vf(I.name)===c.name&&I.handler);if(!g?.handler)return;let b=!1;try{let I=aq(await g.handler(c.input));return b=!0,I}finally{try{ra(u.telemetry,{ulid:u.sessionId??P(),tool:`plugin_command:${c.name}`,modelId:u.modelId,provider:u.provider,success:b,...u.agentIdentity})}catch{}}}var uq=30000,cq=600000;class O0{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)=>N0(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=dq(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)},cq),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=lq("sha256");try{let u=Bh({cwd:i,workspacePath:i});l.update(JSON.stringify(u));for(let c of u)l.update(Oh(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<uq))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??sk)({cwd:i.workspacePath,workspacePath:i.workspacePath,registry:new Uh({logger:this.options.logger})});i.shutdown=c.shutdown;let g=Nt({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:M0(i.commands)}}}function pt(){return new Date().toISOString()}function gd(i){if(!i||!Gd(i))return;try{gq(i)}catch{}}function yq(i){let l=cf(i);if(l)return{rootSessionId:l.rootSessionId,fileStem:`${l.agentId}__${l.teamTaskId}`};let u=jS(i);if(u)return{rootSessionId:u.rootSessionId,fileStem:u.agentId};return{rootSessionId:i,fileStem:i}}class $0{ensureSessionsDir;constructor(i){this.ensureSessionsDir=i}sessionArtifactsDir(i){return sl(this.ensureSessionsDir(),i)}ensureSessionArtifactsDir(i){let l=this.sessionArtifactsDir(i);if(!Gd(l))pq(l,{recursive:!0});return l}sessionMessagesPath(i){return sl(this.sessionArtifactsDir(i),`${i}.messages.json`)}sessionCompactionPath(i){return sl(this.sessionArtifactsDir(i),`${i}.compaction.json`)}sessionManifestPath(i,l=!1){let u=l?this.ensureSessionArtifactsDir(i):this.sessionArtifactsDir(i);return sl(u,`${i}.json`)}removeSessionDirIfEmpty(i){let l=this.sessionArtifactsDir(i),u=this.ensureSessionsDir();while(l.startsWith(u)&&l!==u){if(!Gd(l)){l=Mv(l);continue}try{if(mq(l).length>0)break;hq(l)}catch{break}l=Mv(l)}}removeSessionDir(i){this.removeDir(this.sessionArtifactsDir(i))}removeDir(i){if(!Gd(i))return;try{fq(i,{recursive:!0,force:!0})}catch{}}subagentArtifactPaths(i,l,u){let{rootSessionId:c,fileStem:g}=yq(i),b=this.sessionArtifactsDir(c);return{messagesPath:sl(b,`${g}.messages.json`)}}}function vq(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 wq(i,l,u,c,g){if(u)$A(i.telemetry,{ulid:l,provider:i.providerId,model:i.modelId,...g});else OA(i.telemetry,{ulid:l,provider:i.providerId,model:i.modelId,...g});bq(i.telemetry,{workspacePath:c})}function bq(i,l){let u=Si("Hooks"),c=I0(l.workspacePath),g=new Map,b=u.replace(/\\/g,"/");for(let I of c){let T=I.hookEventName??"unknown",_=g.get(T)??{global:0,workspace:0},E=I.path.replace(/\\/g,"/");if(E===b||E.startsWith(`${b}/`))_.global+=1;else _.workspace+=1;g.set(T,_)}for(let[I,T]of g.entries())JA(i,I,T.global,T.workspace)}function Iq(i,l){for(let u of l.mentions)KA(i,u,l.matchedFiles.includes(u)?1:0,"file",!l.matchedFiles.includes(u));for(let u of l.matchedFiles)zA(i,"file",u.length);for(let u of l.ignoredMentions)WA(i,"file","not_found",u)}var xq="machine-id",Nv,Ov=!1;function Cq(){if(!Ov)Nv=L0(),Ov=!0;return Nv??D0()}function uc(i){let l=i?.trim();if(l)return l;let u=L0();if(u)return u;return D0()}function Rq(){let i=Aq;return i.machineIdSync??i.default?.machineIdSync}function L0(){try{let i=Rq();if(!i)return;return i().trim()||void 0}catch{return}}function D0(){let i=He(),l=Eq(i,xq);try{if(kq(l)){let c=Tq(l,"utf8").trim();if(c.length>0)return c}}catch{}let u=`cl-${R()}`;try{Sq(i,{recursive:!0}),_q(l,u,"utf8")}catch{}return u}function Pq(i){return i?JSON.parse(JSON.stringify(i)):void 0}function Mq(i){return i?JSON.parse(JSON.stringify(i)):void 0}function Nq(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():"",T=Number(b.createdAt),_=Number(b.runCount);if(!I||!Number.isFinite(T)||!Number.isInteger(_))return[];return[{ref:I,createdAt:T,runCount:_,...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 xu(i){let{session:l}=i,u=Pq(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:Mq(i.messages)}:{},...i.usage?{usage:{...i.usage}}:{},...i.aggregateUsage?{aggregateUsage:{...i.aggregateUsage}}:{},...(()=>{let c=Nq(u);return c?{checkpoint:c}:{}})()}}var qe=Lq(Oq);async function $v(i,l){try{return(await qe("git",["-C",i,"rev-parse","--verify","--quiet",l],{windowsHide:!0})).stdout.trim()||void 0}catch{return}}async function Dq(i){if((await qe("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 qe("git",["-C",i,"rev-parse","--verify","HEAD"],{windowsHide:!0})).stdout.trim(),u=await $v(i,"refs/stash"),c=$q(),g=`refs/cline/restore-transactions/${c}`;await qe("git",["-C",i,"stash","push","--include-untracked","--message",`cline restore transaction ${c}`],{windowsHide:!0});let b=await $v(i,"refs/stash"),I=b!==void 0&&b!==u;if(I)try{await qe("git",["-C",i,"update-ref",g,b],{windowsHide:!0}),await qe("git",["-C",i,"stash","drop","stash@{0}"],{windowsHide:!0})}catch(_){try{await qe("git",["-C",i,"reset","--hard",l],{windowsHide:!0}),await qe("git",["-C",i,"clean","-fd"],{windowsHide:!0}),await qe("git",["-C",i,"stash","apply","--index",b],{windowsHide:!0})}catch(E){throw AggregateError([_,E],"Workspace snapshot and rollback both failed")}throw _}let T=!1;return{async commit(){if(T)return;if(T=!0,!I)return;await qe("git",["-C",i,"update-ref","-d",g],{windowsHide:!0}).catch(()=>{return})},async rollback(){if(T)return;if(await qe("git",["-C",i,"reset","--hard",l],{windowsHide:!0}),await qe("git",["-C",i,"clean","-fd"],{windowsHide:!0}),I)await qe("git",["-C",i,"stash","apply","--index",g],{windowsHide:!0}),await qe("git",["-C",i,"update-ref","-d",g],{windowsHide:!0});T=!0}}}function U0(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 Uq(i,l){let u=U0(i).filter((g)=>g.runCount<=l),c=u.at(-1);return c?{latest:c,history:u}:void 0}function Fq(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 F0(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 qq(i,l){let{index:u}=F0(i,l);return i.slice(0,u+1)}function jq(i,l){let{index:u,span:c}=F0(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 Bq(i){let l=i.checkpointRunCount;if(!Number.isInteger(l)||l<1)throw Error("checkpointRunCount must be a positive integer");let u=Fq(U0(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:qq(i.messages??[],l)}:{}}}async function Hq(i,l){if(l.kind)return l.kind;let u=await qe("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&&KU(b)?"stash":"commit"}async function zq(i,l){try{return await qe("git",["-C",i,"cat-file","-e",`${l}^3^{commit}`],{windowsHide:!0}),!0}catch{return!1}}async function Wq(i,l,u){try{let c=await qe("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 Kq(i,l){if((await qe("git",["-C",i,"rev-parse","--is-inside-work-tree"],{windowsHide:!0})).stdout.trim()!=="true")throw Error(`${i} is not a git repository`);await qe("git",["-C",i,"cat-file","-e",`${l.ref}^{commit}`],{windowsHide:!0});let u=await Hq(i,l),c=u==="commit"?l.ref:`${l.ref}^1`,g=(await qe("git",["-C",i,"rev-parse","--verify",`${c}^{commit}`],{windowsHide:!0})).stdout.trim(),b=(await qe("git",["-C",i,"rev-parse","--verify","HEAD"],{windowsHide:!0})).stdout.trim();if(b!==g){let T=await Wq(i,g,b),_=T&&T>0?`${T} commit${T===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: ${_}. 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 qe("git",["-C",i,"cat-file","-e",`${l.ref}^2^{commit}`],{windowsHide:!0});let I=await zq(i,l.ref);if(await qe("git",["-C",i,"update-ref","-m","cline: checkpoint restore","HEAD",g,b],{windowsHide:!0}),await qe("git",["-C",i,"reset","--hard"],{windowsHide:!0}),I)await qe("git",["-C",i,"clean","-fd"],{windowsHide:!0});if(u==="commit")return;await qe("git",["-C",i,"stash","apply",l.ref],{windowsHide:!0})}class Ds extends Error{code;constructor(i,l){super(l);this.code=i,this.name="SessionVersioningError"}}function Gq(i){let l=i.sessionId.trim();if(!l)throw new Ds("invalid_restore","sessionId is required");if(!i.restoreMessages&&!i.restoreWorkspace)throw new Ds("invalid_restore","restore.messages or restore.workspace must be true");if(i.restoreMessages&&i.requiresStart)throw new Ds("invalid_restore","start is required when restore.messages is true");if(!Number.isInteger(i.checkpointRunCount)||i.checkpointRunCount<1)throw new Ds("invalid_restore","checkpointRunCount must be a positive integer");return l}class wf{async restoreCheckpoint(i){let l=i.restore?.messages!==!1,u=i.restore?.workspace!==!1,c=Date.now(),g,b=(B,Q)=>{i.telemetry?.capture({event:"checkpoint.restore",properties:{sessionId:i.sessionId,checkpointRunCount:i.checkpointRunCount,restoreWorkspace:u,restoreMessages:l,checkpointKind:g?.kind??"unknown",outcome:B,durationMs:Date.now()-c,...Q}})},I,T,_;try{let B=Gq({sessionId:i.sessionId,restoreMessages:l,restoreWorkspace:u,requiresStart:i.start===void 0,checkpointRunCount:i.checkpointRunCount}),Q=await i.getSession(B);if(!Q)throw new Ds("session_not_found",`Session ${B} not found`);if(I=Q,T=l?await i.readMessages(B):void 0,l&&T?.length===0)throw new Ds("session_messages_not_found",`No messages found for session ${B}`);_=Bq({session:I,messages:T,checkpointRunCount:i.checkpointRunCount,cwd:i.cwd,restoreMessages:l}),g=_.checkpoint}catch(B){throw b("failed",{phase:"plan"}),B}let E=xu({session:I,messages:T}),A,C=[],N,M;if(l){let{startSession:B,getStartedSessionId:Q,cleanupStartedSession:H}=i;if(!i.start||!B||!Q||!H)throw new Ds("invalid_restore","startSession, getStartedSessionId, and cleanupStartedSession are required when restore.messages is true");M={startSession:B,getStartedSessionId:Q,cleanupStartedSession:H},A=Uq(I,i.checkpointRunCount),C=i.restore?.omitCheckpointMessageFromSession?jq(T??[],i.checkpointRunCount):_.messages??[];let z={sourceSession:I,sourceMessages:T,sourceSnapshot:E,plan:_,restoredCheckpointMetadata:A,initialMessages:C,restoreMessages:l,restoreWorkspace:u,checkpointRunCount:i.checkpointRunCount};N=i.buildStartInput?await i.buildStartInput(z,i.start):i.start}let O=i.applyWorkspaceCheckpoint??Kq,L=i.beginWorkspaceRestoreTransaction??(i.applyWorkspaceCheckpoint?void 0:Dq),D=u&&L?await L(_.cwd):void 0,F=!1,j;try{if(u)await O(_.cwd,_.checkpoint);if(!M)return await D?.commit(),F=!0,b("success"),{checkpoint:_.checkpoint,sourceSnapshot:E};let B=await M.startSession(N);j={result:B,cleanup:M.cleanupStartedSession};let Q=M.getStartedSessionId(B);if(!Q)throw new Ds("invalid_restore","Restored session did not return a session id");await(i.retainCheckpointRefs??QU)(_.cwd,Q,A?.history??[]);let H=i.readRestoredSession?await i.readRestoredSession(Q):void 0,z=H?xu({session:H,messages:C}):void 0;return await D?.commit(),F=!0,b("success"),{sessionId:Q,startResult:B,messages:_.messages,checkpoint:_.checkpoint,sourceSnapshot:E,...z?{restoredSnapshot:z}:{}}}catch(B){let Q=[];if(j)try{await j.cleanup(j.result)}catch(H){Q.push(H)}if(D&&!F)try{await D.rollback()}catch(H){Q.push(H)}if(b("failed",{workspaceRolledBack:!!D&&!F,recovered:Q.length===0}),Q.length>0)throw AggregateError([B,...Q],"Checkpoint restore failed and recovery did not complete");throw B}}}var Vq=ae({task:e().optional(),systemPrompt:e().optional()});class q0{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=Fo(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:Cm({metadata:cn(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=Kn(i.sessionContext);if(!l)return;let u=Vq.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=tv(l,i.agentId),g=await this.adapter.getSession(c),b=pt(),I=this.manifestStore.artifacts.subagentArtifactPaths(c,i.agentId,this.activeTeamTaskSessionId(l,i.parentAgentId)),T=i.prompt??g?.prompt??void 0;if(!T)T=await this.adapter.claimSpawnRequest(l,i.parentAgentId)??`Subagent run by ${i.parentAgentId}`;if(!g){let _=this.buildSubsessionRow(u,{sessionId:c,mode:"subagent",parentSessionId:l,parentAgentId:i.parentAgentId,agentId:i.agentId,conversationId:i.conversationId,prompt:T,startedAt:b,...I});return await this.adapter.upsertSession(_),this.manifestStore.initializeMessagesFile(_,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??T??null,metadata:Cm({metadata:cn(g.metadata,{mode:"subagent",version:Fo(u.metadata)?.version}),prompt:g.prompt??T??null}),expectedStatusLock:g.statusLock}),c}async upsertSubagentSessionFromHook(i){if(!i.parent_agent_id)return;let l=Kn(i.sessionContext);if(!l)return;if(i.hookName==="session_shutdown"){let u=tv(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,dL(l))}async applySubagentStatusBySessionId(i,l){let u=await this.adapter.getSession(i);if(!u)return;let c=Ar(l)?null:pt(),g=Ar(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=lL(i,l),b=pt(),{messagesPath:I}=this.manifestStore.artifacts.subagentArtifactPaths(g,l),T=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(T),this.manifestStore.initializeMessagesFile(T,I,b);let _=this.teamTaskQueueKey(i,l),E=this.teamTaskSessionsByAgent.get(_)??[];E.push(g),this.teamTaskSessionsByAgent.set(_,E)}async onTeamTaskEnd(i,l,u,c,g,b){let I=this.teamTaskQueueKey(i,l),T=this.teamTaskSessionsByAgent.get(I);if(!T||T.length===0)return;let _=T.shift();if(T.length===0)this.teamTaskSessionsByAgent.delete(I);if(!_)return;let E=g?.messages??b,A=this.toPersistedMessages(E,g,b);if(A)await this.manifestStore.persistSessionMessages(_,A);await this.applySubagentStatusBySessionId(_,u),this.teamTaskLastHeartbeatBySession.delete(_),this.teamTaskLastProgressLineBySession.delete(_)}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 T=c?.kind??"progress";if(T==="heartbeat"){let E=Date.now(),A=this.teamTaskLastHeartbeatBySession.get(b)??0;if(E-A<this.heartbeatLogIntervalMs)return;this.teamTaskLastHeartbeatBySession.set(b,E)}let _=T==="heartbeat"?"[progress] heartbeat":T==="text"?`[progress] text: ${I}`:`[progress] ${I}`;if(this.teamTaskLastProgressLineBySession.get(b)===_)return;this.teamTaskLastProgressLineBySession.set(b,_)}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)??Jq(tt(),"hooks.jsonl");Xq(l,`${JSON.stringify({ts:pt(),...i})}
|
|
280
|
+
`,"utf8")}}var j0=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 rj(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 T=I.index,_=i.slice(u,T);try{let E=X.parse(_);if(!E||typeof E!=="object"||Array.isArray(E))continue;j0.parse(E);let A=i.slice(T+I[0].length);g={frontmatter:_,body:A}}catch{}}if(g)return g;throw Error("Missing closing YAML frontmatter delimiter in agent config file.")}function Dv(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 sj(i){return i.trim().toLowerCase()}function ij(i){let l=ej(i).toLowerCase();return l===".yml"||l===".yaml"}function nj(i,l={}){let{frontmatter:u,body:c}=rj(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=j0.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:Dv(b.tools),skills:Dv(b.skills),providerId:b.providerId,modelId:b.modelId,maxIterations:b.maxIterations,systemPrompt:I,path:l.path}}function oj(i){let l=i.searchPaths??Za(i.workspaceRoot),u=new Map,c=[];for(let g of l.filter(Boolean)){if(!Yq(g))continue;let b;try{b=Qq(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()||!ij(I.name))continue;let T=tj(g,I.name);try{let _=Zq(T,"utf8"),E=nj(_,{path:T}),A=sj(E.name);if(!u.has(A))u.set(A,E)}catch(_){c.push({path:T,error:_ instanceof Error?_:Error(String(_))})}}}return{configs:Array.from(u.values()).sort((g,b)=>(g.path?Lv(g.path):g.name).localeCompare(b.path?Lv(b.path):b.name)),errors:c}}var up="subagent_",Xd=64,aj=t({prompt:e().trim().min(1).describe("Task for the subagent to perform")});function lj(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 dj(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 uj(i){let l=lj(i)||"agent",u=dj(i).slice(0,6),c=`${up}${l}`;if(c.length<=Xd)return c;let g=Xd-up.length-u.length-1,b=l.slice(0,Math.max(1,g));return`${up}${b}_${u}`.slice(0,Xd)}function cj(i){let l=new Set,u=[];for(let c of[...i].sort((g,b)=>g.name.localeCompare(b.name))){let g=uj(c.name),b=g,I=2;while(l.has(b)){let T=`_${I++}`,_=Math.max(1,Xd-T.length);b=`${g.slice(0,_)}${T}`}l.add(b),u.push({toolName:b,config:c})}return u}function pj(i,l){return{...i,providerId:l.providerId??i.providerId,modelId:l.modelId??i.modelId,maxIterations:l.maxIterations??i.maxIterations}}function mj(i){return cj(i.agents).map(({toolName:l,config:u})=>k({name:l,executionMode:"parallel",description:`Use the "${u.name}" subagent: ${u.description}`,inputSchema:S(aj),execute:async(c,g)=>{let b=i.configProvider.getRuntimeConfig(),I=NS(pj(b,u)),T=i.createSubAgentTools?await i.createSubAgentTools(u,c,g):[],_=$S({kind:"subagent",prompt:u.systemPrompt,configProvider:I,tools:T,maxIterations:u.maxIterations,parentAgentId:g.agentId,abortSignal:g.signal,onEvent:i.onSubAgentEvent,hookErrorMode:i.hookErrorMode}),E=_.getAgentId(),A=_.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 M=await _.run(c.prompt),O={text:M.text,iterations:M.iterations,finishReason:M.finishReason,usage:{inputTokens:M.usage.inputTokens,outputTokens:M.usage.outputTokens}};if(i.onSubAgentEnd)try{await i.onSubAgentEnd({subAgentId:E,conversationId:A,parentAgentId:C,input:N,result:O,agentResult:M})}catch{}return O}catch(M){if(i.onSubAgentEnd)try{await i.onSubAgentEnd({subAgentId:E,conversationId:A,parentAgentId:C,input:N,error:M instanceof Error?M:Error(String(M))})}catch{}throw M}},timeoutMs:300000,retryable:!1}))}function cc(i){let l=i.type;switch(l){case"agent_event":return!1;case"run_progress":return B0(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 hj(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 B0(i);default:return!1}}function B0(i){return i.type==="run_progress"&&i.run.status==="queued"}var Uv=4000;function Fv(i){return typeof i==="object"&&i!==null}function yd(i,l=0){return typeof i==="number"&&Number.isFinite(i)?i:l}function cp(i){return typeof i==="number"&&Number.isFinite(i)?i:void 0}function fj(i){return i.length>Uv?`${i.slice(0,Uv-3)}...`:i}function jo(i){if(!Fv(i))return;let l=Fv(i.usage)?i.usage:{},u=i.finishReason;return{text:fj(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:cp(l.cacheReadTokens),cacheWriteTokens:cp(l.cacheWriteTokens),totalCost:cp(l.totalCost)}}}function gj(i){if(i.result===void 0)return i;return{...i,result:jo(i.result)}}function Cu(i){switch(i.type){case"task_end":{let{messages:l,result:u,error:c,...g}=i;return{...g,result:jo(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:gj(i.run)};default:return i}}function Ns(){return new Date().toISOString()}function qv(i,l){if(l<=0)return 0;return Math.round(i/l*100)}function yj(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 vj(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},T=0,_=0;for(let D of l.members)if(u[D.status]+=1,D.role==="lead")T+=1;else _+=1;let E=[],A=[],C=l.tasks.filter((D)=>D.status==="completed").length,N=new Map(l.tasks.map((D)=>[D.id,D]));for(let D of l.tasks){if(c[D.status]+=1,D.status==="blocked"){E.push(D.id);continue}if(D.status!=="pending")continue;if(D.dependsOn.every((F)=>N.get(F)?.status==="completed"))A.push(D.id)}let M=[],O,L=0;for(let D of l.runs){if(g[D.status]+=1,D.status==="queued"||D.status==="running")M.push(D.id);let F=D.startedAt.getTime();if(F>=L)L=F,O=D.id}for(let D of l.outcomes)b[D.status]+=1;for(let D of l.outcomeFragments)I[D.status]+=1;return{teamName:i,updatedAt:Ns(),members:{total:l.members.length,byStatus:u,leadCount:T,teammateCount:_},tasks:{total:l.tasks.length,byStatus:c,blockedTaskIds:E,readyTaskIds:A,completionPct:qv(C,l.tasks.length)},runs:{total:l.runs.length,byStatus:g,activeRunIds:M,latestRunId:O},outcomes:{total:l.outcomes.length,byStatus:b,finalizedPct:qv(b.finalized,l.outcomes.length),missingRequiredSections:yj(l.outcomes,l.outcomeFragments)},fragments:{total:l.outcomeFragments.length,byStatus:I}}}function wj(i){let{event:l}=i;switch(l.type){case"team_task_updated":return{teamName:i.teamName,sessionId:i.sessionId,eventType:l.type,ts:Ns(),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:Ns(),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:Ns(),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:Ns(),outcomeId:l.outcome.id};case"outcome_fragment_attached":case"outcome_fragment_reviewed":return{teamName:i.teamName,sessionId:i.sessionId,eventType:l.type,ts:Ns(),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:Ns(),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:Ns(),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:Ns(),agentId:l.agentId}}return{teamName:i.teamName,sessionId:i.sessionId,eventType:l.type,ts:Ns()}}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 jv(i,l){return i?.abortRequested===!0||i?.status==="stopped"&&Sl(l)}function bj(i){if(i.finishReason==="aborted")return"cancelled";if(i.finishReason==="error")return"failed";return"completed"}var Ij=600000,Bv="recovered_queued";function kj(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 H0{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_${ur(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((T)=>T.toAgentId===i&&(!u||!T.readAt)),I=typeof g==="number"&&g>0?b.slice(Math.max(0,b.length-g)):b;if(c){let T=new Date,_=!1;for(let E of I)if(!E.readAt)E.readAt=T,this.dirty.mailbox.add(E.id),_=!0;if(_)this.notifyStateDirty()}return I.map((T)=>({...T}))}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:jo(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:Ij,consumePendingUserMessage:()=>{let I=this.members.get(i);if(!I||!I.pendingSteerMessage)return;let T=I.pendingSteerMessage;return I.pendingSteerMessage=void 0,T},onEvent:(I)=>{l.onEvent?.(I),this.emitEvent({type:"agent_event",agentId:i,event:I}),this.trackMeaningfulEvent(i,I)}},g=new lc(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),T=bj(I);if(this.emitEvent({type:"task_end",agentId:i,status:T,result:I}),T==="completed")this.recordProgressStep(i,`Completed a delegated run (${I.iterations} iterations)`,u?.taskId,!0);else if(T==="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=jv(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===Bv;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?kj(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=jo(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)&&jv(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 Hv(l);return{...u}}async awaitAllRuns(i=250){while(Array.from(this.runs.values()).some((l)=>["queued","running"].includes(l.status)))await Hv(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=Bv,!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 T of g){let _=b(T);if(_!==void 0)I.push({..._})}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 Hv(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 Sj(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}),Km(i);break}default:break}}async function Tj(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 _j=1000,zv=new WeakMap;function Ej(i,l,u,c,g=Date.now){let b=i.runtime.teamRuntime;if(!b)return;let I=()=>Aj(i,l,u,c),T=zv.get(b);if(!T)T={last:0},zv.set(b,T);if(cc(u)){T.pending=void 0,I();return}let _=g(),E=_j-(_-T.last);if(E<=0){T.last=_,T.pending=void 0,I();return}if(T.pending=I,!T.timer){let A=T;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 Aj(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:wj({teamName:b,sessionId:l,event:u}),summary:vj(b,g.exportState())}})}function Wm(i){return i.activeTeamRunIds.size>0||i.pendingTeamRunUpdates.length>0}function xj(i,l){if(i.aborting)return!1;if(!(l==="completed"||l==="max_iterations"))return!1;return i.config.enableAgentTeams===!0&&Wm(i)}function Km(i){let l=i.teamRunWaiters.splice(0);for(let u of l)u()}async function Cj(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 Rj(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 Gm(`System-delivered teammate async run updates:
|
|
286
|
+
${u.join(`
|
|
287
|
+
`)}
|
|
288
|
+
|
|
289
|
+
${g}`,i.config.mode)}function Gm(i,l){return or(i,l==="plan"?"plan":l==="yolo"?"yolo":"act")}function Dj(i){return Pj("sha1").update(i).digest("hex")}function z0(i){return Boolean(i&&typeof i==="object"&&"code"in i)}function Wv(i){return z0(i)&&i.code==="ENOENT"}function Kv(i){return z0(i)&&(i.code==="EACCES"||i.code==="EPERM")}class W0{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=Mj(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(!Wv(u)&&!Kv(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:T}=b;if(u.add(b.directoryPath),i.includeFile&&!i.includeFile(I,T))continue;try{let _=await Oj(T,"utf8"),E={type:i.type,directoryPath:b.directoryPath,fileName:I,filePath:T,content:_},A=i.parseFile(E),C=i.resolveId(A,E).trim();if(!C)continue;l.set(C,{type:i.type,id:C,item:A,filePath:T,fingerprint:Dj(_)})}catch(_){if(this.emitParseErrors)this.emit({kind:"error",type:i.type,error:_,filePath:T})}}}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 Nj(i,{withFileTypes:!0}),u=[];for(let c of l){let g=Lj(i,c.name);if(!(c.isFile()||c.isSymbolicLink()&&await $j(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(Wv(l)||Kv(l))return[];throw l}}}var Nl="SKILL.md",Bj="managed.json",Hj=new Set([".md",".markdown",".txt"]);function Ol(i){return i.trim().toLowerCase()}function wn(i){let l=i;return l?.code==="ENOENT"||l?.code==="ENOTDIR"||l?.code==="EACCES"||l?.code==="EPERM"||l?.code==="ELOOP"}function Pu(i){return Hj.has(Ru(i).toLowerCase())}function K0(i){let l=[],u=new Set;for(let c of i){let g=Bs(c);if(u.has(g))continue;u.add(g),l.push(c)}return l}function zj(i){let l=[...i?.directories??Vj(i?.workspacePath)];if(i?.pluginSkillDirectories)l.push(...i.pluginSkillDirectories);else if(i?.includePluginSkills)l.push(...RC({pluginPaths:i.pluginPaths,workspacePath:i.workspacePath,cwd:i.cwd??i.workspacePath}));if(i?.agentPluginSkills)l.push(...i.agentPluginSkills.map((u)=>u.directoryPath));return K0(l)}function Gv(i,l){let u=jj(i,l);return u===""||!u.startsWith("..")&&!qj(u)}async function Wj(i){try{let[l,u,c]=await Promise.all([pp(i.pluginRoot),pp(i.directoryPath),pp(i.filePath)]);if(l!==Bs(i.pluginRoot)||!Gv(l,u)||!Gv(l,c)||!(await Uo(u)).isDirectory()||!(await Uo(c)).isFile())return[];return[{directoryPath:i.directoryPath,fileName:Nl,filePath:c}]}catch(l){if(wn(l))return[];throw l}}async function Sf(i){try{let l=await If(i,{withFileTypes:!0}),u=[];for(let c of l){if(!c.isDirectory())continue;let g=Cr(i,c.name),b=Cr(g,Bj);try{let I=await Uj(b,"utf8"),T=JSON.parse(I);if(T&&typeof T==="object")u.push(g)}catch(I){if(wn(I))continue;if(I?.name==="SyntaxError")continue;throw I}}return u.sort((c,g)=>c.localeCompare(g))}catch(l){if(wn(l))return[];throw l}}function Tf(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 T=I instanceof Error?I.message:String(I);return{data:{},body:l,hadFrontmatter:!0,parseError:T}}}function Mu(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 Bo(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 Kj(i,l){if(Hs(i.filePath).toLowerCase()!==gt.toLowerCase())return Hs(i.filePath,Ru(i.filePath));if(l&&Bs(i.filePath)===Bs(l,gt))return"Workspace AGENTS.md";if(Bs(i.filePath)===Bs(Yn()))return"Global AGENTS.md";return Hs(i.filePath,Ru(i.filePath))}function Gj(i,l){let{data:u,body:c,parseError:g}=Tf(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=Mu(u.name,"name",!1)??l.trim();if(!I)throw Error("Missing skill name.");return{name:I,description:Mu(u.description,"description",!1),disabled:Bo(u.disabled,"disabled")??(Bo(u.enabled,"enabled")===!1?!0:void 0),instructions:b,frontmatter:u}}function Xj(i,l){let{data:u,body:c,parseError:g}=Tf(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=Mu(u.name,"name",!1)??l.trim();if(!I)throw Error("Missing rule name.");return{name:I,disabled:Bo(u.disabled,"disabled")??(Bo(u.enabled,"enabled")===!1?!0:void 0),instructions:b,frontmatter:u}}function Jj(i,l){let{data:u,body:c,parseError:g}=Tf(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=Mu(u.name,"name",!1)??l.trim();if(!I)throw Error("Missing workflow name.");return{name:I,disabled:Bo(u.disabled,"disabled")??(Bo(u.enabled,"enabled")===!1?!0:void 0),instructions:b,frontmatter:u}}function Vj(i){return Ir(i)}function Yj(i){return Sr(i)}function Qj(i){return Er(i)}async function G0(i){if(Hs(i)===".cline"){let l=await Sf(i);return(await Promise.all(l.map((u)=>G0(Cr(u,et))))).flat()}try{let l=await If(i,{withFileTypes:!0}),u=[];for(let c of l){if(c.isFile()&&c.name===Nl){u.push({directoryPath:i,fileName:c.name,filePath:Cr(i,c.name)});continue}let g=Cr(i,c.name);if(c.isDirectory()||c.isSymbolicLink()&&await Uo(g).then((b)=>b.isDirectory()).catch((b)=>{if(wn(b))return!1;throw b}))u.push({directoryPath:g,fileName:Nl,filePath:Cr(g,Nl)})}return u}catch(l){if(wn(l))return[];throw l}}async function Nu(i){if(Hs(i)===".cline"){let l=await Sf(i);return(await Promise.all(l.map((u)=>Nu(Cr(u,"rules.md"))))).flat()}try{if((await Uo(i)).isFile())return[{directoryPath:Fj(i),fileName:Hs(i),filePath:i}]}catch(l){if(!wn(l))throw l}try{let l=await If(i,{withFileTypes:!0}),u=[];for(let g of l){if(!Pu(g.name))continue;let b=Cr(i,g.name);if(!(g.isFile()||g.isSymbolicLink()&&await Uo(b).then((I)=>I.isFile()).catch(()=>!1)))continue;u.push({directoryPath:i,fileName:g.name,filePath:b})}let c=Cr(i,"AGENTS.md");try{if((await Uo(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(wn(l))return[];throw l}}async function Zj(i){if(Hs(i)===".cline"){let l=await Sf(i);return(await Promise.all(l.map((u)=>Nu(Cr(u,Hi))))).flat()}return Nu(i)}function eB(i){let l=zj(i),u=new Map((i?.agentPluginSkills??[]).map((g)=>[Bs(g.directoryPath),g])),c=i?.workspacePath?Cr(i.workspacePath,".cline"):void 0;return{type:"skill",directories:c?K0([...l,c]):l,discoverFiles:(g)=>{let b=u.get(Bs(g));return b?Wj(b):G0(g)},includeFile:(g)=>g===Nl,parseFile:(g)=>{let b=u.get(Bs(g.directoryPath));if(!b)return Gj(g.content,Hs(g.directoryPath));let I=XS(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 tB(i){let l=i?.directories??Yj(i?.workspacePath),u=i?.workspacePath?Cr(i.workspacePath,".cline"):void 0;return{type:"rule",directories:u?[...l,u]:l,discoverFiles:Nu,includeFile:(c,g)=>c===".clinerules"||Pu(c)||Pu(g),parseFile:(c)=>Xj(c.content,Kj(c,i?.workspacePath)),resolveId:(c)=>Ol(c.name)}}function rB(i){let l=i?.directories??Qj(i?.workspacePath),u=i?.workspacePath?Cr(i.workspacePath,".cline"):void 0;return{type:"workflow",directories:u?[...l,u]:l,discoverFiles:Zj,includeFile:(c)=>Pu(c),parseFile:(c)=>Jj(c.content,Hs(c.filePath,Ru(c.filePath))),resolveId:(c)=>Ol(c.name)}}function sB(i){let l=[eB(i?.skills),tB(i?.rules),rB(i?.workflows)];return new W0(l,{debounceMs:i?.debounceMs,emitParseErrors:i?.emitParseErrors})}function iB(i){return i.disabled!==!0}function X0(i){if(i.length===0)return"";return`
|
|
290
|
+
|
|
291
|
+
# Rules
|
|
292
|
+
${i.map((l)=>`## ${l.name}
|
|
293
|
+
${l.instructions}`).join(`
|
|
294
|
+
|
|
295
|
+
`)}`}function Xv(i,l){let u=i?.trim(),c=l?.trim();if(u&&c)return`${u}
|
|
296
|
+
|
|
297
|
+
${c}`;return u||c||void 0}function J0(i){return i.map((l)=>l.item).filter(iB).sort((l,u)=>l.name.localeCompare(u.name))}function V0(i){return X0(J0(i))}function nB(i){let l=i.getSnapshot("rule");return J0([...l.values()].map((u)=>({item:u.item})))}function oB(i){return X0(nB(i))}function zo(i){return i.trim().toLowerCase().replace(/\s+/g,"-").replace(/[^\p{L}\p{N}_.:@-]+/gu,"-").replace(/-+/g,"-").replace(/^-/,"").replace(/-$/,"")}function lB(i){let l=zo(i).replace(/[^a-z0-9_-]+/g,"-").replace(/^-/,"").replace(/-$/,""),u=aB("sha256").update(i).digest("hex").slice(0,12);return`${l||"command"}-${u}`}function dB(i,l){if(i.description?.trim())return Bn(i.description,".");if(l==="workflow")return;return Bn(i.instructions,".")}function uB(i){return i.disabled!==!0}function cB(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 Jv(i,l){return[...i.getSnapshot(l).entries()].map(([u,c])=>({id:u,record:c})).filter(({record:u})=>uB(u.item)).map(({id:u,record:c})=>({id:u,name:zo(c.item.name)||`${l}-${lB(u)}`,instructions:cB(c.item,l),description:dB(c.item,l),kind:l})).sort((u,c)=>u.name.localeCompare(c.name)||u.id.localeCompare(c.id))}function _f(i){let l=new Map;for(let u of[...Jv(i,"skill"),...Jv(i,"workflow")])if(!l.has(u.name))l.set(u.name,u);return[...l.values()].sort((u,c)=>u.name.localeCompare(c.name))}function pB(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=zo(g);if(!b)return i;let I=g.length+1,T=i.slice(I),_=_f(l).find((E)=>E.name===b);if(!_)return i;if(_.kind==="skill"&&u?.expandSkillCommands===!1)return i;return`${_.instructions}${T}`}function mB(i){return i.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">")}function Y0(i,l){let u=l?.trim(),c=u?`
|
|
299
|
+
<command-args>${u}</command-args>`:"",g=i.source?.type==="agent-plugin"?`
|
|
300
|
+
<skill-root>${mB(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 Ou(i){return i.trim().replace(/^\/+/,"").toLowerCase()}function hB(i){if(!i||i.length===0)return;let l=i.map(Ou).filter((u)=>u.length>0);return l.length>0?new Set(l):void 0}function fB(i,l,u){if(!u)return!0;let c=Ou(i),g=Ou(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 mc(i,l){let u=hB(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)=>fB(c.id,c.name,u))}function gB(i,l){return mc(i,l).filter((u)=>!u.disabled).map((u)=>u.name.trim()).filter((u)=>u.length>0).sort((u,c)=>u.localeCompare(c))}function yB(i,l,u){let c=Ou(l);if(!c)return{error:"Missing skill name."};let g=mc(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,T=g.filter(({id:A})=>{if(A===I)return!0;return A.endsWith(`:${I}`)}),_=T.filter(({skill:A})=>A.disabled!==!0);if(_.length===1){let{id:A,skill:C}=_[0];return{id:A,skill:C}}if(_.length>1)return{error:`Skill "${l}" is ambiguous. Use one of: ${_.map(({id:A})=>A).join(", ")}`};if(T.length===1){let{skill:A}=T[0];return{error:`Skill "${A.name}" is configured but disabled.`}}if(T.length>1)return{error:`Skill "${l}" is ambiguous, and all matches are disabled: ${T.map(({id:A})=>A).join(", ")}`};let E=gB(i,u);return{error:E.length>0?`Skill "${l}" not found. Available skills: ${E.join(", ")}`:"No skills are currently available."}}function Q0(i,l=Promise.resolve(),u){let c=new Set,g=async(b,I)=>{await l;let T=yB(i,b,u);if("error"in T)return T.error;let{id:_,skill:E}=T;if(c.has(_))return`Skill "${E.name}" is already running.`;c.add(_);try{return Y0(E,I)}finally{c.delete(_)}};return Object.defineProperty(g,"configuredSkills",{get:()=>mc(i,u).map(({skill:b,...I})=>I),enumerable:!0,configurable:!1}),g}function vB(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:()=>oB(i.watcher)});if(i.registerSkillsTool)u.registerTool(ic(Q0(i.watcher,l,i.allowedSkillNames)));for(let c of _f(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 Vv(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,T)=>{let _=wd(b);if(!_)return"Missing skill name.";let E=c(),A=E.filter(({metadata:O})=>wd(O.id)===_),C=A.length>0?A:E.filter(({metadata:O})=>{let L=wd(O.id);return wd(O.name)===_||L.endsWith(`:${_}`)}),N=C.filter(({metadata:O})=>!O.disabled);if(N.length===1)return N[0].executor(N[0].metadata.id,I,T);if(N.length>1)return`Skill "${b}" is ambiguous. Use one of: ${N.map(({metadata:O})=>O.id).join(", ")}`;if(C.length>0)return`Skill "${b}" is configured but disabled.`;let M=E.filter(({metadata:O})=>!O.disabled).map(({metadata:O})=>O.id).sort((O,L)=>O.localeCompare(L));return M.length>0?`Skill "${b}" not found. Available skills: ${M.join(", ")}`:"No skills are currently available."};return Object.defineProperty(g,"configuredSkills",{get:()=>c().map(({metadata:b})=>b),enumerable:!0,configurable:!1}),g}function wB(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=zo(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)=>Vv(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:()=>V0(l("rule"))});if(c.registerSkillsTool)g.registerTool(ic(Vv(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 T=I.trim();return T?`${b.instructions}
|
|
308
|
+
|
|
309
|
+
${T}`:b.instructions}})}})}}class Z0{watcher;ready;stopped=!1;constructor(i){this.watcher=sB(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 _f(this.watcher)}resolveRuntimeSlashCommand(i,l){return pB(i,this.watcher,l)}hasConfiguredSkills(i){return mc(this.watcher,i).some((l)=>!l.disabled)}createSkillsExecutor(i){return Q0(this.watcher,(this.ready??Promise.resolve()).catch(()=>{}),i)}createExtension(i){return vB({...i,watcher:this.watcher,watcherReady:(this.ready??Promise.resolve()).catch(()=>{})})}}function Xm(i){return new Z0(i)}var bB=["model","app"];function eT(){return{extensions:{["io.modelcontextprotocol/ui"]:{mimeTypes:["text/html;profile=mcp-app"]}}}}function tT(i){try{return new URL(i).protocol==="ui:"}catch{return!1}}function IB(i){return typeof i==="object"&&i!==null&&!Array.isArray(i)}function Ef(i){let l=i._meta?.ui;if(!IB(l))return;let u=typeof l.resourceUri==="string"&&tT(l.resourceUri)?l.resourceUri:void 0,c=Array.isArray(l.visibility)?l.visibility.filter((g)=>g==="model"||g==="app"):bB;return{resourceUri:u,visibility:c}}function rT(i){return Ef(i)?.visibility.includes("model")??!0}function kB(i){return Ef(i)?.visibility.includes("app")??!0}CI();function iT(i){return Ue(i)*1000}function Yv(i,l,u){if(!(i instanceof q)||i.code!==Y.RequestTimeout)return i;return new q(i.code,qi(l,u),i.data)}var EB=new Set([301,302,303,307,308]),Qv=20,AB=new Set(["authorization","cookie","proxy-authorization"]),xB=new Set(["mcp-protocol-version","mcp-session-id"]);function CB(i){if(!i.headers||!i.restrictConfiguredHeadersToOrigin)return i.headers;let l=Object.entries(i.headers).filter(([u])=>{let c=u.toLowerCase();if(xB.has(c))return!1;return c!=="authorization"||!i.oauthProvider});return l.length>0?Object.fromEntries(l):void 0}function RB(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((T,_)=>{let E=_.toLowerCase();if(u.has(E)||AB.has(E))I.push(_)});for(let T of I)b.delete(T)};return async(b,I)=>{let T=b instanceof Request?new Request(b,I):new Request(String(b),I),_=new URL(T.url),E=T.method,A=E==="GET"||E==="HEAD"?void 0:await T.clone().arrayBuffer(),C=new Headers(T.headers);if(_.origin!==l)g(C);for(let N=0;;N+=1){let M=await c(_,{method:E,headers:C,body:A,redirect:"manual",signal:T.signal});if(!EB.has(M.status))return M;if(N>=Qv)throw await M.body?.cancel().catch(()=>{return}),Error(`MCP endpoint exceeded ${Qv} redirects.`);let O=M.headers.get("location");if(!O)return M;let L=new URL(O,_);if(await M.body?.cancel().catch(()=>{return}),L.origin!==l)g(C);if(M.status===303&&E!=="GET"&&E!=="HEAD"||(M.status===301||M.status===302)&&E==="POST")E="GET",A=void 0,C.delete("content-length"),C.delete("content-type");_=L}}}function PB(i){return{client_name:"Cline",redirect_uris:[i],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"}}function Zv(i){return i?{client_id:i.clientId,...i.clientSecret?{client_secret:i.clientSecret}:{}}:void 0}function Jd(i,l){return i?.client_id===l?.client_id&&i?.client_secret===l?.client_secret}function il(i,l,u){if(!Jd(l.clientInformation,u))throw new Gu(i)}function ew(i){let l={};try{l=hA(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(T)=>{try{l=await gA(i.serverName,T,{filePath:i.settingsPath,expectedOAuthClient:b})}catch(_){if(i.settingsPath||_ instanceof Gu)throw _;l=Ku(T(l))??{}}};return{provider:{get redirectUrl(){return l.redirectUrl??i.redirectUrl},get clientMetadata(){return PB(l.redirectUrl??i.redirectUrl)},state:()=>(c=_B(),c),clientInformation:g,saveClientInformation:async(T)=>{let _=l.clientInformation;await I((E)=>{il(i.serverName,E,_);let A=!Jd(E.clientInformation,T);return{...E,clientInformation:T,...A?{tokens:void 0,lastAuthenticatedAt:void 0}:{},redirectUrl:i.redirectUrl,lastError:void 0}})},tokens:()=>g()?.client_id&&Jd(l.clientInformation,g())?l.tokens:void 0,saveTokens:async(T)=>{let _=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:T,clientInformation:E,redirectUrl:i.redirectUrl,lastError:void 0,lastAuthenticatedAt:_}})},redirectToAuthorization:async(T)=>{u=T.toString(),await i.onAuthorizationUrl?.(u)},saveCodeVerifier:async(T)=>{let _=g();await I((E)=>(il(i.serverName,E,_),{...E,codeVerifier:T,redirectUrl:i.redirectUrl}))},codeVerifier:()=>{if(!l.codeVerifier)throw Error(`Missing OAuth code verifier for MCP server "${i.serverName}".`);return l.codeVerifier},invalidateCredentials:async(T)=>{let _=l.clientInformation;await I((E)=>{if(il(i.serverName,E,_),T==="all")return{lastError:E.lastError,redirectUrl:E.redirectUrl};return{...E,...T==="client"?{clientInformation:void 0}:{},...T==="tokens"?{tokens:void 0,lastAuthenticatedAt:void 0}:{},...T==="verifier"?{codeVerifier:void 0}:{},...T==="discovery"?{discoveryState:void 0}:{}}})},saveDiscoveryState:async(T)=>{let _=l.clientInformation;await I((E)=>(il(i.serverName,E,_),{...E,discoveryState:T}))},discoveryState:()=>l.discoveryState},getLastAuthorizationUrl:()=>u,getLastOAuthState:()=>c,resetInteractiveState:async()=>{await I((T)=>{let _=i.clientInformation,E=_!==void 0&&!Jd(T.clientInformation,_);return{...T,..._?{clientInformation:_}:{},...E?{tokens:void 0,lastAuthenticatedAt:void 0}:{},codeVerifier:void 0,discoveryState:void 0,lastError:void 0,redirectUrl:i.redirectUrl}})},markError:async(T)=>{await I((_)=>({..._,lastError:T}))},markConnectionError:async(T)=>{await I((_)=>({..._,lastError:T,authorizationRequired:void 0}))},markAuthorizationRequired:async(T)=>{await I((_)=>({..._,lastError:T,authorizationRequired:!0}))},clearError:async()=>{await I((T)=>({...T,lastError:void 0,authorizationRequired:void 0}))}}}function MB(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=CB({headers:l.headers,oauthProvider:i.oauthProvider,restrictConfiguredHeadersToOrigin:i.restrictConfiguredHeadersToOrigin}),c=u?{headers:u}:void 0,g=i.restrictConfiguredHeadersToOrigin&&u?RB({endpointUrl:l.url,configuredHeaders:u,baseFetch:i.fetch}):i.fetch,b=i.oauthProvider?g:async(I,T)=>{let _=await(g??globalThis.fetch)(I,T);if(_.status===401)throw await _.body?.cancel().catch(()=>{return}),new ot("MCP server requires authorization");return _};if(l.type==="sse")return new Ko(new URL(l.url),{authProvider:i.oauthProvider,requestInit:c,eventSourceInit:{fetch:(I,T)=>(g??globalThis.fetch)(I,T)},fetch:b});return new Ho(new URL(l.url),{authProvider:i.oauthProvider,requestInit:c,fetch:b})}function tw(i){return i instanceof ot||i instanceof go&&i.code===401}var NB="2024-11-05",OB=1e4,$B=1e4,rw="http://127.0.0.1:1456/mcp/oauth/callback",sw=250,mp=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 LB(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 iw(i){return Buffer.from(`${JSON.stringify(i)}
|
|
310
|
+
`,"utf8")}function nw(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 Jm{buffer="";decoder=new sT("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 Vm{buffer="";decoder=new sT("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 nT{registration;process;processClose;nextRequestId=1;pending=new Map;framedParser=new Jm;newlineParser=new Vm;stderrBuffer="";stdinFailure;stdinFailureTimer;connected=!1;protocolMode="newline";requestTimeoutMs;connectAttemptTimeoutMs;mcpApps;constructor(i,l=!1){this.registration=i,this.mcpApps=l,this.requestTimeoutMs=iT(i.timeoutSeconds),this.connectAttemptTimeoutMs=Ve(i.timeoutSeconds)?this.requestTimeoutMs:OB}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:NB,capabilities:this.mcpApps?eT():{},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(()=>{}),LB(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 TB(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,mp))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,sw))return;if(i.kill(),await bd(l,mp))return;if(i.kill("SIGKILL"),!await bd(l,mp))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=ga.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 Jm,this.newlineParser=new Vm,this.stderrBuffer="",this.stdinFailure=void 0,this.clearStdinFailureTimer(),this.protocolMode=i;let u=process.platform==="win32"?{windowsHide:!0,shell:!0}:{},c=SB(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(()=>{})},sw),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}:{}},T=new Promise((_,E)=>{let A=setTimeout(()=>{this.takePending(b),E(this.createTimeoutError(i,u))},u),C=c?()=>{let N=this.takePending(b);if(!N)return;let M=c.reason instanceof Error?c.reason:Object.assign(Error(`MCP request aborted for "${this.registration.name}" (${i}).`),{name:"AbortError"});N.reject(M)}:void 0;if(this.pending.set(b,{resolve:_,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 T;try{g.stdin.write(this.protocolMode==="framed"?nw(I):iw(I))}catch(_){let E=this.takePending(b);if(E)E.reject(_ instanceof Error?_:Error(String(_)))}return T}createTimeoutError(i,l){return Error(qi(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"?nw(c):iw(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 oT{registration;options;client;authContext;requestTimeoutMs;connectAttemptTimeoutMs;constructor(i,l){this.registration=i,this.options=l,this.requestTimeoutMs=iT(i.timeoutSeconds),this.connectAttemptTimeoutMs=Ve(i.timeoutSeconds)?this.requestTimeoutMs:$B}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=ew({settingsPath:this.options.settingsPath,serverName:this.registration.name,redirectUrl:this.registration.oauth?.redirectUrl??rw,clientInformation:Zv(this.registration.oauthClient)});this.authContext=i;let l=await i.provider.tokens()?i.provider:void 0,u;try{u=new un({name:this.options.clientName?.trim()||"@cline/core",version:this.options.clientVersion?.trim()||"0.0.0"},this.options.mcpApps?{capabilities:eT()}:void 0);let c=MB({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=Yv(c,this.registration.name,this.connectAttemptTimeoutMs),b=tw(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??ew({settingsPath:this.options.settingsPath,serverName:this.registration.name,redirectUrl:this.registration.oauth?.redirectUrl??rw,clientInformation:Zv(this.registration.oauthClient)}),u=Yv(i,this.registration.name,this.requestTimeoutMs),c=tw(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 ow(i={}){return(l)=>l.transport.type==="stdio"?new nT(l,i.mcpApps):new oT(l,i)}CI();var DB=5000;function Gt(){return Date.now()}function UB(i){return i.map((l)=>({name:l.name,description:l.description,inputSchema:l.inputSchema,...l._meta?{_meta:l._meta}:{}}))}class aT{toolsCacheTtlMs;clientFactory;servers=new Map;operationLocks=new Map;constructor(i){this.clientFactory=i.clientFactory,this.toolsCacheTtlMs=i.toolsCacheTtlMs??DB}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:Gt()});return}let u=JSON.stringify(l.registration.transport)!==JSON.stringify(i.transport),c=Ve(l.registration.timeoutSeconds)!==Ve(i.timeoutSeconds)||Ue(l.registration.timeoutSeconds)!==Ue(i.timeoutSeconds);if(l.registration={...i},l.updatedAt=Gt(),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=Gt(),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&&Gt()-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=UB(u);return l.toolCache=c,l.toolCacheUpdatedAt=Gt(),l.updatedAt=Gt(),c})}async callTool(i){return this.runExclusive(i.serverName,async()=>{let l=this.requireServer(i.serverName),u=await this.ensureConnectedClient(l);return l.updatedAt=Gt(),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=Gt(),!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=Gt();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=Gt()}catch(u){throw await l?.disconnect().catch(()=>{}),i.status="disconnected",i.lastError=u instanceof Error?u.message:String(u),i.updatedAt=Gt(),u}}async disconnectState(i){if(!i.client){i.status="disconnected",i.updatedAt=Gt();return}try{await i.client.disconnect()}finally{i.status="disconnected",i.updatedAt=Gt()}}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 FB(i){let l=new Set(i.serverNames),u=i.nameTransform??Zh,c=new Map;for(let[I,T]of i.agentTools)for(let _ of T.filter(rT)){let E=Ef(_)?.resourceUri;c.set(u({serverName:I,toolName:_.name}),E?{serverName:I,toolName:_.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,T){return(await i.manager.listTools(I)).find((_)=>_.name===T)}return{async resolveTool(I){return c.get(I)},async readResource(I){if(g(I.serverName),!tT(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 T=await b(I.serverName,I.toolName);if(!T)throw Error(`MCP tool "${I.toolName}" was not found on server "${I.serverName}".`);if(!kB(T))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 qB(i,l){let u=l.description?.trim();if(u)return u;return`Execute MCP tool "${l.name}" from server "${i}".`}async function jB(i){let l=await i.provider.listTools(i.serverName),u=i.nameTransform??Zh;return l.filter(rT).map((c)=>{let g=u({serverName:i.serverName,toolName:c.name});return k({name:g,resultPolicy:"cache-oversized",description:qB(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 XB(){return be()}function JB(i){let l=Bt(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 T={agentId:b.trim(),rolePrompt:I};if(typeof g.modelId==="string"&&g.modelId.trim())T.modelId=g.modelId.trim();if(typeof g.maxIterations==="number"&&Number.isFinite(g.maxIterations))T.maxIterations=Math.max(1,Math.floor(g.maxIterations));u.push(T)}return u}function uw(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 lT=2000,VB=2592000000,cw=["agent_event","run_progress"],pw=2,YB=["team_tasks","team_runs","team_outcomes","team_outcome_fragments","team_mailbox","team_mission_log"];function so(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 Bt(i)??l}var ol=(i)=>typeof i==="string"?i:"";function mw(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 dT{teamDirPath;db;retentionPerTeam;retentionMs;constructor(i={}){this.teamDirPath=i.teamDir??XB(),this.retentionPerTeam=i.eventRetentionPerTeam??lT,this.retentionMs=i.eventRetentionMs??VB}init(){this.getRawDb()}close(){this.db?.close?.(),this.db=void 0}ensureTeamDir(){if(!WB(this.teamDirPath))KB(this.teamDirPath,{recursive:!0});return this.teamDirPath}dbPath(){return GB(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)<pw)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,mw(uw(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 (${cw.map(()=>"?").join(",")})`).run(...cw);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 T=nl(g.get(I)?.payload_json,void 0);if(T&&typeof T==="object")b.run(JSON.stringify(Cu(T)),I)}i.prepare("UPDATE team_store_schema_version SET version = ? WHERE lock = 1").run(pw),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=Qr(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 T=nl(I.data_json,void 0);return T===void 0?[]:[T]});try{return uw({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 ?",[Qr(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=Qr(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?JB(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, ?)`,[Qr(i),x(),l,JSON.stringify(u),c??null])}persistBatch(i,l){let u=Qr(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=Qr(i),g=this.getRawDb();this.withTransaction(()=>{this.writeDelta(g,c,mw(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 YB)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,so(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:jo(b.result)};g.run(l,I.id,I.agentId,I.taskId??null,I.status,I.message,so(I.startedAt),so(I.endedAt),I.error??null,I.leaseOwner??null,so(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}),so(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,so(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=Qr(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),T=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,T,u,ol(b.run_id)])}}),c.map((b)=>ol(b.run_id))}handleTeamEvent(i,l){if(!cc(l))return;this.appendTeamEvent(i,l.type,Cu(l)),this.pruneTeamEvents(this.getRawDb(),Qr(i))}}var hw=4194304;function fw(){return new Date().toISOString()}function gw(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 uT{teamDirPath;constructor(i={}){this.teamDirPath=i.teamDir??hn()}init(){this.ensureTeamDir()}listTeamNames(){if(!ro(this.teamDirPath))return[];return HB(this.teamDirPath,{withFileTypes:!0}).filter((i)=>i.isDirectory()).filter((i)=>ro(this.statePath(i.name))).map((i)=>i.name).sort()}readState(i){let l=this.readEnvelope(i);return l?.teamState?gw(l.teamState):void 0}readHistory(i,l=200){let u=this.historyPath(i);if(!ro(u))return[];return hp(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?gw(l.teamState):void 0,teammates:l?.teammates??[],interruptedRunIds:[]}}handleTeamEvent(i,l){if(!cc(l))return;this.appendHistory(i,[{type:l.type,payload:Cu(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=fw(),c=this.historyPath(i);BB(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=zB(i).size}catch{return}if(l<hw)return;let u=hp(i,"utf8").split(`
|
|
482
|
+
`).filter(Boolean),c=[],g=0;for(let I=u.length-1;I>=0&&c.length<lT;I--){let T=u[I];if(g+=Buffer.byteLength(T,"utf8")+1,g>hw/2&&c.length>0)break;c.push(T)}c.reverse();let b=`${i}.tmp`;dw(b,`${c.join(`
|
|
483
|
+
`)}
|
|
484
|
+
`,"utf8"),lw(b,i)}persistRuntime(i,l,u){this.ensureTeamSubdir(i);let c={version:1,updatedAt:fw(),teamState:{...l,runs:l.runs.map((I)=>({...I,result:jo(I.result)}))},teammates:u},g=this.statePath(i),b=`${g}.tmp`;dw(b,`${JSON.stringify(c,null,2)}
|
|
485
|
+
`,"utf8"),lw(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(!ro(this.teamDirPath))aw(this.teamDirPath,{recursive:!0});return this.teamDirPath}ensureTeamSubdir(i){let l=fp(this.ensureTeamDir(),Qr(i));if(!ro(l))aw(l,{recursive:!0});return l}statePath(i){return fp(this.ensureTeamDir(),Qr(i),"state.json")}historyPath(i){return fp(this.ensureTeamDir(),Qr(i),"task-history.jsonl")}readEnvelope(i){let l=this.statePath(i);if(!ro(l))return;try{let u=JSON.parse(hp(l,"utf8"));if(u?.version===1&&u.teamState)return u}catch{}return}}function QB(i={}){try{let l=new dT(i);return l.init(),l}catch{let l=new uT({teamDir:i.teamDir});return l.init(),l}}var ZB=300,eH=60000,yw=5000;class cT{opts;pendingEvents=[];teammatesDirty=!1;timer;lastFlushAt=0;disposed=!1;constructor(i){this.opts={batchMs:ZB,telemetryFlushMs:eH,now:Date.now,...i}}onEvent(i){if(this.disposed)return;if(!cc(i)){if(this.opts.now()-this.lastFlushAt>=this.opts.telemetryFlushMs)this.schedule();return}if(this.pendingEvents.push({type:i.type,payload:Cu(i)}),hj(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>yw?b.slice(-yw):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 pT(i,l){let u=l?.["*"]??{},c=l?.[i]??{};return{...u,...c}.enabled!==!1}function tH(i,l){return i.filter((u)=>pT(u.name,l))}function Ym(i,l){return Yu(tH(i,l))}var rH={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 sH(i){let l=i.trim().toLowerCase();return rH[l]??l}function iH(i,l){if(l.tools===void 0)return i;let u=new Set(l.tools.map(sH));if(l.skills!==void 0)u.add("skills");return i.filter((c)=>u.has(c.name))}function nH(){return`team-${R(5)}`}function Vd(i,l,u,c,g,b,I,T,_,E){let A=of[af({mode:u})],C=j$(l,c,u,g??F$);return Ym(FS({cwd:i,telemetry:_,executorOptions:{bash:{executionController:E}},...A,enableSkills:!!I,...C,executors:{...I?{skills:I}:{},...T??{}}}),b)}function oH(i){return Vd(i.cwd,i.providerId,i.mode,i.modelId,i.toolRoutingRules,i.toolPolicies,aH,i.toolExecutors).some((l)=>l.name==="skills")}var aH=async()=>"";async function lH(i){let l=ln(),u=i.includeSettings&&_I({filePath:l});if(!u&&!i.agentPluginServers?.length)return{tools:[]};let c=ow({settingsPath:l,mcpApps:i.mcpApps}),g=ow({restrictConfiguredHeadersToOrigin:!0,mcpApps:i.mcpApps}),b=new aT({clientFactory:(N)=>N.metadata?.source==="agent-plugin"?g(N):c(N)}),I=[];if(u)try{I=await yA(b,{filePath:l})}catch(N){let M=N instanceof Error?N.message:String(N);i.logger?.log(`[mcp] Failed to load MCP settings, skipping settings-backed MCP tools: ${M}`)}let T=new Set(I.map((N)=>N.name));for(let N of i.agentPluginServers??[]){let M=N.registration;if(T.has(M.name)){i.logger?.log(`[agent-plugins] MCP server '${M.name}' conflicts with an existing server and was skipped.`,{severity:"error"});continue}try{await b.registerServer(M),I.push(M),T.add(M.name)}catch(O){let L=O instanceof Error?O.message:String(O);i.logger?.log(`[agent-plugins] Failed to register MCP server '${M.name}', skipping: ${L}`,{severity:"error"})}}if(I.length===0)return await b.dispose().catch(()=>{}),{tools:[]};let _=I.filter((N)=>N.disabled!==!0),E=await Promise.allSettled(_.map(async(N)=>{let M=await b.listTools(N.name),O=await jB({serverName:N.name,provider:{listTools:async()=>M,callTool:(L)=>b.callTool(L)},timeoutMs:Ue(N.timeoutSeconds)*1000});return{descriptors:M,tools:O}})),A=[],C=new Map;for(let[N,M]of E.entries())if(M.status==="fulfilled")A.push(...M.value.tools),C.set(_[N].name,M.value.descriptors);else{let O=M.reason instanceof Error?M.reason.message:String(M.reason);i.logger?.log(`[mcp] Failed to load tools from MCP server "${_[N].name}", skipping: ${O}`)}return{tools:A,...i.mcpApps?{mcpApps:FB({manager:b,serverNames:_.map((N)=>N.name),agentTools:C,isToolEnabled:(N)=>pT(N,i.toolPolicies)&&!i.disabledToolNames?.has(N)})}:{},shutdown:async()=>{await b.dispose()}}}function dH(i,l){if(!i)return;for(let u of i.getTeammateIds())try{i.shutdownTeammate(u,l)}catch{}}function uH(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 cH(i){let l=of[af({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 mT{teamRuntimeEntries=new Map;async build(i){let{config:l,hooks:u,extensions:c,logger:g,telemetry:b,createSpawnTool:I,onTeamRestored:T,userInstructionService:_,configExtensions:E,toolExecutors:A}=i,C=i.onTeamEvent??(()=>{}),N=cH(l),M=[];if(N.enableTools&&N.mode!=="yolo"&&$I("web_search")&&ii({providerId:l.providerId,modelId:l.modelId},"web_search"))M.push({name:"web_search"});if(N.enableTools&&ii({providerId:l.providerId,modelId:l.modelId},"image_generation"))M.push({name:"image_generation",outputFormat:"png"});let O=l.workspaceRoot??l.cwd,L=i.toolPolicies??l.toolPolicies,D=ed(),F=[],j=l.teamName?.trim()||nH(),B=l.sessionId?.trim()||j,Q=N.enableSpawnAgent?oj({workspaceRoot:O}):{configs:[],errors:[]},H=Q.configs.some((Ie)=>Ie.skills!==void 0),z=Id(E,"rules"),te=Id(E,"skills"),ee=te||H,oe=Id(E,"workflows"),G=Id(E,"plugins"),se=z||te||oe,Ne=!1,De=[],Te=_,le,ke;for(let Ie of Q.errors)(g??l.logger)?.log?.(`[agents] Failed to load agent config at ${Ie.path}: ${Ie.error.message}`);if(!Te&&(se||H))Te=Xm({skills:ee?{workspacePath:O,includePluginSkills:G,pluginSkillDirectories:G?i.pluginSkillDirectories:void 0,pluginPaths:l.pluginPaths,cwd:l.cwd,agentPluginSkills:G?i.agentPluginSkills:void 0}:{workspacePath:O},rules:{workspacePath:l.cwd},workflows:{workspacePath:l.cwd}}),De.push(Te);else if(Te&&G&&i.agentPluginSkills?.length&&(se||H)){let Ie=Xm({skills:{directories:[],agentPluginSkills:i.agentPluginSkills},rules:{directories:[]},workflows:{directories:[]}});De.push(Ie),Te=wB([Te,Ie])}if(Te)await Te.start().catch(()=>{});let we=N.enableTools&&te&&Boolean(Te)&&Te?.hasConfiguredSkills(l.skills)===!0&&oH({cwd:l.cwd,providerId:l.providerId,mode:N.mode,modelId:l.modelId,toolRoutingRules:l.toolRoutingRules,toolPolicies:L,toolExecutors:A}),Xe=Te&&se?Te.createExtension({includeRules:z,includeSkills:te,includeWorkflows:oe,registerSkillsTool:we,allowedSkillNames:l.skills}):void 0,ve=N.mode==="plan"&&N.enableTools?EN({telemetry:b??l.telemetry}):void 0,Se=[Xe,ve].filter((Ie)=>Ie!==void 0),Ee=Se.length>0?[...c??l.extensions??[],...Se]:c??l.extensions;if(N.enableTools){F.push(...Vd(l.cwd,l.providerId,N.mode,l.modelId,l.toolRoutingRules,L,void 0,A,b??l.telemetry,i.runCommandExecutionController));let Ie=G?i.agentPluginMcpServers:void 0;if(!N.disableMcpSettingsTools||Ie?.length){let Le=await lH({logger:l.logger,includeSettings:!N.disableMcpSettingsTools,mcpApps:N.mcpApps,toolPolicies:L,disabledToolNames:D,agentPluginServers:Ie});F.push(...Le.tools),le=Le.shutdown,ke=Le.mcpApps}}let Ae,Be=N.enableAgentTeams?QB():void 0,Ye=Be?.loadRuntime(B),xt=Ye?.state,vt=Ye?.teammates??[],Nr=new Map(vt.map((Ie)=>[Ie.agentId,Ie])),bt=Be?new cT({teamKey:B,store:Be,source:()=>Ae,teammates:()=>Array.from(Nr.values()),onError:(Ie)=>(g??l.logger)?.log?.(`[team] failed to persist team state: ${Ie instanceof Error?Ie.message:String(Ie)}`)}):void 0,Ct=l.sessionId||j,Kr,Or=[],Cs=!1,Re=NS({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:Ee,logger:g??l.logger,telemetry:i.telemetry??l.telemetry,workspaceMetadata:l.workspaceMetadata});if(N.enableSpawnAgent){if(Q.configs.length>0)F.push(...Ym(mj({configProvider:Re,agents:Q.configs,createSubAgentTools:(Ie)=>N.enableTools?iH(Vd(l.cwd,Ie.providerId??l.providerId,N.mode,Ie.modelId??l.modelId,l.toolRoutingRules,L,Ie.skills!==void 0&&Te?.createSkillsExecutor?Te.createSkillsExecutor(Ie.skills):void 0,A,b??l.telemetry,i.runCommandExecutionController),Ie):[],hookErrorMode:l.hookErrorMode,onSubAgentEvent:i.onSubAgentEvent,onSubAgentStart:i.onSubAgentStart,onSubAgentEnd:i.onSubAgentEnd}),L))}if(!this.teamRuntimeEntries.has(Ct))this.teamRuntimeEntries.set(Ct,{delegatedAgentConfigProvider:Re});let Rt=()=>{if(!N.enableAgentTeams)return;let Ie=this.teamRuntimeEntries.get(Ct)??{delegatedAgentConfigProvider:Re};if(this.teamRuntimeEntries.set(Ct,Ie),Ae=Ie.runtime,!Ae){if(Ae=new H0({teamName:j,leadAgentId:l.sessionId||"lead",missionLogIntervalSteps:N.missionLogIntervalSteps,missionLogIntervalMs:N.missionLogIntervalMs,onStateDirty:()=>bt?.markStateDirty(),onTeamEvent:(Le)=>{if(C(Le),bt){if(Le.type==="teammate_spawned"&&Le.teammate?.rolePrompt){let Jr={agentId:Le.agentId,rolePrompt:Le.teammate.rolePrompt,modelId:Le.teammate.modelId,maxIterations:Le.teammate.maxIterations};Nr.set(Jr.agentId,Jr),bt.markTeammatesDirty()}if(Le.type==="teammate_shutdown"&&!uH(Le.reason))Nr.delete(Le.agentId),bt.markTeammatesDirty();bt.onEvent(Le)}}}),xt)Ae.hydrateState(xt),Cs=!0;Ie.runtime=Ae}if(!Ne){if(!Ae)return;Ne=!0;let Le=Y1({runtime:Ae,leadAgentId:l.sessionId||"lead",restoredFromPersistence:Boolean(xt),restoredTeammates:vt,includeLeadSpawnTool:!0,includeLeadManagementTools:!0,onLeadToolsUnlocked:(Jr)=>{Or=Jr,Kr?.addTools(Jr)},createBaseTools:N.enableTools?()=>Vd(l.cwd,l.providerId,N.mode,l.modelId,l.toolRoutingRules,L,void 0,A,b??l.telemetry,i.runCommandExecutionController):void 0,teammateConfigProvider:Re});if(Cs)Ae.recoverActiveRuns("runtime_recovered");if(Le.restoredFromPersistence)T?.();F.push(...Le.tools)}return Ae};if(N.enableSpawnAgent&&I){let Ie=I();F.push({...Ie,execute:async(Le,Jr)=>(Rt(),Ie.execute(Le,Jr))})}if(N.enableAgentTeams)Rt();let Gr=Ym(F,L),de=Gr.some((Ie)=>Ie.name==="submit_and_exit"&&Ie.lifecycle?.completesRun===!0),Fe=N.enableAgentTeams?()=>{let Ie=this.teamRuntimeEntries.get(Ct)?.runtime;if(!Ie)return;let Le=Ie.listTasks(),Jr=Le.some((Qe)=>Qe.status==="in_progress"||Qe.status==="pending"),Tn=Ie.listRuns({}),bc=Tn.some((Qe)=>Qe.status==="running"||Qe.status==="queued");if(Jr||bc){let Qe=Le.filter(($r)=>$r.status==="in_progress"||$r.status==="pending").map(($r)=>`${$r.id} (${$r.status}): ${$r.title}`).join(", "),zs=Tn.filter(($r)=>$r.status==="running"||$r.status==="queued").map(($r)=>`${$r.id} (${$r.status})`).join(", "),Ic=[];if(Qe)Ic.push(`Unfinished tasks: ${Qe}`);if(zs)Ic.push(`Active runs: ${zs}`);return`[SYSTEM] You still have team obligations. ${Ic.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,mt=de?{requireCompletionTool:!0,...Fe?{completionGuard:Fe}:{}}:Fe?{completionGuard:Fe}:void 0;return{tools:Gr,modelTools:M,logger:g??l.logger,telemetry:b??l.telemetry,teamRuntime:Ae,teamRestoredFromPersistence:Boolean(xt),delegatedAgentConfigProvider:this.teamRuntimeEntries.get(Ct)?.delegatedAgentConfigProvider??Re,extensions:Ee,completionPolicy:mt,mcpApps:ke,registerLeadAgent:(Ie)=>{if(Kr=Ie,Or.length>0)Ie.addTools(Yu(Or,[...D]))},shutdown:async(Ie)=>{dH(Ae,Ie),bt?.dispose(),this.teamRuntimeEntries.delete(Ct),await le?.();for(let Le of De)Le.stop()}}}}class hT{list(i){return i?Dr(i):[]}update(i,l){if(!i)return{sessionId:l.sessionId,prompts:[],updated:!1};let u=l.promptId.trim(),c=i.pendingPrompts.findIndex((_)=>_.id===u);if(c<0)return{sessionId:l.sessionId,prompts:Dr(i),updated:!1};let g=i.pendingPrompts[c];if(!g)return{sessionId:l.sessionId,prompts:Dr(i),updated:!1};let b=l.prompt===void 0?g.prompt:xe(l.prompt).trim();if(!b)throw Error("prompt cannot be empty");let I=l.delivery??g.delivery,T={...g,prompt:b,mode:l.mode??g.mode,delivery:I};return i.pendingPrompts.splice(c,1),mH(i,T,c,g.delivery),{sessionId:l.sessionId,prompts:Dr(i),prompt:$u(T),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:Dr(i),removed:!1};let[g]=i.pendingPrompts.splice(c,1);return{sessionId:l.sessionId,prompts:Dr(i),prompt:g?$u(g):void 0,removed:!0}}enqueue(i,l){let{prompt:u,mode:c,delivery:g,userImages:b,userFiles:I}=l,T=i.pendingPrompts.findIndex((_)=>_.prompt===u);if(T>=0){let[_]=i.pendingPrompts.splice(T,1),E={..._,prompt:u,mode:c??_.mode,userImages:b??_.userImages,userFiles:I??_.userFiles};if(g==="steer"||_.delivery==="steer")i.pendingPrompts.unshift({...E,delivery:"steer"});else i.pendingPrompts.push(E)}else{let _={id:`pending_${Date.now()}_${R(5)}`,prompt:u,mode:c,delivery:g,userImages:b,userFiles:I};if(g==="steer")i.pendingPrompts.unshift(_);else i.pendingPrompts.push(_)}return Dr(i)}consumeSteer(i){let l=i.pendingPrompts.findIndex((c)=>c.delivery==="steer");if(l<0)return{prompts:Dr(i)};let[u]=i.pendingPrompts.splice(l,1);return{entry:u,prompts:Dr(i)}}shiftNext(i){return{entry:i.pendingPrompts.shift(),prompts:Dr(i)}}requeueFront(i,l){return i.pendingPrompts.unshift(l),Dr(i)}clear(i){return i.pendingPrompts.length=0,[]}}class fT{deps;service=new hT;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:Dr(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(pH(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=$u(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 pH(i){return typeof i==="object"&&i!==null&&"finishReason"in i&&i.finishReason==="error"}function $u(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 Dr(i){return i.pendingPrompts.map($u)}function mH(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 gT{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 Yd(i){let l=i?.trim();if(!l||!hH(l))return[];try{let u=(await fH(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 vw(i){return i?{...i}:void 0}async function gH(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 yH(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 Af{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=KS(u);if(!!c&&(!b.agentId||b.agentId===gp(c.agent))){let I={agentId:gp(c.agent),conversationId:c.agent.getConversationId(),...c?.runtime.teamRuntime?{teamRole:"lead"}:{}};this.rememberSessionIdentity(i,I),Jc(g,u,{...I,isPrimaryAgentEvent:!0});return}Jc(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>Af.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(Sj(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};Jc(c,l.event,{agentId:l.agentId,teamRole:"teammate",teamAgentId:l.agentId,isPrimaryAgentEvent:!1})}if(l.type==="teammate_spawned"){let c=qo({agentId:l.teammate.runtimeAgentId??l.agentId,conversationId:l.teammate.conversationId,parentAgentId:l.teammate.parentAgentId,createdByAgentId:gp(u.agent),teamId:u.runtime.teamRuntime?.getTeamId(),teamName:u.runtime.teamRuntime?.getTeamName(),teamRole:"teammate",teamAgentId:l.agentId});if(c)Ph(u.config.telemetry,{ulid:i,modelId:l.teammate.modelId??u.config.modelId,provider:u.config.providerId,...c})}}if(await Tj(i,l,this.deps.invokeBackendOptional),u)Ej(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 _=this.deps.getSession(i)?.config.extensionContext?.automation??u;if(!_)return;let E=l.payload&&typeof l.payload==="object"?l.payload:void 0;if(!E)return;await _.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 T=l.name==="steer_message"?"steer":l.name==="queue_message"?"queue":g?.delivery==="steer"?"steer":"queue";this.deps.enqueuePendingPrompt(b,{prompt:I,delivery:T})}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 T={...g.properties&&typeof g.properties==="object"?g.properties:{},plugin_name:b,session_id:i};if(g.required===!0)c.captureRequired(`plugin.${I}`,T);else c.capture({event:`plugin.${I}`,properties:T});return}if(g.kind==="metric"){let I=typeof g.name==="string"?g.name.trim():"",T=typeof g.value==="number"?g.value:NaN;if(!I||Number.isNaN(T))return;let _={...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,T,_,E,A);else if(g.metric==="histogram")c.recordHistogram(C,T,_,E,A);else if(g.metric==="gauge")c.recordGauge(C,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 T=b.metadata&&typeof b.metadata==="object"?{...b.metadata}:{};if(T.sessionId??=i,typeof b.pluginName==="string"&&b.pluginName)T.pluginName=b.pluginName;if(b.level==="debug"){g.debug(I,T);return}if(b.level==="error"){if(g.error)g.error(I,T);else g.log(I,{...T,severity:"error"});return}g.log(I,T)}}function gp(i){return i.getAgentId()}function ww(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:js(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 Cf(i,l){let u=i[l];return typeof u==="function"?u:null}async function vH(i,l,...u){let c=Cf(i,l);if(!c)throw Error(`session service method not available: ${l}`);return Promise.resolve(c.apply(i,u))}async function wH(i,l,...u){let c=Cf(i,l);if(!c)return;await Promise.resolve(c.apply(i,u))}async function bH(i,l,...u){let c=Cf(i,l);if(!c)return;return await Promise.resolve(c.apply(i,u))}function yT(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=qo({agentId:c.subAgentId,conversationId:c.conversationId,parentAgentId:c.parentAgentId,teamId:g?.getTeamId(),teamName:g?.getTeamName(),createdByAgentId:c.parentAgentId});if(b)Ph(l.telemetry,{ulid:u,modelId:l.modelId,provider:l.providerId,...b});Sg(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,T=c.result?.text?c.result.text.split(`
|
|
486
|
+
`).length:0;Sg(l.telemetry,{event:"ended",ulid:u,durationMs:I,outputLines:T,errorMessage:c.error?String(c.error):void 0,agentId:c.subAgentId,parentId:c.parentAgentId,...qo({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 vT(i,l,u,c){let g=yT(i,l,u);return LS({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?FS({cwd:l.cwd,telemetry:l.telemetry,...of[af({mode:l.mode})],executors:c}):[];if(l.enableSpawnAgent)b.push(vT(i,l,u,c));return Yu(b)},...g})}var SH=20480000;async function TH(i){let l=await kH(i);if(!l.isFile())throw Error("Path is not a file");if(l.size>SH)throw Error("File is too large to read into context.");let u=await IH(i,"utf8");if(u.includes("\x00"))throw Error("Cannot read binary file into context.");return u}var Rf="session_not_found";class hc 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 Lu(i){return i instanceof hc||typeof i==="object"&&i!==null&&"code"in i&&i.code==="session_not_found"}var bw=5000,yp;function _H(i,l){if(yp)return;yp=GN().then(()=>{return}).catch((u)=>{yp=void 0,i?.error?.("Detached command log recovery failed",{error:u}),U(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 EH(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 AH(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 Iw(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 xH(i){return i==="steer_message"||i==="queue_message"||i==="pending_prompt"}class Pf{runtimeAddress=void 0;pendingPrompts;pluginCommands;pluginCommandManager;sessionService;runtimeBuilder;createAgentInstance;toolExecutors;defaultCapabilities;defaultToolPolicies;providerSettingsManager;oauthTokenManager;defaultTelemetry;distinctId;defaultLogger;defaultFetch;connectorsRequest;events=new gT;sessions=new Map;manifestMutationQueues=new Map;usageBySession=new Map;aggregateUsageBySession=new Map;subAgentStarts=new Map;pendingPromptsController;eventBridge;sessionVersioning=new wf;runCommandExecutionController=new SS;constructor(i){let l=rR();if(l)Va(l);let u=uc(i.distinctId);if(this.distinctId=u,this.sessionService=i.sessionService,this.runtimeBuilder=i.runtimeBuilder??new mT,this.createAgentInstance=i.createAgent??((c)=>new lc(c)),this.defaultCapabilities=zm(i.capabilities),this.toolExecutors=this.defaultCapabilities?.toolExecutors,this.defaultToolPolicies=i.toolPolicies,this.providerSettingsManager=i.providerSettingsManager??new oi,this.oauthTokenManager=i.oauthTokenManager??new dc({providerSettingsManager:this.providerSettingsManager,telemetry:i.telemetry}),this.defaultTelemetry=i.telemetry,this.defaultLogger=i.logger,this.pluginCommandManager=new O0({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(li(c.workspacePath)!==li(js(g.config)))throw Error("Plugin command workspace does not match the session");return this.withSessionPluginCommands(g,()=>({workspacePath:js(g.config),sessionId:c.sessionId,status:g.pluginCommandError?"error":"ready",error:g.pluginCommandError,commands:M0(g.agent.getExtensionRegistry().commands.filter(_g))}))},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(li(c.workspacePath)!==li(js(g.config)))throw Error("Plugin command workspace does not match the session");return this.withSessionPluginCommands(g,()=>N0(g.agent.getExtensionRegistry().commands.filter(_g),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,_H(this.defaultLogger,this.defaultTelemetry),this.pendingPromptsController=new fT({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 Af({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 T=this.sessions.get(c);(T?.config.logger??this.defaultLogger)?.error?.("Failed to persist session messages from agent event",{sessionId:c,error:I}),U(T?.config.telemetry??this.defaultTelemetry,{component:"core",operation:"session.persist_messages_on_agent_event",error:I,severity:"warn",handled:!0,context:{sessionId:c,providerId:T?.config.providerId,modelId:T?.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,T=I?{...i.config,cwd:I.cwd,workspaceRoot:I.workspace_root}:await r$(i.config);return await this.startResolvedSession({...i,config:T},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??Fr.CLI,b=pt(),I=await this.applyInitialOAuthCredentials(i),T=I.initialMessages??[],_=T.length>0?nv(T):Br(),E=await this.invokeOptionalValue("ensureSessionsDir")??"";if(!E)throw Error("session service method not available: ensureSessionsDir");let A=Nc(E,l),C=Nc(A,`${l}.messages.json`),N=Nc(A,`${l}.json`),M=js(i.config),O=i.interactive===!0&&!I.prompt?.trim(),L=bu.parse({version:1,session_id:l,source:g,pid:process.pid,started_at:b,status:O?"idle":"running",interactive:i.interactive===!0,provider:I.config.providerId,model:I.config.modelId,cwd:I.config.cwd,workspace_root:M,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}),D,F,j=u&&T.length>0&&!I.prompt?.trim();if(j){let de=c??await this.invokeOptionalValue("readSessionManifest",l);if(de)L=de,D={manifestPath:N,messagesPath:de.messages_path||C,compactionPath:de.compaction_path,manifest:de},F=await this.invokeOptionalValue("readSessionCompactionState",l)}let B=await this.seedAggregateUsageFromArtifacts({initialUsage:_,sessionDir:A,rootMessagesPath:D?.messagesPath??C,manifest:L});this.usageBySession.set(l,_),this.aggregateUsageBySession.set(l,B);let Q=zm(this.defaultCapabilities,i.capabilities),H=Q?.toolExecutors??this.toolExecutors,z=i.localRuntime,te=z?.extensionContext?.logger??z?.logger,ee=z?.extensionContext?.automation,oe=z?.extensionContext?.telemetry??z?.telemetry??this.defaultTelemetry,G,se=[],Ne={getSession:(de)=>this.sessions.get(de),subAgentStarts:this.subAgentStarts,onAgentEvent:(de,Fe,mt)=>this.eventBridge.dispatchAgentEvent(de,Fe,mt),invokeBackendOptional:(de,...Fe)=>this.invokeOptional(de,...Fe)},De=Fo(D?.manifest.metadata),Te=Fo(cn(I.sessionMetadata,{mode:I.mode??De?.mode,trigger:I.mode?void 0:De?.trigger}));G=await nq({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,te);return}if(se&&xH(de.name)){se.push(de);return}this.eventBridge.handlePluginEvent(l,de,ee,oe)},onPluginIssue:(de)=>{if(!G)return;this.eventBridge.dispatchAgentEvent(l,G.config,{type:"notice",noticeType:"status",displayRole:"status",message:kC(de),metadata:{pluginIssue:de}})},onTeamEvent:(de)=>{this.eventBridge.handleTeamEvent(l,de),G.config.onTeamEvent?.(de)},createSpawnTool:()=>vT(Ne,G.config,l,H),createSubAgentLifecycleCallbacks:(de)=>yT(Ne,de,l),readSessionMetadata:async()=>(await this.getSession(l))?.metadata,writeSessionMetadata:async(de)=>{await this.persistSessionMetadata(l,()=>de)}});let le=cn(xv({...D?.manifest.metadata??{},...I.sessionMetadata??{}},G.gitState),{mode:Te?.mode,trigger:Te?.trigger,version:G.config.extensionContext?.client?.version});if(!D)L.metadata=le;let ke;try{ke=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,Xe=G.providerConfig;if(ke.teamRuntime&&!we.teamName?.trim())we.teamName=ke.teamRuntime.getTeamName();let ve=async()=>{let de=this.sessions.get(l);if(!de||!Kg(de.config.providerId))return!1;try{return await this.syncOAuthCredentials(de,{forceRefresh:!0}),!0}catch{return!1}};ke.delegatedAgentConfigProvider?.updateConnectionDefaults({onAuthError:ve});let Se=[...ke.tools,...we.extraTools??[]],Ee=ke.extensions??G.extensions,Ae=I.initialCompactionState,Be,Ye=Ae??F,xt=Hk(we),vt=j?vq(L.metadata):void 0,Nr=vt?qM({config:we,importedFrom:vt.tool,next:xt}):xt,bt=Ye?{...Ye,conversation_id:Ye.conversation_id?.trim()||l}:void 0,Ct=jM({compact:Nr,getState:()=>Be?.compactionState,prepareApiMessages:(de)=>{let Fe=Be?.agent;if(!Fe)throw Error("Compaction prepareTurn ran before the session runtime was created");return Fe.prepareProviderMessagesForApi(de)},saveState:async(de,Fe)=>{let mt=Be;if(!mt)return;let Ie={...de,conversation_id:mt.sessionId};try{if(!(await this.persistActiveSessionCompactionState(mt,Ie,Fe)).updated)we.logger?.debug?.("Skipped stale session compaction state",{sessionId:mt.sessionId,sourceMessageCount:Ie.source_message_count})}catch(Le){we.logger?.error?.("Failed to persist session compaction state",{sessionId:mt.sessionId,error:Le}),U(we.telemetry,{component:"core",operation:"session.persist_compaction_state",severity:"warn",handled:!0,error:Le,context:{sessionId:mt.sessionId,providerId:we.providerId,modelId:we.modelId}})}}}),Kr={distinctId:this.distinctId,sessionId:l,providerId:Xe.providerId,modelId:Xe.modelId,apiKey:Xe.apiKey,baseUrl:Xe.baseUrl,headers:Xe.headers,onAuthError:ve,knownModels:Xe.knownModels,providerConfig:Xe,thinking:we.thinking,reasoningEffort:we.reasoningEffort??Xe.reasoningEffort,thinkingBudgetTokens:we.thinkingBudgetTokens,maxTokensPerTurn:we.maxTokensPerTurn,temperature:we.temperature,systemPrompt:we.systemPrompt,maxIterations:we.maxIterations,execution:we.execution,prepareTurn:Ct,tools:Se,modelTools:ke.modelTools,hooks:G.hooks,extensions:Ee,hookErrorMode:we.hookErrorMode,initialMessages:G.effectiveInput.initialMessages,userFileContentLoader:TH,toolPolicies:G.toolPolicies,requestToolApproval:G.requestToolApproval?async(de)=>{let Fe=G.requestToolApproval,mt=this.sessions.get(l);if(mt)await this.markTurnPending(mt);try{if(!Fe)return{approved:!1,reason:"Tool approval callback is not configured."};return await Fe(de)}finally{let Ie=this.sessions.get(l);if(Ie?.status==="pending")await this.markTurnRunning(Ie)}}:void 0,telemetry:we.telemetry,onConsecutiveMistakeLimitReached:we.onConsecutiveMistakeLimitReached,completionPolicy:ke.completionPolicy,consumePendingUserMessage:()=>{let de=this.pendingPromptsController.consumeSteer(l);return de?Gm(de.prompt,de.mode??we.mode):void 0},logger:ke.logger??we.logger,extensionContext:we.extensionContext,onEvent:(de)=>this.eventBridge.dispatchAgentEvent(l,we,de)};Kr.hooks={...Kr.hooks,onEvent:async(de)=>{if(await G.hooks?.onEvent?.(de),de.type!=="assistant-message")return;let Fe=this.sessions.get(l);if(!Fe)return;let mt=Fe.agent.getMessages();try{await this.invoke("persistSessionMessages",l,mt,we.systemPrompt)}catch(Ie){we.logger?.error?.("Failed to persist session messages after assistant response",{sessionId:l,error:Ie}),U(we.telemetry,{component:"core",operation:"session.persist_messages_after_assistant_response",error:Ie,severity:"warn",handled:!0,context:{sessionId:l,providerId:we.providerId,modelId:we.modelId}})}}};let Or=this.createAgentInstance(Kr);if(Kr.onEvent)Or.subscribeEvents(Kr.onEvent);ke.registerLeadAgent?.(Or);let Cs=qo({agentId:Or.getAgentId(),conversationId:Or.getConversationId(),teamId:ke.teamRuntime?.getTeamId(),teamName:ke.teamRuntime?.getTeamName(),teamRole:ke.teamRuntime?"lead":void 0});if(wq(we,l,u,M,Cs),Cs)Ph(we.telemetry,{ulid:l,modelId:we.modelId,provider:we.providerId,...Cs});if(ke.teamRuntime)GA(we.telemetry,{ulid:l,teamId:ke.teamRuntime.getTeamId(),teamName:ke.teamRuntime.getTeamName(),leadAgentId:Or.getAgentId(),restoredFromPersistence:ke.teamRestoredFromPersistence===!0});let Re={sessionId:l,config:we,sessionMetadata:le,...D?{artifacts:D}:{},source:g,startedAt:D?.manifest.started_at??b,updatedAt:D?.manifest.ended_at??D?.manifest.started_at??b,pendingPrompt:L.prompt,runtime:ke,agent:Or,started:!1,status:D?.manifest.status??(O?"idle":"running"),aborting:!1,interactive:i.interactive===!0,persistedMessages:T,compactionState:bt,activeTeamRunIds:new Set,pendingTeamRunUpdates:[],teamRunWaiters:[],pendingPrompts:[],drainingPendingPrompts:!1,pluginSandboxShutdown:G.pluginSandboxShutdown,pluginCommandError:G.pluginCommandError,submitAndExitObserved:!1,taskCompletedEmitted:!1,lastInteractiveTurnFinishReason:void 0};if(Be=Re,Re.compactionState&&!this.isCompactionStateForSession(Re.sessionId,Re.compactionState,Re))Re.config.logger?.log?.("Ignoring session compaction state for a different conversation",{severity:"warn",sessionId:Re.sessionId,conversationId:Re.compactionState.conversation_id}),Re.compactionState=void 0;this.sessions.set(l,Re);let Rt=se??[];se=null;for(let de of Rt)this.eventBridge.handlePluginEvent(l,de,ee,oe);if(D)await this.refreshActiveSessionGitMetadata(Re,G.gitState);if(T.length>0&&!D)try{await this.ensureSessionPersisted(Re),await this.invoke("persistSessionMessages",l,T,Re.config.systemPrompt)}catch(de){Re.config.logger?.error?.("Failed to persist seeded session messages at start",{sessionId:l,error:de}),U(Re.config.telemetry,{component:"core",operation:"session.persist_seeded_messages",error:de,severity:"warn",handled:!0,context:{sessionId:l,providerId:Re.config.providerId,modelId:Re.config.modelId}})}this.emitStatus(l,Re.status);let Gr;try{if(I.prompt?.trim())if(Gr=await this.executeTurn(Re,{prompt:I.prompt,userImages:I.userImages,userFiles:I.userFiles}),!Re.interactive)await this.finalizeSingleRun(Re,Gr.finishReason);else await this.completeInteractiveTurn(Re,Gr.finishReason)}catch(de){if(Re.interactive&&Re.aborting)Gr=await this.completeAbortedInteractiveTurn(Re);else{U(Re.config.telemetry,{component:"core",operation:"session.start",error:de,severity:"error",handled:!1,context:{sessionId:Re.sessionId,providerId:Re.config.providerId,modelId:Re.config.modelId}});try{await this.failSession(Re)}catch(Fe){Re.config.logger?.error?.("Session failure cleanup threw",{sessionId:Re.sessionId,error:Fe})}throw de}}return{sessionId:l,manifest:L,manifestPath:N,messagesPath:C,result:Gr,...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:e1(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 U(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=vw(this.usageBySession.get(i)),u=vw(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,Km(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{ra(c.telemetry??this.defaultTelemetry,{ulid:i,tool:Zh({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&&!Ar(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&&!Ar(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 ww(l);let u=i.trim();if(!u)return;let c=await this.getRow(u);if(c)return sv(c);let g=await this.readManifest(u);return g?yH(g):void 0}async listSessions(i=200,l={}){let u=(await this.listRows(i,l)).map(sv),c=new Set(u.map((g)=>g.sessionId));for(let g of this.sessions.values()){if(c.has(g.sessionId))continue;u.unshift(ww(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),T=l.source_message_count>0&&I.length>=l.source_message_count,_=T?I:void 0;if(T){if(!await this.canPersistCompactionState(u,l,c,void 0,I))return{updated:!1};c.agent.restore(I)}return await this.persistActiveSessionCompactionState(c,l,_)}if(!await this.canPersistCompactionState(u,l,void 0,g))return{updated:!1};let b=await this.invokeOptionalValue("readSessionCompactionState",u);if(Iw(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 gm(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&&gm(c,u??i.agent.getMessages())!==void 0;if(c&&(g?Iw(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 Yd(u.messagesPath);let c=await this.readManifest(l);return Yd(c?.messages_path)}async dispatchHookEvent(i){await gH(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=df(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(xj(i,I.finishReason)){let T=await Cj(i);if(T.length===0)break;let _=Rj(i,T);I=await this.executeAgentTurn(i,_)}return I}finally{i.lastTurnEndedAt=Date.now(),await this.refreshActiveSessionGitMetadata(i)}}async completeInteractiveTurn(i,l){if(Wm(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=Br();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}),U(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)??Br(),T=this.aggregateUsageBySession.get(i.sessionId)??I;i.turnUsageBaseline=I,i.turnAggregateUsageBaseline=T,i.turnPrimaryUsage=Br(),i.turnUsageByAgent=new Map,DA(i.config.telemetry,i.sessionId,i.config.mode),PI(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 _=()=>{let L=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 L},E=await this.runWithAuthRetry(i,_,b);i.started=!0;let A=BS(E.messages,E,b);i.persistedMessages=A;let C=WS(i.turnUsageByAgent?.values()??[]),N=Qt(I,E.usage),M=Qt(Qt(Br(),E.usage),C),O=Qt(T,M);return this.usageBySession.set(i.sessionId,N),this.aggregateUsageBySession.set(i.sessionId,O),await this.persistSessionMetadata(i.sessionId,(L)=>({...L??{},totalCost:N.totalCost,aggregatedAgentsCost:O.totalCost,usage:N,aggregateUsage:O})),await this.invoke("persistSessionMessages",i.sessionId,A,i.config.systemPrompt),this.observeTaskCompletionTool(i,E),E}catch(_){U(i.config.telemetry,{component:"core",operation:"session.turn",error:_,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 _}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===Kt.SUBMIT_AND_EXIT&&u.error===void 0))return;i.submitAndExitObserved=!0,i.taskCompletedEmitted=!0,Ig(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,Ig(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=js(i.config),c=xe(l.prompt).trim();if(!c)return{prompt:"",userImages:l.userImages,userFiles:this.resolveAbsoluteFilePaths(i.config.cwd,l.userFiles)};let g=await E$(c,u);Iq(i.config.telemetry,g);let b=Gm(g.prompt,l.mode??i.config.mode),I=this.resolveAbsoluteFilePaths(i.config.cwd,l.userFiles),T=this.resolveAbsoluteFilePaths(u,g.matchedFiles),_=Array.from(new Set([...I,...T]));return{prompt:b,userImages:l.userImages,userFiles:_.length>0?_:void 0}}async ensureSessionPersisted(i){if(i.artifacts)return;let l=js(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 WF(js(i.config));if(!u||!i.artifacts)return;if(zF(i.artifacts.manifest.metadata,u))return;await this.persistSessionMetadata(i.sessionId,(c)=>xv({...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(Wm(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),Km(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"}),U(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"}),U(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,Ar(l))delete b.ended_at,b.exit_code=null;else b.ended_at=c.endedAt??pt(),b.exit_code=typeof u==="number"?u:null});if(!g)return;i.status=l,i.updatedAt=c.endedAt??pt(),i.endedAt=Ar(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(!Kg(i.config.providerId)||!Ii(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 hc(i);throw U(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)=>sR(c)?c:li(i,c));return Array.from(new Set(u))}getSessionAgentTelemetryIdentity(i){return qo({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=Qt(i.initialUsage,l);return this.withPersistedAggregateUsageFloor(u,i.manifest)}async summarizePersistedTeammateUsage(i,l,u){let c=li(l),g=`${u}.messages.json`,b;try{b=tR(i)}catch{return Br()}let I=Br();for(let T of b){if(!T.endsWith(".messages.json"))continue;if(T===g)continue;let _=li(i,T);if(_===c)continue;let E=await Yd(_);if(E.length===0)continue;I=Qt(I,nv(E))}return I}withPersistedAggregateUsageFloor(i,l){let u=EH(l.metadata?.aggregateUsage);if(u)return AH(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:xu({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)),bw),l)}async getRow(i){let l=i.trim();if(!l)return;return(await this.listRows(bw)).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 vH(this.sessionService,i,...l)}invokeOptional(i,...l){return wH(this.sessionService,i,...l)}invokeOptionalValue(i,...l){return bH(this.sessionService,i,...l)}}class Mf{sessionsDirPath;db;constructor(i={}){this.sessionsDirPath=i.sessionsDir??be()}init(){this.getRawDb()}ensureSessionsDir(){if(!CH(this.sessionsDirPath))RH(this.sessionsDirPath,{recursive:!0});return this.sessionsDirPath}sessionDbPath(){return PH(this.ensureSessionsDir(),"sessions.db")}getRawDb(){if(this.db)return this.db;let i=V(this.sessionDbPath());return Qo(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,rt(i.interactive),i.provider,i.model,i.cwd,i.workspaceRoot,i.teamName??null,rt(i.enableTools),rt(i.enableSpawn),rt(i.enableTeams),i.parentSessionId??null,i.parentAgentId??null,i.agentId??null,i.conversationId??null,rt(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:Ar(l)?null:x(),exitCode:Ar(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 kw=`
|
|
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 Sw(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 vp(i){if(!i||Object.keys(i).length===0)return null;return JSON.stringify(i)}async function zH(i){let l;try{l=await wT(i,"r"),await l.sync()}catch{}finally{if(l!==void 0)try{await l.close()}catch{}}}async function WH(i,l){await jH(xw(i),{recursive:!0});let u=`${i}.${process.pid}.${qH()}.tmp`,c;try{c=await wT(u,"wx"),await c.writeFile(l,"utf8"),await c.sync(),await c.close(),c=void 0,await BH(u,i),await zH(xw(i))}catch(g){if(c!==void 0)try{await c.close()}catch{}try{await HH(u,{force:!0})}catch{}throw g}}function KH(i){return typeof i==="object"&&i!==null&&"code"in i&&i.code==="ENOENT"}function GH(i){return i!=="."&&i!==".."&&!i.includes("/")&&!i.includes("\\")}function XH(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:pt()}}class bT{adapter;messagesArtifactUploader;logger;artifacts;constructor(i,l,u){this.adapter=i,this.messagesArtifactUploader=l,this.logger=u,this.artifacts=new $0(()=>this.ensureSessionsDir())}ensureSessionsDir(){return this.adapter.ensureSessionsDir()}initializeMessagesFile(i,l,u){hL(l,u,iv(i))}writeSessionManifest(i,l){Tw(Aw(i),{recursive:!0}),_w(i,`${JSON.stringify(bu.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 Ew(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(!LH(l))return{path:l};try{return{path:l,manifest:bu.parse(JSON.parse(DH(l,"utf8")))}}catch{return{path:l}}}readSessionRowFromManifest(i){if(!GH(i))return;let{manifest:l}=this.readManifestFile(i);if(!l||l.session_id!==i)return;return XH(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=zS({updatedAt:pt(),context:iv(c),messages:l,systemPrompt:u}),I=`${JSON.stringify(b,null,2)}
|
|
526
|
+
`;if(Tw(Aw(g),{recursive:!0}),_w(g,I,"utf8"),!this.messagesArtifactUploader)return;try{await this.messagesArtifactUploader.uploadMessagesFile({sessionId:i,path:g,contents:I,row:c})}catch(T){this.logger?.debug("Failed to upload persisted session messages",{sessionId:i,error:T})}}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 rc(JSON.parse(await Ew(l,"utf8")))}catch(u){if(KH(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=Vh.parse(l);await WH(u,`${JSON.stringify(c,null,2)}
|
|
527
|
+
`),this.updateCompactionPath(i,u)}async deleteSessionCompactionState(i){await UH(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)??FH(tt(),"hooks.jsonl");$H(b,`${JSON.stringify({ts:i,hookName:"session_shutdown",reason:c,sessionId:l,pid:u,source:g})}
|
|
528
|
+
`,"utf8")}}var wp=4;class mo{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 bT(i,l.messagesArtifactUploader,l.logger),this.teamChildren=new q0(i,this.manifestStore,(u,c,g)=>this.toPersistedMessages(u,c,g),mo.TEAM_HEARTBEAT_LOG_INTERVAL_MS)}toPersistedMessages(i,l,u){if(!i)return;return l?BS(l.messages,l,u):xm(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??pt(),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),T=Cm({metadata:cn(i.metadata,{mode:i.mode,version:i.version}),prompt:i.prompt}),_=i.status??"running",E=!Ar(_),A=E?i.endedAt??pt():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:_,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:T,messages_path:g},M={sessionId:c,source:i.source,pid:i.pid,startedAt:l,endedAt:A??null,exitCode:C??null,status:_,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:Xs(N.metadata),hookPath:"",messagesPath:g,updatedAt:pt()};return await this.adapter.upsertSession(M),this.manifestStore.initializeMessagesFile(M,g,l),this.manifestStore.writeSessionManifest(I,N),{manifestPath:I,messagesPath:g,compactionPath:b,manifest:N}}async updateSessionStatus(i,l,u){let c;if((await gL(()=>this.adapter.getSession(i),async(g)=>(c=Ar(l)?void 0:pt(),this.adapter.updateSession({sessionId:i,status:l,endedAt:c??null,exitCode:Ar(l)?null:typeof u==="number"?u:null,expectedStatusLock:g.statusLock})),wp)).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<wp;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?Xs(i.metadata)??{}:Xs(c)??{},b=Do(typeof c?.title==="string"?c.title:void 0),I=i.title!==void 0?Do(i.title):b??HS(i.prompt);if(I)g.title=I;else delete g.title;let T=i.metadata!==void 0||i.prompt!==void 0||i.title!==void 0;if(!(await this.adapter.updateSession({sessionId:i.sessionId,prompt:i.prompt,metadata:T?Object.keys(g).length>0?g:null:void 0,title:I,expectedStatusLock:u.statusLock})).updated)continue;let{path:_,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?Xs(i.metadata)??{}:Xs(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(_,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=xm(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(Ar(i.status)===!1||this.isPidAlive(i.pid))return i;let l=pt(),u=mo.STALE_REASON;for(let c=0;c<wp;c++){let g=await this.adapter.getSession(i.sessionId);if(!g)return;if(Ar(g.status)===!1)return g;let b={...g.metadata??{},terminal_marker:u,terminal_marker_at:l,terminal_marker_pid:g.pid,terminal_marker_source:mo.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 T=fL(g,{status:"failed",endedAt:l,exitCode:1,metadata:b}),{path:_}=this.manifestStore.readManifestFile(g.sessionId);return this.manifestStore.writeSessionManifest(_,T),this.manifestStore.appendStaleSessionHookLog(l,g.sessionId,g.pid,u,mo.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,T)=>{let _=Xs(I.metadata??void 0),E=Do(b[T]),A=E?{..._??{},title:E}:_;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:Xs(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 kv(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 kv(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(OH(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 IT{store;sessionsDirPath;constructor(i,l=He()){this.store=i,this.sessionsDirPath=l}ensureSessionsDir(){if(!MH(this.sessionsDirPath))NH(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,vp(i.metadata),"",i.hookPath??"",i.messagesPath??null,i.updatedAt])}async getSession(i){let l=this.store.queryOne(`SELECT ${kw} FROM sessions WHERE session_id = ?`,[i]);return l?Sw(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 ${kw}
|
|
534
|
+
FROM sessions
|
|
535
|
+
${c}
|
|
536
|
+
ORDER BY started_at DESC
|
|
537
|
+
LIMIT ?`,[...u,i.limit]).map(Sw)}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 = ?`,[pt(),i.expectedStatusLock+1,i.parentSessionId??null,i.parentAgentId??null,i.agentId??null,i.conversationId??null,i.prompt??null,vp(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(vp(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(pt());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,pt()])}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 = ?",[pt(),u.id]),u.task??void 0}}class Nf extends mo{store;constructor(i,l={}){super(new IT(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,pt()])}}function JH(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 VH(i){return i.mode==="plan"?"plan":i.mode==="yolo"?"yolo":"act"}function YH(i={}){let l=async(c)=>c,u=new Pf({sessionService:new Nf(new Mf),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:Fr.CORE,mode:"automation",sessionMetadata:cn(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:VH(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:JH(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 QH="CLINE_HUB_HOST",ZH="CLINE_HUB_PORT",ez="CLINE_HUB_PATHNAME",tz="127.0.0.1",rz=jn,sz="/hub";function Cw(i){return re(i)==="development"?$n:rz}function iz(i={}){return(i.env??process.env)[QH]?.trim()||tz}function kT(i={}){let l=(i.env??process.env)[ZH]?.trim();if(!l)return Cw(i);let u=Number.parseInt(l,10);if(!Number.isInteger(u)||u<1||u>65535)return Cw(i);return u}function nz(i={}){return(i.env??process.env)[ez]?.trim()||sz}function ST(i={},l={}){return{host:i.host??iz(l),port:i.port??kT(l),pathname:i.pathname??nz(l)}}var uz=3;class TT 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 Of(i){return i instanceof Error&&i.name==="HubLockHeldError"}function cz(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{lz(dz(i),{recursive:!0}),l=az(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?.(),pz(c))throw new TT(i);return new $l(i,void 0)}if(!l)try{oz(i,384)}catch{}return new $l(i,u)}}function pz(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 yz="CLINE_HUB_DISCOVERY_PATH",vz="CLINE_HUB_BUILD_ID",wz="CLINE_HUB_BUILD_EPOCH_MS",bz=30000,Iz=15000,Pw=100;function kz(i){return i.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function Sz(i){return hz("sha256").update(i).digest("hex").slice(0,12)}function Tz(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 _z(){return _T(32).toString("hex")}function Mw(i){return new Promise((l)=>setTimeout(l,i))}function Ez(i){return`${i}.lock`}async function Az(i){try{let l=JSON.parse(await ET($f(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 bp(i){await fc(i,{recursive:!0,force:!0}).catch(()=>{return})}function na(){let i=process.env[vz]?.trim();if(i)return i;return"sdk-v1-5440fffc790ba5c6e5fa7cf89479eda8b49b27304efecf0ecb12ca78ad581c61".trim()||`source-${String(zl.version)}`}function xT(){let i=Number(process.env[wz]);if(Number.isFinite(i)&&i>0)return i;return Number.isFinite(1793312823572)?1793312823572:void 0}function CT(i,l=na()){let u=Pt(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 Nw(i){return typeof i==="number"&&Number.isFinite(i)&&i>0?i:void 0}function Ow(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 xz(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 Cz(i,l){let u=i.buildId?.trim(),c=l.buildId?.trim();if(u&&c&&u===c)return 0;let g=Nw(i.buildEpochMs),b=Nw(l.buildEpochMs);if(g!==void 0&&b!==void 0&&g!==b)return g<b?-1:1;let I=Ow(i.coreVersion),T=Ow(l.coreVersion);if(I&&T){let _=xz(I,T);if(_!==0)return _}if(u&&c&&u!==c)return u<c?-1:1;return 0}function Rz(){return{buildId:na(),buildEpochMs:xT(),coreVersion:String(zl.version)}}function RT(i,l){let u=l?.self??Rz(),c=CT(i,u.buildId??"");if(c.compatible)return!0;if(c.reason!=="build_mismatch"&&c.reason!=="missing_build")return!1;return Cz(u,i)<=0}function PT(i=process.argv[1]?.trim()||process.cwd()){let l=`hub-${Sz(i)}`,u=process.env[yz]?.trim()||$f(Z(),"locks","hub","owners",`${kz(l)}.json`);return{ownerId:l,discoveryPath:u}}async function Wo(i,l={}){try{let u;try{u=await ET(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 MT(i,l){await Lf(i,async()=>{let u=AT(i);await Qm(u,{recursive:!0});let c=`${i}.${process.pid}.${_T(6).toString("hex")}.tmp`,g;try{g=await Rw(c,"wx",384),await g.writeFile(`${JSON.stringify(l,null,2)}
|
|
550
|
+
`,{encoding:"utf8"}),await g.sync(),await g.close(),g=void 0,await fz(c,i);let b;try{b=await Rw(u,"r"),await b.sync()}catch{}finally{await b?.close().catch(()=>{return})}}catch(b){throw await g?.close().catch(()=>{return}),await fc(c,{force:!0}).catch(()=>{return}),b}})}async function gc(i){await Lf(i,async()=>{await fc(i,{force:!0}).catch(()=>{return})})}async function Pz(i,l){return await Lf(i,async()=>{if((await Wo(i))?.hubId!==l)return!1;return await fc(i,{force:!0}),!0})}async function NT(i,l,u){let c=Ez(i);await Qm(AT(c),{recursive:!0});let g=Date.now()+Iz;while(!0){try{await Qm(c,{recursive:!1})}catch(b){if((b instanceof Error&&"code"in b?String(b.code):"")!=="EEXIST")throw b;let I=await Az(c);if(!I){if(Date.now()>=g){await bp(c);continue}await Mw(Pw);continue}let T=Date.now()-Date.parse(I.acquiredAt);if(!Tz(I.pid)||T>bz){await bp(c);continue}if(Date.now()>=g)throw Error(`Timed out waiting for hub ${l} lock ${c}`);await Mw(Pw);continue}try{return await gz($f(c,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
|
|
551
|
+
`,"utf8"),await u()}finally{await bp(c)}}}function Lf(i,l){return NT(`${i}.mutation`,"discovery mutation",l)}function Mz(i,l){return NT(i,"startup",l)}async function Df(i,l){Ze();try{let u=await fetch(l?.authToken?Nz(i):OT(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 Du(i,l,u="/hub"){return new URL(`ws://${i}:${l}${u}`).toString()}function OT(i){let l=new URL(i);return l.protocol=l.protocol==="wss:"?"https:":"http:",l.pathname="/health",l.search="",l.toString()}function Nz(i){let l=new URL(OT(i));return l.pathname="/status",l.toString()}var Oz="shared:cline",$z="CLINE_HUB_DISCOVERY_PATH",Lz="hub-production";function yc(i=Oz){return PT(`${i}@${na()}`)}function Uf(){return{ownerId:Lz,discoveryPath:process.env[$z]?.trim()||mz(Z(),"locks","hub","production.json")}}function Dz(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 $w=120,Ip="...";function Uz(i){let l=i.trim();if(!l)return"";if(Buffer.byteLength(l,"utf8")<=$w)return l;let u=$w-Buffer.byteLength(Ip,"utf8");if(u<=0)return Ip;let c="";for(let g of l){if(Buffer.byteLength(c+g,"utf8")>u)break;c+=g}return`${c}${Ip}`}async function Fz(i){let l=i?.sessionId?.trim()||"unknown",u=typeof i?.metadata?.messagesPath==="string"?i.metadata.messagesPath:void 0,c=[...await Yd(u)].reverse().find((T)=>T.role==="assistant"),g=c?Dz(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:Uz(g&&g.length>0?g:I.length>0?I:b),severity:"info"}}function Gl(i){return!!i&&typeof i==="object"&&!Array.isArray(i)}function Sp(i){let l=i?.trim();return l?l:void 0}function qz(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 Lw(i,l){return new Date(new Date(i).getTime()+Math.max(0,Math.floor(l))*1000).toISOString()}function Dw(i,l){return new Date(new Date(i).getTime()-Math.max(0,Math.floor(l))*1000).toISOString()}function jz(i,l){if(!i)return l;return new Date(i).getTime()>=new Date(l).getTime()?i:l}function Bz(i,l){let u=i.eventId.trim(),c=i.eventType.trim(),g=i.source.trim(),b=Sp(i.subject),I=Sp(i.dedupeKey)??`${c}:${g}:${b??u}`;return{eventId:u,eventType:c,source:g,subject:b,occurredAt:qz(i.occurredAt,l),workspaceRoot:Sp(i.workspaceRoot),payload:Gl(i.payload)?i.payload:void 0,attributes:Gl(i.attributes)?i.attributes:void 0,dedupeKey:I}}function Tp(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 Hz(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=Tp(u,l);if(c!==void 0)return c;if(i.attributes){let g=Tp(i.attributes,l);if(g!==void 0)return g}if(i.payload)return Tp(i.payload,l);return}function Qd(i,l){if(Array.isArray(l))return l.some((u)=>Qd(i,u));if(Array.isArray(i))return i.some((u)=>Qd(u,l));if(Gl(l)){if(!Gl(i))return!1;return Object.entries(l).every(([u,c])=>Qd(i[u],c))}return Object.is(i,l)}function zz(i,l){if(!l||Object.keys(l).length===0)return!0;return Object.entries(l).every(([u,c])=>Qd(Hz(i,u),c))}class $T{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=Bz(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 _ of c){if(!zz(i,_.filters)){g.push({specId:_.specId,externalId:_.externalId,reason:"filter_mismatch",dedupeKey:i.dedupeKey});continue}b.push(_);let E=this.materializeForSpec(_,i,u.record.receivedAt);if(E.run)I.push(E.run);else g.push({specId:_.specId,externalId:_.externalId,reason:E.reason,dedupeKey:i.dedupeKey})}let T=b.length===0?"unmatched":I.length>0?"queued":"suppressed";return this.store.updateEventLogProcessing(u.record.eventId,{status:T,matchedSpecCount:b.length,queuedRunCount:I.length,suppressedCount:g.filter((_)=>_.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 T=this.store.findQueuedEventRunForDedupe({specId:i.specId,dedupeKey:c});if(T){let _=jz(T.scheduledFor,Lw(u,g)),E=this.store.updateQueuedEventRunForDebounce({runId:T.runId,triggerEventId:l.eventId,scheduledFor:_});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:Dw(u,b)}))return{reason:"dedupe_window"};let I=i.cooldownSeconds??0;if(I>0&&this.store.hasRecentEventRunForSpec({specId:i.specId,sinceIso:Dw(u,I)}))return{reason:"cooldown"};return{run:this.store.enqueueRun({specId:i.specId,specRevision:i.revision,triggerKind:"event",triggerEventId:l.eventId,scheduledFor:g>0?Lw(u,g):u}),reason:"dedupe_window"}}}class Ff{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 Js(i){if(/[:#\n]/.test(i)||i.includes('"'))return JSON.stringify(i);return i}function Lr(i,l){if(l===void 0||l===null)return;return`${i}: ${Js(l)}`}function DT(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 Jz(i){return i.replace(/[\r\n\u2028\u2029]+/g," ").replace(/[\\`*_[\]{}()#+\-.!<>|]/g,"\\$&")}function Vz(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=Xz(i.sourcePath)?i.sourcePath:LT(Dt(l),i.sourcePath);return{kind:"file",path:u,label:u}}function Zm(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 Uw(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 Yz(i,l,u,c){let g=[`runId: ${Js(i.runId)}`,`specId: ${Js(l.specId)}`,`scheduleId: ${Js(l.externalId)}`,`title: ${Js(l.title)}`,`triggerKind: ${Js(i.triggerKind)}`,`status: ${Js(i.status)}`,`definitionSource: ${Js(u.kind)}`],b=[Lr("sourcePath",u.path),Lr("workspaceRoot",l.workspaceRoot),Lr("schedule",l.scheduleExpr),Lr("timezone",l.timezone),Lr("model",l.providerId||l.modelId?[l.providerId,l.modelId].filter(Boolean).join("/"):void 0),Lr("sessionId",i.sessionId),Lr("startedAt",i.startedAt),Lr("completedAt",i.completedAt),Lr("triggerEventId",i.triggerEventId),Lr("triggerEventType",c?.eventType),Lr("triggerEventSource",c?.source),Lr("triggerEventSubject",c?.subject)];for(let I of b)if(I)g.push(I);return`---
|
|
555
|
+
${g.join(`
|
|
556
|
+
`)}
|
|
557
|
+
---
|
|
558
|
+
`}function Qz(i,l,u,c){let g=Jz(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",T=i.startedAt?` at ${i.startedAt}`:"",_=c.durationMs!==void 0?` in ${Zm(c.durationMs)}`:"",E=[`# ${g} — ${b}`,"",`Run of schedule **${g}** (${I})${T}, ${b}${_}.`,"","## Job",""],A=[`- **Definition**: ${u.label}`,l.workspaceRoot?`- **Workspace**: ${l.workspaceRoot}`:"",Uw(l)?`- **Schedule**: ${Uw(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","",DT(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}${DT(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: ${Zm(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(`(${Zm(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 eW(i){let l=Ja(i.specs);Kz(l,{recursive:!0});let u=LT(l,`${i.run.runId}.md`),c=Vz(i.spec,i.specs),g=`${Yz(i.run,i.spec,c,i.data.triggerEvent)}
|
|
583
|
+
${Qz(i.run,i.spec,c,i.data)}
|
|
584
|
+
${Zz(i.data)}`;return Gz(u,g,"utf8"),u}var tW=5000;class Ni extends Error{}async function _p(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 rW=15000,sW=90,UT=["rules","skills","plugins"];function iW(i,l){return new Set(i.extensions??UT).has(l)}function nW(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[Kt.ASK]={...u[Kt.ASK],enabled:!1,autoApprove:!0},l==="yolo")u[Kt.SUBMIT_AND_EXIT]={enabled:!0,autoApprove:!0};return u}function oW(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 aW(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 lW(i,l,u){return{[kd.scheduleId]:i.externalId,[kd.scheduleName]:i.title,[kd.scheduleExecutionId]:l.runId,...u!==void 0?{[kd.scheduleRunNumber]:u}:{}}}class qf{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??sW)*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??rW);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 Ni("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 Ni("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,T=!1,_,E=Date.now(),A={triggerKind:l.triggerKind,attemptCount:l.attemptCount,startDelayMs:Math.max(0,E-new Date(l.scheduledFor??l.createdAt).getTime())};da(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()},M;if(u.timeoutSeconds&&u.timeoutSeconds>0)M=setTimeout(()=>c.abort(new Ll("cron run timed out")),u.timeoutSeconds*1000);let O="preparing the session request",L;try{_=this.startClaimLeaseHeartbeat(i);let D=await _p(this.buildStartRequest(u),g);N(),O="starting the agent session";let F=this.options.runtimeHandlers.startSession(D,{sessionMetadata:lW(u,l,this.store.getRunOrdinal(l.runId))}).then(async(te)=>{if(g.aborted)await this.cleanupSession(te.sessionId,!0);else I=te.sessionId.trim()});if(await _p(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 Ni("run lease lost")),N();O="running the agent turn";let j={config:D,prompt:this.buildPrompt(u,b)},B=this.options.runtimeHandlers.sendSession(I,j),Q=await _p(B,g);if(N(),L=Q.result,L.finishReason==="error")throw Error(L.text||"agent turn ended with an error");let H=Date.now();if(!this.store.completeRun(l.runId,{status:"done",sessionId:I,claimToken:i.claimToken})){da(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 z=this.writeReport({specs:this.options.specs,workspaceRoot:this.options.workspaceRoot,run:{...l,sessionId:I,status:"done"},spec:u,data:{finalText:L.text,usage:L.usage,toolCalls:L.toolCalls,durationMs:H-E,triggerEvent:b}});if(z)this.store.attachReportPathToRun(l.runId,z);da(this.options.telemetry,{...A,phase:"finished",outcome:"success",durationMs:Math.max(0,H-E)}),this.publishScheduleExecutionEvent("schedule.execution.completed",u,l.runId),this.store.updateSpecLastRunAt(u.specId,x())}catch(D){let F=D instanceof Ll;if(I&&g.aborted)await this.cleanupSession(I,!0),T=!0;let j=D instanceof Error?D.message:String(D),B=Date.now(),Q=F?`The run exceeded its ${u.timeoutSeconds}s timeout while ${O} and was cancelled:`:D instanceof Ni?`The run was cancelled while ${O}:`:`The run failed while ${O}:`,H=D instanceof Ni?"cancelled":"failed";if(!this.store.completeRun(l.runId,{status:H,sessionId:I,error:j,claimToken:i.claimToken})){da(this.options.telemetry,{...A,phase:"finished",outcome:"superseded",durationMs:Math.max(0,B-E)});return}if(l.triggerKind==="one_off")this.store.updateSpecNextRunAt(u.specId,void 0);let z=this.writeReport({specs:this.options.specs,workspaceRoot:this.options.workspaceRoot,run:{...l,sessionId:I,status:H},spec:u,data:{error:j,errorContext:Q,usage:L?.usage,toolCalls:L?.toolCalls,durationMs:B-E,triggerEvent:b}});if(z)this.store.attachReportPathToRun(l.runId,z);da(this.options.telemetry,{...A,phase:"finished",outcome:H==="cancelled"?"cancelled":F?"timeout":"failed",durationMs:Math.max(0,B-E)}),this.publishScheduleExecutionEvent("schedule.execution.failed",u,l.runId)}finally{if(M)clearTimeout(M);if(_?.(),I&&!T)await this.cleanupSession(I,g.aborted);this.activeRuns.delete(l.runId)}}writeReport(i){try{return eW(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 aW(this.options.runtimeHandlers[u](i),tW)}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 Ni("run lease lost"))},l);return()=>clearInterval(u)}async buildSystemPrompt(i,l,u,c){let g=oW(i.notesDirectory),b=Xv(void 0,g),I=await KF(l),T=Ke({ide:"Cline Cron",workspaceRoot:l,workspaceName:Wz(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?Xv(T,b)??T:T}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:nW(i,I),configExtensions:UT.filter((T)=>iW(i,T))}}}function ll(i,l,u,c){let g=new Set;function b(I){let T=I.toLowerCase();if(c){let E=c.indexOf(T);if(E!==-1)return E+l}let _=Number(I);if(!Number.isInteger(_)||_<l||_>u)throw Error(`Invalid cron value "${I}" for range [${l}-${u}]`);return _}for(let I of i.split(",")){if(I==="*"){for(let E=l;E<=u;E+=1)g.add(E);continue}let T=I.indexOf("/");if(T!==-1){let E=I.slice(0,T),A=Number(I.slice(T+1));if(!Number.isInteger(A)||A<1)throw Error(`Invalid step "${I.slice(T+1)}"`);let C=l,N=u;if(E!=="*"){let M=E.indexOf("-");if(M!==-1)C=b(E.slice(0,M)),N=b(E.slice(M+1));else C=b(E)}if(C>N)throw Error(`Invalid cron range "${E}"`);for(let M=C;M<=N;M+=A)g.add(M);continue}let _=I.indexOf("-");if(_!==-1){let E=b(I.slice(0,_)),A=b(I.slice(_+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,T)=>I-T)}var hW=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"],FT=["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 Ep(i,l){let u=i[0];if(typeof u!=="number")throw Error(`Invalid cron pattern: no values parsed for ${l}`);return u}function jf(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,hW),daysOfWeek:ll(dl(l,4,i),0,6,FT)}}function fW(i){jf(i)}function gW(i,l,u=Date.now()){Dl(i,u,l)}var Fw=new Map,yW=new Map(FT.map((i,l)=>[i,l]));function qT(i){let l=i?.trim();return l?l:void 0}function jT(i){let l=Fw.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 Fw.set(i,u),u}function BT(i){let l=qT(i);if(!l)return;jT(l).format(new Date)}function vW(i,l){let u=jT(l).formatToParts(new Date(i)),c=new Map(u.map((I)=>[I.type,I.value])),g=c.get("weekday")?.toLowerCase().slice(0,3)??"",b=yW.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 wW(i){let l=new Date(i);return{month:l.getMonth()+1,dayOfMonth:l.getDate(),dayOfWeek:l.getDay(),hour:l.getHours(),minute:l.getMinutes()}}function bW(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 IW(i,l,u){let c=jf(i),g=new Date(l);g.setSeconds(0,0);let b=g.getTime()+60000,I=new Date(l);I.setFullYear(I.getFullYear()+4);let T=I.getTime();while(b<=T){if(bW(c,vW(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=qT(u);if(c)return BT(c),IW(i,l,c);let g=jf(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:T,dayOfMonth:_,dayOfWeek:E,hour:A,minute:C}=wW(b.getTime());if(!g.months.includes(T)){let N=g.months.find((O)=>O>T)??Ep(g.months,"months"),M=N<=T?1:0;b=new Date(b.getFullYear()+M,N-1,1,0,0,0,0);continue}if(!g.daysOfMonth.includes(_)||!g.daysOfWeek.includes(E)){b=new Date(b.getFullYear(),b.getMonth(),_+1,0,0,0,0);continue}if(!g.hours.includes(A)){let N=g.hours.find((O)=>O>A)??Ep(g.hours,"hours"),M=N<=A?1:0;b=new Date(b.getFullYear(),b.getMonth(),b.getDate()+M,N,0,0,0);continue}if(!g.minutes.includes(C)){let N=g.minutes.find((O)=>O>C)??Ep(g.minutes,"minutes"),M=N<=C?1:0;b=new Date(b.getFullYear(),b.getMonth(),b.getDate(),b.getHours()+M,N,0,0);continue}return b.getTime()}throw Error(`No cron occurrence found within 4 years for pattern "${i}"`)}var kW=[`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 SW(i){i.exec("PRAGMA journal_mode = WAL;"),i.exec("PRAGMA busy_timeout = 5000;"),i.exec("PRAGMA foreign_keys = ON;");for(let l of kW)i.exec(l)}function Uu(i){if(!i)return;try{let l=JSON.parse(i);if(l&&typeof l==="object"&&!Array.isArray(l))return l}catch{}return}function Ap(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 bi(i){if(typeof i==="number"&&Number.isFinite(i))return i;if(typeof i==="bigint")return Number(i);return}function Ks(i){return{specId:f(i.spec_id),externalId:f(i.external_id),sourcePath:f(i.source_path),triggerKind:f(i.trigger_kind),sourceMtimeMs:bi(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:Uu(h(i.filters_json)),debounceSeconds:bi(i.debounce_seconds),dedupeWindowSeconds:bi(i.dedupe_window_seconds),cooldownSeconds:bi(i.cooldown_seconds),mode:h(i.mode),systemPrompt:h(i.system_prompt),providerId:h(i.provider_id),modelId:h(i.model_id),maxIterations:bi(i.max_iterations),timeoutSeconds:bi(i.timeout_seconds),maxParallel:bi(i.max_parallel),tools:Ap(h(i.tools_json),{preserveEmpty:!0}),notesDirectory:h(i.notes_directory),extensions:Ap(h(i.extensions_json),{preserveEmpty:!0}),source:h(i.source),tags:Ap(h(i.tags_json)),metadata:Uu(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 qw(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:Uu(h(i.payload_json)),attributes:Uu(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 jw(i){return i?JSON.stringify(i):null}var TW=["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 _W(i,l,u,c){for(let I of TW){let T=i[I],_=l[I];if(Td(T)!==Td(_))return!0}let g=i.triggerKind==="one_off"||l.triggerKind==="one_off",b=l.metadata;if(g&&Td(i.metadata?.[ye])!==Td(b?.[ye]))return!0;if(u===!1&&c===!0)return!0;return!1}function EW(i){return(i.split("/").pop()??i).replace(/\.event\.md$/,"").replace(/\.cron\.md$/,"").replace(/\.md$/,"")}var HT="hub/schedules/";function AW(i){return`${HT}${i}.cron.md`}function xW(i){return i.source==="hub-schedule"&&i.sourcePath.startsWith(HT)&&i.sourceMtimeMs===void 0}function CW(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[ye];return Object.keys(l).length>0?l:void 0}function eh(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:CW(i)};return l?{...u,triggerKind:"one_off"}:{...u,triggerKind:"schedule",schedule:i.cronPattern.trim(),timezone:i.timezone?.trim()||void 0}}function Bw(i){return JSON.stringify(eh(i))}function RW(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??""),T={...u,...l.metadata??{}};if(I.trim()!==pe)delete T[ye];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(T).length>0?T:void 0}}class Bf{db;constructor(i={}){let l=i.dbPath??Ka();this.db=V(l),SW(this.db)}close(){this.db.close?.()}getSpecBySourcePath(i){let l=this.db.prepare("SELECT * FROM cron_specs WHERE source_path = ?").get(i);return l?Ks(l):void 0}getSpec(i){let l=this.db.prepare("SELECT * FROM cron_specs WHERE spec_id = ?").get(i);return l?Ks(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?Ks(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)=>Ks(b))}createHubSchedule(i){let l=`sched_${ul()}`,u=eh(i),c=this.upsertSpec({externalId:l,sourcePath:AW(l),triggerKind:u.triggerKind,sourceHash:Bw(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?Ks(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)=>Ks(g))}updateHubSchedule(i,l){this.db.exec("BEGIN IMMEDIATE;");try{let u=this.getHubSchedule(i);if(!u){this.db.exec("COMMIT;");return}let c=RW(u,l),g=eh(c),b=this.upsertSpec({externalId:i,sourcePath:u.sourcePath,triggerKind:g.triggerKind,sourceHash:Bw(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?.[ye]!==void 0||l.enabled!==void 0)this.initializeHubScheduleNextRun(b.record.specId,c);let T=this.getSpec(b.record.specId);return this.db.exec("COMMIT;"),T}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?.[ye];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)=>Ks(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??EW(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&&_W(u,g,u.enabled,b),T=I?u.revision+1:u.revision;this.updateSpecRow(u.specId,i,g,b,T,l);let _=this.getSpec(u.specId);if(!_)throw Error("failed to reload cron_spec after update");return{record:_,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=Ks(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 _=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(_,u,g.specId),this.db.exec("COMMIT;"),{queued:!1,nextRunAt:_}}if(new Date(b).getTime()>l)return this.db.exec("COMMIT;"),{queued:!1,nextRunAt:b};let I=`crun_${ul()}`,T;try{T=new Date(Dl(g.scheduleExpr,l,g.timezone)).toISOString()}catch{T=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,T??null,u,g.specId),this.db.exec("COMMIT;"),{queued:!0,run:this.getRun(I),nextRunAt:T}}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 T=i.occurredAt.trim()||c,_=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,T,c,i.workspaceRoot?.trim()||null,i.dedupeKey?.trim()||null,jw(i.payload),jw(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:_===1}}getEventLog(i){let l=this.db.prepare("SELECT * FROM cron_event_log WHERE event_id = ?").get(i);return l?qw(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)=>qw(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 T of b)u.push(T)}}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
|
+
`),T=Math.max(1,Math.floor(i.maxConcurrency??10));while(b.length<g){let _=I.get(l,l,l,T,l);if(!_)break;let E=f(_.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 MW(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 NW(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 Ur(i){if(typeof i!=="string")return;let l=i.trim();return l.length>0?l:void 0}function OW(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 th(i){if(!i||typeof i!=="object"||Array.isArray(i))return;return i}function $W(i){let l=th(i);if(!l)return;let u=Ur(l.providerId),c=Ur(l.modelId);if(u===void 0&&c===void 0)return;return{providerId:u,modelId:c}}function LW(i){if(typeof i!=="string")return;let l=i.trim().toLowerCase();if(l==="act"||l==="plan"||l==="yolo")return l;return}function zT(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 DW=new Set(uN);function UW(i){let l=zT(i,{preserveEmptyArray:!0});if(!l)return;let u=l.filter((c)=>!DW.has(c));if(u.length>0)throw Error(`unknown tool(s): ${u.join(", ")}`);return l}var FW=new Set(["rules","skills","plugins"]);function qW(i){let l=zT(i,{preserveEmptyArray:!0});if(!l)return;let u=l.filter((c)=>!FW.has(c));if(u.length>0)throw Error(`unknown extension(s): ${u.join(", ")}`);return l}function xp(i){if(typeof i!=="number"||!Number.isFinite(i)||i<=0)return;return Math.floor(i)}function Cp(i){if(typeof i!=="number"||!Number.isFinite(i)||i<0)return;return Math.floor(i)}function rh(i){if(i===null||typeof i!=="object")return JSON.stringify(i??null);if(Array.isArray(i))return`[${i.map((u)=>rh(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)}:${rh(c)}`).join(",")}}`}function WT(i,l){let u=PW("sha256");return u.update(rh(i)),u.update(`
|
|
865
|
+
`),u.update(l),u.digest("hex")}function jW(i){return(i.split("/").pop()??i).replace(/\.event\.md$/,"").replace(/\.cron\.md$/,"").replace(/\.md$/,"")}var BW=["schedule","timezone"],HW=["event","filters","debounceSeconds","dedupeWindowSeconds","cooldownSeconds","maxParallel"],zW=["cwd"];function Hw(i,l,u,c,g){return{externalId:i,relativePath:i,triggerKind:l,body:u,contentHash:WT(c,u),error:g}}function Rs(i,l,u,c,g,b){return{externalId:i,relativePath:l,triggerKind:u,body:c,contentHash:g,error:b}}function WW(i){let l=i.relativePath.replace(/\\/g,"/"),u=MW(l),{frontmatter:c,body:g}=NW(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 Hw(l,u,g,{},"frontmatter must be a YAML mapping")}catch(j){return Hw(l,u,g,{},j instanceof Error?`failed to parse frontmatter: ${j.message}`:"failed to parse frontmatter")}let I=WT(b,g),T=Ur(b.id),_=T??l;if(u!=="schedule"){for(let j of BW)if(b[j]!==void 0)return Rs(_,l,u,g,I,`field "${j}" is only allowed on *.cron.md specs`)}for(let j of zW)if(b[j]!==void 0)return Rs(_,l,u,g,I,`field "${j}" is no longer supported; cron specs use workspaceRoot as cwd`);if(u!=="event"){for(let j of HW)if(b[j]!==void 0)return Rs(_,l,u,g,I,`field "${j}" is only allowed on .event.md specs`)}let E=Ur(b.prompt),A=g.trim(),C=E??(A.length>0?A:void 0);if(!C)return Rs(_,l,u,g,I,"prompt is required (frontmatter `prompt` or markdown body)");let N=Ur(b.workspaceRoot);if(!N)return Rs(_,l,u,g,I,"workspaceRoot is required");let M,O;try{M=UW(b.tools),O=qW(b.extensions)}catch(j){return Rs(_,l,u,g,I,j instanceof Error?j.message:String(j))}let L=LW(b.mode);if(b.mode!==void 0&&L===void 0)return Rs(_,l,u,g,I,"mode must be one of: act, plan, yolo");let D={id:T,title:Ur(b.title)??T??jW(l),prompt:C,workspaceRoot:N,mode:L??"yolo",systemPrompt:Ur(b.systemPrompt),modelSelection:$W(b.modelSelection),maxIterations:xp(b.maxIterations),timeoutSeconds:xp(b.timeoutSeconds),tools:M,notesDirectory:Ur(b.notesDirectory),extensions:O,source:Ur(b.source)??"user",tags:OW(b.tags),enabled:typeof b.enabled==="boolean"?b.enabled:!0,metadata:th(b.metadata)},F;if(u==="schedule"){let j=Ur(b.schedule);if(!j)return Rs(_,l,u,g,I,"schedule is required for *.cron.md specs");let B=Ur(b.timezone);try{gW(j,B)}catch(Q){return Rs(_,l,u,g,I,Q instanceof Error?Q.message:String(Q))}F={...D,triggerKind:"schedule",schedule:j,timezone:B}}else if(u==="event"){let j=Ur(b.event);if(!j)return Rs(_,l,u,g,I,"event is required for .event.md specs");F={...D,triggerKind:"event",event:j,filters:th(b.filters),debounceSeconds:Cp(b.debounceSeconds),dedupeWindowSeconds:Cp(b.dedupeWindowSeconds),cooldownSeconds:Cp(b.cooldownSeconds),maxParallel:xp(b.maxParallel)}}else F={...D,triggerKind:"one_off"};return{externalId:_,relativePath:l,triggerKind:u,body:g,contentHash:I,spec:F}}function KW(i,l){return mW(i,l).replace(/\\/g,"/")}function GW(i){if(!dW(i))return[];let l=[],u=[i];while(u.length>0){let c=u.pop();if(!c)continue;let g;try{g=uW(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 KT{store;cronDir;constructor(i){this.store=i.store,this.cronDir=Dt(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=GW(this.cronDir),u=new Set;for(let g of l){let b=KW(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(xW(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=cW(l,"utf8"),g=pW(l).mtimeMs}catch{return}let b=WW({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 eK=250;class GT{reconciler;debounceMs;onError;onReconciled;watcher;pending=new Map;disposed=!1;constructor(i){this.reconciler=i.reconciler,this.debounceMs=Math.max(0,i.debounceMs??eK),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{JW(i,{recursive:!0});let l=VW.native(i);this.watcher=YW(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(!XW(l)){await this.reconciler.reconcileAll(),await this.onReconciled();return}let u=QW(this.reconciler.getCronDir(),l).replace(/\\/g,"/");await this.reconciler.reconcileFile(u,l),await this.onReconciled()}catch(l){this.onError(l)}}}class XT{store;reconciler;watcher;eventIngress;materializer;runner;started=!1;disposed=!1;constructor(i){this.store=new Bf({dbPath:i.dbPath});let l=i.specs;this.reconciler=new KT({store:this.store,specs:l}),this.materializer=new Ff({store:this.store}),this.eventIngress=new $T({store:this.store,logger:i.logger}),this.runner=new qf({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 GT({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 Ai(i,l){return l.crossWorkspace&&i.payload?.allWorkspaces===!0}function zw(i,l){if(typeof l!=="string"||!l.trim())return;let u=ho(i,l);if(!JT(i,u))throw Error("schedule cwd is outside the client workspace scope");return u}function Ww(i){return typeof i.workspaceRoot==="string"&&i.workspaceRoot.trim()?ho(i.workspaceRoot.trim()):void 0}function JT(i,l){let u=rK(i,l);return u!==".."&&!u.startsWith(`..${sK}`)&&!tK(u)}function Ht(i,l){return{version:i.version,requestId:i.requestId,ok:!0,payload:l}}function Kw(i,l,u){return{version:i.version,requestId:i.requestId??P("hubreq_"),ok:!1,error:{code:l,message:u}}}class VT{schedules;constructor(i){this.schedules=i}async handleCommand(i,l){try{let u=this.resolveScope(l);switch(i.command){case"schedule.create":return Ht(i,{schedule:this.schedules.createSchedule(this.toCreateInput(i.payload??{},u,Ai(i,u)))});case"schedule.list":return Ht(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:Ai(i,u)?void 0:u.workspaceRoot})});case"schedule.get":return Ht(i,{schedule:this.requireScopedSchedule(i,u)});case"schedule.update":{let c=this.requireScopedSchedule(i,u);return Ht(i,{schedule:this.schedules.updateSchedule(c.scheduleId,this.toUpdateInput(i.payload??{},u,c,Ai(i,u)))})}case"schedule.delete":return Ht(i,{deleted:this.schedules.deleteSchedule(this.requireScopedSchedule(i,u).scheduleId)});case"schedule.enable":return Ht(i,{schedule:this.schedules.resumeSchedule(this.requireScopedSchedule(i,u).scheduleId)});case"schedule.disable":return Ht(i,{schedule:this.schedules.pauseSchedule(this.requireScopedSchedule(i,u).scheduleId)});case"schedule.trigger":return Ht(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 Ht(i,{executions:this.listScopedExecutions(i,u)});case"schedule.stats":return Ht(i,{stats:this.schedules.getScheduleStats(this.requireScopedSchedule(i,u).scheduleId)});case"schedule.active":{let c=this.schedules.getActiveExecutions();if(Ai(i,u))return Ht(i,{executions:c});let g=this.scopedScheduleIds(u);return Ht(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(Ai(i,u))return Ht(i,{runs:c});let g=this.scopedScheduleIds(u);return Ht(i,{runs:c.filter((b)=>g.has(b.scheduleId))})}default:return Kw(i,"unsupported_command",`Unsupported hub schedule command: ${i.command}`)}}catch(u){return Kw(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=ho(l.workspaceRoot),c=ho(l.cwd?.trim()||u);if(!JT(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||!Ai(i,l)&&ho(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(Ai(i,l))return c;let g=this.scopedScheduleIds(l);return c.filter((b)=>g.has(b.scheduleId))}toCreateInput(i,l,u){let c=_a(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?Ww(i):void 0)??l.workspaceRoot,{allWorkspaces:I,...T}=i;return{...T,modelSelection:g,mode:c,workspaceRoot:b,cwd:zw(b,i.cwd)??(b===l.workspaceRoot?l.cwd:b)}}toUpdateInput(i,l,u,c){let g=_a(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?Ww(i)??ho(u.workspaceRoot):l.workspaceRoot,{allWorkspaces:T,..._}=i;return{..._,modelSelection:b,...g===void 0?{}:{mode:g},workspaceRoot:I,...Object.hasOwn(i,"cwd")?{cwd:i.cwd===null?I:zw(I,i.cwd)??(I===l.workspaceRoot?l.cwd:I)}:{}}}}function Fu(i){return i?new Date(i).getTime():void 0}function iK(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:Fu(i.nextRunAt),lastRunAt:Fu(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:iK(i)}}function nK(i){switch(i){case"done":return"success";case"cancelled":return"aborted";case"running":return"running";case"queued":return"pending";default:return"failed"}}function Rp(i,l){return{executionId:i.runId,scheduleId:l,sessionId:i.sessionId,triggeredAt:new Date(i.scheduledFor??i.createdAt).getTime(),startedAt:Fu(i.startedAt),endedAt:Fu(i.completedAt),status:nK(i.status),errorMessage:i.error}}class YT{store;materializer;runner;started=!1;disposed=!1;constructor(i){this.store=new Bf({dbPath:i.dbPath}),this.materializer=new Ff({store:this.store}),this.runner=new qf({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 T=this.store.updateHubSchedule(i,{...l,scheduleId:i});return T?cl(T):void 0}validateScheduleTiming(i,l,u,c){if(i.trim()!==pe){fW(i),BT(l);return}if(l?.trim())throw Error("timezone is only supported for recurring schedules");let g=u?.[ye];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 Rp(u,i)}triggerScheduleNowDetached(i){let l=this.store.enqueueHubScheduleRun(i,"manual");if(!l)return;return this.runner.tick().catch(()=>{return}),Rp(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 Rp(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 Gw=2,lK=300000,Xw=131072,dK=1e5,uK=2000,cK="bm25(0, 0, 0, 0, 0, 0.5, 8.0, 1.0)";function Hf(i){return i!==null&&typeof i==="object"&&!Array.isArray(i)?i:void 0}function sh(i,l){if(l.length>=Xw)return;if(typeof i==="string"){let c=l.parts.length>0?1:0,g=Xw-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)sh(c,l);return}let u=Hf(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;sh(g,l)}}function pK(i){let l=Hf(i),u={length:0,parts:[]};return sh(l?.content??i,u),u.parts.join(`
|
|
866
|
+
`).trim()}function mK(i){let l=Hf(i)?.role;return typeof l==="string"?l:"unknown"}function hK(i){let l=i.metadata?.title,u=typeof l==="string"&&l.trim()?l:i.prompt||i.sessionId;return Wn(u)||i.sessionId}function fK(i){return i.trim().split(/\s+/u).filter(Boolean).map((l)=>`"${l.replaceAll('"','""')}"*`).join(" AND ")}function gK(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 yK(i){let l;try{return l=V(i),gK(l),{db:l}}catch(u){try{l?.close?.()}catch{}return{error:u??Error("Session search database initialization failed")}}}class QT{host;db;initializationError;intervalMs;removedDuringRefresh=new Set;failedEvictionSessionIds=new Set;timer;refreshPromise;readyPromise=Promise.resolve();constructor(i,l={}){this.host=i;let u=yK(l.dbPath??aK(be(),"session-search.db"));this.db=u.db,this.initializationError=u.error,this.intervalMs=l.reconcileIntervalMs??lK}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=fK(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),uK),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,cK,b??null,b??null,g,c);return(this.removedDuringRefresh.size===0&&this.failedEvictionSessionIds.size===0?I:I.filter((T)=>!this.isSessionSuppressed(String(T.session_id)))).map((T)=>{let _=String(T.role);return{sessionId:String(T.session_id),documentId:String(T.document_id),ordinal:Number(T.ordinal),role:_,startedAt:String(T.started_at),workspaceRoot:String(T.workspace_root),title:Wn(String(T.title)),snippet:rr(_,String(T.snippet??"")),score:Number(T.score)}})}isSessionSuppressed(i){return this.removedDuringRefresh.has(i)||this.failedEvictionSessionIds.has(i)}async reconcile(i){let l=await this.host.listSessions(dK),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 T=await this.sourceRevision(I);if(this.isSessionSuppressed(I.sessionId))continue;let _=g.get(I.sessionId);if(_?.source_revision===T&&Number(_.index_version)===Gw)continue;await this.indexSession(i,I,T)}for(let I of c){let T=String(I.session_id);if(!u.has(T)||this.isSessionSuppressed(T))this.deleteIndexedSession(i,T),this.failedEvictionSessionIds.delete(T)}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 oK(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=hK(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[T,_]of c.entries()){let E=pK(_);if(!E)continue;b.run(l.sessionId,`${l.sessionId}:${T}`,T,mK(_),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,Gw,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 kK(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 Jw(i,l){return`---
|
|
919
|
+
${X.stringify(i).trimEnd()}
|
|
920
|
+
---
|
|
921
|
+
${l}`}function SK(i,l){let{data:u,body:c,hadFrontmatter:g}=kK(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 Jw(u,c)}return u.disabled=!0,Jw(u,c)}async function TK({filePath:i,enabled:l}){let u=await bK(i,"utf8"),c=SK(u,l);return await IK(i,c),{filePath:i,enabled:l,disabled:!l}}function t_(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 r_(i,l){return{pluginName:i.name,pluginPath:l,extension:i,tools:[],rules:[],commands:[],mcpServers:[],providers:[]}}async function AK(i){if(Zu(i.mode)==="sandbox")return xK(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:(_)=>{if(_.lastError?.phase==="setup")c.set(_.pluginPath,_)}}),b=[],I=[...g.failures],T=g.issues.flatMap((_)=>_.state==="failed"?l.get(_.pluginPath):[]);try{for(let _ of g.extensions){let E=_.__clinePluginPath;if(!E)continue;let A=r_(_,E);try{await _.setup?.(t_(A).api,{workspaceInfo:u})}catch{}let C=c.get(E);if(C){T.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:_.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:T,failures:I,warnings:g.warnings}}async function xK(i){if(i.pluginPaths.length===0)return{plugins:[],failed:[],failures:[],warnings:[]};let l=i.workspacePath?{rootPath:i.workspacePath}:void 0,u=await Lh({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 T=I.__clinePluginPath;if(!T)continue;let _=r_(I,T);try{await I.setup?.(t_(_).api,{workspaceInfo:l})}catch(E){c.push({pluginPath:T,pluginName:I.name,phase:"setup",message:E instanceof Error?E.message:String(E),stack:E instanceof Error?E.stack:void 0});continue}g.push(_)}}finally{await u.shutdown().catch(()=>{})}let b=c.map((I)=>({name:I.pluginName??wC(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 CK(i,l){let u=EK(Vw(i),Vw(l));return u===""||!u.startsWith("..")&&!_K(u)}var RK=32,po=new Map;function PK(i,l){if(!po.has(i)&&po.size>=RK){let u=po.keys().next().value;if(u)po.delete(u)}po.set(i,l)}async function MK(i){let l=i.pluginPaths.map((g)=>`${g}:${Oh(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:Zu(),pathStats:l,statuses:c})}function Yw(i,l){return i.map((u)=>({...u,enabled:!l.has(u.name)}))}function NK(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 OK(i){let l=jh({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 MK({pluginPaths:u,workspacePath:i.workspacePath,cwd:i.cwd,providerId:i.providerId,modelId:i.modelId}),b=po.get(g);if(b)return{tools:Yw(b.tools,c),plugins:b.plugins,failures:b.failures,warnings:b.warnings};let I=[],T=[],_=await AK({pluginPaths:u,discoveryFailures:l.discoveryFailures,cwd:i.cwd,workspacePath:i.workspacePath,providerId:i.providerId,modelId:i.modelId});for(let C of _.plugins){let{extension:N,pluginPath:M}=C,O=CK(i.workspacePath,M)?"workspace-plugin":"global-plugin";for(let L of C.tools)I.push({name:L.name,pluginName:N.name,path:M,source:O,description:L.description?.trim()||void 0});T.push({pluginName:N.name,path:M,capabilities:[...N.manifest.capabilities].sort(),tools:C.tools.map((L)=>L.name).sort(),rules:C.rules.map((L)=>L.id).sort(),hooks:Object.keys(N.hooks??{}).sort(),commands:C.commands.map((L)=>L.name).sort(),mcpServers:C.mcpServers.map((L)=>L.name).sort(),providers:C.providers.map((L)=>L.name).sort(),state:"ready"})}for(let C of _.failed)T.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=NK(I),A={tools:E,plugins:T,failures:_.failures,warnings:_.warnings};if(_.failures.length===0)PK(g,A);return{tools:Yw(E,c),plugins:T,failures:_.failures,warnings:_.warnings}}function Po(i,l){if(!l)return"global";let u=e_(l,i);return!u.startsWith("..")&&!ZT(u)?"workspace":"global"}function s_(i,l){return Po(i,l)==="workspace"?"workspace-plugin":"global-plugin"}function i_(i,l){let u=e_(oh(i),oh(l));return u===""||!u.startsWith("..")&&!ZT(u)}function $K(i){try{let l=JSON.parse(wK(i,"utf8"));return typeof l.name==="string"&&l.name.trim()?l.name.trim():void 0}catch{return}}function n_(i,l){let u=ih(i),c=l?oh(l):void 0;while(!c||u!==c&&i_(c,u)){let g=zf(u,"package.json");if(Co(g)){let I=$K(g);if(I)return I;break}let b=ih(u);if(b===u)break;u=b}return Go(i,nh(i))}function LK(i){let l=new Set(_s().disabledPlugins??[]),u=new Map;for(let c of ZI(i.workspaceRoot||void 0)){if(!Co(c))continue;try{for(let g of ek(c)){if(u.has(g))continue;u.set(g,{id:g,name:n_(g,c),path:g,enabled:!l.has(g),kind:"plugin",source:i.workspaceRoot?s_(g,i.workspaceRoot):"global-plugin",toggleable:!0})}}catch{}}return Oi([...u.values()])}function DK(i){let l=[];for(let u of Bh({workspacePath:i.workspaceRoot||void 0,cwd:i.cwd,includeDisabled:!0}))for(let c of Qu([u]))l.push({directory:c,pluginName:n_(u),pluginPath:u,source:i.workspaceRoot?s_(u,i.workspaceRoot):"global-plugin"});return l.sort((u,c)=>c.directory.length-u.directory.length)}function UK(i){let l=new Set,u=(c)=>{for(let g of vK(c,{withFileTypes:!0})){let b=zf(c,g.name);if(g.isDirectory())u(b);else if(g.isFile()&&nh(g.name).toLowerCase()===".md"){let I=Go(g.name,nh(g.name));l.add(I.toLowerCase()==="skill"?Go(ih(b)):I)}}};for(let c of Qu([i]))try{u(c)}catch{}return[...l].sort()}function FK(i,l){return l.find((u)=>i_(u.directory,i))}function Oi(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 Qw(i,l){return l&&Po(i,l)==="workspace"?"workspace-plugin":"global-plugin"}function Zw(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 qK(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=Qw(c.rootPath,i.workspaceRoot),I=c.skills.map((E)=>E.metadata.name).sort(),T=c.mcpServers.map((E)=>E.registration.name).sort(),_=[`${I.length} skill${I.length===1?"":"s"}`,`${T.length} MCP server${T.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}`:""} (${_})`].filter(Boolean).join(`
|
|
923
|
+
`),loadError:Zw(i.report,c.rootPath),contributions:{inspectionStatus:g?"available":"disabled",capabilities:[...I.length>0?["skills"]:[],...T.length>0?["mcp"]:[]],tools:[],skills:I,rules:[],hooks:[],commands:[],mcpServers:T,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:zf(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:Go(c)||c,path:c,enabled:!1,kind:"plugin",source:Qw(c,i.workspaceRoot),toggleable:!1,agentPlugin:!0,pluginPath:c,description:"Invalid portable Agent Plugin package.",loadError:Zw(i.report,c),contributions:{inspectionStatus:"failed",capabilities:[],tools:[],skills:[],rules:[],hooks:[],commands:[],mcpServers:[],providers:[]}})}function o_(i){return i.workspaceRoot?.trim()||i.cwd?.trim()||""}function ah(i,l){return i.cwd?.trim()||l||process.cwd()}async function eb(i,l){if(i.userInstructionService)return await l(i.userInstructionService);let u=o_(i),c=ah(i,u),g=Xm({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 jK(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 a_{pluginSource;constructor(i={}){this.pluginSource=i.pluginSource}async list(i={}){return await eb(i,async(l)=>{let u=o_(i),c=DK({workspaceRoot:u,cwd:ah(i,u)}),g=[],b=[],I=[],T=this.pluginSource?[]:LK({workspaceRoot:u}),_=[],E=[];if(this.pluginSource){let N=await this.pluginSource.list(i);T.push(...N.plugins),_.push(...N.tools)}try{let N=await ZS({pluginPaths:i.agentPluginPaths,cwd:ah(i,u)});qK({report:N,workspaceRoot:u,disabledPluginNames:Nh(),plugins:T,skills:I,mcp:E})}catch(N){let M=N instanceof Error?N.message:String(N);console.warn(`[agent-plugins] Package discovery failed; listing settings without Agent Plugins: ${M}`)}let A=new Set(T.filter((N)=>N.enabled!==!1).map((N)=>N.path));if(l){for(let N of l.listRecords("workflow")){let M=N.item;g.push({id:N.id,name:M.name,path:N.filePath,enabled:M.disabled!==!0,kind:"workflow",source:Po(N.filePath,u),description:M.instructions,toggleable:!1})}for(let N of l.listRecords("rule")){let M=N.item;b.push({id:N.id,name:M.name,path:N.filePath,enabled:M.disabled!==!0,kind:"rule",source:Po(N.filePath,u),description:M.instructions,toggleable:!1})}for(let N of l.listRecords("skill")){let M=N.item,O=FK(N.filePath,c);I.push({id:N.id,name:M.name,path:N.filePath,enabled:M.disabled!==!0,kind:"skill",source:O?.source??Po(N.filePath,u),description:M.description,pluginName:O?.pluginName,pluginPath:O?.pluginPath,toggleable:!0})}}if(u&&!this.pluginSource&&i.includePluginTools!==!1)try{let N=await OK({workspacePath:u,cwd:i.cwd,providerId:i.availabilityContext?.providerId,modelId:i.availabilityContext?.modelId});for(let O of N.tools)_.push({id:`${O.pluginName}:${O.name}:${O.path}`,name:O.name,path:O.path,enabled:O.enabled&&A.has(O.path),kind:"tool",source:O.source,description:O.description,toggleable:!0,pluginName:O.pluginName,pluginPath:O.path});let M=new Map(N.plugins.map((O)=>[O.path,O]));for(let O of T){if(O.agentPlugin===!0)continue;let L=M.get(O.path),D=!L||L.state==="failed";if(O.enabled!==!1&&L?.lastError)O.loadError??=`Failed during ${L.lastError.phase}: ${L.lastError.message}`;O.contributions={inspectionStatus:O.enabled===!1?"disabled":D?"failed":"available",capabilities:L?.capabilities??[],tools:L?.tools??[],skills:[...new Set([...UK(O.path),...I.filter((F)=>F.pluginPath===O.path).map((F)=>F.name)])].sort(),rules:L?.rules??[],hooks:L?.hooks??[],commands:L?.commands??[],mcpServers:L?.mcpServers??[],providers:L?.providers??[]}}}catch{}let C=ln();if(_I({filePath:C}))try{for(let N of dm({filePath:C}))E.push({id:N.name,name:N.name,path:C,enabled:N.disabled!==!0,kind:"mcp",source:Po(C,u),description:N.transport.type,toggleable:!0})}catch{}return{workflows:Oi(g.filter((N)=>Co(N.path))),rules:Oi(b.filter((N)=>Co(N.path))),plugins:T,skills:Oi(I.filter((N)=>Co(N.path))),tools:Oi(_),mcp:Oi(E.filter((N)=>Co(N.path)))}})}async toggle(i){if(i.type==="skills")return await eb(i,async(l)=>{let u=jK(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??Go(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??Go(i.path??"")}'; provide an explicit enabled value or a resolvable workspace context.`);return await TK({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)dx(i.name);else cx(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((_)=>u&&_.id===u||c&&_.path===c||g&&_.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 _=i.enabled??b.enabled===!1;return mx(b.pluginName??b.name,!_),{snapshot:await this.list(i),changedTypes:["plugins","skills","mcp"]}}let I=b.path;if(this.pluginSource){let _=i.enabled;if(_===void 0)_=!b.enabled;let E=await this.pluginSource.setEnabled({path:I,enabled:_,cwd:i.cwd,workspaceRoot:i.workspaceRoot});return{snapshot:{...l,plugins:[...E.plugins,...l.plugins.filter((A)=>A.agentPlugin===!0)],tools:Oi(E.tools)},changedTypes:["plugins"]}}let T=i.enabled;if(T===void 0)T=!b.enabled;return px(I,!T),{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()||ln(),c=i.enabled;if(c===void 0){let g=dm({filePath:u}).find((b)=>b.name===l);if(!g)throw Error(`Unknown MCP server: ${l}`);c=g.disabled===!0}return mA({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 u_(i,l){let u=Kf(i,l);return u===""||!u.startsWith(`..${sG}`)&&u!==".."&&!Wf(u)}function iG(i,l,u){if(!Np(i))return;let c=ib(i),g=l;while(!Np(g)){let I=rG(g);if(I===g)break;g=I}if(!Np(g))return;let b=ib(g);if(!u_(c,b))throw Error(`${u} escapes the workspace through a symbolic link`)}function nb(i,l,u,c){let g=d_(i,Wf(l)?Kf(i,l):l);if(!u_(i,g)||!c&&g===i)throw Error(`${u} must stay within the task workspace`);return iG(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((_)=>_.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=d_(u),g=_d(i.cwd),b=g?nb(c,g,"cwd",!0):void 0,I=[],T=new Set;for(let _ of l){let E=_.trim();if(!E)throw Error("resourcePaths must contain only non-empty paths");if(Wf(E)||E.split(/[\\/]+/u).includes(".."))throw Error("resourcePaths must be workspace-relative without '..'");let A=nb(c,E,"resourcePaths",!1),C=Kf(c,A);if(!T.has(C))T.add(C),I.push(C)}return{workspaceRoot:c,cwd:b,resourcePaths:I}}var nG=new Set(["suggestion","follow-up","todo","handoff","idea","reminder"]),oG=new Set(["status","instructions","revision","approvedRevision","createdBy","updatedBy","currentRunId","lastRunId","lastSessionId","error","createdAt","updatedAt","completedAt","archivedAt"]),aG=new Set(["taskId","type","priority","title","description","availableAt","expiresAt","cwd","resourcePaths","assignee","modelSelection","mode","systemPrompt","maxIterations","timeoutSeconds","automationEligible"]);function lG(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 tG("sha256").update(JSON.stringify(i)).update(`
|
|
928
|
+
`).update(l.trim()).digest("hex")}function qr(i){if(typeof i!=="string")return;let l=i.trim();return l.length>0?l:void 0}function ob(i,l){let u=qr(i);if(!u||!Number.isFinite(Date.parse(u)))return Error(`${l} must be a valid ISO-8601 timestamp`);return new Date(u).toISOString()}function ab(i,l){if(i===void 0)return;if(!Number.isInteger(i)||i<=0)return Error(`${l} must be a positive integer`);return i}function dG(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=qr(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 uG(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=qr(l.providerId);if(!c)return Error("modelSelection.providerId is required");let g=qr(l.modelId);return{providerId:c,...g?{modelId:g}:{}}}function nt(i,l,u){return{ok:!1,specPath:i.specPath,contentHash:l,error:u}}function lb(i){let{frontmatter:l,body:u}=lG(i.raw);if(l===void 0)return nt(i,Ed({},u),"task spec must begin with YAML frontmatter");let c;try{let B=X.parse(l);if(!B||typeof B!=="object"||Array.isArray(B))return nt(i,Ed({},u),"frontmatter must be a YAML mapping");c=B}catch(B){return nt(i,Ed({},u),B instanceof Error?`failed to parse frontmatter: ${B.message}`:"failed to parse frontmatter")}let g=Ed(c,u),b=Object.keys(c).filter((B)=>oG.has(B));if(b.length>0)return nt(i,g,`operational field(s) cannot be set in a task spec: ${b.join(", ")}`);let I=Object.keys(c).filter((B)=>!aG.has(B));if(I.length>0)return nt(i,g,`unknown task spec field(s): ${I.join(", ")}`);if(i.scope==="workspace"&&!qr(i.workspaceRoot))return nt(i,g,"workspaceRoot is required for workspace-scoped task specs");let T=qr(c.type);if(!T||!nG.has(T))return nt(i,g,"type must be one of: suggestion, follow-up, todo, handoff, idea, reminder");let _=qr(c.title);if(!_)return nt(i,g,"title is required");let E=u.trim();if(!E)return nt(i,g,"markdown body instructions are required");let A=c.priority??3;if(!Number.isInteger(A)||A<0||A>5)return nt(i,g,"priority must be an integer from 0 to 5");let C=ob(c.expiresAt,"expiresAt");if(C instanceof Error)return nt(i,g,C.message);let N;if(c.availableAt!==void 0){let B=ob(c.availableAt,"availableAt");if(B instanceof Error)return nt(i,g,B.message);if(N=B,Date.parse(N)>=Date.parse(C))return nt(i,g,"availableAt must be before expiresAt")}let M=dG(c.resourcePaths,"resourcePaths");if(M instanceof Error)return nt(i,g,M.message);let O;try{O=Xl({scope:i.scope,workspaceRoot:i.workspaceRoot,cwd:qr(c.cwd),resourcePaths:M})}catch(B){return nt(i,g,B instanceof Error?B.message:String(B))}let L=uG(c.modelSelection);if(L instanceof Error)return nt(i,g,L.message);let D=ab(c.maxIterations,"maxIterations");if(D instanceof Error)return nt(i,g,D.message);let F=ab(c.timeoutSeconds,"timeoutSeconds");if(F instanceof Error)return nt(i,g,F.message);let j=c.mode;if(j!==void 0&&j!=="act"&&j!=="plan"&&j!=="yolo")return nt(i,g,"mode must be one of: act, plan, yolo");if(c.automationEligible!==void 0&&typeof c.automationEligible!=="boolean")return nt(i,g,"automationEligible must be a boolean");return{ok:!0,specPath:i.specPath,contentHash:g,spec:{taskId:qr(c.taskId),type:T,title:_,description:qr(c.description),instructions:E,scope:i.scope,workspaceRoot:O.workspaceRoot,cwd:O.cwd,resourcePaths:O.resourcePaths,priority:A,assignee:qr(c.assignee),modelSelection:L,mode:j,systemPrompt:qr(c.systemPrompt),maxIterations:D,timeoutSeconds:F,availableAt:N,expiresAt:C,automationEligible:c.automationEligible!==!1,specPath:i.specPath,contentHash:g}}}function cG(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 pG(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 mG(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 hG(i,l){let u=l_(i,l);return u===""||!u.startsWith(`..${eG}`)&&u!==".."&&!dh(u)}class c_{specsDir;scope;workspaceRoot;constructor(i){this.scope=i.scope,this.workspaceRoot=i.workspaceRoot?.trim()||void 0,this.specsDir=sb(Ya({scope:i.scope,workspaceRoot:this.workspaceRoot,taskSpecsDir:i.taskSpecsDir}))}listSpecPaths(){if(!Yr(this.specsDir))return[];return this.assertSpecsDirSafe(),XK(this.specsDir,{withFileTypes:!0}).filter((i)=>i.isFile()&&i.name.endsWith(".task.md")).map((i)=>Mp(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(Pp(l).isSymbolicLink())throw Error("task spec files cannot be symbolic links");return lb({specPath:l,raw:JK(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&&Yr(u))throw Error(`task spec already exists: ${u}`);if(Yr(u)&&Pp(u).isSymbolicLink())throw Error("task spec files cannot be symbolic links");let c=cG(i),g=lb({specPath:u,raw:c,scope:this.scope,workspaceRoot:this.workspaceRoot});if(!g.ok)throw Error(`invalid task spec: ${g.error}`);let b=Mp(this.specsDir,`.${QK(u)}.${process.pid}.${Date.now()}.tmp`);try{if(YK(b,c,{encoding:"utf8",mode:384}),this.assertExpectedContent(u,l),l.createOnly)KK(b,u);else VK(b,u)}finally{if(Yr(b))rb(b,{force:!0})}return g.spec}resolveWritePath(i,l){return this.resolveSpecPath(l??mG(i))}ensureSpecsDir(){this.assertSpecsDirSafe(),GK(this.specsDir,{recursive:!0}),this.assertSpecsDirSafe()}deleteSpec(i,l={}){this.assertSpecsDirSafe();let u=this.resolveSpecPath(i);if(!Yr(u))return!1;if(l.expectedContentHash){if(this.readSpec(u).contentHash!==l.expectedContentHash)throw Error(`task spec changed before delete: ${u}`)}return rb(u),!0}assertExpectedContent(i,l){if(l.createOnly){if(Yr(i))throw Error(`task spec already exists: ${i}`);return}if(!l.expectedContentHash)return;if(!Yr(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(Yr(this.specsDir)&&Pp(this.specsDir).isSymbolicLink())throw Error("task specs directory cannot be a symbolic link");if(!this.workspaceRoot||!Yr(this.workspaceRoot))return;let i=tb(this.workspaceRoot),l=this.specsDir;while(!Yr(l)){let u=ZK(l);if(u===l)break;l=u}if(Yr(l)&&!hG(i,tb(l)))throw Error("task specs directory escapes the workspace")}resolveSpecPath(i){let l=sb(dh(i)?i:Mp(this.specsDir,i)),u=l_(this.specsDir,l);if(u===""||u.startsWith("..")||dh(u)||!l.endsWith(".task.md"))throw Error("task spec path must be a *.task.md file within the specs directory");return l}}var fG=[`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 gG(i){i.exec("PRAGMA journal_mode = WAL;"),i.exec("PRAGMA busy_timeout = 5000;"),i.exec("PRAGMA foreign_keys = ON;");for(let l of fG)i.exec(l)}var cb={kind:"system",id:"task_store"};class Zd 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 Is(i){if(typeof i==="number"&&Number.isFinite(i))return Math.floor(i);if(typeof i==="bigint")return Number(i);return}function Op(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:Is(i.priority)??3,assignee:h(i.assignee),modelSelection:Tl(i.model_selection_json),mode:h(i.mode),systemPrompt:h(i.system_prompt),maxIterations:Is(i.max_iterations),timeoutSeconds:Is(i.timeout_seconds),availableAt:f(i.available_at),expiresAt:f(i.expires_at),automationEligible:Number(i.automation_eligible??0)===1,revision:Is(i.revision)??1,approvedRevision:Is(i.approved_revision),createdBy:Tl(i.created_by_json)??cb,updatedBy:Tl(i.updated_by_json)??cb,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 pb(i){return{runId:f(i.run_id),taskId:f(i.task_id),taskRevision:Is(i.task_revision)??1,attempt:Is(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 mb(i){return{scopeKey:f(i.scope_key),mode:f(i.mode),applyToAgentCreated:Number(i.apply_to_agent_created??0)===1,maxConcurrentRuns:Is(i.max_concurrent_runs)??2,maxChainDepth:Is(i.max_chain_depth)??1,maxStartsPerHour:Is(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 Vt(i){return typeof i==="string"&&i.trim()?i.trim():void 0}function Li(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 hb(i,l){return i==null?void 0:Li(i,l)}function Ci(i,l){if(i==null)return;if(!Number.isInteger(i)||i<=0)throw Error(`${l} must be a positive integer`);return i}function fb(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 p_{db;constructor(i={}){this.db=V(i.dbPath??Ha()),gG(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=Vt(i.taskId)??`task_${db()}`,c=Xl(i),g=Li(i.availableAt??l,"availableAt"),b=Li(i.expiresAt,"expiresAt");fb(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 T=Ci(i.maxIterations,"maxIterations"),_=Ci(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"),Vt(i.description)??null,pl(i.instructions,"instructions"),i.scope,c.workspaceRoot??null,c.cwd??null,JSON.stringify(c.resourcePaths),I,Vt(i.assignee)??null,i.modelSelection?JSON.stringify(i.modelSelection):null,i.mode??null,Vt(i.systemPrompt)??null,T??null,_??null,g,b,i.automationEligible===!1?0:1,C,JSON.stringify(i.createdBy),JSON.stringify(i.createdBy),Vt(i.originSessionId)??null,Vt(i.originTaskId)??null,Vt(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?Op(l):void 0}getTaskBySpecPath(i){let l=this.db.prepare("SELECT * FROM agenda_tasks WHERE spec_path = ?").get(i);return l?Op(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(ub(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()?ub(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(Li(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(Op)}updateTask(i){let l=this.getTask(i.taskId);if(!l)return;if(l.revision!==i.expectedRevision)throw new Zd(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=Li(i.availableAt??l.availableAt,"availableAt"),b=Li(i.expiresAt??l.expiresAt,"expiresAt");fb(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 T=l.status==="approved"||l.status==="failed"?"pending_approval":l.status,_=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,T,pl(i.title??l.title,"title"),i.description===null?null:Vt(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:Vt(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:Vt(i.systemPrompt??l.systemPrompt)??null,Ci(i.maxIterations===null?void 0:i.maxIterations??l.maxIterations,"maxIterations")??null,Ci(i.timeoutSeconds===null?void 0:i.timeoutSeconds??l.timeoutSeconds,"timeoutSeconds")??null,g,b,i.automationEligible??l.automationEligible?1:0,_,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 Zd(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 Zd(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=(Is(u?.max_attempt)??0)+1,g=`run_${db()}`,b=x(),I=i.claimedAt?Li(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",Vt(i.claimToken)??null,hb(i.claimUntilAt,"claimUntilAt")??null,Vt(i.requestedByClientId)??null,Vt(i.sessionId)??null,I,b,b);let T=this.getRun(g);if(!T)throw Error(`failed to create run ${g}`);return T}getRun(i){let l=this.db.prepare("SELECT * FROM agenda_task_runs WHERE run_id = ?").get(i);return l?pb(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(pb)}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 mb(l)}listAutomationPolicies(){return this.db.prepare("SELECT * FROM agenda_task_automation ORDER BY scope_key").all().map((i)=>mb(i))}setAutomationPolicy(i){let l=pl(i.scopeKey,"scopeKey"),u=Ci(i.maxConcurrentRuns,"maxConcurrentRuns"),c=Ci(i.maxChainDepth,"maxChainDepth"),g=Ci(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,hb(i.enabledAt,"enabledAt")??null,b),this.getAutomationPolicy(l)}}var Di={kind:"system",id:"file_reconciler"},Pi={kind:"system",id:"task_manager"},gb={kind:"automation_policy",id:"global"},ml=new Set(["completed","failed","cancelled","interrupted"]),yG=30000,vG=250;function Ps(){return new Date().toISOString()}function yb(i){return typeof i==="string"&&i.trim()?i.trim():void 0}function vb(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 wb(i,l){let u=WK(i,l);return u!==""&&!u.startsWith("..")&&!u.startsWith("/")}function hl(i){if(!i||!lh(i))return!1;try{return HK(i).isDirectory()}catch{return!1}}function $p(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 Lp(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 wG(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:Di}}function bG(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 m_{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 p_({dbPath:i.dbPath}),this.globalSpecsDir=i.globalSpecsDir,this.watcherDebounceMs=Math.max(0,i.watcherDebounceMs??vG),this.watchFiles=i.watchFiles!==!1,this.automationEnabled=i.automationEnabled!==!1,this.logger=i.logger??Un,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()},yG),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:Ps(),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:Pi});if(this.activeRuns.clear(),this.ownsStore)this.store.close()}async createTask(i){this.assertUsable(),vb(i.expiresAt);let l=Xl(i),u={...i,...l},c=yb(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(lh(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(T){throw this.store.deleteTask(c),T}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!==Di.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=bG(u,i);vb(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},T=this.ensureScope(b.scope,b.workspaceRoot),_=u.specPath!==void 0&&wb(T.specsDir,u.specPath);if(!_)await this.reconcileFileStore(T);let E=T.resolveWritePath(u.taskId,_?u.specPath:void 0);if(E!==u.specPath&&(lh(E)||this.store.getTaskBySpecPath(E)))throw Error(`task spec already exists: ${E}`);let A;if(_&&u.specPath){let L=T.readSpec(u.specPath);if(!L.ok)throw Error(`task spec is invalid: ${L.error}`);if(i.updatedBy.id!==Di.id&&$p(L.spec,u)!==Lp(u))throw Error(`task spec changed outside the manager; reconcile task ${u.taskId} and retry`);A=L.contentHash}let C,N;try{C=T.writeSpec(b,{specPath:E,expectedContentHash:A,createOnly:!_}),N=this.store.updateTask(I)}catch(L){try{if(C&&_&&u.specPath)T.writeSpec(u,{specPath:u.specPath,expectedContentHash:C.contentHash});else if(C)T.deleteSpec(E,{expectedContentHash:C.contentHash})}catch(D){this.logError("agenda task update rollback failed",D,{taskId:u.taskId,specPath:E})}throw L}if(!N||!C)throw Error(`unknown task: ${i.taskId}`);let M=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 O=M??this.requireTask(i.taskId);return this.publish("task.updated",O),this.expireTask(O),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:Ps(),error:c?.trim()||void 0});this.activeRuns.delete(i);let T=this.store.updateTaskState(i,{status:"cancelled",approvedRevision:null,currentRunId:null,error:c?.trim()||null,updatedBy:l},g.revision);if(!T)throw Error(`unknown task: ${i}`);if(this.publish("task.updated",T,b),b?.sessionId)try{await this.runtime.abortSession(b.sessionId,I)}catch(_){this.logError("agenda task session abort failed",_,{taskId:i,runId:b.runId,sessionId:b.sessionId})}return T}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 T=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"}),_=this.store.getRun(b.runId),E=this.store.getTask(i);if(!_||ml.has(_.status)||E?.status!==g.status||E.currentRunId!==b.runId){if(_&&!ml.has(_.status))this.store.updateRun(b.runId,{status:"cancelled",sessionId:T.sessionId,completedAt:Ps(),error:"Task changed or was cancelled while its session was starting."});else if(_)this.store.updateRun(b.runId,{sessionId:T.sessionId});throw this.activeRuns.delete(i),await this.runtime.abortSession(T.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:T.sessionId})),Error(`task ${i} changed or was cancelled while starting`)}b=this.store.updateRun(b.runId,{status:"running",sessionId:T.sessionId,startedAt:Ps()})??b,I=this.store.updateTaskState(i,{status:"in_progress",lastSessionId:T.sessionId,updatedBy:l})??I,this.activeRuns.set(i,{runId:b.runId,sessionId:T.sessionId}),this.publish("task.run.started",I,b);let A=this.finishRun(I,b,T.sessionId);return this.backgroundRuns.add(A),A.finally(()=>this.backgroundRuns.delete(A)),{task:I,run:b}}catch(T){throw await this.finishRunFailure(I,b,T),T}}async getAutomationPolicy(i="global"){return this.assertUsable(),this.store.getAutomationPolicy(i)}async setAutomationPolicy(i,l){this.assertUsable();let u=Ps(),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=Ps(),I=this.store.updateRun(l.runId,{status:"completed",completedAt:b,resultSummary:c.summary,error:null})??g,T=this.store.updateTaskState(i.taskId,{status:"completed",currentRunId:null,error:null,completedAt:b,updatedBy:Pi})??this.requireTask(i.taskId);this.publish("task.run.completed",T,I)}else if(c.status==="cancelled")await this.cancelTask(i.taskId,Pi,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:Ps(),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 T=this.store.updateTaskState(i.taskId,{status:"failed",currentRunId:null,error:g,updatedBy:Pi})??I;this.activeRuns.delete(i.taskId),this.publish("task.run.failed",T,b)}ensureScope(i,l){let u=yb(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 c_({scope:i,workspaceRoot:u,taskSpecsDir:i==="global"?this.globalSpecsDir:void 0}),I={store:b},T=!0;try{b.ensureSpecsDir();let _=this.watchFiles?this.resolveWatchRoot(b.specsDir):void 0;if(_!==void 0)I.watcher=zK(_,(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=!1,this.logError("agenda task source could not be attached",_,{specsDir:b.specsDir})}if(T)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,T=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(!T){let _=this.store.createTask(pG(g,Di));this.publish("task.created",_),this.expireTask(_);continue}if(T.archivedAt){let _=T.status==="cancelled"&&T.error==="Task spec was deleted.",E=this.store.updateTaskState(T.taskId,{status:_?"pending_approval":T.status,approvedRevision:_?null:T.approvedRevision,archivedAt:null,error:_?null:T.error,updatedBy:Di});if(E)T=E,this.publish("task.updated",E)}if($p(g,T)===Lp(T))continue;if(T.status==="in_progress"){this.logger.log("agenda task edit deferred until its run completes",{severity:"warn",taskId:T.taskId});continue}if(T.status==="completed"||T.status==="cancelled"||T.status==="expired"){this.logger.log("terminal agenda task edits are not applied",{severity:"warn",taskId:T.taskId,status:T.status}),i.writeSpec(T,{specPath:g.specPath,expectedContentHash:g.contentHash});continue}await this.updateTask(wG(g,T))}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||!wb(i.specsDir,c.specPath)||l.has(c.specPath)||c.archivedAt)continue;if(c.status==="in_progress")await this.cancelTask(c.taskId,Di,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:Ps(),updatedBy:Di});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:Pi});if(l)this.publish("task.updated",l)}isExpired(i){return Date.parse(i.expiresAt)<=Date.now()}recoverInterruptedRuns(){let i=Ps();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:Pi});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:Pi})}}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:Ps(),limit:1000});for(let I of b){if(g<=0)break;if(i!==this.automationPolicyGeneration)return;try{let T=I;if(T.status==="pending_approval"){if(!this.canAutomaticallyApprove(T,u))continue;T=await this.approveTask(T.taskId,gb,T.revision)}if(i!==this.automationPolicyGeneration)return;if(u.mode==="auto_start"&&this.runtime.isInteractiveClientAvailable?.()!==!0)continue;await this.runTask(T.taskId,gb,T.revision),g-=1}catch(T){this.logError("agenda task automation start failed",T,{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||$p(c.spec,u)!==Lp(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 BK.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 Ib=s(["suggestion","follow-up","todo","handoff","idea","reminder"]),IG=s(["pending_approval","approved","in_progress","completed","failed","cancelled","expired"]),kb=p([a(0),a(1),a(2),a(3),a(4),a(5)]),kG=t({provider_id:e().min(1),model_id:e().min(1).optional()}),Gf=t({operation:s(["create","update","list","get"]),task_id:e().min(1).optional(),expected_revision:n().int().positive().optional(),type:Ib.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:kb.optional(),assignee:e().min(1).nullable().optional(),model_selection:kG.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(IG).optional(),types:o(Ib).optional(),priorities:o(kb).optional(),limit:n().int().positive().max(500).optional()}),SG=new Set(["create","update"]);function Dp(i,l,u,c){if(!SG.has(l.operation))return;ra(i.telemetry,{ulid:u.sessionId??u.conversationId??u.agentId,tool:`tasks.todo.${l.operation}`,success:c,agentId:u.agentId})}function no(i,l){let u=i?.trim();if(!u)throw Error(`${l} is required for this operation`);return u}function Sb(i){if(i===void 0||i===null)return i;return{providerId:i.provider_id,modelId:i.model_id}}function h_(i,l){return bb(i)===bb(l)}function Tb(i,l){if(!i)throw Error("task does not exist");if(l.workspaceRoot){if(i.scope!=="workspace"||!i.workspaceRoot||!h_(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 TG(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||!h_(i.workspace_root,l.workspaceRoot))throw Error(`this session can only manage ${u} tasks`)}return u}async function _G(i,l,u){let c=Gf.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 T=TG(g,I);switch(g.operation){case"create":{let _={type:no(g.type,"type"),title:no(g.title,"title"),description:g.description??void 0,instructions:no(g.instructions,"instructions"),scope:T,workspaceRoot:I.workspaceRoot,cwd:T==="workspace"?(g.cwd??I.cwd)?.trim()||void 0:void 0,resourcePaths:g.resource_paths,priority:g.priority,assignee:g.assignee??void 0,modelSelection:Sb(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:no(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(_)};return Dp(i,g,u,!0),E}case"update":{let _=no(g.task_id,"task_id");if(Tb(await i.manager.getTask(_),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:_,expectedRevision:g.expected_revision,type:g.type,title:g.title,description:g.description,instructions:g.instructions,scope:T,workspaceRoot:I.workspaceRoot??null,cwd:g.cwd,resourcePaths:g.resource_paths,priority:g.priority,assignee:g.assignee,modelSelection:Sb(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 Dp(i,g,u,!0),E}case"list":{let _={statuses:g.statuses,types:g.types,scope:T,workspaceRoot:I.workspaceRoot,priorities:g.priorities,automationEligible:g.automation_eligible,limit:g.limit};return{ok:!0,operation:g.operation,tasks:await i.manager.listTasks(_)}}case"get":{let _=await i.manager.getTask(no(g.task_id,"task_id"));return Tb(_,I),{ok:!0,operation:g.operation,task:_}}}}catch(I){return Dp(i,g,u,!1),{ok:!1,operation:g.operation,error:{code:"task_operation_failed",message:I instanceof Error?I.message:String(I)}}}}var xG=s(["create","update","list","get","pause","resume","delete","run_now"]),CG=t({provider_id:e().min(1),model_id:e().min(1).optional()}),vc=t({operation:xG,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:CG.optional(),limit:n().int().positive().max(200).optional()});function lo(i,l,u,c){if(!y_.has(l.operation))return;ra(i.telemetry,{ulid:u.sessionId??u.conversationId??u.agentId,tool:`tasks.scheduled.${l.operation}`,success:c,agentId:u.agentId})}var y_=new Set(["create","update","pause","resume","delete","run_now"]);function Vo(i,l){let u=i?.trim();if(!u)throw Error(`${l} is required for this operation`);return u}function Xf(i,l){try{let u=uh.native(i);if(!EG(u).isDirectory())throw Error("not a directory");return u}catch{throw Error(`${l} does not resolve to an existing safe path`)}}function RG(i,l){try{return uh.native(i)===uh.native(l)}catch{return!1}}function v_(i,l,u){let c=AG(i,l);if(c===".."||c.startsWith(`..${g_}`)||f_(c))throw Error(`${u} is outside the workspace scope`)}function w_(i,l,u){return Xf(f_(l)?l:`${i}${g_}${l}`,u)}function PG(i){let l=Xf(i.workspaceRoot,"workspaceRoot"),u=i.cwd?w_(l,i.cwd,"cwd"):l;return v_(l,u,"cwd"),{...i,workspaceRoot:l,cwd:u}}function uo(i,l){if(!i)throw Error("schedule does not exist");if(!RG(i.workspaceRoot,l.workspaceRoot))throw Error("schedule is outside this session's workspace scope");let u=Xf(i.workspaceRoot,"schedule workspaceRoot");if(i.cwd){let c=w_(u,i.cwd,"schedule cwd");v_(u,c,"schedule cwd")}}function _b(i){if(!i)return;return{providerId:i.provider_id.trim(),modelId:i.model_id?.trim()||void 0}}function Up(i){if(!i)return;return[...new Set(i.map((l)=>l.trim()).filter(Boolean))]}function b_(i){let l=Date.parse(Vo(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 MG(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:{[ye]:b_(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:Vo(i.cron_pattern,"cron_pattern"),timezone:i.timezone?.trim()||void 0}}throw Error("schedule_type is required for create")}function NG(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:{[ye]:b_(i.run_at)}}}if(i.schedule_type==="recurring"||i.cron_pattern)return{cronPattern:Vo(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 Vo(i.schedule_id,"schedule_id")}async function OG(i,l,u){let c=vc.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=PG(b);if(y_.has(g.operation)&&!I.interactive)throw Error("schedule mutations require an interactive user session");switch(g.operation){case"create":{let T=i.schedules.createSchedule({name:Vo(g.name,"name"),...MG(g),prompt:Vo(g.prompt,"prompt"),workspaceRoot:I.workspaceRoot,cwd:I.cwd,modelSelection:_b(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:Up(g.tags)});return i.publish?.("schedule.created",{schedule:T},u.sessionId),lo(i,g,u,!0),{ok:!0,operation:g.operation,schedule:T}}case"update":{let T=fl(g);uo(i.schedules.getSchedule(T),I);let _=i.schedules.updateSchedule(T,{scheduleId:T,...NG(g),name:g.name?.trim()||void 0,prompt:g.prompt?.trim()||void 0,modelSelection:_b(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:Up(g.tags)});if(!_)throw Error("schedule does not exist");return i.publish?.("schedule.updated",{schedule:_},u.sessionId),lo(i,g,u,!0),{ok:!0,operation:g.operation,schedule:_}}case"list":{let T=i.schedules.listSchedules({enabled:g.enabled,tags:Up(g.tags),workspaceRoot:I.workspaceRoot,limit:g.limit??50}).filter((_)=>{try{return uo(_,I),!0}catch{return!1}}).slice(0,g.limit??50);return{ok:!0,operation:g.operation,schedules:T}}case"get":{let T=i.schedules.getSchedule(fl(g));return uo(T,I),{ok:!0,operation:g.operation,schedule:T}}case"pause":case"resume":{let T=fl(g);uo(i.schedules.getSchedule(T),I);let _=g.operation==="pause"?i.schedules.pauseSchedule(T):i.schedules.resumeSchedule(T);if(!_)throw Error("schedule does not exist");return i.publish?.("schedule.updated",{schedule:_},u.sessionId),lo(i,g,u,!0),{ok:!0,operation:g.operation,schedule:_}}case"delete":{let T=fl(g);uo(i.schedules.getSchedule(T),I);let _=i.schedules.deleteSchedule(T);if(!_)throw Error("schedule does not exist");return i.publish?.("schedule.deleted",{deleted:_,scheduleId:T},u.sessionId),lo(i,g,u,!0),{ok:!0,operation:g.operation,deleted:_}}case"run_now":{let T=fl(g);uo(i.schedules.getSchedule(T),I);let _=i.schedules.triggerScheduleNowDetached(T);if(!_)throw Error("schedule does not exist");return i.publish?.("schedule.triggered",{execution:_},u.sessionId),lo(i,g,u,!0),{ok:!0,operation:g.operation,execution:_}}}}catch(b){return lo(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",$G='# 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.',LG="# 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.",DG=Gf.extend({kind:a("todo")}).strict(),I_=vc.extend({kind:a("scheduled")}).strict(),UG=w("kind",[DG,I_]),FG=w("kind",[I_]),k_=["create","update","list","get","pause","resume","delete","run_now"],qG=t({...vc.shape,...Gf.shape,kind:s(["todo","scheduled"]),operation:s(k_)}).strict(),jG=t({...vc.shape,kind:s(["scheduled"]),operation:s(k_)}).strict();function BG(i){let l=i.todo;return k({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?qG:jG),retryable:!1,maxRetries:0,execute:async(u,c)=>{let g=(l?UG:FG).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 _G(l,g.data,c)}}return{kind:"scheduled",...await OG(i.scheduled,g.data,c)}}})}function HG(i){return{name:"hub-task-guidance",manifest:{capabilities:["rules"]},setup:(l)=>{l.registerRule({id:"hub:task-guidance",content:i?.todoEnabled===!1?LG:$G,whenToolAvailable:Jf})}}}function WG(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 Ab(i,l,u){let c=WG(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 S_{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 T=await I.text(),_;if(T.trim())try{_=JSON.parse(T)}catch{if(!I.ok)throw Error(Ab(I.status,T,void 0));throw Error("Cline account response was not valid JSON")}if(!I.ok)throw Error(Ab(I.status,T,_));if(typeof _==="object"&&_!==null){let E=_;if(typeof E.success==="boolean"){if(!E.success)throw Error(E.error||"Cline account request failed");return E.data}}if(_===void 0||_===null)throw Error("Cline account response payload was empty");return _}finally{clearTimeout(b)}}}var GG=610000,XG=3000,gl=15000,JG="CLOUD_SESSION_ERROR:",T_="__cline_create_request__:";function VG(i){return(i.trim().split(`
|
|
1064
|
+
`)[0]??"").trim().slice(0,72)}class ue extends Error{code;detail;connectUrl;status;constructor(i,l,u,c){super(`${JG}${JSON.stringify({code:i,message:l,connectUrl:u})}`);this.code=i,this.detail=l,this.connectUrl=u,this.status=c,this.name="CloudSessionError"}}class __ extends ue{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 E_ extends Error{constructor(i){super(i instanceof Error?i.message:"Cloud handoff creation was rejected.",{cause:i});this.name="CloudHandoffCreationRejectedError"}}function ch(i){let l=i.length;while(l>0&&i[l-1]==="/")l--;return i.slice(0,l)}function YG(i){return`${T_}${i}`.slice(0,255)}function xb(i){return i?.startsWith(T_)===!0}function A_(i){switch(i){case"provisioning":case"cloning_repo":case"agent_starting":case"ready":case"failed":return i;default:return}}function Fp(i){let l=ne(i.replace(/^workos:/,""));return typeof l?.sub==="string"&&l.sub.trim()?l.sub.trim():void 0}function Cb(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()},XG);i.addEventListener("abort",c,{once:!0})})}function QG(i,l){if(i&&typeof i==="object"){let u=i.error;if(typeof u==="string"&&u.trim())return u.trim()}return l}function qp(i,l,u,c){let g=QG(l,`Cloud session request failed (${i})`);if(i===401)return new ue("authentication_required",g);if(i===404)return new ue("session_not_found",g);if(i===410)return new ue("session_expired",g);if(i===412)return new ue("github_not_connected",g,c??`${ch(u)}/dashboard/integrations`);if(i===403&&g.trim().toLowerCase()==="forbidden")return new ue("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 ue("request_failed",g,void 0,i)}class x_{options;apiBaseUrl;appBaseUrl;fetchImpl;createTimeoutMs;unconfirmedHandoffCreates=new Set;completedHandoffCreates=new Map;constructor(i){this.options=i,this.apiBaseUrl=ch(i.apiBaseUrl),this.appBaseUrl=ch(i.appBaseUrl),this.fetchImpl=i.fetch??fetch,this.createTimeoutMs=i.createTimeoutMs??GG}async request(i,l={},u,c,g){let b=!1,I;while(!0){let T;try{T=typeof c==="string"?c:await this.options.getAuthToken()}catch(A){if(I)throw qp(401,void 0,this.appBaseUrl,u);throw A}if(!T?.trim())throw new ue("authentication_required","Sign in to Cline before starting a cloud session.");if(T.trim()===I)throw new ue("authentication_required","The cloud session credential was rejected. Sign in again.");if(typeof c==="object"){if(c.subject?Fp(T.trim())!==c.subject:T.trim()!==c.token)throw new ue("authentication_required","The signed-in account changed during cloud session creation.");c.token=T.trim()}g?.();let _=await this.fetchImpl(`${this.apiBaseUrl}${i}`,{...l,signal:l.signal??AbortSignal.timeout(gl),headers:{Accept:"application/json",Authorization:`Bearer ${T.trim()}`,...l.body?{"Content-Type":"application/json"}:{},...l.headers}}),E=_.status===204?void 0:await _.json().catch(()=>{return});if(!_.ok){if(_.status===401&&typeof c==="object"&&!b&&c.subject){b=!0,I=T.trim();continue}throw qp(_.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&&xb(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&&xb(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),T=String(b.html_url??b.clone_url??"").trim();if(!Number.isSafeInteger(I)||I<=0||!T)return[];let _=String(b.name??"").trim();return[{id:I,name:_,fullName:String(b.full_name??(_||T)).trim(),url:T,defaultBranch:String(b.default_branch??"").trim()}]})}}catch(g){if(g instanceof ue&&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 ue("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(),T=u.cursor?.trim();if(I)b.set("query",I);if(T)b.set("cursor",T);let _=b.size>0?`${g}?${b}`:g;try{let E=await this.request(_),A=Array.isArray(E)?E:Array.isArray(E?.items)?E.items:[],C=I?.toLowerCase();return{available:!0,branches:A.flatMap((N)=>{let M=String(N.name??"").trim();return M&&(!Array.isArray(E)||!C||M.toLowerCase().includes(C))?[M]:[]}),nextToken:Array.isArray(E)?"":String(E?.nextToken??"").trim()}}catch(E){if(E instanceof ue&&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 ue("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 ue("authentication_required","Sign in to Cline before starting a cloud session.");let u={token:l,subject:Fp(l)},c=YG(i.requestId?.trim()||KG()),g=i.handoff?`${u.subject??l}/${i.organizationId??""}/${i.requestId?.trim()??""}`:void 0;if(i.handoff&&!i.requestId?.trim())throw new ue("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 M=new ue(C.status==="failed"?"session_failed":"session_expired","The recovered cloud handoff workspace is no longer usable.");try{await this.deleteWithAuth(C.id,u)}catch(O){if(!(O instanceof ue&&(O.code==="session_not_found"||O.code==="session_expired")))throw AggregateError([M,O],"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),M}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 ue("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(M){if(M instanceof ue&&(M.code==="session_not_found"||M.code==="session_expired"))await i.handoff?.onOuterSessionRemoved?.(N.sessionId),this.completedHandoffCreates.delete(g),this.unconfirmedHandoffCreates.delete(g);throw M}return await i.handoff?.onOuterSessionCreated(N.sessionId,{created:!1}),{...N,cleanupAuthToken:u.token}}if(this.unconfirmedHandoffCreates.has(g))throw new ue("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 T=new AbortController,_=setTimeout(()=>T.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:T.signal},i.organizationId?.trim()?`${this.appBaseUrl}/dashboard/organization/integrations`:void 0,u,()=>{A=!0}),N=C?.sessionId?.trim();if(!N)throw new ue("request_failed","The cloud session service returned no session id.");E=N,await this.persistHandoffOuterSession(i,N,u,g);let M={sessionId:N,status:C.status?.trim()||"provisioning",sandboxUrl:C.sandboxUrl?.trim()??"",cleanupAuthToken:u.token};if(g)this.unconfirmedHandoffCreates.delete(g),this.completedHandoffCreates.set(g,M);return M}catch(C){if(E)throw C;let N=!A||C instanceof ue&&(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 E_(C);if(T.signal.aborted||!(C instanceof ue)||C instanceof ue&&C.code==="request_failed"&&(C.status===void 0||C.status>=500||C.status===408||C.status===409)){let M=[];try{M=await b()}catch(L){if(i.handoff)throw AggregateError([C,L],"Cloud handoff creation is unconfirmed and its session list could not be checked.")}if(!i.handoff&&!N&&M.length!==1)throw new __(C);if(M.length>1)throw new ue("request_failed","Cloud session creation had an ambiguous result. Check your cloud session list before trying again.");let O=M[0];if(O){if(i.handoff)return await I(O);return{sessionId:O.id,status:O.status,sandboxUrl:O.sandboxUrl,cleanupAuthToken:u.token}}}else if(g)this.unconfirmedHandoffCreates.delete(g);throw C}finally{clearTimeout(_)}}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 ue&&(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:Fp(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(T){if(l.aborted)throw T;if(T instanceof ue&&T.code!=="request_failed")throw T;await Cb(l);continue}let I=b?.status?.trim().toLowerCase();if(u?.({phase:A_(b?.phase)}),I==="ready"||I==="active")return;if(I==="failed")throw new ue("session_failed",b?.statusReason?.trim()||"The cloud sandbox could not be prepared.");if(I!=="provisioning")throw new ue("request_failed","The cloud session service returned an unexpected provisioning status.");await Cb(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 ue)||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 ue("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 qp(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 ue("request_failed","Invalid archived session history");return c.messages}}var ZG="CLINE_CLOUD_COMPUTER_USE";function e2(i){let l=ge.cline?.models?.[i];return l?Wt(l):!1}var C_="## Verify your work visually\n\nThis sandbox may have a virtual display and standard Linux tools for computer use: Xvfb, xdotool, ImageMagick (`import`), wmctrl, and Chromium. Check with `command -v Xvfb xdotool import chromium` the first time you need them. If any are missing, skip visual verification and don't try to install them. To see a screenshot, call `read_files` on the image file.\n\n### When to verify\n\nUse your judgment. Verify when a change affects something a user sees or interacts with (a navbar style, a new dialog, a form flow, a terminal UI). Skip it when there's nothing to look at (a git operation, a config tweak, a refactor with no visible effect).\n\n### Display, input, and screenshots\n\n- Start the display if it isn't running: `Xvfb :99 -screen 0 1280x800x24 -nolisten tcp &`, and run every GUI command with `DISPLAY=:99` (for example `export DISPLAY=:99` at the start of the command). Keep the display as small as the check allows so screenshots stay legible. To check a phone layout, restart Xvfb at 390x844 and relaunch the app window at 0,0 with the same size.\n- Start the app (for example `bun run dev &`) and wait until it's serving.\n- Open web apps in a normal Chromium window so screenshots look like a real browser:\n `chromium --new-window http://localhost:5173 --remote-debugging-port=9222 --window-position=0,0 --window-size=1280,800 --force-device-scale-factor=1 --user-data-dir=\"$(mktemp -d)\" --no-first-run --no-default-browser-check --disable-features=Translate --disable-gpu --no-sandbox &`\n - `--remote-debugging-port=9222` exposes the Chrome DevTools Protocol, so you can inspect the DOM, console, and network when a screenshot alone doesn't explain a problem.\n - A fixed position and size, plus `--force-device-scale-factor=1`, keep screenshot pixels equal to click coordinates.\n - A fresh `--user-data-dir` and the first-run flags keep restore prompts and popups out of screenshots. `--disable-gpu` and `--no-sandbox` are needed in this container.\n- Drive the app with xdotool: `key`, `type --delay 40 --`, `mousemove X Y click 1` (buttons 4 and 5 scroll). Find the window with `xdotool search --sync --onlyvisible --class chromium | tail -1` and focus it with `xdotool windowfocus --sync <id>`.\n- Take screenshots of the whole display, for example `import -window root /tmp/cu-shots/03-filtered.png`, so every frame has the same size and framing. Wait about half a second after each action so the UI settles. To look closely at one area, crop a copy instead of capturing a region.\n- Take a fresh screenshot before every click and click in that screenshot's coordinates; layouts move. If a click misses, look again before retrying.\n- Move the pointer out of the way before screenshots you'll show the user, so hover states don't leak in.\n\nExample of a loop that works well:\n\n```bash\nexport DISPLAY=:99\nmkdir -p /tmp/cu-shots\nWID=$(xdotool search --sync --onlyvisible --class chromium | tail -1)\nxdotool windowfocus --sync \"$WID\"\nxdotool key ctrl+k && sleep 0.5 && import -window root /tmp/cu-shots/01-palette.png\nxdotool type --delay 40 -- \"over\" && sleep 0.5 && import -window root /tmp/cu-shots/02-search.png\nxdotool mousemove 640 228 click 1 && sleep 0.5 && import -window root /tmp/cu-shots/03-filtered.png\n```\n\n### What to check\n\n- Check the states that usually break: empty, loading, error, long content, dark mode, and a narrow viewport.\n- If something looks wrong, fix it, reload, and check again.\n- Read only the screenshots you need; each one costs context (about 1.4k tokens at 1280x800).\n- Never close the window you're testing, and never put secrets (tokens, passwords, `.env` contents) on screen.\n\n### Show the user what you verified\n\nThe user can't see this sandbox, and its files disappear when it stops. When you've verified something, publish the few screenshots that prove it with the `publish_artifacts` tool, which uploads them to this session so the user can open them. Pass absolute paths, for example `{\"files\": [{\"path\": \"/tmp/cu-shots/01-palette.png\"}, {\"path\": \"/tmp/cu-shots/03-filtered.png\"}]}`.\n\n- Publish frames for the reader, not a log of every input: usually 1 to 8 per thing you verified, in the order that tells the story (at most 20 per call).\n- The tool reports an `artifactId` or an `error` for each file. To retry a failed file, pass the same `artifactId` back. If publishing fails or the tool isn't available, say so in your answer and carry on.\n- In your answer, say what each published screenshot shows, in order, and call out anything you couldn't fix.",Rb=15000,p2=200,Pb=3000,m2=100,h2=[100,250,500,1000,2000],M_="--cline-hub-daemon",f2=3,g2=60000,Mb=new Map;function y2(i,l=Date.now()){let u=Mb.get(i);if(!u||l-u.windowStartedAt>g2)return Mb.set(i,{count:1,windowStartedAt:l}),!0;return u.count+=1,u.count<=f2}function v2(i){return[...i.host?["--host",i.host]:[],...typeof i.port==="number"?["--port",String(i.port)]:[],...i.pathname?["--pathname",i.pathname]:[]]}function w2(){try{let i=u2(Z(),"logs","hub-daemon.log");return i2(d2(i),{recursive:!0}),{fd:n2(i,"a"),logPath:i}}catch{return}}function b2(){return re()==="production"?Uf():yc()}function _l(i){return RT(i)}function I2(i){try{let l=JSON.parse(o2(`${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 jp(i){try{a2(`${i}.superseded`)}catch{}}function Nb(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 Df(i,{authToken:l})}catch{return}}async function Ob(i,l){let u=Date.now()+l;while(Date.now()<u){if(!(await El(i))?.url)return!0;await new Promise((c)=>setTimeout(c,m2))}return!1}async function Vf(i,l){if(!y2(i.url))return!1;await eu(i.url,i.authToken,"retired by newer install").catch(()=>!1),await X2(i.url,i.authToken).catch(()=>!1);let u=await Ob(i.url,Pb);if(!u&&i.pid&&k2(i.pid)){try{process.kill(i.pid,"SIGTERM")}catch{}u=await Ob(i.url,Pb)}if(u)await gc(l).catch(()=>{return});return u}function k2(i){try{return process.kill(i,0),!0}catch(l){return l?.code==="EPERM"}}async function S2(i){try{let l=await D_(i.url,i.authToken);return l.activeSessionCount>0||(l.activePluginRequests??0)>0||(l.activeCloudCommands??0)>0}catch{return!1}}async function Bp(i,l){if(_l(i))return"reusable";let u=await eu(i.url,i.authToken,"retired by newer install").catch(()=>!1);if(await S2(i)){if(u)await eu(i.url,i.authToken,"hub retirement deferred",{off:!0}).catch(()=>!1);return"deferred_busy"}let c=await Vf(i,l);if(!c&&u)await eu(i.url,i.authToken,"hub retirement failed",{off:!0}).catch(()=>!1);return c?"retired":"failed"}async function T2(i){if(re()!=="production")return;let l=yc();if(l.discoveryPath===i.discoveryPath)return;let u=await Wo(l.discoveryPath);if(u?.url)await Vf(u,l.discoveryPath);else await gc(l.discoveryPath).catch(()=>{return})}function _2(){let i=import.meta.url.endsWith(".ts")?"ts":"js";return c2(new URL(`./entry.${i}`,import.meta.url))}function E2(i,l){if(qn(i))return[M_];return[...l&&i.toLowerCase().endsWith(".ts")?["--conditions=development"]:[],i]}var xd;function A2(i,l){let u,c;if(xd)u=xd.command,c=xd.args??[M_];else{let g=process.execPath?.trim();if(!g)throw Error("unable to resolve runtime executable for hub daemon");let b=l2(g).toLowerCase().includes("bun");u=g,c=E2(_2(),b)}return{launcher:u,args:[...c,"--cwd",i,...v2(l),...l.manageConnectors===!1?["--no-connectors"]:[]],cwd:i,env:{...zn(Me({...process.env,...xd?.env}),x2()),CLINE_NO_INTERACTIVE:"1",[Zt]:"1"}}}function x2(){let i=Gi(),l=i?.name?.trim();return l?{client:l,version:i?.version,transport:"local"}:void 0}function C2(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 R2(i,l={}){if(jt())return;let u=A2(i,l),c=w2();try{r2(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)s2(c.fd)}}async function P2(i,l={}){for(let u=0;;u++)try{R2(i,l);return}catch(c){let g=h2[u];if(!C2(c)||g===void 0)throw c;await new Promise((b)=>setTimeout(b,g))}}async function M2(i,l,u={}){let c=u.host!==void 0||u.port!==void 0||u.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),g=ST(u),b=Du(g.host,g.port,g.pathname),I=(M)=>{if(!c)Zf(M.url,M.authToken);return M};await T2(i).catch(()=>{return});let T=await Wo(i.discoveryPath),_=T?.url?void 0:I2(i.discoveryPath),E=!1;if(T?.url){let M=T.authToken;if(!M)E=!0,await Vf(T,i.discoveryPath);else{let O=await El(T.url,M);if(O?.url&&_l(O)&&await Ys(O.url,{authToken:M}))return jp(i.discoveryPath),I({url:O.url,authToken:M});if(O?.url){if(await Bp({...O,authToken:M},i.discoveryPath)==="deferred_busy"&&await Ys(O.url,{authToken:M}))return I({url:O.url,authToken:M})}else await gc(i.discoveryPath).catch(()=>{return})}}let A=await El(b);if(A?.url){let M=Nb(A,T??_,b);if(_l(A)){let L=[A.authToken,T?.authToken,_?.authToken].filter((D)=>typeof D==="string"&&D.trim().length>0);for(let D of L){if(!await Ys(A.url,{authToken:D}))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:D,host:A.host,port:A.port,url:A.url,pid:A.pid??T?.pid??_?.pid,startedAt:A.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await MT(i.discoveryPath,F)}catch{}return jp(i.discoveryPath),I({url:A.url,authToken:D})}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 O=await Bp(M,i.discoveryPath);if(O==="deferred_busy"){for(let L of[M.authToken,T?.authToken].filter((D)=>typeof D==="string"&&D.trim().length>0))if(await Ys(A.url,{authToken:L}))return I({url:A.url,authToken:L});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(O==="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 P2(l,{...C,manageConnectors:u.manageConnectors});let N=Date.now()+Rb;while(Date.now()<N){let M=await Wo(i.discoveryPath);if(M?.url&&M.authToken){let L=await El(M.url,M.authToken);if(L?.url&&_l(L)&&await Ys(L.url,{authToken:M.authToken}))return jp(i.discoveryPath),I({url:L.url,authToken:M.authToken})}let O=await El(b);if(O?.url&&!_l(O)){let L=Nb(O,M??_,b),D=await Bp(L,i.discoveryPath);if(D==="deferred_busy"&&M?.authToken&&await Ys(O.url,{authToken:M.authToken}))return I({url:O.url,authToken:M.authToken});if(D==="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((L)=>setTimeout(L,p2))}throw Error(`Timed out after ${Rb}ms waiting for detached hub startup.`)}async function N2(i,l={}){let u=b2();return await Mz(u.discoveryPath,async()=>M2(u,i,l))}function O2(){return re()==="production"?Uf():yc()}function $2(){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 L2(i){let l=new URL(i);l.protocol=i.protocol==="wss:"?"https:":"http:";let u=xa(l.toString());if(!u)return;return i.protocol==="wss:"?new P_.HttpsProxyAgent(u):new R_.HttpProxyAgent(u)}function N_(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 N_(i.data);return String(i)}function D2(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 $b(i){let l=i,u=D2(l.reason);return new St("hub_connection_closed",l.code||u?`Hub connection closed (code=${l.code??0}${u?`, reason=${u}`:""})`:ph,{closeCode:l.code,closeReason:u||void 0})}function Hp(i,l){if(i instanceof St)return i;if(i instanceof Error)return new St("hub_connect_failed",i.message);if(i&&typeof i==="object"&&"error"in i&&i.error instanceof Error)return new St("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 St("hub_connect_failed",u);let c=i&&typeof i==="object"&&"type"in i&&typeof i.type==="string"?i.type.trim():"";return new St("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 zp="*",Cd=8000,U2="cline-hub-auth.",O_=new Map,$_=new Set,F2=3000,ph="Hub connection closed",q2=250,j2=5000,Lb=0.5;class St extends Error{code;details;constructor(i,l,u){super(l);this.code=i,this.details=u,this.name="HubTransportError"}}function B2(i){return i instanceof St}class ju extends Error{command;code;constructor(i,l,u){super(u);this.command=i,this.code=l,this.name="HubCommandError"}}function Yf(i,l={}){let u=i.searchParams.get("authToken")?.trim();if(i.searchParams.delete("authToken"),u)return u;if(l.skipRegistry)return;let c=Qf(i.toString());return c?O_.get(c):void 0}function H2(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 Qf(i){if(!H2(i))return;let l=new URL(L_(i));return l.search="",l.hash="",l.toString()}function Db(i){let l=Qf(i);return!!l&&$_.has(l)}function Zf(i,l){let u=Qf(i);if(u){if($_.add(u),l?.trim())O_.set(u,l)}return i}class wc{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 St("hub_connection_closed",ph);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()||Yf(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 T of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(T));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=Hp(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 St("hub_connect_timeout",`Timed out resolving hub connection headers after ${Cd}ms`))},Cd)})])}catch(A){let C=A instanceof St?A:new St("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 St("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?L2(i):void 0}catch(E){let A=Hp(E,i);if(u===this.connectGeneration)this.lastCloseError=A;throw A}let I=g?new ba(i.toString(),{headers:{...g},agent:b}):new($2())(i.toString(),l?[`${U2}${l}`]:void 0);this.socket=I;let T=!1,_=new Promise((E,A)=>{let C=!1,N=setTimeout(()=>{if(C)return;C=!0,T=!0;let M=new St("hub_connect_timeout",`Timed out connecting to hub after ${Cd}ms`);if(this.socket===I)this.lastCloseError=M,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{I.close()}catch{}A(M)},Cd);I.addEventListener("open",()=>{if(C)return;C=!0,clearTimeout(N),E()}),I.addEventListener("error",(M)=>{if(C)return;C=!0,clearTimeout(N);let O=Hp(M,i);if(this.socket===I)this.lastCloseError=O,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;A(O)}),I.addEventListener("close",(M)=>{if(C)return;C=!0,clearTimeout(N);let O=T?this.lastCloseError:$b(M);if(this.socket===I){if(!T)this.lastCloseError=O,this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0}A(O)})});return I.addEventListener("message",(E)=>{this.handleFrame(JSON.parse(N_(E)))}),I.addEventListener("close",(E)=>{if(this.socket!==I)return;if(!T)this.lastCloseError=$b(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 _,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:(_)=>{b=!0,c?.onDispatch?.(_)}},T=i!=="client.register"&&i!=="client.unregister";while(!0)try{return await this.commandOnce(i,l,u,I)}catch(_){if(!T||b&&c?.retryAfterDispatch===!1||g>=1||!await this.recoverLocalHubTransport(_))throw _;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=Xt(i,c?.timeoutMs),T=new Promise((E,A)=>{let C=I===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(b))return;A(new ju(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 _=await T;if(!_.ok){if(_.error?.code===Rf){let E=u??(typeof l?.sessionId==="string"?l.sessionId:void 0);throw new hc(E,_.error.message)}throw new ju(i,_.error?.code,_.error?.message??`Hub command ${i} failed`)}return _}async recoverLocalHubTransport(i){if(!Db(this.currentUrl)||!B2(i))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let l=await Ub({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(q2*2**this.reconnectAttempt,j2),l=Math.round(i*(1-Lb)+Math.random()*i*Lb);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(!Db(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let i=await Ub({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 St("hub_connection_closed",ph);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 St("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??zp}subscriptionSessionIdFromKey(i){return i===zp?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[zp,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 L_(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 Ys(i,l){let u=new wc({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 mh(i,l){let u=L_(i),c=await Df(u,{authToken:l?.authToken});if(!c)return{status:"unreachable",url:u};if(l?.requireCurrentBuild){let g=na(),b=CT(c,g);if(!b.compatible&&!RT(c))return{status:b.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:u}}else if(!Pt(c).compatible)return{status:"protocol_mismatch",url:u};if(l?.verifyConnection===!0&&!await Ys(u,{workspaceRoot:l.workspaceRoot,cwd:l.cwd,authToken:l.authToken}))return{status:"unreachable",url:u};return{status:"compatible",url:u}}function z2(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 T of I){let _=T&&typeof T==="object"?T.clientId:void 0;if(typeof _==="string"&&_.trim())c.add(_)}}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 D_(i,l,u){let c=new wc({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:F2});return z2(g.payload)}finally{await c.dispose().catch(()=>{return})}}async function W2(i,l,u){try{let c=await D_(i,l,u);return c.activeSessionCount===0&&c.activePluginRequests===0&&c.activeCloudCommands===0}catch{return!1}}async function K2(i,l){let u=`${i.discoveryPath}.superseded`,c=await Wo(u);if(!c?.url||!c.authToken)return;let g=await mh(c.url,{authToken:c.authToken});if(g.status!=="compatible")return;if(await W2(g.url,c.authToken,l))return;return Zf(g.url,c.authToken)}async function G2(i={}){if(i.endpoint?.trim()){let g=await mh(i.endpoint);return g.status==="compatible"?g.url:void 0}let l=O2(),u=await Wo(l.discoveryPath);if(!u?.url)return await K2(l,i);let c=await mh(u.url,{authToken:u.authToken,requireCurrentBuild:!0});if(c.status==="compatible")return Zf(c.url,u.authToken);if(c.status==="protocol_mismatch")await gc(l.discoveryPath).catch(()=>{return});return}async function Ub(i={}){let l=await G2(i);if(l&&await Ys(l,{workspaceRoot:i.workspaceRoot,cwd:i.cwd}))return l;if(i.endpoint?.trim())return;try{return(await N2(i.workspaceRoot??process.cwd())).url}catch(u){i.onStartupError?.(u);return}}async function eu(i,l,u,c){Ze();let g=new URL(i),b=l?.trim()||Yf(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 X2(i,l){Ze();let u=new URL(i),c=l?.trim()||Yf(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 Fb(i){let l=0,u=i.length;while(l<u&&i[l]==="/")l+=1;while(u>l&&i[u-1]==="/")u-=1;let c=i.slice(l,u);return c.toLowerCase().endsWith(".git")?c.slice(0,-4):c}function hh(i){let l=i.trim();if(!l)return null;let u=l.match(/^(?:[^@/\s]+@)?github\.com:([^\s]+)$/i);if(u?.[1]){let c=Fb(u[1]);return c.split("/").length===2?`https://github.com/${c}`:null}try{let c=new URL(l);if(c.hostname.toLowerCase()!=="github.com")return null;if(!new Set(["https:","http:","ssh:","git:"]).has(c.protocol))return null;let g=Fb(c.pathname);return g.split("/").length===2?`https://github.com/${g}`:null}catch{return null}}function qb(i){return i.map((l)=>{let u=l&&typeof l==="object"?l:{};return{role:u.role,content:u.content}})}function jb(i,l){return i.length===l.length&&JSON.stringify(qb(i))===JSON.stringify(qb(l))}class U_ extends Error{constructor(i,l){super(`Cloud transcript verification failed (local ${i} messages, cloud ${l}).`);this.name="CloudHandoffTranscriptMismatchError"}}function J2(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 Wp(i,l){return Array.isArray(i)?i.flatMap((u)=>{let c=J2(u,l);return c?[c]:[]}):[]}async function V2(i,l={}){let u=i.trim(),c=u.length;while(c>0&&u[c-1]==="/")c--;let g=u.slice(0,c),b=async(L)=>{let D=await(l.fetchImpl??fetch)(`${g}${L}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(1e4)});if(!D.ok)throw Error(`HTTP ${D.status}`);return await D.json()},I,T;try{[I,T]=await Promise.all([b("/api/v1/ai/cline/models"),b("/api/v1/ai/cline/recommended-models")])}catch(L){throw Error("Could not load the cloud model catalog.",{cause:L})}let _=I&&typeof I==="object"?I:void 0,E=Wp(Array.isArray(I)?I:_?.data,"cline"),A=T&&typeof T==="object"?T:void 0,C=A?.data&&typeof A.data==="object"?A.data:A,N=Wp(C?.clinePass,"cline-pass"),M=Wp(C?.clineCloud,"cline-cloud"),O=new Set;return[...l.isOrganizationSession?[]:N,...M,...E].filter((L)=>{if(O.has(L.id))return!1;return O.add(L.id),!0})}function Kp(i){return Array.isArray(i?.sessions)?i.sessions.filter((l)=>Boolean(l)&&typeof l==="object"&&!Array.isArray(l)):[]}function Bb(i){let l=i.updatedAt;return typeof l==="number"?l:Date.parse(String(l??""))||0}function Hb(i){let l=i?.metadata&&typeof i.metadata==="object"?i.metadata:void 0;return String(l?.model??i?.model??"").trim()}function Gp(i){let l=i.metadata&&typeof i.metadata==="object"?i.metadata:void 0;return!String(l?.parentSessionId??i.parentSessionId??"").trim()}function F_(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 tu(i){let l=i.trim(),u=l.match(/^<user_input\b[^>]*>([\s\S]*)<\/user_input>$/);return(u?u[1]:l).trim()}function Bu(i,l,u){let c=tu(u);return i.filter((g)=>Boolean(g)&&typeof g==="object"&&!Array.isArray(g)&&String(g.role??"").toLowerCase()==="user"&&(c!==""||LP(g))&&tu(F_(g))===c).length+l.filter((g)=>tu(g.prompt)===c).length}function q_(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 Y2=new Set(["run.completed","run.aborted","run.failed"]),Q2=new Set(["assistant.delta","assistant.finished","reasoning.delta","reasoning.finished"]);function zb(i,l){return i.filter((u)=>Boolean(u)&&typeof u==="object"&&!Array.isArray(u)&&String(u.role??"").toLowerCase()==="assistant").map((u)=>F_(u,l)).filter(Boolean)}function Wb(i,l,u="text"){let c=new Map;for(let g of zb(l,u))c.set(g,(c.get(g)??0)+1);return zb(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 Hu(i,l,u=new Set){if(!i||typeof i!=="object")return u;if(Array.isArray(i)){for(let b of i)Hu(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))Hu(b,l,u);return u}function Kb(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 Z2(i,l,u={}){let c=u.queueSnapshotApplied!==!1,g=Wb(l,u.baselineMessages??[]),b=Wb(l,u.baselineMessages??[],"thinking"),I=Hu(l,"tool_use"),T=Hu(l,"tool_result"),_=new Set(i.slice(0,u.messagesSnapshotEventCutoff??i.length)),E=new Set,A=new Map;for(let L of i.slice(0,u.messagesSnapshotEventCutoff??i.length)){let D=q_([L])[0];if(!D)continue;let F=tu(D.prompt),j=A.get(F)??Math.max(0,Bu(l,[],F)-Bu(u.baselineMessages??[],[],F));if(A.set(F,Math.max(0,j-1)),j>0)E.add(L)}let C=[...c?i.slice(u.queueSnapshotEventCutoff??i.length):i].reverse().find((L)=>L.event==="session.pending_prompts"),N=[],M=[],O=(L)=>{if(M.length===0)return;let D=M.filter((oe)=>_.has(oe)),F=(oe)=>{if(!L)return-1;let G=[...D].reverse().findIndex((Ne)=>Ne.event===`${oe}.finished`),se=G<0?-1:D.length-1-G;return se>=0||M.at(-1)?.event==="run.aborted"?se:D.length-1},j=F("assistant"),B=F("reasoning"),Q=Kb(D.slice(0,j+1)),H=Q?g.findIndex((oe)=>oe.endsWith(Q)):-1,z=H>=0;if(z)g.splice(H,1);let te=Kb(D.slice(0,B+1),"reasoning"),ee=te?b.findIndex((oe)=>oe.endsWith(te)):-1;if(ee>=0)b.splice(ee,1);for(let[oe,G]of M.entries()){if(E.has(G)){N.push({...G,payload:{...G.payload,transcriptReflected:!0}});continue}if(_.has(G)&&Q2.has(G.event)&&(G.event.startsWith("reasoning.")?ee>=0&&oe<=B:z&&oe<=j))continue;if(G.event==="session.pending_prompts"&&G!==C)continue;if(_.has(G)&&G.event.startsWith("tool.")){let se=String(G.payload?.toolCallId??"").trim();if(T.has(se)||G.event==="tool.started"&&I.has(se))continue}N.push(G)}M=[]};for(let L of i)if(M.push(L),Y2.has(L.event))O(!0);return O(!1),N}function Xp(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 eg(i){let l=i?.trim();return l?me(l).slice(0,120):void 0}function j_(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
|
+
${j_(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 eX(i){let l=eg(i??void 0);if(!l)return;return l.split(`
|
|
1067
|
+
`)[0]?.trim().slice(0,70)||void 0}function tX(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=eg(j_(c.content));if(!g)continue;return g.split(`
|
|
1068
|
+
`)[0]?.trim().slice(0,70)||void 0}return}function rX(i){let l=i.metadata&&typeof i.metadata==="object"?eg(i.metadata.title):void 0;if(l)return l.slice(0,70);let u=eX(i.prompt);if(u)return u;let c=i.messages?tX(i.messages):void 0;if(c)return c;return`Session ${i.sessionId.slice(-6)}`}function sX(i,l,u,c){let g=l.payload??{},b=()=>{let T=u.get(c);if(T===void 0||!i.messages[T]||i.messages[T]?.role!=="assistant")T=i.messages.length,i.messages.push({role:"assistant",content:[]}),u.set(c,T);let _=i.messages[T];if(!Array.isArray(_.content))_.content=[];return _.content},I=(T,_,E)=>{let A=b(),C=A.at(-1);if(C?.type===T)C[_]=`${C[_]??""}${E}`;else A.push({type: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 T=String(g.toolCallId??"");if(T&&!i.messages.some((_)=>Array.isArray(_.content)&&_.content.some((E)=>E.type==="tool_use"&&E.id===T)))b().push({type:"tool_use",id:T,name:String(g.toolName??"tool"),input:structuredClone(g.input??{})});return}case"tool.finished":{let T=String(g.toolCallId??"");if(T&&!i.messages.some((_)=>Array.isArray(_.content)&&_.content.some((E)=>E.type==="tool_result"&&E.tool_use_id===T)))i.messages.push({role:"user",content:[{type:"tool_result",tool_use_id:T,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 T=Array.isArray(g.prompts)?g.prompts:[];i.promptsInQueue=T.map((_)=>({id:String(_.id??""),prompt:String(_.prompt??""),steer:_.delivery==="steer",attachmentCount:typeof _.attachmentCount==="number"?_.attachmentCount:0,userImages:Array.isArray(_.userImages)?_.userImages.filter((E)=>typeof E==="string"):void 0})).filter((_)=>_.id&&(_.prompt||_.attachmentCount));return}case"session.pending_prompt_submitted":{let T=g.prompt,_=String(T?.id??"");if(!_||i.lastQueuedPromptStartId===_)return;if(i.lastQueuedPromptStartId=_,i.promptsInQueue=i.promptsInQueue.filter((E)=>E.id!==_),g.transcriptReflected!==!0)i.messages.push({role:"user",content:[{type:"text",text:String(T?.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 T=g.session,_=typeof T?.status==="string"?T.status:l.event==="run.started"?"running":i.status,E=_==="pending"?"running":_;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 Jp(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 Vp(i,l){return i instanceof Error&&i.name==="HubCommandError"&&i.code==="hub_command_timeout"&&(!l||i.command===l)}var at="/workspace",iX=30000,nX=2000,oX=2000,B_="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 aX(i,l={}){let u=`cline/${(i.metadata.taskId?.trim()||i.id).slice(-8).toLowerCase()}`,c=i.sandboxType==="resumable"||i.metadata.sandboxType==="resumable";return`${B_}
|
|
1069
|
+
|
|
1070
|
+
Do all work for this task on the branch \`${u}\`: 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. `+(c?"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 \`${u}\` 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 ${u}\`, and push again after each later commit. `)+"Do not force-push or amend commits that are already pushed unless the user explicitly asks."+(l.computerUse?`
|
|
1071
|
+
|
|
1072
|
+
${C_}`:"")}function Yp(i){if(!i)return at;if(qu.isAbsolute(i)||i.includes("\\")||i.split("/").some((u)=>!u||u==="."||u===".."))throw new ue("request_failed","The handoff workspace path must stay inside the repository.");let l=qu.join(at,i);if(!l.startsWith(`${at}/`))throw new ue("request_failed","The handoff workspace path must stay inside the repository.");return l}function tg(i){let l=i.metadata.cwd;return typeof l==="string"&&qu.normalize(l)===l&&(l===at||l.startsWith(`${at}/`))?l:at}function Gb(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 fh extends Error{constructor(i){super(i instanceof Error?i.message:"Cloud conversation creation was not dispatched.",{cause:i});this.name="CloudHandoffSeedRejectedError"}}class gh extends ue{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 H_ 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 Os(i){let l=i.expiredAt?Date.parse(i.expiredAt):Number.NaN;return Number.isFinite(l)&&l<=Date.now()}function lX(i){return i.trim().startsWith("ses-")}function dX(i,l){let u=new URL(`/api/v1/session/${encodeURIComponent(l)}`,i);return u.protocol=u.protocol==="https:"?"wss:":"ws:",u.toString()}function Qp(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:tg(i),workspaceRoot:at},messages:[],promptsInQueue:[],busy:!1,startedAt:Date.parse(i.createdAt)||Date.now(),endedAt:Os(i)&&i.expiredAt?Date.parse(i.expiredAt):void 0,status:i.status,attachedViaHub:!0}}function Zp(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:tg(i),workspaceRoot:at,...u?.trim()?{prompt:u.trim()}:{},metadata:{origin:"cloud",repoUrl:i.repoContext.repoUrl??"",git:{url:i.repoContext.repoUrl??"",branch:i.repoContext.branch??""}}}}function Xb(i){return{sessionId:i.id,origin:"cloud",executionTarget:"cloud",status:i.status,provider:"cline",model:i.metadata.modelId??"",cwd:tg(i),workspaceRoot:at,repoUrl:i.repoContext.repoUrl??"",branch:i.repoContext.branch??"",startedAt:i.createdAt,...i.lastActivityAt?{lastActivityAt:i.lastActivityAt}:{},endedAt:Os(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 uX(i){if(typeof i!=="string")return i;try{return JSON.parse(i)}catch{return i}}function cX(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 z_{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;initialSends=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 wc(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=Qp(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 Xp({...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&&Os(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):Xp(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)sX(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 ue("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 lX(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?Xb(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 ue&&(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 T=l(I.id);if(this.titleWrites.has(I.id)||T!==u.get(I.id))I.title=T??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 T=await this.options.api.status(I.id).catch(()=>{return}),_=T?.status?.trim();if(!_)return I;return{...I,status:_,metadata:{...I.metadata,...A_(T?.phase)?{provisioningPhase:T?.phase}:{},...T?.statusReason?.trim()?{statusReason:T.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 T=this.sessions.get(I.id);if(T)T.title=I.title;if(T?.status==="provisioning"&&I.status!=="provisioning")T.status=I.status;let _=this.connections.get(I.id);if(_)_.remote=I;let E=Os(I);if(E||I.status==="failed"||I.status==="suspended"){if(T)T.busy=!1,T.status=E?"expired":I.status,T.endedAt=E?Date.parse(I.expiredAt??"")||Date.now():Math.max(T.endedAt??0,Date.parse(I.lastActivityAt??I.createdAt)||0)||void 0;if(_)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 Xp(b)}async handoffTargetExists(i){try{return await this.options.api.status(i),!0}catch(l){if(l instanceof ue&&(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 V2(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 ue("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 ue("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 T=await this.resolveActiveOrganizationId();l={organizationId:T};let _=this.discoveryRefresh?.organizationId===T?this.discoveryRefresh?.promise:void 0;if(!_){let E=this.listInOrganization(T).finally(()=>{if(this.discoveryRefresh?.promise===E)this.discoveryRefresh=void 0});this.discoveryRefresh={organizationId:T,promise:E},_=E}return{organizationId:T,records:await _}})(),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 T;try{g=await Promise.race([u.catch((_)=>{if(!(_ instanceof ue&&_.code==="authentication_required"))this.options.logger?.error?.("Cloud session discovery failed",{error:_});return c()}),new Promise((_)=>{T=setTimeout(()=>_(c()),Math.max(0,i.timeoutMs??0))})])}finally{if(T!==void 0)clearTimeout(T)}}if(!g)return[];let{organizationId:b,records:I}=g;return[...new Map([...Array.from(this.unlistedSessions.values()).filter((T)=>T.organizationId===b).map((T)=>T.record),...I].map((T)=>[T.id,T])).values()].map((T)=>{let _=Xb(T),E=this.sessions.get(T.id);if(!E)return _;let A=E.title?.trim()||T.title?.trim();return{..._,status:E.status,prompt:E.prompt,endedAt:E.endedAt!==void 0?new Date(E.endedAt).toISOString():_.endedAt,metadata:{..._.metadata??{},title:rX({sessionId:T.id,metadata:A?{title:A}:void 0,prompt:E.prompt,messages:E.messages})}}})}async create(i){let l=i.requestId?.trim();if(!l)return this.createSession(i);let u=this.createRequests.get(l);if(u)return u;let c=this.createSession(i).finally(()=>{if(this.createRequests.get(l)===c)this.createRequests.delete(l)});return this.createRequests.set(l,c),c}async createSession(i){let{initialMessage:l,...u}=i;if(!l)return this.createOnce(u);let c=!1,g,b={lifecycle:{beforeDispatch:()=>{c=!0}},settled:new Promise((_)=>{g=_})},I,T;try{I=await this.createOnce({...u,initialPrompt:l.text},(E)=>{if(T=E,!this.initialSends.has(E))this.initialSends.set(E,b)});let _=await this.send(I.sessionId,l.text,"queue",i.modelId,l.images,b.lifecycle);return g(),{...I,initialSend:_}}catch(_){let E={dispatched:c,message:_ instanceof Error?_.message:String(_),..._ instanceof Error&&"detail"in _&&typeof _.detail==="string"?{detail:_.detail}:{}};if(g(E),!I)throw _;return{...I,initialSend:E}}finally{if(T&&this.initialSends.get(T)===b)this.initialSends.delete(T)}}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){Yp(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 H_;if(!(u.allowAppendedMessages?I.length>=l.length&&jb(l,I.slice(0,l.length)):jb(l,I)))throw new U_(l.length,I.length);c.transcriptKnown=!0;let T=this.sessions.get(i);if(T)T.messages=structuredClone(I),this.authoritativeMessages.set(i,structuredClone(I)),this.streamingMessages.delete(i),this.publishSnapshot(i,!0)}async createOnce(i,l){if(this.disposed)throw Error("Cloud session manager was disposed");let u=Yp(i.workspaceRelativePath),c=i.organizationId===void 0?await this.resolveActiveOrganizationId({fresh:!0}):i.organizationId??void 0,g=i.handoff,b=!g,I=await this.options.api.create({...i,organizationId:c,...g&&{handoff:{...g,onOuterSessionCreated:async(L,D)=>{b=D?.created===!0,await g.onOuterSessionCreated(L,D)}}}});if(!I?.sessionId?.trim())throw new ue("request_failed","The cloud session service returned an unexpected response; please try again.");if(this.disposed){if(b&&this.options.lateCreateDisposition==="delete")await this.deleteProvisionedSessionAfterDispose(I.sessionId,I.cleanupAuthToken,i.handoff?.onOuterSessionRemoved);throw Error("Cline account changed while the cloud session was starting")}let T={id:I.sessionId,sandboxType:i.sandboxType,status:I.status,sandboxUrl:I.sandboxUrl,repoContext:{repoUrl:i.repoUrl,...i.branch?.trim()?{branch:i.branch.trim()}:{}},metadata:{modelId:i.modelId,cwd:u},createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};l?.(T.id),this.knownSessions.set(T.id,T),this.unlistedSessions.set(T.id,{record:T,organizationId:c});let{autoApproveTools:_,thinking:E,reasoningEffort:A,mode:C,workspaceRelativePath:N}=i;this.pendingInitialTasks.set(T.id,{autoApproveTools:_,thinking:E,reasoningEffort:A,mode:C??"act",workspaceRelativePath:N});let M=this.stateFromRecord(T);M.prompt=i.initialPrompt?.trim()||void 0,M.config.mode=i.mode??"act",this.sessions.set(T.id,M);let O;try{if(i.handoff){let L=await i.handoff.resolveMessages();this.assertSessionActive(T.id),O=(await this.seedHandoff(T.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&&b&&this.options.lateCreateDisposition==="delete")await this.deleteProvisionedSessionAfterDispose(T.id,I.cleanupAuthToken,i.handoff?.onOuterSessionRemoved);throw L}return this.assertSessionActive(T.id),this.notify("chat_session_status",{sessionId:T.id,status:M.status}),{sessionId:T.id,origin:"cloud",executionTarget:"cloud",status:T.status,provider:"cline",model:i.modelId,repoUrl:i.repoUrl,branch:i.branch??"",cwd:u,workspaceRoot:at,...O?{innerSessionId:O}:{},...M.prompt?{prompt:M.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 Zp(c,c.status,this.sessions.get(i)?.prompt);if(Os(c))return await this.disposeConnection(i),await this.attachExpired(c);let g;try{g=await this.ensureConnection(i)}catch(T){let _=await this.refreshKnownSession(i);if(_&&Os(_))return await this.disposeConnection(i),await this.attachExpired(_);throw T}await this.ensureAttached(g);let b=g.remote,I=this.sessions.get(i);return Zp(b,I?.status??b.status,I?.prompt)}async send(i,l,u,c,g,b){let I=this.sendAbortTokens.get(i),T=this.initialSends.get(i);if(T&&b!==T.lifecycle){if(await T.settled)throw new ue("request_failed","The initial cloud prompt was not confirmed. Check the cloud task before sending another message.")}let _=this.knownSessions.get(i);if(_&&Os(_))throw new ue("session_expired","This cloud session has expired; its sandbox is gone. Start a new cloud session to continue.");let E=await this.ensureConnection(i,{createInner:!0}),A=()=>this.disposed||E.disposed||this.deletingSessions.has(i)||this.sendAbortTokens.get(i)!==I,C=()=>{if(A())throw Error("Cloud session prompt cancelled")};if(C(),await E.reconnectResolution,C(),await this.ensureAttached(E),await E.reconnectResolution,C(),!E.transcriptKnown)await this.rehydrateAfterTransportDrop(i,E);C(),await this.updateModel(E,c),await E.reconnectResolution,C();let N=E.innerSessionId;if(!N)throw Error("Cloud Hub session was not initialized");let M=this.sessions.get(i),O=u??(M?.busy?"queue":void 0),L=Bu(M?.messages??[],M?.promptsInQueue??[],l),D=O!=="queue"&&O!=="steer",F=M&&O!=="queue"?{role:"user",content:[{type:"text",text:l}]}:void 0;if(M&&F)M.messages=[...M.messages,F];let j=()=>{if(M&&F)M.messages=M.messages.filter((z)=>z!==F),this.publishSnapshot(i)};if(M&&D){let z=M.status!=="running";if(M.busy=!0,M.status="running",z)this.publishSnapshot(i,!1,"status")}let B=new Set,Q=!1,H=()=>{if(Q||A())return;Q=!0,this.publish({type:"prompt_accepted",sessionId:i,prompt:l,delivery:O})};try{let z=await E.client.command("session.send_input",{prompt:l,delivery:O,...g?.length?{attachments:{userImages:g}}:{}},N,{timeoutMs:O==="queue"?iX:null,onDispatch:(ee)=>{B.add(ee),E.pendingInputs??=new Map,E.pendingInputs.set(ee,{clientId:E.client.getClientId(),ownsBusyState:D,accept:H})},beforeDispatch:()=>{if(C(),E.innerSessionId!==N)throw Error("The cloud session reconnected before the prompt could be sent. Please try again.");if(b?.beforeDispatch?.(),M&&D)M.prompt||=l;let ee=this.knownSessions.get(i);if(ee&&!ee.title?.trim()&&!this.titleWrites.has(i)){let oe=VG(l);if(oe){if(ee.title=oe,M)M.title=oe;let G=this.options.api.updateTitle?.(i,oe).then(()=>{}).catch(()=>{}).finally(()=>{if(this.titleWrites.get(i)===G)this.titleWrites.delete(i)});if(G)this.titleWrites.set(i,G)}}}});H();let te=O==="queue"||O!=="steer"&&z.payload?.result===void 0;if(te)j();return{sessionId:i,ok:!0,...te?{queued:!0}:{},result:z.payload?.result}}catch(z){if(A())throw j(),z;if(Jp(z)||Vp(z,"session.send_input")){let te;try{te=await this.rehydrateAfterTransportDrop(i,E)}catch(ee){if(C(),j(),M&&D)M.busy=!1,M.status="error";if(O==="queue")throw new gh;throw ee}if(C(),O==="queue")throw new gh;if(O==="steer")throw new ue("request_failed","Cline could not confirm whether this message was accepted. Check the cloud session before resending it.");if(Bu(te.messages,cX(te.prompts,te.submittedPrompts),l)<=L)throw new ue("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:te.status}}if(j(),M&&D)M.busy=!1,M.status="error";throw this.publishSnapshot(i),z}finally{for(let z of B)E.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)??[],T=String(g?.status??b?.status??"running").trim(),_=T==="pending"?"running":T;if(_==="running"&&!l.transcriptKnown&&!l.pendingInputs?.size)l.externalRun??={progressHydrated:!0};let E=()=>l.client.command("session.messages",{sessionId:u},u),A=await E().catch((H)=>{if(!Vp(H,"session.messages"))throw H;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,M=await l.client.command("session.pending_prompts",{sessionId:u},u).catch(()=>{return});this.assertSessionActive(i,l);let O=l.bufferedEventsDropped+l.bufferedEvents.length;if(b){let H=b.status!==_;if(this.authoritativeMessages.set(i,structuredClone(C)),b.messages=structuredClone(C),this.streamingMessages.delete(i),b.status=_,b.busy=_==="running",H)if(_==="completed"||_==="failed"||_==="aborted")b.endedAt=Date.now(),this.notify("chat_session_ended",{sessionId:i,reason:_==="failed"?"error":_});else this.notify("chat_session_status",{sessionId:i,status:_})}let L=M!==void 0&&M.ok!==!1&&Array.isArray(M.payload?.prompts),D=L?this.applyQueueSnapshot(i,M):void 0;l.transcriptKnown=!0;let F=C;this.assertSessionActive(i,l),this.notify("cloud_session_rehydrated",{sessionId:i,status:_,transcriptKnown:!0,messages:F}),this.assertSessionActive(i,l);let j=l.bufferedEvents,B=q_(j),Q=Z2(j,C,{queueSnapshotApplied:L,queueSnapshotEventCutoff:Math.max(0,O-l.bufferedEventsDropped),messagesSnapshotEventCutoff:Math.max(0,N-l.bufferedEventsDropped),baselineMessages:I});l.bufferedEvents=[],l.bufferingEvents=!1,l.syncFailureNotified=!1;for(let H of Q)this.forwardEvent(i,l,H);return{status:_,messages:C,prompts:D,submittedPrompts:B}}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&&Os(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 ue?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)??Qp(i);return l.busy=!1,l.status="expired",this.sessions.set(i.id,l),await this.loadArchivedMessages(i).catch(()=>{return}),Zp(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)??Qp(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 ue("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 ue("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 T=await this.ensureKnownSession(i);if(c(),!this.pendingInitialTasks.has(i)&&(T.sandboxType==="resumable"||T.metadata.sandboxType==="resumable"||T.status==="suspended")){let C=await this.options.api.status(i).catch(async(M)=>{if(!(M instanceof ue?M.code==="request_failed"&&(M.status===void 0||M.status===408||M.status===429||M.status>=500):M instanceof TypeError||M instanceof Error&&M.name==="TimeoutError"))throw M;return c(),await this.refreshKnownSession(i).catch(()=>{return})});if(c(),C?.status)T.status=C.status;let N=this.sessions.get(i);if(N?.status==="suspended"&&["provisioning","ready","active"].includes(T.status))N.status=T.status,N.busy=!1,N.endedAt=void 0}if(T.status==="suspended"){let C=new AbortController,N=this.trackProvisioningController(i,C);try{try{T=await this.options.api.resume(i,C.signal)}catch(O){if(!(O instanceof ue)||O.status!==409)throw O;c(),C.signal.throwIfAborted();let L=await this.options.api.status(i,{signal:C.signal});if(L.status!=="provisioning"&&L.status!=="ready"&&L.status!=="active")throw O;T={...T,status:L.status}}c(),C.signal.throwIfAborted(),this.knownSessions.set(i,T);let M=this.sessions.get(i);if(M)M.status=T.status,M.busy=!1,M.endedAt=void 0;this.publishSnapshot(i,!1,"status")}finally{N()}}if(T.status==="provisioning"){let C=new AbortController,N=this.trackProvisioningController(i,C);try{if(await this.options.api.waitUntilReady(i,C.signal,({phase:O})=>{T.metadata.provisioningPhase=O,this.notify("chat_session_status",{sessionId:i,status:"provisioning",phase:O})}),this.disposed)throw Error("Cloud session manager was disposed");if(T=await this.refreshKnownSession(i)??T,C.signal.throwIfAborted(),T.status==="provisioning")T.status="ready";let M=this.sessions.get(i);if(M?.status==="provisioning")M.status="idle",M.busy=!1,M.endedAt=void 0}catch(M){if(M instanceof ue&&M.code==="session_failed"){if(T.status="failed",T.metadata.statusReason=M.detail,T.metadata.provisioningPhase="failed",!this.disposed)this.knownSessions.set(i,T);let O=this.sessions.get(i);if(O)O.status="error";this.notify("chat_session_status",{sessionId:i,status:"error"})}throw M}finally{N()}}if(c(),T.status==="failed")throw new ue("session_failed",T.metadata.statusReason||"The cloud sandbox could not be prepared.");if(Os(T))throw new ue("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(T));let _,E=0,A=this.createHubClient({url:dX(this.options.apiBaseUrl,i),clientId:`${this.options.clientIdentity?.prefix??"cloud"}-${i}-${t2()}`,clientType:this.options.clientIdentity?.type??"cloud-client",displayName:this.options.clientIdentity?.displayName??"Cline cloud session",workspaceRoot:at,cwd:at,resolveConnectionHeaders:async()=>{c();let C=E>0;if(E+=1,_)_.connected=!1,_.reconnecting=C,this.publishSnapshot(i);if(C){let M=_;if(M&&!M.disposed){M.transcriptKnown=!1,M.innerSessionId=void 0;let O=(async()=>{if(await this.resolveInnerSession(i,M),M.innerSessionId)await this.rehydrateAfterTransportDrop(i,M)})().catch(()=>this.disposeConnectionIfSessionGone(i,M)).finally(()=>{if(M.reconnectResolution===O)M.reconnectResolution=void 0,M.connected=M.transcriptKnown,this.publishSnapshot(i)});M.reconnectResolution=O}}let N=await this.options.getAuthToken();if(!N?.trim())throw new ue("authentication_required","Sign in to Cline to reconnect this cloud session.");return c(),{Authorization:`Bearer ${N.trim()}`}}});_={generation:u,remote:T,client:A,bufferedEvents:[],bufferedEventsDropped:0,transcriptKnown:!1,seenEventIds:new Set,unsubscribe:()=>{}},_.unsubscribe=A.subscribe(()=>{},{sessionId:T.metadata.taskId?.trim()||i}),this.connections.set(i,_);try{if(await A.connect(),_.connected=!0,this.publishSnapshot(i),this.assertSessionActive(i,_),await this.resolveInnerSession(i,_,Boolean(l.handoffSeed)),this.assertSessionActive(i,_),l.handoffSeed&&_.innerSessionId)await this.assertHandoffConnectionReusable(_,l.handoffSeed);if(l.createInner&&!_.innerSessionId)await this.createInnerSession(_,l.handoffSeed);return this.assertSessionActive(i,_),_}catch(C){if(Jp(C)&&!this.disposed&&!_.disposed&&!this.deletingSessions.has(i))throw C;if(this.connections.get(i)===_)this.connections.delete(i);if(_.disposed=!0,_.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 T=await l.client.command("session.get",{sessionId:c},c);this.assertSessionActive(i,l),g=T.payload?.session&&typeof T.payload.session==="object"&&!Array.isArray(T.payload.session)?T.payload.session:void 0}catch(T){if(!Lu(T))throw T}else{let T=await l.client.command("session.list",{limit:100});this.assertSessionActive(i,l),g=Kp(T.payload).filter(Gp).sort((_,E)=>Bb(E)-Bb(_))[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=Hb(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(N){if(!(Lu(N)||N instanceof Error&&N.code==="command_failed"&&N.message===`session not found: ${l}`))throw N}this.assertSessionActive(i.remote.id,i);let g=u.metadata??{},b=u.runtimeOptions??{},I=this.sessions.get(i.remote.id)?.config,T=Object.hasOwn(g,"thinking")?g.thinking:I?.thinking,_=Object.hasOwn(g,"reasoningEffort")?g.reasoningEffort:I?.reasoningEffort,E=typeof g.autoApproveTools==="boolean"?g.autoApproveTools:I?.autoApproveTools,A=u.cwd??u.workspaceRoot??at,C=u.workspaceRoot??at;try{let N={workspaceRoot:C,cwd:A,metadata:{...g,interactive:!0},sessionConfig:{sessionId:l,providerId:g.provider??"cline",modelId:g.model??g.modelId??i.remote.metadata.modelId,workspaceRoot:C,cwd:A,systemPrompt:b.systemPrompt??g.systemPrompt??"",mode:b.mode??g.mode??"act",...typeof T==="boolean"?{thinking:T}:{},...typeof _==="string"?{reasoningEffort:_}:{},...g.checkpointEnabled===!0?{checkpoint:{enabled:!0}}:{}},runtimeOptions:b,...typeof E==="boolean"?{toolPolicies:{"*":{autoApprove:E}}}:{}},M=await i.client.command("session.resume",N).catch(async(O)=>{if(!(O instanceof ju)||O.code!=="unsupported_command")throw O;this.assertSessionActive(i.remote.id,i);let L=await i.client.command("session.messages",{},l);this.assertSessionActive(i.remote.id,i);let D=L.payload?.messages;if(!Array.isArray(D)||D.length===0)throw Error("The saved conversation is empty or unavailable.");return i.client.command("session.create",{...N,initialMessages:D})});if(this.assertSessionActive(i.remote.id,i),(M.payload?.session?.sessionId??M.payload?.sessionId)!==l)throw Error("Cloud Hub did not restore the requested session.")}catch(N){if(N?.code!=="session_already_exists")throw N;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=Kp(u.payload).filter(Gp),[g]=c;if(c.length!==1||String(g?.sessionId??"").trim()!==i.innerSessionId||Gb(g)!==l.sourceSessionId)throw new ue("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 ue("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=Kp(u.payload).filter(Gp);if(c.length===0)return!1;let[g]=c,b=String(g?.sessionId??"").trim();if(c.length!==1||!b||Gb(g)!==l.sourceSessionId)throw new ue("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 resolveComputerUse(i){if(!e2(i))return!1;try{return await this.options.isComputerUseEnabled?.()===!0}catch(l){return this.options.logger?.debug("Cloud computer-use gate failed",{error:l}),!1}}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=Yp(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 fh(D);throw D}let T=await this.resolveComputerUse(u),_=aX(i.remote,{computerUse:T}),E=l?.config?.thinking??c?.config.thinking,A=l?.config?.reasoningEffort??c?.config.reasoningEffort,C=!1,N=i.client.command("session.create",{workspaceRoot:at,cwd:b,...l?{initialMessages:l.messages}:{},sessionConfig:{...i.remote.metadata.taskId?.trim()?{sessionId:i.remote.metadata.taskId.trim()}:{},providerId:"cline",modelId:u,workspaceRoot:at,cwd:b,systemPrompt:l?`${B_}
|
|
1073
|
+
|
|
1074
|
+
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 ${at}. Earlier transcript references to the local OS, absolute paths, environment, and tool availability are stale.`+(b===at?"":`
|
|
1075
|
+
|
|
1076
|
+
Continue from the original repository subdirectory at ${b}.`)+(T?`
|
|
1077
|
+
|
|
1078
|
+
${C_}`:""):_,mode:I,enableTools:!0,...typeof E==="boolean"?{thinking:E}:{},...typeof A==="string"?{reasoningEffort:A}:{}},metadata:{source:this.options.clientIdentity?.source??"sdk",provider:"cline",model:u,interactive:!0,thinking:E??null,reasoningEffort:E===!1?null:A??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:()=>{C=!0}}),M;try{M=await N}catch(D){if(l&&!C)throw new fh(D);if(l&&(Vp(D,"session.create")||Jp(D)))this.unconfirmedInnerCreates.add(i.remote.id);throw D}this.assertSessionActive(i.remote.id,i);let O=M.payload?.session&&typeof M.payload.session==="object"?M.payload.session:void 0,L=String(O?.sessionId??M.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>oX){let g=l.seenEventIds.values().next().value;if(g)l.seenEventIds.delete(g)}}if(l.bufferingEvents){if(l.bufferedEvents.push(u),l.bufferedEvents.length>nX)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,T=u.payload?.requestId,_=typeof T==="string"?l.pendingInputs?.get(T):void 0;if(_&&u.payload?.clientId===_.clientId){if(_.accept(),_.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((T)=>{if(this.disposed||l.disposed)return;this.notify("cloud_session_sync_failed",{sessionId:i,message:T instanceof Error?T.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:uX(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=Hb(l);if(u)this.applyModel(i,u);let c=l,g=typeof c.cwd==="string"&&qu.normalize(c.cwd)===c.cwd&&(c.cwd===at||c.cwd.startsWith(`${at}/`))?c.cwd:void 0;if(g){i.remote.metadata.cwd=g;let T=this.sessions.get(i.remote.id);if(T)T.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(Os(b))await this.attachExpired(b).catch(()=>{return}),await this.disposeConnection(i).catch(()=>{return})}}async function en(i,l,u={}){try{return await new Promise((c,g)=>{let b=pX("git",l,{cwd:i,env:{...process.env,...u.env,GIT_TERMINAL_PROMPT:"0",GIT_NO_REPLACE_OBJECTS:"1",GIT_GRAFT_FILE:"/dev/null"},encoding:"utf8",maxBuffer:8388608,timeout:u.timeout??60000},(I,T)=>I?g(I):c(T.trimEnd()));if(u.input!==void 0)b.stdin?.on("error",g),b.stdin?.end(u.input)})}catch(c){let g=c instanceof Error&&"code"in c?c.code:void 0,b=g===null&&c instanceof Error&&"killed"in c&&c.killed===!0?`timed out after ${(u.timeout??60000)/1000} seconds`:`failed${typeof g==="number"?` (exit code ${g})`:""}. Check Git authentication, permissions, and repository state`;throw Error(`Git ${l[0]} ${b}.`)}}async function mX(i,l){let u=(await en(i,["remote","get-url","--all",l])).split(`
|
|
1079
|
+
`),c=(await en(i,["remote","get-url","--push","--all",l])).split(`
|
|
1080
|
+
`),g=hh(u[0]??""),b=c[0];if(g&&b&&u.length===1&&c.length===1&&hh(b)===g)return{repoUrl:g,pushUrl:b};return}async function W_(i){let l=await mX(i.root,i.remote);if(!l||l.repoUrl!==i.repoUrl)throw Error("The remote changed after confirmation. Run /cloud again to review the destination.");return l.pushUrl}async function hX(i,l){if(await W_(i),(await en(i.root,["ls-remote","--heads",i.remote,`refs/heads/${i.branch}`])).split(/\s/)[0]!==l)throw Error("The published branch changed during preparation. Run /cloud again.")}async function fX(i){let l=await W_(i);if((await en(i.root,["ls-remote","--heads",i.remote,`refs/heads/${i.branch}`])).trim())throw Error("The proposed handoff branch already exists. Run /cloud again.");let u=i.treeSha===await en(i.root,["rev-parse",`${i.headSha}^{tree}`])?i.headSha:await en(i.root,["commit-tree","-p",i.headSha,"--no-gpg-sign","-m","Cline cloud handoff checkpoint",i.treeSha]);try{await en(i.root,["-c","push.followTags=false","-c","push.recurseSubmodules=no","push",l,`${u}:refs/heads/${i.branch}`],{timeout:600000})}catch{throw Error(`Couldn't complete the push. Check GitHub write access, branch rules (including required signatures), pre-push hooks, and your connection. Check whether ${i.branch} was published before retrying.`)}return u}var We=e().trim().min(1),gX=e().nullish(),em=e().min(1).refine((i)=>!i.startsWith("-")&&!/\p{Cc}/u.test(i)),Jb=e().regex(/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/),yX=t({id:We,root:em.refine(Eb),workspaceRelativePath:e().refine((i)=>!i||!Eb(i)&&!i.split(/[\\/]/).some((l)=>!l||l==="."||l==="..")&&!/\p{Cc}/u.test(i)),repoUrl:em,remote:em,branch:e().regex(/^cline\/handoff-[0-9a-f-]{12}$/),headSha:Jb,treeSha:Jb}).strict().refine((i)=>hh(i.repoUrl)===i.repoUrl,"Git publication must target the selected GitHub repository"),yh=t({mode:s(["act","plan","yolo","zen"]).optional(),workspaceRelativePath:e().optional(),autoApproveTools:r().optional(),thinking:r().optional(),reasoningEffort:s(["low","medium","high","xhigh"]).optional()}),K_=yh.extend({sandboxType:s(["standard","resumable"]).optional(),requestId:We.optional(),modelId:We,repoUrl:We,initialPrompt:e().optional(),initialMessage:t({text:e().refine((i)=>i.trim().length>0),images:o(e()).optional()}).strict().optional(),branch:We.optional(),organizationId:We.nullable().optional(),localGit:yX.optional()}).strict().superRefine((i,l)=>{if(!i.localGit)return;if(i.organizationId===void 0)l.addIssue({code:"custom",path:["organizationId"],message:"Local Git publication requires organizationId from preparation, or null for Personal"});if(!i.requestId||!i.initialMessage)l.addIssue({code:"custom",message:"Local Git publication requires requestId and initialMessage"});if(i.repoUrl!==i.localGit.repoUrl||i.branch!==i.localGit.branch||(i.workspaceRelativePath??"")!==i.localGit.workspaceRelativePath)l.addIssue({code:"custom",message:"Cloud workspace must match the approved Git preparation"})}),Vb={create:W([K_]),attach:W([We,yh.nullish()]),send:W([We,e(),s(["queue","steer"]).nullish(),gX,o(e()).nullish()]),abort:W([We]),pendingPrompts:W([We]),updatePendingPrompt:W([We,We,t({prompt:e().optional(),delivery:s(["queue","steer"]).optional()}).strict()]),removePendingPrompt:W([We,We]),readMessages:W([We]),updateTitle:W([We,e()]),delete:W([We]),list:W([]),listForDiscovery:W([t({timeoutMs:n().positive().max(30000).optional()}).nullish()]),getCrossScopeDiscoveryRecord:W([We]),listModels:W([]),listRepositories:W([]),listBranches:W([n().int().positive(),t({cursor:e().optional(),query:e().optional()}).nullish()]),respondApproval:W([We,We,t({approved:r(),reason:e().optional()}).strict()]),refreshOrganization:W([]),prepareHandoffRepository:W([We]),restoreCreationOptions:W([We,yh.strict()])};function vX(i){let l=i?.auth;return JSON.stringify([l?.accessToken,l?.refreshToken,l?.expiresAt,i?.apiKey,i?.baseUrl])}class G_{options;serviceId=zG();scopeGeneration=0;revision=0;organization;organizationGeneration=0;controller;scope;closed=!1;snapshots=new Map;tokenManager;settings=new oi;scopeTimer;retiring=new Set;publications=new Map;activeCommands=0;constructor(i){this.options=i,this.tokenManager=new dc({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=_e(),l=this.scope,u=this.settings.getProviderSettings("cline")?.baseUrl?.trim().replace(/\/api\/v1\/*$/,"")||i.apiBaseUrl,c,g=async()=>{if(!this.isCurrentScope(l))throw Error("Cline account changed");let I=vX(this.settings.getProviderSettings("cline"));if(I===c)return;c=void 0;let T,_;try{T=(await this.tokenManager.resolveProviderApiKey({providerId:"cline"}))?.apiKey}catch(E){_=E}if(_ instanceof od){if(c=I,!this.isCurrentScope(l))throw Error("Cline account changed");return}if(!T)T=ri("cline")?.getApiKey(this.settings.getProviderSettings("cline"));if(!T&&_)this.options.logger?.error?.("Cloud account token refresh failed",{error:_}),ql(this.options.telemetry,"cline",{errorName:_ instanceof Error?_.name:"Error",errorCode:"hub_cloud_refresh_failed_no_fallback_token"});if(!this.isCurrentScope(l))throw Error("Cline account changed");return T},b=new S_({apiBaseUrl:u,getAuthToken:g});return new z_({api:new x_({apiBaseUrl:u,appBaseUrl:i.appBaseUrl,getAuthToken:g}),apiBaseUrl:u,getAuthToken:g,logger:this.options.logger,clientIdentity:{prefix:"hub-cloud",type:"hub-cloud",displayName:"Cline Hub cloud session",source:"desktop"},lateCreateDisposition:"preserve",isComputerUseEnabled:async()=>process.env[ZG]==="1"||await gf(Ge.CLOUD_COMPUTER_USE),getActiveOrganizationId:async(I)=>{if(I?.fresh)this.invalidateOrganization();let T=this.organization;if(!I?.fresh&&T&&Date.now()-T.at<60000)return T.id;let _=this.organizationGeneration;if(!await g())return;let E=(await b.fetchUserOrganizations())?.find((A)=>A.active)?.organizationId;if(_===this.organizationGeneration)this.organization={id:E,at:Date.now()};return E}})}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(Vb,i))throw Error(`Unknown cloud operation: ${i}`);let c=i,g=Vb[c].parse(l).map((T)=>T===null?void 0:T);if(c==="create"){let T=g[0];T.sandboxType??="resumable"}let b=t({serviceId:e(),scopeGeneration:n().int(),expectedAccountId:We.optional()}).parse(u),I=this.getController();if(b.serviceId!==this.serviceId||b.scopeGeneration!==this.scopeGeneration)throw Error("Cloud account changed before request");if(b.expectedAccountId!==void 0){let T=this.scope;if(T?.kind!=="account"||T.identity!==b.expectedAccountId)throw Error("The cloud account does not match the signed-in account. Sign in again before continuing.")}this.activeCommands++;try{let T=c==="create"?await this.create(I,K_.parse(g[0])):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:T}}finally{this.activeCommands--}}create(i,l){let{localGit:u,...c}=l;if(!u)return i.create(c);let g=`${this.scopeGeneration}:${l.requestId}`,b=this.publications.get(g);if(b){if(b.planId!==u.id)throw Error("The request already has a different Git preparation");return b.result}let I=()=>{if(this.checkScope(),this.closed||this.controller!==i)throw Error("Cline account changed during cloud publication")},T=Promise.resolve().then(async()=>{I();let _=l.initialMessage?.images??[],E=di();for(let M of _){let O=mi(void 0,M,{},E);if(!O.ok)throw Error(O.message)}let{organizationId:A}=await i.prepareHandoffRepository(u.repoUrl);if(I(),(A??null)!==(c.organizationId??null))throw Error("The cloud organization changed before publication");let C=await i.listModels();if(I(),!C.some((M)=>M.id===l.modelId))throw Error("The selected model is not available in Cline Cloud for this account");let N=await fX(u);return I(),await hX(u,N),I(),i.create(c)}).finally(()=>this.publications.delete(g));return this.publications.set(g,{planId:u.id,result:T}),T}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 wX(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 bX(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 X_(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:wX(i.status),participants:l?[...l.participants.values()]:[],metadata:bX(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 ce(i,l){return{version:i.version,requestId:i.requestId,ok:!0,...l!==void 0?{payload:l}:{}}}function fe(i,l,u){return{version:i.version,requestId:i.requestId,ok:!1,error:{code:l,message:u}}}function Wr(i){return i&&typeof i==="object"&&!Array.isArray(i)?i:void 0}function it(i){if(typeof i.payload?.sessionId==="string")return i.payload.sessionId.trim();return i.sessionId?.trim()??""}function Yt(i,l,u){return{version:"v1",event:i,eventId:P("hevt_"),sessionId:u,timestamp:Date.now(),payload:l}}async function Mr(i,l){let u=await i.sessionHost.getSession(l);if(!u)return;let c=await i.sessionHost.getAccumulatedUsage?.(l);return X_(u,i.sessionState.get(l),c?.usage,c?.aggregateUsage)}async function Ss(i,l){let u=await i.sessionHost.getSession(l);if(!u)return;let c=await i.sessionHost.getAccumulatedUsage?.(l);return xu({session:u,usage:c?.usage,aggregateUsage:c?.aggregateUsage})}function J_(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 IX(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 Rd(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 T=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:T}),i.publish(T)})}function kX(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 V_(i,l,u){let c=i.pendingApprovals.get(l);if(!c)return;return i.pendingApprovals.delete(l),c.resolve(u),{sessionId:c.sessionId}}function Y_(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 SX(i,l){let u=typeof l.payload?.approvalId==="string"?l.payload.approvalId.trim():"";if(!i.pendingApprovals.get(u))return fe(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=V_(i,u,{approved:g,reason:c});if(!b)return fe(l,"approval_not_found",`Unknown approval: ${u}`);return i.publish(i.buildEvent("approval.resolved",{approvalId:u,approved:g,reason:c},b.sessionId)),ce(l,{approvalId:u,approved:g})}function TX(i){if(i instanceof Error)return{name:i.name,message:i.message,stack:i.stack};if(i===void 0)return;return i}var Yb={debug:10,info:20,warn:30,error:40,silent:50};function _X(){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 Ce(i,l,u={}){if(Yb[i]<Yb[_X()])return;let c=JSON.stringify({ts:new Date().toISOString(),level:i,component:"hub",message:l,...Object.fromEntries(Object.entries(u).map(([g,b])=>[g,TX(b)]).filter(([,g])=>g!==void 0))});if(i==="error"||i==="warn"){console.error(`[hub] ${c}`);return}console.log(`[hub] ${c}`)}function Mi(i,l){let u=l instanceof Error?l.stack||l.message:String(l);Ce("error",i,{error:u})}var zu="The app running this task disconnected before it could respond. Reopen the task to continue.",EX=7000;function AX(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 xX(i,l,u,c,g,b){let I=P("capreq_"),T=performance.now();Ce("info","capability.request.start",{requestId:I,sessionId:l,capabilityName:u,targetClientId:g});let _=(E)=>(Ce("warn","capability.request.end",{requestId:I,sessionId:l,capabilityName:u,targetClientId:g,ok:!1,error:`target_client_${E}`,durationMs:Math.round(performance.now()-T)}),kg(i.telemetry,{sessionId:l,capabilityName:u,reason:E}),Error(zu));if(i.detachedClientsBySession?.get(l)?.has(g))throw _("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:(M)=>{if(Ce(M.ok?"info":"warn","capability.request.end",{requestId:I,sessionId:l,capabilityName:u,targetClientId:g,ok:M.ok,error:M.error,durationMs:Math.round(performance.now()-T)}),!M.ok){if(M.error===zu)kg(i.telemetry,{sessionId:l,capabilityName:u,reason:"cancelled_while_waiting"});A(Error(M.error||`Capability ${u} was rejected by ${g}.`));return}E(M.payload)}}),!N){setTimeout(()=>{if(!i.pendingCapabilityRequests.get(I)?.undeliveredEvent)return;i.pendingCapabilityRequests.delete(I),A(_("disconnected"))},EX);return}i.publish(C),Ce("info","capability.request.published",{requestId:I,sessionId:l,capabilityName:u,targetClientId:g})})}function CX(i,l){let u=typeof l.payload?.requestId==="string"?l.payload.requestId.trim():"",c=i.pendingCapabilityRequests.get(u);if(!c)return ce(l,{requestId:u,ignored:!0});if((l.clientId?.trim()||"")!==c.targetClientId)return fe(l,"capability_wrong_client",`Capability request ${u} is owned by ${c.targetClientId}`);if(l.sessionId?.trim()&&l.sessionId.trim()!==c.sessionId)return fe(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),ce(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),Ce("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 RX(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 fe(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 ce(l,I)}catch(b){return fe(l,"capability_request_failed",b instanceof Error?b.message:String(b))}}function PX(i,l){let u=typeof l.payload?.requestId==="string"?l.payload.requestId.trim():"",c=i.pendingCapabilityRequests.get(u);if(!c)return ce(l,{requestId:u,ignored:!0});let g=l.clientId?.trim()||"";if(g!==c.targetClientId)return fe(l,"capability_wrong_client",`Capability request ${u} is owned by ${c.targetClientId}`);if(l.sessionId?.trim()&&l.sessionId.trim()!==c.sessionId)return fe(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,T=l.payload?.ok===!0;return Ce(T?"info":"warn","capability.respond",{requestId:u,sessionId:c.sessionId,capabilityName:c.capabilityName,targetClientId:c.targetClientId,respondedByClientId:g,ok:T,error:I}),c.resolve({ok:T,payload:b,error:I}),i.publish(i.buildEvent("capability.resolved",{requestId:u,capabilityName:c.capabilityName,targetClientId:c.targetClientId,respondedByClientId:g,ok:T,payload:b,error:I},c.sessionId)),ce(l,{requestId:u,ok:T})}function MX(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()})),ce(l,{clientId:c})}function NX(i,l){let u=l.clientId?.trim(),c=u?i.clients.get(u):void 0;if(!u||!c)return fe(l,"client_not_found","Client is not registered with this hub.");let g=Wr(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((T)=>typeof T==="string")?{scopes:I.scopes}:{}}]});return ce(l)}function OX(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 ce(l)}function $X(i,l){return ce(l,{clients:[...i.clients.values()]})}function In(i){return typeof i==="object"&&i!==null&&!Array.isArray(i)}function Wu(i){return typeof i==="string"?i.trim():void 0}function Qb(i){if(!In(i))return{};let l={};for(let[u,c]of Object.entries(i))if(typeof c==="string")l[u]=c.trim();return l}function LX(){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 rg(){return{available:nr(),active:nk(),configured:LX()}}function DX(i,l){if(i.required&&!l[i.flag]?.trim())throw Error(`${i.label} is required`)}function UX(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(!To(g,u))continue;DX(g,u),c[g.flag]=u[g.flag]}return c}function FX(i){if(!In(i))throw Error("connector.configure payload must be an object.");let l=Wu(i.channel);if(!l)throw Error("channel is required");let u=_o.find((A)=>A.id===l);if(!u)throw Error(`unknown connector channel: ${l}`);if(!new Set(pi().map((A)=>A.name)).has(u.id))throw Error(`connector channel is not available: ${l}`);let c=Qb(i.values),g=UX(u,c),b=In(i.security)?i.security:{},I=b.enabled===!0,T=Qb(b.values);if(I&&u.security)for(let A of u.security.fields){let C=T[A.key];if(!C)throw Error(A.requiredMessage);let N=A.validate?.(C);if(N)throw Error(N)}let _=I?{enabled:!0,values:T}:{enabled:!1,values:{}},E=tr(u,g,_);return Je((A)=>A.upsertConfig({channel:l,type:l,values:g,security:_,updateConnectArgs:(C)=>ir(u,C.connection.connectArgs,E,{replaceSecurityArgs:C.config?.security?.enabled===!0||_.enabled})})),rg()}function qX(i){if(!In(i))throw Error("connector.delete_config payload must be an object.");let l=Wu(i.channel);if(!l)throw Error("channel is required");return Je((u)=>u.deleteConfig(l)),rg()}function jX(i){return Array.isArray(i)?i.filter((l)=>typeof l==="string"):[]}function sg(){let i=lk();if(!i)throw Error("connector supervision is unavailable in this hub; start connectors with the CLI instead");return i}function Q_(i){if(!In(i))throw Error("payload must be an object.");let l=Wu(i.channel);if(!l)throw Error("channel is required");let u=Wu(i.instanceId);if(!u)throw Error("instanceId is required");return{channel:l,instanceId:u}}async function BX(i){let{channel:l,instanceId:u}=Q_(i),c=In(i)?i:{};return await sg().start({channel:l,instanceId:u,args:jX(c.args),restart:c.restart===!0})}async function HX(i){let{channel:l,instanceId:u}=Q_(i),c=In(i)?i:{};return{stopped:await sg().stop({channel:l,instanceId:u,disableAutostart:c.disableAutostart!==!1}),channel:l,instanceId:u}}function zX(i){return i==="connector.configure"||i==="connector.delete_config"||i==="connector.start"||i==="connector.stop"}function yl(i,l,u){if(!zX(l.command))return;ra(i.telemetry,{ulid:l.sessionId??l.requestId??"hub",tool:l.command,success:u})}async function WX(i,l){try{if(l.command==="connector.channels")return ce(l,rg());if(l.command==="connector.configure"){let u=FX(l.payload);return yl(i,l,!0),ce(l,u)}if(l.command==="connector.delete_config"){let u=qX(l.payload);return yl(i,l,!0),ce(l,u)}if(l.command==="connector.start"){let u=await BX(l.payload);return yl(i,l,!0),ce(l,u)}if(l.command==="connector.stop"){let u=await HX(l.payload);return yl(i,l,!0),ce(l,u)}if(l.command==="connector.supervised")return ce(l,{supervised:sg().list()});return fe(l,"unsupported_connector_command",`unsupported connector command: ${l.command}`)}catch(u){return yl(i,l,!1),fe(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 ig(i,l,u){let c=u instanceof Error?u.message:String(u);return fe(i,Lu(u)?Rf:l,c)}async function KX(i,l){let u=it(l),c=Vl(l.payload?.toolName);if(!u||!c)return fe(l,"invalid_mcp_apps_resolve_tool","session.mcp_apps.resolve_tool requires a sessionId and toolName");let g=i.sessionHost.resolveMcpAppTool;if(!g)return ce(l,{});try{let b=await g.call(i.sessionHost,u,c);return ce(l,b?{binding:b}:{})}catch(b){return ig(l,"mcp_apps_resolve_tool_failed",b)}}async function GX(i,l){let u=it(l),c=Vl(l.payload?.serverName),g=Vl(l.payload?.uri);if(!u||!c||!g)return fe(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 fe(l,"unsupported_command","This runtime does not support MCP Apps.");try{let I=await b.call(i.sessionHost,u,{serverName:c,uri:g});return ce(l,{result:I})}catch(I){return ig(l,"mcp_apps_read_resource_failed",I)}}async function XX(i,l){let u=it(l),c=Vl(l.payload?.serverName),g=Vl(l.payload?.toolName),b=l.payload?.arguments,I=Wr(b);if(!u||!c||!g||b!==void 0&&!I)return fe(l,"invalid_mcp_apps_call_tool","session.mcp_apps.call_tool requires a sessionId, serverName, toolName, and object arguments");let T=i.sessionHost.callMcpAppTool;if(!T)return fe(l,"unsupported_command","This runtime does not support MCP Apps.");try{let _=await T.call(i.sessionHost,u,{serverName:c,toolName:g,...I?{arguments:I}:{}});return ce(l,{result:_})}catch(_){return ig(l,"mcp_apps_call_tool_failed",_)}}var JX=30000;function VX(i){if(i==="aborted")return"run.aborted";if(i==="error"||i==="failed")return"run.failed";return"run.completed"}function YX(i){if(i.finishReason!=="error")return;return i.text.trim()||void 0}function QX(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 Zb(i,l,u){let c=u instanceof Error&&u.message.trim()?u.message:`Unknown session: ${l}`;return fe(i,Rf,c)}function ZX(i){return i?i:void 0}function eJ(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 tJ(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},T=setInterval(()=>{if(b)return;let A=Math.round(performance.now()-g);Ce("warn","run.heartbeat",{...I,elapsedMs:A}),i.publish(i.buildEvent("run.heartbeat",{requestId:l.requestId,elapsedMs:A,...c?{timeoutMs:c}:{}},u.sessionId))},JX),_=i.sessionHost.runTurn(u);_.then((A)=>{if(!b)return;Ce("warn","run.late_end",{...I,elapsedMs:Math.round(performance.now()-g),finishReason:A?.finishReason})},(A)=>{if(!b)return;Ce("error","run.late_error",{...I,elapsedMs:Math.round(performance.now()-g),error:A})});let E;try{if(!c)return await _;return await Promise.race([_,new Promise((A,C)=>{E=setTimeout(()=>{let N=`Hub run ${l.command} timed out after ${c}ms.`;b=!0,clearInterval(T),C(Error(N)),Ce("error","run.timeout",{...I,elapsedMs:Math.round(performance.now()-g)}),Y_(i,(M)=>M.sessionId===u.sessionId,N),Jl(i,(M)=>M.sessionId===u.sessionId,N),i.sessionHost.abort(u.sessionId,N).catch((M)=>{Ce("error","run.timeout_abort_failed",{...I,error:M})})},c)})])}finally{if(b=!0,clearInterval(T),E)clearTimeout(E)}}async function vh(i,l){let u=it(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,T=Array.isArray(b?.userFiles)?b.userFiles.filter((N)=>typeof N==="string"&&N.trim().length>0):void 0;if(!g.trim()&&!I?.length&&!T?.length)return fe(l,"invalid_session_input","session input requires a prompt or attachment");if(!await i.sessionHost.getSession(u))return Zb(l,u);i.publish(i.buildEvent("run.started",{...l.requestId?{requestId:l.requestId}:{},...l.clientId?{clientId:l.clientId}:{}},u));let _=eJ(c);i.suppressNextTerminalEventBySession.set(u,"run.start.reply");let E=QX(i,u),A;try{try{A=await tJ(i,l,{sessionId:u,prompt:g,mode:ZX(c.mode),delivery:c.delivery==="queue"||c.delivery==="steer"?c.delivery:void 0,userImages:I,userFiles:T,timeoutMs:_},_)}catch(N){if(i.suppressNextTerminalEventBySession.get(u)==="run.start.reply")i.suppressNextTerminalEventBySession.delete(u);if(Lu(N))return Zb(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 Ss(i,u),M=YX(A);if(i.publish(i.buildEvent(VX(A.finishReason),{reason:A.finishReason,...M?{error:M}:{},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 Ss(i,u);return ce(l,A||C?{...A?{result:A}:{},...C?{snapshot:C}:{}}:void 0)}async function rJ(i,l){let u=it(l),c=typeof l.payload?.reason==="string"?l.payload.reason:"Run was aborted before pending approval or capability request was resolved.";Y_(i,(g)=>g.sessionId===u,c);try{await i.sessionHost.abort(u,l.payload?.reason)}catch(g){Ce("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 ce(l,{applied:!0})}async function sJ(i,l){let u=it(l);if(!u)return fe(l,"invalid_session_id","run.proceed_while_running requires a sessionId");if(typeof i.sessionHost.proceedWhileRunning!=="function")return fe(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 ce(l,{detachedCount:g})}async function iJ(i,l){let u=va(l.payload?.payload);if(!u)return fe(l,"invalid_hook_payload","session.hook requires a valid hook event payload");return await i.sessionHost.dispatchHookEvent(u),ce(l,{applied:!0})}var oJ=32,aJ=604800000;class ng 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 lJ(i){let l=i?.replace(/[^a-zA-Z0-9_-]/g,"-");return nJ(be(),l?`hub-runs-${l}.db`:"hub-runs.db")}class Z_{db;maxPendingPerSession;closed=!1;constructor(i={}){this.db=V(i.dbPath??lJ(i.ownerId)),this.maxPendingPerSession=i.maxPendingPerSession??oJ,this.db.exec("PRAGMA journal_mode = WAL;"),this.db.exec("PRAGMA busy_timeout = 5000;"),this.db.exec(`
|
|
1081
|
+
CREATE TABLE IF NOT EXISTS hub_runs (
|
|
1082
|
+
accepted_seq INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1083
|
+
run_id TEXT NOT NULL UNIQUE,
|
|
1084
|
+
session_id TEXT NOT NULL,
|
|
1085
|
+
state TEXT NOT NULL,
|
|
1086
|
+
input_json TEXT NOT NULL,
|
|
1087
|
+
client_id TEXT,
|
|
1088
|
+
accepted_at INTEGER NOT NULL,
|
|
1089
|
+
started_at INTEGER,
|
|
1090
|
+
ended_at INTEGER,
|
|
1091
|
+
error TEXT
|
|
1092
|
+
);
|
|
1093
|
+
CREATE INDEX IF NOT EXISTS idx_hub_runs_session
|
|
1094
|
+
ON hub_runs(session_id, accepted_seq);
|
|
1095
|
+
CREATE INDEX IF NOT EXISTS idx_hub_runs_state
|
|
1096
|
+
ON hub_runs(state, accepted_seq);
|
|
1097
|
+
`)}admit(i,l,u){let c=this.countPendingBySession(i);if(c>=this.maxPendingPerSession)throw new ng(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)
|
|
1098
|
+
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'
|
|
1099
|
+
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
|
|
1100
|
+
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
|
|
1101
|
+
${l.length?`WHERE ${l.join(" AND ")}`:""}
|
|
1102
|
+
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 = ?,
|
|
1103
|
+
error = 'Hub daemon exited before the run finished.'
|
|
1104
|
+
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()-aJ),{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 dJ="hub_draining",uJ=new Set(["session.create","session.resume","session.restore","session.fork","run.start","session.send_input","run.enqueue","plugins.commands.run","plugins.commands.list"]);function cJ(i){return uJ.has(i)}function eI(i){return{version:i.version,requestId:i.requestId,ok:!1,error:{code:dJ,message:"Hub is draining and refuses new mutating work; retry once a hub is serving again.",details:{retryable:!0}}}}class eE{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)=>{Ce("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 vh(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 pJ(i,l,u,c){let g=it(l);if(!g)return fe(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 fe(l,"invalid_session_input","run.enqueue requires a prompt string");let I;try{I=u.admit(g,b,l.clientId?.trim()||void 0)}catch(T){if(T instanceof ng)return{version:l.version,requestId:l.requestId,ok:!1,error:{code:"run_admission_rejected",message:T.message,details:{retryable:!0}}};throw T}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),ce(l,{...I})}function mJ(i,l){let u=it(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 ce(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 hJ(i,l){switch(l.type){case"chunk":return;case"agent_event":await fJ(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([Mr(i,l.payload.sessionId),Ss(i,l.payload.sessionId)]);if(u)i.publish(i.buildEvent("session.updated",{session:u,...c?{snapshot:c}:{}},l.payload.sessionId));return}case"ended":await yJ(i,l);return;default:return}}async function fJ(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 gJ(i,l)}async function gJ(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 Ss(i,u);i.publish(i.buildEvent("run.failed",{reason:"error",...g?{error:g,text:g}:{},...b?{snapshot:b}:{}},u))}async function yJ(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([Mr(i,l.payload.sessionId),Ss(i,l.payload.sessionId)]);if(l.payload.reason==="completed"){let I=await Fz(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 vJ=["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 wJ(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 tE(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 T=wJ(g,u);if(T)l.push(T);continue}if(b==="toolExecutor"){let T=g.executor;if(!ko(T))continue;u.add(I),l.push({kind:"toolExecutor",capabilityName:I,executor:T});continue}if(b==="hook"){let T=typeof g.name==="string"?g.name.trim():"";if(!T)continue;u.add(I),l.push({kind:"hook",capabilityName:I,name:T});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 rE(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 sE(i){return Object.hasOwn(i,"update")?i.update:i}function Yl(i){return i.trim().replace(/^\/+/,"").toLowerCase()}function bJ(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 wh(i,l){let u=bJ(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 tI(i,l){let u=async(c,g)=>{let b=Yl(c),I=wh(i,l).filter((_)=>_.id===b||Yl(_.name)===b||_.id.endsWith(`:${b}`)).filter((_)=>!_.disabled);if(I.length!==1)return I.length>1?`Skill "${c}" is ambiguous. Use one of: ${I.map((_)=>_.id).join(", ")}`:`Skill "${c}" not found.`;let T=I[0].skill;return Y0(T,g)};return Object.defineProperty(u,"configuredSkills",{get:()=>wh(i,l).map(({skill:c,...g})=>g),enumerable:!0}),u}function kJ(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,T)=>{if(!I.startsWith("/")||I.length<2)return I;let _=I.match(/^\/(\S+)/)?.[1];if(!_)return I;let E=zo(_),A=g.runtimeCommands.find((C)=>zo(C.name)===E);if(!A)return I;if(A.kind==="skill"&&T?.expandSkillCommands===!1)return I;return`${A.instructions}${I.slice(_.length+1)}`},hasConfiguredSkills:(I)=>wh(g,I).some((T)=>!T.disabled),createSkillsExecutor:(I)=>tI(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((T)=>Boolean(T))},setup(T){if(I.includeRules)T.registerRule({id:"cline-hub-user-instructions:rules",source:"hub-user-instructions",content:()=>V0(g.records.rule)});if(I.registerSkillsTool)T.registerTool(ic(tI(g,I.allowedSkillNames)));for(let _ of g.runtimeCommands.filter((E)=>E.kind==="skill"&&I.includeSkills||E.kind==="workflow"&&I.includeWorkflows))T.registerCommand({name:_.name,description:_.description,handler:(E)=>{let A=E.trim();return A?`${_.instructions}
|
|
1105
|
+
|
|
1106
|
+
${A}`:_.instructions}})}})}}function SJ(i,l,u,c){let g=u.map((b)=>[b.executor,async(...I)=>{let T=I.at(-1),_=I.slice(0,-1);return(await c(i,b.capabilityName,{executor:b.executor,args:_,context:rE(T)},l,T.emitUpdate?(E)=>{T.emitUpdate?.(sE(E))}:void 0))?.result}]);return g.length>0?Object.fromEntries(g):void 0}function TJ(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:rE(I)},l,I.emitUpdate?(T)=>{I.emitUpdate?.(sE(T))}:void 0))?.result}}))}var _J=new Set(["assistant-text-delta","assistant-reasoning-delta","tool-call-delta","tool-updated"]);function EJ(i,l,u,c){let g=new Map(u.map((I)=>[I.name,I])),b={};for(let I of vJ){let T=g.get(I);if(!T)continue;b[I]=async(_)=>{if(I==="onEvent"&&_J.has(_.type))return;return(await c(i,T.capabilityName,{context:_},l))?.control}}return Object.keys(b).length>0?b:void 0}function iE(i){let l=i.contributions.filter((_)=>_.kind==="toolExecutor"),u=i.contributions.filter((_)=>_.kind==="tool"),c=i.contributions.filter((_)=>_.kind==="hook"),g=i.contributions.find((_)=>_.kind==="compaction"),b=i.contributions.find((_)=>_.kind==="checkpoint"),I=i.contributions.find((_)=>_.kind==="mistakeLimit"),T=i.contributions.find((_)=>_.kind==="userInstructionService");return{hasClientContributions:i.contributions.length>0,toolExecutors:SJ(i.sessionId,i.targetClientId,l,i.requestCapability),localRuntime:{...c.length>0?{hooks:EJ(i.sessionId,i.targetClientId,c,i.requestCapability)}:{},...u.length>0?{extraTools:TJ(i.sessionId,i.targetClientId,u,i.requestCapability)}:{},...g?{compaction:{...i.sessionConfig?.compaction??{},...g.config,compact:async(_)=>(await i.requestCapability(i.sessionId,g.capabilityName,{context:_},i.targetClientId))?.result}}:{},...b?{checkpoint:{...i.sessionConfig?.checkpoint??{},...b.config,createCheckpoint:async(_)=>(await i.requestCapability(i.sessionId,b.capabilityName,{context:_},i.targetClientId))?.result}}:{},...I?{onConsecutiveMistakeLimitReached:async(_)=>(await i.requestCapability(i.sessionId,I.capabilityName,{context:_},i.targetClientId))?.result}:{},...T?{userInstructionService:kJ(i.sessionId,i.targetClientId,T,i.requestCapability)}:{}}}}var rI="hubCapabilityOwnerClientId";function rn(i,l){let u=i?.[l];return typeof u==="string"&&u.trim()?u.trim():void 0}function nE(i){let l=Wr(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 oE(i){let l=Wr(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 aE(i,l){let u=await i.sessionHost.deleteSession(l);i.sessionState.delete(l);try{i.sessionSearch.removeSession(l)}catch(c){Ce("warn","session search eviction failed",{error:c,sessionId:l})}return u}function lE(i,l,u){let c=Q1(u);return i.filter((g)=>(l!=="yolo"||g.name!==Jf)&&eL(g.name,c))}function Pd(i){return typeof i==="string"&&i.trim().length>0?i.trim():void 0}function AJ(i){if(i===null)return null;let l=Mn.safeParse(i);return l.success?l.data:void 0}function xJ(i){let l=Wr(i)??{},u={},c=Pd(l.providerId);if(c)u.providerId=c;let g=Pd(l.modelId);if(g)u.modelId=g;let b=Pd(l.apiKey);if(b!==void 0)u.apiKey=b;let I=Pd(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 T=AJ(l.reasoningEffort);if(T!==void 0)u.reasoningEffort=T}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 df(u)}function CJ(i,l){return i.sessionState.get(l)?.createdByClientId}function sI(i){return typeof i==="string"||i===null?i:void 0}function RJ(i){if(!i||!("autoApproveTools"in i)&&!(rI in i))return i;let l={...i};return delete l[rI],delete l.autoApproveTools,l}function dE(i,l){let u=Wr(i),c=Wr(u?.["*"]);if(typeof c?.autoApprove==="boolean")return c.autoApprove;return l.autoApproveTools===!0}function uE(i){let l=CJ(i.ctx,i.sessionId);if(!l)return fe(i.envelope,"session_wrong_client",`Session ${i.sessionId} has no owner`);if(l!==i.clientId)return fe(i.envelope,"session_wrong_client",`Session ${i.sessionId} is owned by ${l}`);return}function cE(i){let l=Wr(i);if(!l)return;let u={};for(let[c,g]of Object.entries(l)){let b=Wr(g)?.enabled;u[c]=typeof b==="boolean"?{enabled:b}:{}}return Object.keys(u).length>0?u:void 0}async function PJ(i,l,u){let c=Wr(l.payload?.sessionConfig),g=typeof c?.sessionId==="string"?c.sessionId.trim():"";if(!g)return fe(l,"invalid_resume","sessionConfig.sessionId is required");if(!await i.sessionHost.getSession(g))return fe(l,"session_not_found","The saved session was not found.");let b=await(i.sessionHost.readLiveSessionMessages?i.sessionHost.readLiveSessionMessages(g):i.sessionHost.readSessionMessages(g));if(b.length===0)return fe(l,"session_messages_not_found","The saved conversation is empty or unavailable.");return bh(i,{...l,payload:{...l.payload,initialMessages:b}},u)}async function bh(i,l,u){let c=performance.now(),g={command:l.command,requestId:l.requestId,clientId:l.clientId,sessionId:l.sessionId};Ce("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)):{},T=b.sessionConfig&&typeof b.sessionConfig==="object"?JSON.parse(JSON.stringify(b.sessionConfig)):void 0,_=b.runtimeOptions&&typeof b.runtimeOptions==="object"?b.runtimeOptions:{},E=nE(_.clientContext),A=oE(_.userContext),C=rc(b.initialCompactionState);if(typeof T?.mode==="string")I.mode=T.mode;else if(typeof _.mode==="string")I.mode=_.mode;if(typeof T?.systemPrompt==="string")I.systemPrompt=T.systemPrompt;else if(typeof _.systemPrompt==="string")I.systemPrompt=_.systemPrompt;if(T?.checkpoint?.enabled===!0)I.checkpointEnabled=!0;else if(_.checkpointEnabled===!0)I.checkpointEnabled=!0;I.autoApproveTools=dE(b.toolPolicies,_);let N=b.modelSelection&&typeof b.modelSelection==="object"?b.modelSelection:{},M=typeof b.workspaceRoot==="string"&&b.workspaceRoot.trim()?b.workspaceRoot.trim():typeof b.cwd==="string"&&b.cwd.trim()?b.cwd.trim():void 0,O=l.clientId?.trim()||"hub-client",L=tE(_.clientContributions);Ce("info","session.create.contributions_parsed",{...g,clientId:O,workspaceRoot:M,cwd:typeof b.cwd==="string"?b.cwd:void 0,contributionCount:L.length});let D=(typeof T?.sessionId==="string"?T.sessionId.trim():"")||P(),F=Hn(_.configExtensions);Ce("info","session.create.runtime_build.begin",{...g,sessionId:D,configExtensionCount:F?.length??0}),i.detachedClientsBySession?.get(D)?.delete(O);let j=iE({sessionId:D,targetClientId:O,contributions:L,sessionConfig:T,requestCapability:i.requestCapability});Ce("info","session.create.start_session.begin",{...g,sessionId:D,provider:T?.providerId??(typeof N.provider==="string"?N.provider:typeof I.provider==="string"?I.provider:"hub"),model:T?.modelId??(typeof N.model==="string"?N.model:typeof I.model==="string"?I.model:"hub")});let B=T?.mode??(_.mode==="plan"||_.mode==="yolo"?_.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:lE([...i.sessionTools??[],...j.localRuntime.extraTools??[]],B,typeof I.source==="string"?I.source:void 0)},capabilities:{toolExecutors:j.toolExecutors,requestToolApproval:u},config:{...T??{},sessionId:D,providerId:T?.providerId??(typeof N.provider==="string"?N.provider:typeof I.provider==="string"?I.provider:"hub"),modelId:T?.modelId??(typeof N.model==="string"?N.model:typeof I.model==="string"?I.model:"hub"),apiKey:T?.apiKey??(typeof N.apiKey==="string"?N.apiKey:void 0),cwd:T?.cwd??(typeof b.cwd==="string"&&b.cwd.trim()?b.cwd.trim():M),workspaceRoot:T?.workspaceRoot??M,systemPrompt:T?.systemPrompt??(typeof _.systemPrompt==="string"?_.systemPrompt:""),mode:B,maxIterations:T?.maxIterations??(typeof _.maxIterations==="number"?_.maxIterations:void 0),enableTools:T?.enableTools??_.enableTools!==!1,enableSpawnAgent:T?.enableSpawnAgent??_.enableSpawn!==!1,enableAgentTeams:T?.enableAgentTeams??_.enableTeams!==!1,checkpoint:T?.checkpoint??(_.checkpointEnabled===!0?{enabled:!0}:void 0),teamName:T?.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)):_.autoApproveTools===!0?{"*":{autoApprove:!0}}:void 0,plugins:cE(b.plugins)}),H=Q.pluginIssues??[];if(H.length>0)Ce("warn","session.create.plugin_issues",{...g,sessionId:Q.sessionId,plugins:H.map((oe)=>({name:oe.name,state:oe.state,reason:oe.reason,phase:oe.lastError?.phase,message:oe.lastError?.message}))});Ce("info","session.create.start_session.end",{...g,sessionId:Q.sessionId,elapsedMs:Math.round(performance.now()-c),hasImmediateResult:!!Q.result}),J_(i,Q.sessionId,O,"creator",{interactive:I.interactive!==!1}),Ce("info","session.create.read_records.begin",{...g,sessionId:Q.sessionId});let[z,te]=await Promise.all([Mr(i,Q.sessionId),Ss(i,Q.sessionId)]);Ce("info","session.create.read_records.end",{...g,sessionId:Q.sessionId,hasSession:!!z,hasSnapshot:!!te,elapsedMs:Math.round(performance.now()-c)});let ee=H.length>0?{pluginIssues:JSON.parse(JSON.stringify(H))}:{};if(z)i.publish(i.buildEvent("session.created",{session:z,...te?{snapshot:te}:{},...ee},Q.sessionId));return Ce("info","session.create.reply",{...g,sessionId:Q.sessionId,elapsedMs:Math.round(performance.now()-c)}),ce(l,{session:z,...te?{snapshot:te}:{},...ee})}async function MJ(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 fe(l,"invalid_restore","session.restore requires a session id");let I=c.restore&&typeof c.restore==="object"?c.restore:{},T=I.messages!==!1;if(typeof b!=="number")return fe(l,"invalid_restore","checkpointRunCount must be a positive integer");try{let _=c.sessionConfig&&typeof c.sessionConfig==="object"?JSON.parse(JSON.stringify(c.sessionConfig)):void 0;if(T&&!_)return fe(l,"invalid_restore","sessionConfig is required when restore.messages is true");let E=c.runtimeOptions&&typeof c.runtimeOptions==="object"?c.runtimeOptions:{},A=nE(E.clientContext),C=oE(E.userContext),N=rc(c.initialCompactionState),M=c.metadata&&typeof c.metadata==="object"?JSON.parse(JSON.stringify(c.metadata)):{};if(typeof _?.mode==="string")M.mode=_.mode;else if(typeof E.mode==="string")M.mode=E.mode;if(typeof _?.systemPrompt==="string")M.systemPrompt=_.systemPrompt;else if(typeof E.systemPrompt==="string")M.systemPrompt=E.systemPrompt;if(_?.checkpoint?.enabled===!0)M.checkpointEnabled=!0;else if(E.checkpointEnabled===!0)M.checkpointEnabled=!0;M.autoApproveTools=dE(c.toolPolicies,E);let O=c.modelSelection&&typeof c.modelSelection==="object"?c.modelSelection:{},L=l.clientId?.trim()||"hub-client",D=tE(E.clientContributions),F=(typeof _?.sessionId==="string"?_.sessionId.trim():"")||P(),j=Hn(E.configExtensions);i.detachedClientsBySession?.get(F)?.delete(L);let B=iE({sessionId:F,targetClientId:L,contributions:D,sessionConfig:_,requestCapability:i.requestCapability}),Q=await new wf().restoreCheckpoint({sessionId:g,checkpointRunCount:b,telemetry:i.telemetry,restore:{messages:I.messages,workspace:I.workspace,omitCheckpointMessageFromSession:I.omitCheckpointMessageFromSession===!0},start:_,cwd:typeof _?.cwd==="string"&&_.cwd.trim()||typeof _?.workspaceRoot==="string"&&_.workspaceRoot.trim()||void 0,getSession:(ee)=>i.sessionHost.getSession(ee),readMessages:(ee)=>i.sessionHost.readSessionMessages(ee),buildStartInput:(ee)=>{if(ee.restoredCheckpointMetadata)M.checkpoint=ee.restoredCheckpointMetadata;let oe=typeof c.workspaceRoot==="string"&&c.workspaceRoot.trim()?c.workspaceRoot.trim():typeof c.cwd==="string"&&c.cwd.trim()?c.cwd.trim():ee.sourceSession.workspaceRoot||ee.sourceSession.cwd,G=_?.mode??(E.mode==="plan"||E.mode==="yolo"?E.mode:"act");return{source:typeof M.source==="string"?M.source:void 0,interactive:M.interactive!==!1,sessionMetadata:{...M,restoredFromSessionId:g,restoredCheckpointRunCount:b},initialMessages:ee.initialMessages,initialCompactionState:N,localRuntime:{modelCatalogDefaults:{loadLatestOnInit:!0,loadPrivateOnAuth:!0},configExtensions:j,...B.localRuntime,...A||C?{extensionContext:{...B.localRuntime.extensionContext,...A?{client:A}:{},...C?{user:C}:{}}}:{},extensions:[...i.sessionExtensions??[],...B.localRuntime.extensions??[]],extraTools:lE([...i.sessionTools??[],...B.localRuntime.extraTools??[]],G,typeof M.source==="string"?M.source:void 0)},capabilities:{toolExecutors:B.toolExecutors,requestToolApproval:u},config:{..._??{},sessionId:F,providerId:_?.providerId??(typeof O.provider==="string"?O.provider:ee.sourceSession.provider),modelId:_?.modelId??(typeof O.model==="string"?O.model:ee.sourceSession.model),apiKey:_?.apiKey??(typeof O.apiKey==="string"?O.apiKey:""),cwd:_?.cwd??ee.plan.cwd,workspaceRoot:_?.workspaceRoot??oe,systemPrompt:_?.systemPrompt??(typeof E.systemPrompt==="string"?E.systemPrompt:""),mode:G,maxIterations:_?.maxIterations??(typeof E.maxIterations==="number"?E.maxIterations:void 0),enableTools:_?.enableTools??E.enableTools!==!1,enableSpawnAgent:_?.enableSpawnAgent??E.enableSpawn!==!1,enableAgentTeams:_?.enableAgentTeams??E.enableTeams!==!1,checkpoint:_?.checkpoint??(E.checkpointEnabled===!0?{enabled:!0}:void 0),teamName:_?.teamName??(typeof M.teamName==="string"?M.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:cE(c.plugins)}},startSession:(ee)=>i.sessionHost.startSession(ee),getStartedSessionId:(ee)=>ee.sessionId,cleanupStartedSession:async(ee)=>{if(!await aE(i,ee.sessionId))throw Error(`Failed to clean up restored session ${ee.sessionId}`)},readRestoredSession:(ee)=>i.sessionHost.getSession(ee)});if(!T)return ce(l,{checkpoint:Q.checkpoint});let H=Q.startResult;if(!H)return fe(l,"restore_failed","Checkpoint restore did not start a session");J_(i,H.sessionId,L,"creator",{interactive:M.interactive!==!1});let[z,te]=await Promise.all([Mr(i,H.sessionId),Ss(i,H.sessionId)]);if(z)i.publish(i.buildEvent("session.created",{session:z,...te?{snapshot:te}:{}},H.sessionId));return ce(l,{session:z,...te?{snapshot:te}:{},messages:Q.messages??[],checkpoint:Q.checkpoint})}catch(_){if(_ instanceof Ds)return fe(l,_.code,_.code==="session_not_found"?`Unknown session: ${g}`:_.message);return fe(l,"restore_failed",_ instanceof Error?_.message:String(_))}}async function NJ(i,l){let u=it(l);if(!u)return fe(l,"invalid_session_attach","session.attach requires a session id");let c=await Mr(i,u);if(!c)return fe(l,"session_not_found",`Unknown session: ${u}`);IX(i,u,l.clientId?.trim()||"hub-client","participant");let g=await Mr(i,u);return i.publish(i.buildEvent("session.attached",{session:g??c},u)),ce(l,{session:g??c})}async function OJ(i,l){let u=it(l);if(!u)return fe(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,(_)=>_.sessionId===u&&_.targetClientId===c,zu);let[I,T]=await Promise.all([Mr(i,u),Ss(i,u)]);return i.publish(i.buildEvent("session.detached",I?{session:I,...T?{snapshot:T}:{},clientId:c}:{clientId:c},u)),ce(l)}async function $J(i,l){let u=it(l),c=l.payload?.includeSnapshot===!0,[g,b]=await Promise.all([Mr(i,u),c?Ss(i,u):Promise.resolve(void 0)]);return g?ce(l,{session:g,...b?{snapshot:b}:{}}):fe(l,"session_not_found",`Unknown session: ${u}`)}async function LJ(i,l){let u=it(l);if(!u)return fe(l,"invalid_session_id","session.messages requires a session id");if(!await Mr(i,u))return fe(l,"session_not_found",`Unknown session: ${u}`);let c=await i.sessionHost.readSessionMessages(u);return ce(l,{sessionId:u,messages:c})}async function DJ(i,l){let u=it(l);if(!u)return fe(l,"invalid_session_id","session.compaction.get requires a session id");if(!await Mr(i,u))return fe(l,"session_not_found",`Unknown session: ${u}`);let c=l.clientId?.trim()||"hub-client",g=uE({sessionId:u,ctx:i,clientId:c,envelope:l});if(g)return g;let b=await i.sessionHost.readSessionCompactionState(u);return ce(l,{sessionId:u,state:b})}async function UJ(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)=>X_(g,i.sessionState.get(g.sessionId)));return ce(l,{sessions:c})}async function FJ(i,l){let u=l.payload??{};if(typeof u.query!=="string"||!u.query.trim())return fe(l,"invalid_search_query","session.search requires a non-empty query");return ce(l,{hits:i.sessionSearch.search({query:u.query,limit:u.limit,workspaceRoot:u.workspaceRoot})})}async function qJ(i,l){let u=it(l),c=RJ(Wr(l.payload?.metadata)),g=sI(l.payload?.prompt),b=sI(l.payload?.title),I=await i.sessionHost.updateSession(u,{metadata:c,...g!==void 0?{prompt:g}:{},...b!==void 0?{title:b}:{}}),[T,_]=await Promise.all([Mr(i,u),Ss(i,u)]);if(T)i.publish(i.buildEvent("session.updated",{session:T,..._?{snapshot:_}:{}},u));return{version:l.version,requestId:l.requestId,ok:I.updated,payload:{updated:I.updated,session:T,..._?{snapshot:_}:{}}}}async function jJ(i,l){let u=it(l);if(!u)return fe(l,"invalid_session_update_connection","session.update_connection requires a session id");let c=i.sessionHost.updateSessionConnection;if(!c)return fe(l,"unsupported_session_update_connection","runtime host does not support session connection updates");let g=Wr(l.payload),b=xJ(g?.updates);return await c.call(i.sessionHost,u,b),ce(l,{sessionId:u,updated:!0})}async function BJ(i,l){let u=it(l);if(!u)return fe(l,"invalid_session_id","session.compaction.update requires a session id");let c=l.clientId?.trim()||"hub-client",g=await Mr(i,u);if(!g)return fe(l,"session_not_found",`Unknown session: ${u}`);let b=uE({sessionId:u,ctx:i,clientId:c,envelope:l});if(b)return b;let I=l.payload&&typeof l.payload==="object"?l.payload:{},T=rc(I.state);if(!T)return fe(l,"invalid_compaction_state","session.compaction.update requires a valid compaction state");let _=await i.sessionHost.updateSessionCompactionState(u,T),[E,A]=_.updated?await Promise.all([Mr(i,u),Ss(i,u)]):[g,void 0];if(_.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:_.updated,session:E??g,...A?{snapshot:A}:{}}}}async function HJ(i,l){let u=it(l),c=await aE(i,u);return ce(l,{deleted:c})}async function zJ(i,l){let u=it(l),c=i.sessionHost.pendingPrompts;if(!c)return fe(l,"pending_prompts_unavailable","Pending prompt service is not available.");let g=await c.list({sessionId:u});return ce(l,{sessionId:u,prompts:g})}async function WJ(i,l){let u=it(l),c=i.sessionHost.pendingPrompts;if(!c)return fe(l,"pending_prompts_unavailable","Pending prompt service is not available.");let g=await c.steerFirst({sessionId:u});return ce(l,g)}async function KJ(i,l){let u=it(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 fe(l,"pending_prompts_unavailable","Pending prompt service is not available.");let T=await I.update({sessionId:u,promptId:c,prompt:g,delivery:b});return ce(l,T)}async function GJ(i,l){let u=it(l),c=typeof l.payload?.promptId==="string"?l.payload.promptId.trim():"",g=i.sessionHost.pendingPrompts;if(!g)return fe(l,"pending_prompts_unavailable","Pending prompt service is not available.");let b=await g.delete({sessionId:u,promptId:c});return ce(l,b)}var JJ=604800000,VJ=200000,YJ=67108864,QJ=16777216;function ZJ(i){let l=i?.replace(/[^a-zA-Z0-9_-]/g,"-");return XJ(be(),l?`hub-events-${l}.db`:"hub-events.db")}class pE{db;retentionMs;maxRows;maxTotalBytes;appendedBytesSincePrune=0;closed=!1;constructor(i={}){this.db=V(i.dbPath??ZJ(i.ownerId)),this.retentionMs=i.retentionMs??JJ,this.maxRows=i.maxRows??VJ,this.maxTotalBytes=i.maxTotalBytes??YJ,this.db.exec("PRAGMA journal_mode = WAL;"),this.db.exec("PRAGMA synchronous = NORMAL;"),this.db.exec("PRAGMA busy_timeout = 5000;"),this.db.exec(`
|
|
1107
|
+
CREATE TABLE IF NOT EXISTS hub_events (
|
|
1108
|
+
sequence INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1109
|
+
event TEXT NOT NULL,
|
|
1110
|
+
session_id TEXT,
|
|
1111
|
+
envelope_json TEXT NOT NULL,
|
|
1112
|
+
created_at INTEGER NOT NULL
|
|
1113
|
+
);
|
|
1114
|
+
CREATE INDEX IF NOT EXISTS idx_hub_events_session
|
|
1115
|
+
ON hub_events(session_id, sequence);
|
|
1116
|
+
CREATE INDEX IF NOT EXISTS idx_hub_events_created
|
|
1117
|
+
ON hub_events(created_at);
|
|
1118
|
+
`)}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)
|
|
1119
|
+
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>=QJ)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
|
|
1120
|
+
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 <= (
|
|
1121
|
+
SELECT sequence FROM hub_events ORDER BY sequence DESC
|
|
1122
|
+
LIMIT 1 OFFSET ?
|
|
1123
|
+
);`).run(this.maxRows),this.fileSizeBytes()>this.maxTotalBytes){this.db.prepare(`DELETE FROM hub_events WHERE sequence <= (
|
|
1124
|
+
SELECT sequence FROM (
|
|
1125
|
+
SELECT sequence, SUM(LENGTH(CAST(envelope_json AS BLOB))) OVER (
|
|
1126
|
+
ORDER BY sequence DESC
|
|
1127
|
+
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
|
|
1128
|
+
) AS newer_bytes FROM hub_events
|
|
1129
|
+
)
|
|
1130
|
+
WHERE newer_bytes > ? ORDER BY sequence DESC LIMIT 1
|
|
1131
|
+
);`).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 eV(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 tV=new Set(["task.create","task.list","task.get","task.update","task.approve","task.cancel","task.run","task.automation.get","task.automation.set"]);function rV(i){return tV.has(i)}function sV(i){return i.payload&&typeof i.payload==="object"?i.payload:{}}function Md(i){return typeof i.taskId==="string"?i.taskId.trim():""}function tm(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 mE{tasks;constructor(i){this.tasks=i}async handleCommand(i,l){let u=sV(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 ce(i,{task:b})}case"task.list":{let b=u,[I,T]=await Promise.all([this.tasks.listTasks({...b,scope:"workspace",workspaceRoot:g}),this.tasks.listTasks({...b,scope:"global",workspaceRoot:void 0})]);return ce(i,{tasks:[...I,...T]})}case"task.get":{let b=await this.requireScopedTask(u,g);return ce(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 ce(i,{task:I})}case"task.approve":return await this.requireScopedTask(u,g),ce(i,{task:await this.tasks.approveTask(Md(u),c,tm(u))});case"task.cancel":return await this.requireScopedTask(u,g),ce(i,{task:await this.tasks.cancelTask(Md(u),c,tm(u),typeof u.reason==="string"?u.reason:void 0)});case"task.run":{await this.requireScopedTask(u,g);let b=await this.tasks.runTask(Md(u),c,tm(u),i.clientId);return ce(i,b)}case"task.automation.get":return ce(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 ce(i,{policy:await this.tasks.setAutomationPolicy({...b,scopeKey:g},c)})}default:return fe(i,"unsupported_command",`Unsupported agenda task command: ${i.command}`)}}catch(g){return fe(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 iI(l)}async requireScopedTask(i,l){let u=await this.tasks.getTask(Md(i));if(!u||u.scope==="workspace"&&(!u.workspaceRoot||iI(u.workspaceRoot)!==l))throw Error("task does not exist in this workspace");return u}}var Nd=!1,iV=new Set(["skills","workflows","rules","plugins","tools","mcp"]);function Ih(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 hE(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 nV(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 fE(i){if(i===void 0)return{};if(!Ih(i))throw Error("settings.list payload must be an object.");return{cwd:Ul(i,"cwd"),workspaceRoot:Ul(i,"workspaceRoot"),agentPluginPaths:nV(i,"agentPluginPaths"),includePluginTools:hE(i,"includePluginTools"),availabilityContext:Ih(i.availabilityContext)?i.availabilityContext:void 0}}function oV(i){if(!Ih(i))throw Error("settings.toggle payload must be an object.");let{type:l}=i;if(typeof l!=="string"||!iV.has(l))throw Error("settings.toggle payload 'type' must be one of: skills, workflows, rules, plugins, tools, mcp.");return{...fE(i),type:l,id:Ul(i,"id"),path:Ul(i,"path"),name:Ul(i,"name"),enabled:hE(i,"enabled")}}var aV={debug:(i,l)=>Ce("debug",i,l),log:(i,l)=>Ce(l?.severity==="warn"||l?.severity==="error"?"warn":"info",i,l),error:(i,l)=>Ce("error",i,l)};class gE{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 G_({...i.cloudSessionOptions,logger:i.logger,telemetry:i.telemetry,publish:(u,c)=>this.publish(Yt("cloud.event",{event:u,...c},u?.sessionId))}),this.plugins.setLogger(aV),this.unsubscribePluginStatus=this.plugins.subscribe((u)=>{this.publish(Yt("plugin.status_changed",{plugin:JSON.parse(JSON.stringify(u))}))}),this.sessionHost=i.sessionHost??new Pf({sessionService:new Nf(new Mf),fetch:i.fetch,logger:i.logger,telemetry:i.telemetry}),this.sessionSearch=new QT(this.sessionHost,i.sessionSearchOptions??{});let l=this.sessionSearch.getInitializationError();if(l!==void 0)Mi("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:Yt,requestCapability:(u,c,g,b,I)=>xX(this.ctx,u,c,g,b,I)},this.tasks=new m_({...i.taskOptions,automationEnabled:Nd,watchFiles:Nd&&i.taskOptions?.watchFiles!==!1,runtime:{isInteractiveClientAvailable:()=>[...this.clients.values()].some((u)=>u.capabilities.some((c)=>c.name===os)),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(Yt(u,c,g))}}),this.taskCommands=new mE(this.tasks),this.schedules=new YT({...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(Yt(g,c&&typeof c==="object"?c:void 0))}}),this.scheduleCommands=new VT(this.schedules),this.sessionTools.push(BG({todo:Nd?{manager:this.tasks,telemetry:i.telemetry,resolveSessionDefaults:async(u)=>{let c=await this.sessionHost.getSession(u);if(!c)return;let g=!mn(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(Yt(u,c,g))},resolveSessionDefaults:async(u)=>{let c=await this.sessionHost.getSession(u);if(!c)return;return{workspaceRoot:await VO(),modelSelection:{providerId:c.provider,modelId:c.model},interactive:c.interactive}}}})),this.sessionExtensions.push(HG({todoEnabled:Nd})),this.settings=i.settingsService??new a_,i.cronOptions)this.cronService=new XT({runtimeHandlers:i.runtimeHandlers,...i.cronOptions,telemetry:i.telemetry});this.sessionHost.subscribe((u)=>{if(hJ(this.ctx,u).catch((c)=>{Mi("session event handling failed",c),U(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)=>{Mi("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",T=i.modelSelection?.modelId?.trim()||(I==="cline"?pr:""),_=cn({title:i.title,agendaTaskId:i.taskId,agendaTaskRunId:l.runId,agendaTaskAssignee:i.assignee,interactive:!c,source:Fr.CORE},{mode:"task",trigger:"agenda_task"}),E=u?.trim()||"agenda-task-manager",A=await bh(this.ctx,{version:"v1",command:"session.create",requestId:P("task_session_"),clientId:E,payload:{workspaceRoot:i.workspaceRoot,cwd:i.cwd,sessionConfig:{providerId:I,modelId:T,systemPrompt:i.systemPrompt??"",mode:i.mode??"act",maxIterations:i.maxIterations,enableTools:!0,enableSpawnAgent:!0,enableAgentTeams:!0},metadata:_,runtimeOptions:{mode:i.mode??"act",maxIterations:i.maxIterations,enableTools:!0,enableSpawn:!0,enableTeams:!0},toolPolicies:{"*":{autoApprove:b,enabled:!0}}}},(O)=>Rd(this.ctx,O));if(!A.ok)throw Error(A.error?.message??"failed to create task session");let C=A.payload?.session,N=A.payload?.snapshot,M=typeof N?.sessionId==="string"?N.sessionId:typeof C?.sessionId==="string"?C.sessionId:"";if(!M)throw Error("task session did not return a session id");return{sessionId:M}}async runAgendaTaskSession(i,l,u){let c=l.resourcePaths.length?`
|
|
1132
|
+
|
|
1133
|
+
Relevant resources (paths are relative to workspace root ${l.workspaceRoot}):
|
|
1134
|
+
${l.resourcePaths.map((A)=>`- ${A} (absolute: ${kp(l.workspaceRoot??l.cwd??"",A)})`).join(`
|
|
1135
|
+
`)}`:"",g=l.assignee?`
|
|
1136
|
+
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.
|
|
1137
|
+
|
|
1138
|
+
Title: ${l.title}
|
|
1139
|
+
Type: ${l.type}
|
|
1140
|
+
Priority: P${l.priority}${g}
|
|
1141
|
+
|
|
1142
|
+
${l.instructions}${c}`,I=await vh(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 T=I.payload?.result,_=typeof T?.finishReason==="string"?T.finishReason:void 0,E=typeof T?.text==="string"&&T.text.trim()?T.text.trim():void 0;if(_==="completed")return{status:"completed",summary:E};if(_==="aborted")return{status:"cancelled",summary:E};return{status:"failed",summary:E,error:E??(_?`Task session ended with ${_}`:"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 pE({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){Ce("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 eE(this.ctx,this.runQueue);let i=this.runQueue.recoverOnStartup();for(let u of i.interrupted)this.publish(Yt("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)Ce("info","run.queue.recovered",{interrupted:i.interrupted.length,requeued:i.requeued.length})}catch(i){Ce("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())V_(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 fe(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 U(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&&cJ(i.command))return eI(i);if(rV(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 fe(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 eI(i);try{if(i.command==="cloud.watch")return ce(i,this.cloud.watch());let c=i.payload?.args;if(i.payload?.operation==="create"&&Array.isArray(c)&&c[0]?.localGit!==void 0&&!l?.crossWorkspace)throw Error("Local Git publication requires a token-authenticated Hub workspace");let g=await this.cloud.command(String(i.payload?.operation??""),i.payload?.args,i.payload?.scope);return ce(i,g)}catch(c){return fe(i,"cloud_command_failed",c instanceof Error?c.message:String(c))}}switch(i.command){case"client.register":{let u=MX(this.ctx,i);return this.tasks.notifyAutomationReadinessChanged(),u}case"client.update":{let u=NX(this.ctx,i);return this.tasks.notifyAutomationReadinessChanged(),u}case"client.unregister":{let u=OX(this.ctx,i,(c)=>{this.listeners.delete(c),this.detachClientFromSessions(c)});return this.tasks.notifyAutomationReadinessChanged(),u}case"client.list":return $X(this.ctx,i);case"session.create":return await bh(this.ctx,i,(u)=>Rd(this.ctx,u));case"session.resume":return await PJ(this.ctx,i,(u)=>Rd(this.ctx,u));case"session.restore":return await MJ(this.ctx,i,(u)=>Rd(this.ctx,u));case"session.attach":return await NJ(this.ctx,i);case"session.detach":return await OJ(this.ctx,i);case"session.get":return await $J(this.ctx,i);case"session.messages":return await LJ(this.ctx,i);case"session.compaction.get":return await DJ(this.ctx,i);case"session.list":{let u=await UJ(this.ctx,i);return{...u,payload:{...u.payload,activePluginRequests:this.pendingPluginCommands.size,activeCloudCommands:this.cloud.activeCommands}}}case"session.search":return await FJ(this.ctx,i);case"session.update":return await qJ(this.ctx,i);case"session.update_connection":return await jJ(this.ctx,i);case"session.mcp_apps.resolve_tool":return await KX(this.ctx,i);case"session.mcp_apps.read_resource":return await GX(this.ctx,i);case"session.mcp_apps.call_tool":return await XX(this.ctx,i);case"session.compaction.update":return await BJ(this.ctx,i);case"session.pending_prompts":return await zJ(this.ctx,i);case"session.steer_first_pending_prompt":return await WJ(this.ctx,i);case"session.update_pending_prompt":return await KJ(this.ctx,i);case"session.remove_pending_prompt":return await GJ(this.ctx,i);case"session.delete":return await HJ(this.ctx,i);case"session.hook":return await iJ(this.ctx,i);case"run.start":case"session.send_input":return await vh(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 pJ(this.ctx,i,this.runQueue,this.runExecutor)}case"run.list":{if(!this.runQueue)return ce(i,{runs:[]});return mJ(i,this.runQueue)}case"hub.drain":return this.handleHubDrain(i);case"hub.status":return this.handleHubStatus(i);case"plugins.list":case"plugins.status":return ce(i,{plugins:this.plugins.list()});case"plugins.reload":return await this.handlePluginsReload(i);case"run.abort":return await rJ(this.ctx,i);case"run.proceed_while_running":return await sJ(this.ctx,i);case"capability.request":return await RX(this.ctx,i);case"approval.respond":return await SX(this.ctx,i);case"capability.respond":return PX(this.ctx,i);case"capability.progress":return CX(this.ctx,i);case"ui.notify":return this.publish(Yt("ui.notify",i.payload??{})),ce(i);case"ui.show_window":return this.publish(Yt("ui.show_window",i.payload??{})),ce(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&&kp(c)!==kp(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 WX(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=eV(i.command);if(c)this.publish(Yt(c,u.payload))}return u}}}captureFailedReply(i,l){if(l.ok||!l.error||!lV(l.error.code))return;U(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(fE(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(oV(i.payload));return this.publish(Yt("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(Yt("hub.drain_changed",{draining:this.draining,...u?{reason:u}:{}})),Ce("info","hub.drain_changed",{draining:this.draining,reason:u});return ce(i,this.describeStatus())}async handlePluginsReload(i){let l=typeof i.payload?.plugin==="string"?i.payload.plugin.trim():"";if(!l)return fe(i,"invalid_plugin","plugins.reload requires a plugin name or path");let u=await this.plugins.reload(l);if(u.length===0)return fe(i,"plugin_not_found",`No loaded plugin matches "${l}"`);return ce(i,{plugins:u})}handleHubStatus(i){return ce(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(Yt("cloud.event",{...b,snapshots:g.sessionId?b.snapshots.filter((T)=>T.sessionId===g.sessionId):b.snapshots,...g.sessionId?{sessionId:g.sessionId}:{}},g.sessionId))}catch(T){Mi("listener threw while recovering cloud state",T)}});let I=kX(this.ctx,u?.sessionId);return queueMicrotask(()=>{if(!this.listeners.get(i)?.has(g))return;let T=[...I,...AX(this.ctx,i,u?.sessionId)];for(let _ of T)try{g.listener(_)}catch(E){Mi("listener threw while re-issuing pending request",E)}}),()=>{let T=this.listeners.get(i);if(!T)return;if(T.delete(g),T.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,zu)}publish(i){if(this.eventLog&&i.event!=="cloud.event")try{i=this.eventLog.append(i)}catch(l){Mi(`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){Mi(`listener threw while publishing ${i.event}`,c),U(this.options.telemetry,{component:"core",operation:"hub.publish",error:c,severity:"warn",handled:!0,context:{event:i.event,sessionId:i.sessionId}})}}}}function lV(i){return i==="session_not_found"||i==="session_messages_not_found"||i==="hub_command_timeout"||i.endsWith("_failed")}var hV=200,fV=1000;function sm(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 gV(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(),T=u?I||l?.trim():l?.trim();if(!T)return{clientId:b};let _=rm(T);if(!u&&I&&rm(I)!==_)throw Error("Registration workspace must match the Hub-authorized workspace");let E=rm(c.workspaceContext?.cwd?.trim()||_),A=pV(_,E);if(A===".."||A.startsWith(`..${mV}`)||cV(A))throw Error("Registration cwd must be inside its workspace");return{clientId:b,workspaceContext:{workspaceRoot:_,cwd:E},...u?{crossWorkspace:!0}:{}}}class yE{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)}`)}},T=(A)=>{if(A.event==="cloud.event"&&!g)return;I({kind:"event",envelope:A})},_=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=gV(C,this.workspaceRoot,l.allowRegisteredWorkspace)}catch(te){I({kind:"reply",envelope:wl(C,"invalid_client_registration",te instanceof Error?te.message:String(te))});break}let M=performance.now(),O=!1,L=sm(C);Ce("info","command.start",L);let D=setTimeout(()=>{if(O)return;Ce("warn","command.slow",{...L,elapsedMs:Math.round(performance.now()-M)})},rs),F=this.transport.command(C.envelope,g??null);F.then((te)=>{if(!O)return;Ce(te.ok?"warn":"error","command.late_end",{...L,elapsedMs:Math.round(performance.now()-M),ok:te.ok,errorCode:te.error?.code,errorMessage:te.error?.message})},(te)=>{if(!O)return;Ce("error","command.late_error",{...L,elapsedMs:Math.round(performance.now()-M),error:te})});let j=!1,B,Q,H=Xt(C.envelope.command,C.envelope.timeoutMs);try{Q=H===null?await F:await Promise.race([F,new Promise((te)=>{B=setTimeout(()=>{j=!0,U(this.telemetry,{component:"core",operation:"hub.command_timeout",error:Error(`Hub command ${C.envelope.command} did not complete within ${H}ms.`),severity:"error",handled:!0,context:{...L,timeoutMs:H}}),te(wl(C,"hub_command_timeout",`Hub command ${C.envelope.command} did not complete within ${H}ms. Check hub-daemon.log for command.start/command.slow logs with requestId ${C.envelope.requestId}.`))},H)})])}catch(te){if(clearTimeout(D),B)clearTimeout(B);throw te}if(O=j,clearTimeout(D),B)clearTimeout(B);let z=Math.round(performance.now()-M);if(j)Ce("error","command.timeout",{...L,durationMs:z,timeoutMs:H});else Ce(Q.ok?"info":"warn","command.end",{...L,durationMs:z,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 te=C.envelope.clientId?.trim();if(te)c.delete(te),g=void 0}I({kind:"reply",envelope:Q});break}case"stream.subscribe":{let N=`${C.clientId}:${C.sessionId??"*"}`;if(u.has(N))break;let M=typeof C.sinceSequence==="number"&&Number.isFinite(C.sinceSequence)&&C.sinceSequence>=0?Math.floor(C.sinceSequence):void 0;if(M===void 0||typeof this.transport.replayEventsAfter!=="function"){let H=await this.transport.subscribe(C.clientId,T,{sessionId:C.sessionId});u.set(N,H);break}let O=!1,L=M,D=[],F=new Set,j=(H)=>{if(typeof H.sequence==="number"){if(H.sequence<=L)return;L=H.sequence}if(H.eventId&&F){if(F.has(H.eventId))return;F.add(H.eventId)}T(H)},B=(H)=>{if(!O){D.push(H);return}j(H)},Q=await this.transport.subscribe(C.clientId,B,{sessionId:C.sessionId});u.set(N,Q);try{let H=0;while(!b&&H<fV){let z=L,te=this.transport.replayEventsAfter(L,{sessionId:C.sessionId,limit:hV});if(te.length===0)break;for(let ee of te)j(ee);if(L<=z)break;H+=1,await new Promise((ee)=>setTimeout(ee,0))}}finally{O=!0;for(let H of D)j(H);D.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"?Bt(A.data):void 0;if(!N||N.kind!=="command"){Ce("error","rejected malformed websocket frame",{error:C});return}Ce("error","command.error",{...sm(N),error:C}),U(this.telemetry,{component:"core",operation:"hub.websocket_command",error:C,severity:"error",handled:!0,context:sm(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",_),i.removeEventListener("close",E)};return i.addEventListener("message",_),i.addEventListener("close",E),E}}class vE{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 wE(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 yV(i){return{send(l){i.send(l)},addEventListener(l,u){if(l==="message"){i.on("message",(c)=>{u({data:wE(c)})});return}i.on("close",u)},removeEventListener(){}}}function vV(i){try{i.write(`HTTP/1.1 400 Bad Request\r
|
|
1143
|
+
Connection: close\r
|
|
1144
|
+
Content-Length: 0\r
|
|
1145
|
+
\r
|
|
1146
|
+
`),i.end()}catch{i.destroy()}}function wV(i){try{i.write(`HTTP/1.1 401 Unauthorized\r
|
|
1147
|
+
Connection: close\r
|
|
1148
|
+
Content-Length: 0\r
|
|
1149
|
+
\r
|
|
1150
|
+
`),i.end()}catch{i.destroy()}}function bV(i){try{i.write(`HTTP/1.1 503 Service Unavailable\r
|
|
1151
|
+
Connection: close\r
|
|
1152
|
+
Content-Length: 0\r
|
|
1153
|
+
\r
|
|
1154
|
+
`),i.end()}catch{i.destroy()}}function Od(i,l){if(!i||!l)return!1;let u=Buffer.from(i,"utf8"),c=Buffer.from(l,"utf8");return u.length===c.length&&dV(u,c)}function nI(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}
|
|
1155
|
+
Caused by: ${i.stack}`;return b}var im=new Map,oI="cline-hub-auth.",IV=30000,aI=2000;async function lI(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 og(i){return Array.isArray(i)?i.join(","):i??""}function dI(i){return i===32||i===9}function nm(i){let l=og(i).trim(),u="bearer";if(l.length<=6||l.slice(0,6).toLowerCase()!=="bearer"||!dI(l.charCodeAt(6)))return null;let c=7;while(c<l.length&&dI(l.charCodeAt(c)))c+=1;return l.slice(c).trim()||null}function kV(i){for(let l of og(i).split(",")){let u=l.trim();if(u.startsWith(oI))return u.slice(oI.length).trim()||null}return null}function bE(i){let l=i.trim().toLowerCase();return l==="localhost"||l==="127.0.0.1"||l==="::1"||l==="[::1]"}function SV(i){let l=og(i).trim();if(!l)return!1;try{return bE(new kh(l).hostname)}catch{return!1}}async function TV(i){let l=i.owner??PT(),u=i.host??"127.0.0.1",c=i.pathname??"/hub",g=i.port??kT(),b=g,I=Du(u,g,c),T=na(),_=xT(),E=_z(),A=$l.acquire(cz(l.discoveryPath));if(!A.held)Ce("warn","instance_lock.unavailable",{lockFile:A.lockFile});let C;try{C=new gE({...i,owner:l}),await C.start()}catch(G){throw A.release(),G}let N=C.getHubId(),M=new yE(new vE(C),i.telemetry,i.workspaceRoot),O=new Set,L=new Date().toISOString(),D={protocolVersion:ji,minClientProtocolVersion:wa,maxClientProtocolVersion:Ta,capabilities:as,coreVersion:zl.version,buildId:T,buildEpochMs:_,pid:process.pid,startedAt:L},F=new Set,j,B,Q,H=!1,z=()=>{if(B)return B;if(Q){let le=im.get(l.discoveryPath);if(le?.server===Q)le.state="closing"}if(j)clearInterval(j),j=void 0;let G=new Promise((le,ke)=>{oe.close((we)=>{if(we){ke(we);return}le()})}),se=new Promise((le,ke)=>{ee.close((we)=>{if(we){ke(we);return}le()})}),Ne=Promise.resolve().then(()=>C.stop()),De=Ne.then(async()=>{await Pz(l.discoveryPath,N)}),Te=(async()=>{let le=(await Promise.allSettled([G,se,Ne,De])).flatMap((ke)=>ke.status==="rejected"?[ke.reason]:[]);if(le.length>0)throw AggregateError(le,"hub server close failed")})().finally(()=>{if(im.get(l.discoveryPath)?.server===Q)im.delete(l.discoveryPath);A.release()});B={transportStopped:Ne,closed:Te};for(let le of F)le.terminate?.();F.clear();for(let le of O)le();return O.clear(),B},te=()=>z().closed,ee=uV.createServer((G,se)=>{if(!H){se.statusCode=503,se.end("Starting");return}if((G.url??"/")==="/health"){let De=JSON.stringify({ok:!0,hubId:N,protocolVersion:D.protocolVersion,minClientProtocolVersion:D.minClientProtocolVersion,maxClientProtocolVersion:D.maxClientProtocolVersion,coreVersion:D.coreVersion,buildId:D.buildId,buildEpochMs:D.buildEpochMs,draining:C.isDraining(),host:u,port:b,url:I});se.statusCode=200,se.setHeader("content-type","application/json"),se.end(De);return}if((G.url??"/")==="/status"){if(!Od(nm(G.headers.authorization),E)){se.statusCode=401,se.end("Unauthorized");return}let De=JSON.stringify({hubId:N,...D,authToken:E,host:u,port:b,url:I,updatedAt:new Date().toISOString()});se.statusCode=200,se.setHeader("content-type","application/json"),se.end(De);return}if((G.url??"/")==="/version"){se.statusCode=200,se.setHeader("content-type","application/json"),se.end(JSON.stringify(D));return}let Ne=new kh(G.url??"/",`http://${u}:${b}`);if(Ne.pathname==="/drain"&&G.method==="POST"){if(!Od(nm(G.headers.authorization),E)){se.statusCode=401,se.end("Unauthorized");return}let De=Ne.searchParams.get("off")===null;C.handleCommand({version:ji,command:"hub.drain",payload:{draining:De,reason:Ne.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(Ne.pathname==="/shutdown"&&G.method==="POST"){if(!Od(nm(G.headers.authorization),E)){se.statusCode=401,se.end("Unauthorized");return}let De=!1,Te=()=>{if(De)return;De=!0;try{Promise.resolve(i.onShutdownRequested?.()).catch(()=>{return})}catch{}finally{te().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 Jo.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)}}},IV),ee.on("upgrade",(G,se,Ne)=>{if(!H){bV(se);return}if(new kh(G.url??"/",`http://${u}:${b}`).pathname!==c){se.destroy();return}let De=Od(kV(G.headers["sec-websocket-protocol"]),E);if(!(De||bE(u)&&SV(G.headers.origin))){wV(se);return}try{oe.handleUpgrade(G,se,Ne,(Te)=>{let le=Te;le.isAlive=!0,le.on("pong",()=>{le.isAlive=!0}),F.add(le),le.once("close",(we,Xe)=>{Ce("info","socket.closed",{code:we,reason:wE(Xe).slice(0,200)||void 0,heartbeatTerminated:le.heartbeatTerminated??!1,serverClosing:B!==void 0})});let ke=M.attach(yV(Te),{allowRegisteredWorkspace:De});O.add(ke),Te.once("close",()=>{F.delete(le),ke(),O.delete(ke)})})}catch{vV(se)}});try{await new Promise((G,se)=>{ee.once("error",(Ne)=>{se(nI(Ne,{host:u,port:g,pathname:c}))}),ee.listen(g,u,()=>{let Ne=ee.address();if(!Ne||typeof Ne==="string"){se(nI(Error("Failed to resolve hub port"),{host:u,port:g,pathname:c}));return}b=Ne.port,I=Du(u,b,c),G()})})}catch(G){if(j)clearInterval(j),j=void 0;if(G instanceof Error)G.hubInstanceLockHeld=A.held;throw await lI(Promise.resolve().then(()=>C.stop()),aI),A.release(),G}try{await MT(l.discoveryPath,{hubId:N,protocolVersion:ji,minClientProtocolVersion:wa,maxClientProtocolVersion:Ta,capabilities:[...D.capabilities],coreVersion:zl.version,buildId:T,buildEpochMs:_,authToken:E,host:u,port:b,url:I,pid:process.pid,startedAt:L,updatedAt:L}),H=!0}catch(G){if(!await lI(z().closed,aI))try{ee.closeAllConnections(),ee.unref()}catch{}throw G}return Q={host:u,port:b,url:I,authToken:E,beginClose:z,close:te},Q}var EV=5000,AV=2000;function xV(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=_V(l,u,{encoding:"utf8",timeout:EV,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:xV(c.stdout)}function RV(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 PV(i,l){let u={bind_port:l.port,instance_lock_held:i.hubInstanceLockHeld},c=CV(l.port);u.port_owners=c?RV(c.join(" | ")).slice(0,600):"unavailable";let g=await Df(Du(l.host,l.port,l.pathname),{signal:AbortSignal.timeout(AV)});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 uI=2000;function MV(i){let l="idle",u=0,c,g,b=!1,I=(_)=>{if(b)return;b=!0,i.exit(_)},T=(_)=>{if(u=Math.max(u,_.exitCode),l==="forced"||l==="finished")return;if(l="forced",g)clearTimeout(g),g=void 0;try{i.onForcedExit?.({..._,exitCode:u})}finally{I(u)}};return{request:(_)=>{if(u=Math.max(u,_.exitCode),c)return c;return l="shutting_down",g=setTimeout(()=>{T({reason:`shutdown deadline exceeded after ${_.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:T,getState:()=>l}}class AE{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),T=this.gaugeValues.get(i);if(l===null){if(T){if(T.delete(I),T.size===0)this.gaugeValues.delete(i),this.gauges.delete(i)}return}let _=T;if(!_)_=new Map,this.gaugeValues.set(i,_);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)}_.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=OV(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[T,_]of Object.entries(i)){if(T==="__proto__"||T==="constructor"||T==="prototype")continue;let E=l?`${l}.${T}`:T;if(_===null||_===void 0){g[E]=String(_);continue}if(Array.isArray(_)){let A=_.length>b?_.slice(0,b):_;try{g[E]=JSON.stringify(A)}catch{g[E]="[UnserializableArray]"}if(_.length>b)g[`${E}_truncated`]=!0,g[`${E}_original_length`]=_.length;continue}if(typeof _==="object"){if(_ instanceof Date){g[E]=_.toISOString();continue}if(_ instanceof Error){g[E]=_.message;continue}if(u.has(_)){g[E]="[Circular]";continue}if(c>=I){g[E]="[MaxDepthExceeded]";continue}u.add(_),Object.assign(g,this.flattenProperties(_,E,u,c+1));continue}if($V(_)){g[E]=_;continue}try{g[E]=JSON.stringify(_)}catch{g[E]=String(_)}}return g}}function OV(i){switch(typeof i==="string"?i.toLowerCase():i){case"trace":return{text:"TRACE",number:Ui.SeverityNumber.TRACE};case"debug":return{text:"DEBUG",number:Ui.SeverityNumber.DEBUG};case"warn":case"warning":return{text:"WARN",number:Ui.SeverityNumber.WARN};case"error":return{text:"ERROR",number:Ui.SeverityNumber.ERROR};case"fatal":return{text:"FATAL",number:Ui.SeverityNumber.FATAL};default:return{text:"INFO",number:Ui.SeverityNumber.INFO}}}function $V(i){return typeof i==="string"||typeof i==="number"||typeof i==="boolean"}class xE{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 ag{adapters;metadata;distinctId;deviceId;commonProperties;constructor(i={}){if(this.adapters=[...i.adapters??[]],i.logger)this.adapters.push(new xE({logger:i.logger}));this.metadata={...i.metadata??{}},this.distinctId=i.distinctId,this.deviceId=i.deviceId??Cq(),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 CE{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 RE{meterProvider;loggerProvider;tracerProvider;options;constructor(i={}){this.options=i;let l=_E.resourceFromAttributes({...i.resourceAttributes,[Pn]:i.serviceName??"cline",...i.serviceVersion?{[Dn]: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)IE.logs.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(i="cline",l){return Wi.getTracer(i,l??this.options.serviceVersion)}createAdapter(i){return new AE({...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 ag({...i,adapters:[l],distinctId:uc(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=om(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)=>jV(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 Sn.MeterProvider({resource:i,readers:g})}createTracerProvider(i){let l=om(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 T of l){let _=qV(T,{endpoint:u,headers:c,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(_){if(g.push(_),T!=="console")b=!0}}if(g.length===0)return null;let I=new EE.NodeTracerProvider({resource:i,spanProcessors:b?[new Zi,...g]:g});if(b)Vn(I);return I}createLoggerProvider(i){let l=om(this.options.logsExporter);if(l.length===0)return null;let u=l.map((c)=>{let g=FV(c,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!g)return null;return new aa.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 aa.LoggerProvider({resource:i,processors:u})}}function LV(i){let l=new RE(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 DV(i){if(ox())return{telemetry:new CE(i)};if(i.enabled!==!0)return{telemetry:new ag({...i,distinctId:uc(i.distinctId)})};return LV(i)}function UV(i){let{telemetry:l,provider:u,emitProviderCreated:c}=DV(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 om(i){if(!i)return[];return(Array.isArray(i)?i:i.split(",")).map((l)=>l.trim()).filter((l)=>l==="console"||l==="otlp")}function FV(i,l){if(i==="console")return new aa.ConsoleLogRecordExporter;if(!l.endpoint)return null;let u=lg(l.endpoint,"/v1/logs");return new kE.OTLPLogExporter({url:u,headers:l.headers})}function qV(i,l){if(i==="console")return new la.SimpleSpanProcessor(new la.ConsoleSpanExporter);if(!l.endpoint)return null;let u=lg(l.endpoint,"/v1/traces");return new la.BatchSpanProcessor(new TE.OTLPTraceExporter({url:u,headers:l.headers}))}function jV(i,l){if(i==="console")return new Sn.PeriodicExportingMetricReader({exporter:new Sn.ConsoleMetricExporter,exportIntervalMillis:l.interval,exportTimeoutMillis:l.timeout});if(!l.endpoint)return null;let u=lg(l.endpoint,"/v1/metrics");return new Sn.PeriodicExportingMetricReader({exporter:new SE.OTLPMetricExporter({url:u,headers:l.headers}),exportIntervalMillis:l.interval,exportTimeoutMillis:l.timeout})}function lg(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 cI=ac,BV=300000,HV=5000;function zV(i=km(),l={}){let u=l.buildId??na(),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 WV(){let i=xf(),l=Tr({serviceName:"cline-hub-daemon",serviceVersion:cI,metadata:{extension_version:cI,cline_type:"hub",platform:"cline-hub-daemon",platform_version:process.version,os_type:process.platform,os_version:NV()}}),u=UV({...l,resourceAttributes:zV(i)}),c,g=()=>{try{return c??=new oi,c.getProviderSettings("cline")?.auth}catch{return null}},b,I=()=>{let _=g();if(_===null)return;let E=_?.accountId?.trim();if(!_||!E){if(b!==void 0)b=void 0,NA(u.telemetry,uc());return}let A=`${E}:${_.organizationId??""}`;if(A===b)return;b=A,Vu(u.telemetry,{id:E,provider:"cline",organizationId:_.organizationId,organizationName:_.organizationName,memberId:_.memberId})};I();let T=setInterval(I,BV);return T.unref?.(),{telemetry:u.telemetry,launcher:i,dispose:async()=>{clearInterval(T);let _;await Promise.race([(async()=>{await u.flush(),await u.dispose()})(),new Promise((E)=>{_=setTimeout(E,HV),_.unref?.()})]),clearTimeout(_)}}}kf(process.env.CLINE_VCR);var PE,dg,KV=new Promise((i,l)=>{PE=i,dg=l});KV.catch(()=>{return});var GV=5000,XV=250;function ME(i){return i instanceof Error&&i.code==="EADDRINUSE"}async function JV(i,l){for(;;)try{return await TV(l)}catch(u){if(!ME(u)&&!Of(u)||Date.now()>=i)throw u;await new Promise((c)=>setTimeout(c,XV))}}function VV(i){let l=!0,u=process.cwd(),c,g,b;for(let I=0;I<i.length;I+=1){let T=i[I],_=i[I+1];if(T==="--no-connectors"){l=!1;continue}if(T==="--cwd"&&_){u=_,I+=1;continue}if(T==="--host"&&_){c=_,I+=1;continue}if(T==="--port"&&_){let E=Number(_);if(Number.isFinite(E))g=E;I+=1;continue}if(T==="--pathname"&&_)b=_,I+=1}return{cwd:u,host:c,port:g,pathname:b,manageConnectors:l}}function YV(i){if(i instanceof pc)return!0;if(i instanceof Error){if(i.name==="AbortError")return!0;if(i.code==="ABORT_ERR")return!0}return!1}async function QV(){Ze();let i=VV(process.argv.slice(2));process.chdir(i.cwd);let l=ST({host:i.host,port:i.port,pathname:i.pathname}),u=WV(),c=(L)=>L instanceof Error?L.stack||L.message:String(L),g,b,I,T=(L)=>{if(g)return g.request(L);if(!b||L.exitCode>b.exitCode)b=L;if(!I)I=setTimeout(()=>{let D=b??L;try{process.stderr.write(`[hub-daemon] startup did not reach shutdown coordination after ${D.reason}; forcing process exit
|
|
1156
|
+
`)}finally{process.exit(D.exitCode)}},uI);return},_=!1,E=(L,D)=>{if(_)return;_=!0,process.stderr.write(`[hub-daemon] ${L}: ${c(D)}
|
|
1157
|
+
`),T({reason:L,exitCode:1})},A=0,C=(L)=>{if(A+=1,A>1){if(g){g.force({reason:`second termination signal (${L})`,exitCode:0});return}if(I)clearTimeout(I),I=void 0;process.exit(b?.exitCode??0);return}T({reason:L,exitCode:0})};process.on("SIGINT",()=>C("SIGINT")),process.on("SIGTERM",()=>C("SIGTERM")),process.on("uncaughtException",(L)=>{E("uncaughtException",L)}),process.on("unhandledRejection",(L)=>{if(YV(L)){let D=L instanceof Error?L.message:String(L);process.stderr.write(`[hub-daemon] ignored abort rejection: ${D}
|
|
1158
|
+
`);return}E("unhandledRejection",L)});let N=Date.now()+GV,M;try{M=await JV(N,{workspaceRoot:i.cwd,onShutdownRequested:()=>{T({reason:"authenticated HTTP shutdown request",exitCode:0})},host:l.host,port:l.port,pathname:l.pathname,owner:re()==="production"?Uf():yc(),telemetry:u.telemetry,runtimeHandlers:YH({telemetry:u.telemetry}),cronOptions:{workspaceRoot:i.cwd}})}catch(L){if(!Of(L)){let D=ME(L)?await PV(L,l):void 0;if(D)process.stderr.write(`[hub-daemon] port ${l.port} is in use: ${JSON.stringify(D)}
|
|
1159
|
+
`);U(u.telemetry,{component:"hub",operation:"hub.daemon.startup",error:L,handled:!1,severity:"fatal",context:D})}throw await u.dispose().catch(()=>{return}),L}let O=i.manageConnectors?new ok({cleanupInstance:(L,D)=>$C(L,D)}):void 0;if(jg(O),g=MV({deadlineMs:uI,cleanup:async()=>{let L=[];try{O?.dispose()}catch(F){L.push(F)}finally{jg(void 0)}let D=M.beginClose();await Promise.allSettled([D.transportStopped]);try{await u.dispose()}catch(F){L.push(F)}try{await D.closed}catch(F){L.push(F)}if(L.length>0)throw AggregateError(L,"hub daemon shutdown cleanup failed")},exit:(L)=>process.exit(L),onCleanupError:(L)=>{process.stderr.write(`[hub-daemon] shutdown cleanup failed: ${c(L)}
|
|
1160
|
+
`)},onForcedExit:({reason:L})=>{process.stderr.write(`[hub-daemon] ${L}; forcing process exit
|
|
1161
|
+
`)}}),b){if(I)clearTimeout(I),I=void 0;dg(Error("Hub daemon shutdown was requested before readiness")),await g.request(b);return}PE(),ZV(i.cwd);try{if(O)O.adoptRunningConnectors(),await eR()}catch(L){let D=L instanceof Error?L.stack||L.message:String(L);process.stderr.write(`[hub-daemon] connector reconnect failed: ${D}
|
|
1162
|
+
`)}await new Promise(()=>{})}async function ZV(i){if(Zu()==="sandbox")return;try{let l=jh({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}
|
|
1163
|
+
`)}catch(l){let u=l instanceof Error?l.stack||l.message:String(l);process.stderr.write(`[hub-daemon] plugin preload failed: ${u}
|
|
1164
|
+
`)}}QV().catch((i)=>{if(dg(i),Of(i))process.stderr.write(`[hub-daemon] another live Hub owns this data directory: ${i.message}
|
|
1165
|
+
`),process.exit(uz);let l=i instanceof Error?i.stack||i.message:String(i);process.stderr.write(`[hub-daemon] fatal: ${l}
|
|
1166
|
+
`),process.exit(1)});export{KV as hubDaemonReady,YV as isAbortRejection};
|