alchemylab-opencode 1.0.21 → 1.0.23
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/chunk-22MFGOA6.js +75 -0
- package/dist/{chunk-T7EXROHP.js → chunk-2ANK3QEN.js} +1 -1
- package/dist/{chunk-A4S3BYGY.js → chunk-CZVKIDQZ.js} +1 -1
- package/dist/{chunk-ABCQLKMJ.js → chunk-GCMAFSDE.js} +1 -1
- package/dist/chunk-MN5GIJ5E.js +2260 -0
- package/dist/{chunk-DBKYWUEM.js → chunk-SILEE7UA.js} +1 -1
- package/dist/{chunk-N2IDMOID.js → chunk-VREN4JVV.js} +1 -1
- package/dist/{chunk-XREX5MYM.js → chunk-YRY5Y3QL.js} +1 -1
- package/dist/{default-u_dwuiYb-5QQ4GXMV.js → default-u_dwuiYb-652AQZKX.js} +1 -1
- package/dist/{effect-QlVUlMFu-ORZ7TVO5.js → effect-QlVUlMFu-JVYEXAZL.js} +1 -1
- package/dist/{mcp-BCTN55WE.js → mcp-3MLN7453.js} +1 -1
- package/dist/{registry-MRPMZCK4.js → registry-HM2N65IE.js} +1 -1
- package/dist/{run-O75PTUSN.js → run-VQUBMRCD.js} +1 -1
- package/dist/run.js +1 -1
- package/dist/serve.js +1 -1
- package/dist/{server-QXCNOJQJ.js → server-TLPVN3ZL.js} +1 -1
- package/dist/{session-OLERO43H.js → session-FWLEEJPX.js} +1 -1
- package/dist/{share-next-7PZI7GKT.js → share-next-PRCWHS3Z.js} +1 -1
- package/dist/{sury-CWZTCd75-IXNCX752.js → sury-CWZTCd75-3YHH6KVI.js} +1 -1
- package/dist/{valibot--1zFm7rT-SSCP4J5I.js → valibot--1zFm7rT-FSYJNYJ6.js} +1 -1
- package/dist/{valibot-D_HTw1Gn-KPCJMJMC.js → valibot-D_HTw1Gn-E5NKVIOV.js} +1 -1
- package/dist/{worktree-43SDNYPU.js → worktree-5G5VWN6L.js} +1 -1
- package/dist/{zod-Bwrt9trS-BYLM45IZ.js → zod-Bwrt9trS-HVDOFWRP.js} +1 -1
- package/dist/{zod-DSgpEGAE-T3VJY2W3.js → zod-DSgpEGAE-DSH6V7MG.js} +1 -1
- package/package.json +1 -1
- package/dist/chunk-5MPKKAWG.js +0 -2215
- package/dist/chunk-CMU5MV6S.js +0 -75
- /package/dist/{arktype-aI7TBD0R-ETU7X65Q.js → arktype-aI7TBD0R-TFNARRIP.js} +0 -0
- /package/dist/{chunk-T6MY2WE4.js → chunk-FXLFZ5DL.js} +0 -0
- /package/dist/{chunk-BGADAZN4.js → chunk-PWFRMDDF.js} +0 -0
- /package/dist/{typebox-Dei93FPO-K67WT2FO.js → typebox-Dei93FPO-GLI7OCTY.js} +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Built by esbuild from opencode-server source
|
|
2
|
+
if (typeof globalThis.Bun === 'undefined') {
|
|
3
|
+
globalThis.Bun = {
|
|
4
|
+
version: '0.0.0-node-compat',
|
|
5
|
+
stdin: { async text() { const chunks = []; for await (const c of process.stdin) chunks.push(c); return Buffer.concat(chunks).toString(); } },
|
|
6
|
+
which(cmd) { try { return require('child_process').execFileSync('which', [cmd], { encoding: 'utf8' }).trim(); } catch { return null; } },
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
if (typeof globalThis.__name === 'undefined') { globalThis.__name = (t, n) => { Object.defineProperty(t, 'name', { value: n, configurable: true }); return t; }; }
|
|
10
|
+
if (typeof globalThis.__export === 'undefined') { globalThis.__export = (t, a) => { for (const k in a) Object.defineProperty(t, k, { get: a[k], enumerable: true }); }; }
|
|
11
|
+
|
|
12
|
+
import{B as mt,a as Ln,b as $r,c as zr,d as ft,e as ae,f as Ur,g as Br,h as _e,j as mr,k as Eo,l as gr,s as ot,t as pe,v as Pt,w as Fn,z as Ie}from"./chunk-N7PLTD3P.js";import{b as Jr}from"./chunk-7KKA6WBY.js";import{a as Zt}from"./chunk-LTCXIXYM.js";import{a as Sn,b as Fr,c as L,d as z,e as Xe}from"./chunk-M4CB72HE.js";import{a as t,e as Kt,f as Vt}from"./chunk-MBZTOEAD.js";import{dynamicTool as Ui,jsonSchema as Bi}from"ai";import{Client as ho}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as bo}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{SSEClientTransport as Ji}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as Hi}from"@modelcontextprotocol/sdk/client/stdio.js";import{UnauthorizedError as wo}from"@modelcontextprotocol/sdk/client/auth.js";import{CallToolResultSchema as Wi,ToolListChangedNotificationSchema as qi}from"@modelcontextprotocol/sdk/types.js";import ze from"path";import{pathToFileURL as ar}from"url";import go from"os";import ko from"cross-spawn";import{buffer as Wr}from"node:stream/consumers";function jt(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}t(jt,"isRecord");function So(e){if(e instanceof Error)return e.stack??`${e.name}: ${e.message}`;if(typeof e=="object"&&e!==null)try{return JSON.stringify(e,null,2)}catch{return"Unexpected error (unserializable)"}return String(e)}t(So,"errorFormat");function Hr(e){if(e instanceof Error){if(e.message)return e.message;if(e.name)return e.name}if(jt(e)&&typeof e.message=="string"&&e.message)return e.message;let r=String(e);if(r&&r!=="[object Object]")return r;let s=So(e);return s&&s!=="{}"?s:"unknown error"}t(Hr,"errorMessage");var Ve;(ce=>{class e extends Error{static{t(this,"RunFailedError")}cmd;code;stdout;stderr;constructor(I,F,K,l){let v=l.toString().trim();super(v?`Command failed with code ${F}: ${I.join(" ")}
|
|
13
|
+
${v}`:`Command failed with code ${F}: ${I.join(" ")}`),this.name="ProcessRunFailedError",this.cmd=[...I],this.code=F,this.stdout=K,this.stderr=l}}ce.RunFailedError=e;function r(W,I={}){if(W.length===0)throw new Error("Command is required");I.abort?.throwIfAborted();let F=ko(W[0],W.slice(1),{cwd:I.cwd,shell:I.shell,env:I.env===null?{}:I.env?{...process.env,...I.env}:void 0,stdio:[I.stdin??"ignore",I.stdout??"ignore",I.stderr??"ignore"],windowsHide:process.platform==="win32"}),K=!1,l,v=t(()=>{if(K||F.exitCode!==null||F.signalCode!==null)return;K=!0,F.kill(I.kill??"SIGTERM");let c=I.timeout??5e3;c<=0||(l=setTimeout(()=>F.kill("SIGKILL"),c))},"abort"),u=new Promise((c,C)=>{let E=t(()=>{I.abort?.removeEventListener("abort",v),l&&clearTimeout(l)},"done");F.once("exit",(b,x)=>{E(),c(b??(x?1:0))}),F.once("error",b=>{E(),C(b)})});u.catch(()=>{}),I.abort&&(I.abort.addEventListener("abort",v,{once:!0}),I.abort.aborted&&v());let i=F;return i.exited=u,i}ce.spawn=r,t(r,"spawn");async function s(W,I={}){let F=r(W,{cwd:I.cwd,env:I.env,stdin:I.stdin,shell:I.shell,abort:I.abort,kill:I.kill,timeout:I.timeout,stdout:"pipe",stderr:"pipe"});if(!F.stdout||!F.stderr)throw new Error("Process output not available");let K=await Promise.all([F.exited,Wr(F.stdout),Wr(F.stderr)]).then(([l,v,u])=>({code:l,stdout:v,stderr:u})).catch(l=>{if(!I.nothrow)throw l;return{code:1,stdout:Buffer.alloc(0),stderr:Buffer.from(Hr(l))}});if(K.code===0||I.nothrow)return K;throw new e(W,K.code,K.stdout,K.stderr)}ce.run=s,t(s,"run");async function w(W){if(W.exitCode!==null||W.signalCode!==null)return;if(process.platform!=="win32"||!W.pid){W.kill();return}(await s(["taskkill","/pid",String(W.pid),"/T","/F"],{nothrow:!0})).code!==0&&W.kill()}ce.stop=w,t(w,"stop");async function p(W,I={}){let F=await s(W,I);return{...F,text:F.stdout.toString()}}ce.text=p,t(p,"text");async function B(W,I={}){return(await p(W,I)).text.split(/\r?\n/).filter(Boolean)}ce.lines=B,t(B,"lines")})(Ve||={});import n from"zod";import Mo from"path";import ee from"zod";import{Effect as Ze,Layer as yr,Schema as We,ServiceMap as Ao,Stream as _t}from"effect";import{FetchHttpClient as Oo,HttpClient as Gr,HttpClientRequest as At,HttpClientResponse as kn}from"effect/unstable/http";import{Schedule as qr}from"effect";import{HttpClient as Po}from"effect/unstable/http";var $n=t(e=>e.pipe(Po.retryTransient({retryOn:"errors-and-responses",times:2,schedule:qr.exponential(200).pipe(qr.jittered)})),"withTransientReadRetry");import{ChildProcess as hr,ChildProcessSpawner as Kr}from"effect/unstable/process";import Vr from"path";import Yt from"zod";import zn from"semver";var Lt;(oe=>{let e=Xe.create({service:"installation"});oe.Event={Updated:ot.define("installation.updated",Yt.object({version:Yt.string()})),UpdateAvailable:ot.define("installation.update-available",Yt.object({version:Yt.string()}))};function s(Z,ue){let Le=zn.major(Z),Se=zn.minor(Z),He=zn.major(ue),qe=zn.minor(ue);return He>Le?"major":qe>Se?"minor":"patch"}oe.getReleaseType=s,t(s,"getReleaseType"),oe.Info=Yt.object({version:Yt.string(),latest:Yt.string()}).meta({ref:"InstallationInfo"}),oe.VERSION=Ur,oe.CHANNEL=Br,oe.USER_AGENT=`opencode/${oe.CHANNEL}/${oe.VERSION}/${ae.OPENCODE_CLIENT}`;function W(){return oe.CHANNEL!=="latest"}oe.isPreview=W,t(W,"isPreview");function I(){return oe.CHANNEL==="local"}oe.isLocal=I,t(I,"isLocal");class F extends We.TaggedErrorClass()("UpgradeFailedError",{stderr:We.String}){static{t(this,"UpgradeFailedError")}}oe.UpgradeFailedError=F;let K=We.Struct({tag_name:We.String}),l=We.Struct({version:We.String}),v=We.Struct({versions:We.Struct({stable:We.String})}),u=We.Struct({formulae:We.Array(We.Struct({versions:We.Struct({stable:We.String})}))}),i=We.Struct({d:We.Struct({results:We.Array(We.Struct({Version:We.String}))})}),c=l;class C extends Ao.Service()("@opencode/Installation"){static{t(this,"Service")}}oe.Service=C,oe.layer=yr.effect(C,Ze.gen(function*(){let Z=yield*Gr.HttpClient,ue=Gr.filterStatusOk($n(Z)),Le=yield*Kr.ChildProcessSpawner,Se=Ze.fnUntraced(function*(O,T){let y=hr.make(O[0],O.slice(1),{cwd:T?.cwd,env:T?.env,extendEnv:!0}),g=yield*Le.spawn(y),R=yield*_t.mkString(_t.decodeText(g.stdout));return yield*g.exitCode,R},Ze.scoped,Ze.catch(()=>Ze.succeed(""))),He=Ze.fnUntraced(function*(O,T){let y=hr.make(O[0],O.slice(1),{cwd:T?.cwd,env:T?.env,extendEnv:!0}),g=yield*Le.spawn(y),[R,le]=yield*Ze.all([_t.mkString(_t.decodeText(g.stdout)),_t.mkString(_t.decodeText(g.stderr))],{concurrency:2});return{code:yield*g.exitCode,stdout:R,stderr:le}},Ze.scoped,Ze.catch(()=>Ze.succeed({code:Kr.ExitCode(1),stdout:"",stderr:""}))),qe=Ze.fnUntraced(function*(){return(yield*Se(["brew","list","--formula","anomalyco/tap/opencode"])).includes("opencode")?"anomalyco/tap/opencode":((yield*Se(["brew","list","--formula","opencode"])).includes("opencode"),"opencode")}),St=Ze.fnUntraced(function*(O){let y=yield*(yield*ue.execute(At.get("https://opencode.ai/install"))).text,g=new TextEncoder().encode(y),R=hr.make("bash",[],{stdin:_t.make(g),env:{VERSION:O},extendEnv:!0}),le=yield*Le.spawn(R),[xe,Ne]=yield*Ze.all([_t.mkString(_t.decodeText(le.stdout)),_t.mkString(_t.decodeText(le.stderr))],{concurrency:2});return{code:yield*le.exitCode,stdout:xe,stderr:Ne}},Ze.scoped,Ze.orDie),Ge=Ze.fn("Installation.method")(function*(){if(process.execPath.includes(Vr.join(".opencode","bin"))||process.execPath.includes(Vr.join(".local","bin")))return"curl";let O=process.execPath.toLowerCase(),T=[{name:"npm",command:t(()=>Se(["npm","list","-g","--depth=0"]),"command")},{name:"yarn",command:t(()=>Se(["yarn","global","list"]),"command")},{name:"pnpm",command:t(()=>Se(["pnpm","list","-g","--depth=0"]),"command")},{name:"bun",command:t(()=>Se(["bun","pm","ls","-g"]),"command")},{name:"brew",command:t(()=>Se(["brew","list","--formula","opencode"]),"command")},{name:"scoop",command:t(()=>Se(["scoop","list","opencode"]),"command")},{name:"choco",command:t(()=>Se(["choco","list","--limit-output","opencode"]),"command")}];T.sort((y,g)=>{let R=O.includes(y.name),le=O.includes(g.name);return R&&!le?-1:!R&&le?1:0});for(let y of T){let g=yield*y.command(),R=y.name==="brew"||y.name==="choco"||y.name==="scoop"?"opencode":"opencode-ai";if(g.includes(R))return y.name}return"unknown"}),Dt=Ze.fn("Installation.latest")(function*(O){let T=O||(yield*Ge());if(T==="brew"){let R=yield*qe();if(R.includes("/")){let Ne=yield*Se(["brew","info","--json=v2",R]);return(yield*We.decodeUnknownEffect(We.fromJsonString(u))(Ne)).formulae[0].versions.stable}let le=yield*ue.execute(At.get("https://formulae.brew.sh/api/formula/opencode.json").pipe(At.acceptJson));return(yield*kn.schemaBodyJson(v)(le)).versions.stable}if(T==="npm"||T==="bun"||T==="pnpm"){let le=(yield*Se(["npm","config","get","registry"])).trim()||"https://registry.npmjs.org",xe=le.endsWith("/")?le.slice(0,-1):le,Ne=oe.CHANNEL,te=yield*ue.execute(At.get(`${xe}/opencode-ai/${Ne}`).pipe(At.acceptJson));return(yield*kn.schemaBodyJson(l)(te)).version}if(T==="choco"){let R=yield*ue.execute(At.get("https://community.chocolatey.org/api/v2/Packages?$filter=Id%20eq%20%27opencode%27%20and%20IsLatestVersion&$select=Version").pipe(At.setHeaders({Accept:"application/json;odata=verbose"})));return(yield*kn.schemaBodyJson(i)(R)).d.results[0].Version}if(T==="scoop"){let R=yield*ue.execute(At.get("https://raw.githubusercontent.com/ScoopInstaller/Main/master/bucket/opencode.json").pipe(At.setHeaders({Accept:"application/json"})));return(yield*kn.schemaBodyJson(c)(R)).version}let y=yield*ue.execute(At.get("https://api.github.com/repos/anomalyco/opencode/releases/latest").pipe(At.acceptJson));return(yield*kn.schemaBodyJson(K)(y)).tag_name.replace(/^v/,"")},Ze.orDie),Rt=Ze.fn("Installation.upgrade")(function*(O,T){let y;switch(O){case"curl":y=yield*St(T);break;case"npm":y=yield*He(["npm","install","-g",`opencode-ai@${T}`]);break;case"pnpm":y=yield*He(["pnpm","install","-g",`opencode-ai@${T}`]);break;case"bun":y=yield*He(["bun","install","-g",`opencode-ai@${T}`]);break;case"brew":{let g=yield*qe(),R={HOMEBREW_NO_AUTO_UPDATE:"1"};if(g.includes("/")){let le=yield*He(["brew","tap","anomalyco/tap"],{env:R});if(le.code!==0){y=le;break}let Ne=(yield*Se(["brew","--repo","anomalyco/tap"])).trim();if(Ne){let te=yield*He(["git","pull","--ff-only"],{cwd:Ne,env:R});if(te.code!==0){y=te;break}}}y=yield*He(["brew","upgrade",g],{env:R});break}case"choco":y=yield*He(["choco","upgrade","opencode",`--version=${T}`,"-y"]);break;case"scoop":y=yield*He(["scoop","install",`opencode@${T}`]);break;default:return yield*new F({stderr:`Unknown method: ${O}`})}if(!y||y.code!==0){let g=O==="choco"?"not running from an elevated command shell":y?.stderr||"";return yield*new F({stderr:g})}e.info("upgraded",{method:O,target:T,stdout:y.stdout,stderr:y.stderr}),yield*Se([process.execPath,"--version"])});return C.of({info:Ze.fn("Installation.info")(function*(){return{version:oe.VERSION,latest:yield*Dt()}}),method:Ge,latest:Dt,upgrade:Rt})})),oe.defaultLayer=oe.layer.pipe(yr.provide(Oo.layer),yr.provide(Fn));let{runPromise:x}=mt(C,oe.defaultLayer);async function P(){return x(Z=>Z.method())}oe.method=P,t(P,"method");async function V(Z){return x(ue=>ue.latest(Z))}oe.latest=V,t(V,"latest");async function se(Z,ue){return x(Le=>Le.upgrade(Z,ue))}oe.upgrade=se,t(se,"upgrade")})(Lt||={});import Un from"path";import Co from"os";import{randomBytes as Do,randomUUID as jo}from"crypto";import{mkdir as Bn,readFile as Io,rm as sn,stat as Ro,utimes as No,writeFile as Zr}from"fs/promises";import{createHash as To}from"crypto";var Pn;(r=>{function e(s){return To("sha1").update(s).digest("hex")}r.fast=e,t(e,"fast")})(Pn||={});var Ft;(u=>{let e=Un.join(z.Path.state,"locks"),r={staleMs:6e4,timeoutMs:5*6e4,baseDelayMs:100,maxDelayMs:2e3};function s(i){if(typeof i!="object"||i===null||!("code"in i))return;let c=i.code;if(typeof c=="string")return c}t(s,"code");function w(i,c){return new Promise((C,E)=>{if(c?.aborted){E(c.reason??new Error("Aborted"));return}let b,x=t(()=>{c?.removeEventListener("abort",P),C()},"done"),P=t(()=>{b&&clearTimeout(b),c?.removeEventListener("abort",P),E(c?.reason??new Error("Aborted"))},"abort");c?.addEventListener("abort",P,{once:!0}),b=setTimeout(x,i)})}t(w,"sleep");function p(i){let c=Math.floor(i*.3),C=Math.floor(Math.random()*(2*c+1))-c;return Math.max(0,i+C)}t(p,"jitter");function B(){return performance.now()}t(B,"mono");function ce(){return performance.timeOrigin+B()}t(ce,"wall");async function W(i){try{return await Ro(i)}catch(c){let C=s(c);if(C==="ENOENT"||C==="ENOTDIR")return;throw c}}t(W,"stats");async function I(i,c,C,E){let b=ce(),x=await W(c);if(x)return b-x.mtimeMs>E;let P=await W(C);if(P)return b-P.mtimeMs>E;let V=await W(i);return V?b-V.mtimeMs>E:!1}t(I,"stale");async function F(i,c){let C=jo?.()??Do(16).toString("hex"),E=Un.join(i,"meta.json"),b=Un.join(i,"heartbeat");try{await Bn(i,{mode:448})}catch(oe){if(s(oe)!=="EEXIST")throw oe;if(!await I(i,b,E,c.staleMs))return{acquired:!1};let Z=i+".breaker";try{await Bn(Z,{mode:448})}catch(ue){let Le=s(ue);if(Le==="EEXIST"){let Se=await W(Z);return Se&&ce()-Se.mtimeMs>c.staleMs&&await sn(Z,{recursive:!0,force:!0}).catch(()=>{}),{acquired:!1}}if(Le==="ENOENT"||Le==="ENOTDIR")return{acquired:!1};throw ue}try{if(!await I(i,b,E,c.staleMs))return{acquired:!1};await sn(i,{recursive:!0,force:!0});try{await Bn(i,{mode:448})}catch(ue){let Le=s(ue);if(Le==="EEXIST"||Le==="ENOTEMPTY")return{acquired:!1};throw ue}}finally{await sn(Z,{recursive:!0,force:!0}).catch(()=>{})}}let x={token:C,pid:process.pid,hostname:Co.hostname(),createdAt:new Date().toISOString()};await Zr(b,"",{flag:"wx"}).catch(async()=>{throw await sn(i,{recursive:!0,force:!0}),new Error("Lock acquired but heartbeat already existed (possible compromise).")}),await Zr(E,JSON.stringify(x,null,2),{flag:"wx"}).catch(async()=>{throw await sn(i,{recursive:!0,force:!0}),new Error("Lock acquired but meta.json already existed (possible compromise).")});let P;return{acquired:!0,startHeartbeat:t((oe=Math.max(100,Math.floor(c.staleMs/3)))=>{P||(P=setInterval(()=>{let Z=new Date;No(b,Z,Z).catch(()=>{})},oe),P.unref?.())},"startHeartbeat"),release:t(async()=>{if(P&&(clearInterval(P),P=void 0),(await Io(E,"utf8").then(Z=>{let ue=JSON.parse(Z);return!ue||typeof ue!="object"?{}:{token:"token"in ue&&typeof ue.token=="string"?ue.token:void 0}}).catch(Z=>{let ue=s(Z);throw ue==="ENOENT"||ue==="ENOTDIR"?new Error("Refusing to release: lock is compromised (metadata missing)."):Z instanceof SyntaxError?new Error("Refusing to release: lock is compromised (metadata invalid)."):Z})).token!==C)throw new Error("Refusing to release: lock token mismatch (not the owner).");await sn(i,{recursive:!0,force:!0})},"release")}}t(F,"tryAcquireLockDir");async function K(i,c,C){let E=B()+C.timeoutMs,b=0,x=0,P=C.baseDelayMs;for(;;){c.signal?.throwIfAborted();let V=await F(i,C);if(V.acquired)return V;if(B()>E)throw new Error(`Timed out waiting for lock: ${c.key}`);b+=1;let se=p(P);await c.onWait?.({key:c.key,attempt:b,delay:se,waited:x}),await w(se,c.signal),x+=se,P=Math.min(C.maxDelayMs,Math.floor(P*1.7))}}t(K,"acquireLockDir");async function l(i,c={}){c.signal?.throwIfAborted();let C={staleMs:c.staleMs??r.staleMs,timeoutMs:c.timeoutMs??r.timeoutMs,baseDelayMs:c.baseDelayMs??r.baseDelayMs,maxDelayMs:c.maxDelayMs??r.maxDelayMs},E=c.dir??e;await Bn(E,{recursive:!0});let b=Un.join(E,Pn.fast(i)+".lock"),x=await K(b,{key:i,onWait:c.onWait,signal:c.signal},C);x.startHeartbeat();let P=t(()=>x.release(),"release");return{release:P,[Symbol.asyncDispose](){return P()}}}u.acquire=l,t(l,"acquire");async function v(i,c,C={}){var b=[];try{let E=Kt(b,await l(i,C),!0);C.signal?.throwIfAborted();return await c()}catch(x){var P=x,V=!0}finally{var se=Vt(b,P,V);se&&await se}}u.withLock=v,t(v,"withLock")})(Ft||={});var an;(u=>{let e=Xe.create({service:"models.dev"}),r=ce(),s=Mo.join(z.Path.cache,r==="https://models.dev"?"models.json":`models-${Pn.fast(r)}.json`),w=300*1e3;u.Model=ee.object({id:ee.string(),name:ee.string(),family:ee.string().optional(),release_date:ee.string(),attachment:ee.boolean(),reasoning:ee.boolean(),temperature:ee.boolean(),tool_call:ee.boolean(),interleaved:ee.union([ee.literal(!0),ee.object({field:ee.enum(["reasoning_content","reasoning_details"])}).strict()]).optional(),cost:ee.object({input:ee.number(),output:ee.number(),cache_read:ee.number().optional(),cache_write:ee.number().optional(),context_over_200k:ee.object({input:ee.number(),output:ee.number(),cache_read:ee.number().optional(),cache_write:ee.number().optional()}).optional()}).optional(),limit:ee.object({context:ee.number(),input:ee.number().optional(),output:ee.number()}),modalities:ee.object({input:ee.array(ee.enum(["text","audio","image","video","pdf"])),output:ee.array(ee.enum(["text","audio","image","video","pdf"]))}).optional(),experimental:ee.boolean().optional(),status:ee.enum(["alpha","beta","deprecated"]).optional(),options:ee.record(ee.string(),ee.any()),headers:ee.record(ee.string(),ee.string()).optional(),provider:ee.object({npm:ee.string().optional(),api:ee.string().optional()}).optional(),variants:ee.record(ee.string(),ee.record(ee.string(),ee.any())).optional()}),u.Provider=ee.object({api:ee.string().optional(),name:ee.string(),env:ee.array(ee.string()),id:ee.string(),npm:ee.string().optional(),models:ee.record(ee.string(),u.Model)});function ce(){return ae.OPENCODE_MODELS_URL||"https://models.dev"}t(ce,"url");function W(){return Date.now()-Number(L.stat(s)?.mtimeMs??0)<w}t(W,"fresh");function I(i){return!i&&W()}t(I,"skip");let F=t(async()=>{let i=await fetch(`${ce()}/api.json`,{headers:{"User-Agent":Lt.USER_AGENT},signal:AbortSignal.timeout(1e4)});return{ok:i.ok,text:await i.text()}},"fetchApi");u.Data=zr(async()=>{let i=await L.readJson(ae.OPENCODE_MODELS_PATH??s).catch(()=>{});if(i)return i;let c=await import("./models-snapshot.js").then(C=>C.snapshot).catch(()=>{});return c||(ae.OPENCODE_DISABLE_MODELS_FETCH?{}:Ft.withLock(`models-dev:${s}`,async()=>{let C=await L.readJson(ae.OPENCODE_MODELS_PATH??s).catch(()=>{});if(C)return C;let E=await F();return E.ok&&await L.write(s,E.text).catch(b=>{e.error("Failed to write models cache",{error:b})}),JSON.parse(E.text)}))});async function l(){return await(0,u.Data)()}u.get=l,t(l,"get");async function v(i=!1){if(I(i))return u.Data.reset();await Ft.withLock(`models-dev:${s}`,async()=>{if(I(i))return u.Data.reset();let c=await F();c.ok&&(await L.write(s,c.text),u.Data.reset())}).catch(c=>{e.error("Failed to fetch models.dev",{error:c})})}u.refresh=v,t(v,"refresh")})(an||={});!ae.OPENCODE_DISABLE_MODELS_FETCH&&!process.argv.includes("--get-yargs-completions")&&(an.refresh(),setInterval(async()=>{await an.refresh()},60*1e3*60).unref());import{mergeDeep as gt,pipe as Ai,unique as Oi}from"remeda";import Rr from"fs/promises";import Jo from"path";import{Effect as wt,Layer as Xr,Record as Ho,Result as Wo,Schema as Re,ServiceMap as qo}from"effect";import{SchemaAST as Jn}from"effect";import it from"zod";function Yr(e){return Ut(e.ast)}t(Yr,"zod");function Ut(e){let r=Lo(e),s=Jn.resolveDescription(e),w=Jn.resolveIdentifier(e),p=s?r.describe(s):r;return w?p.meta({ref:w}):p}t(Ut,"walk");function Lo(e){if(Jn.isOptional(e))return Fo(e);switch(e._tag){case"String":return it.string();case"Number":return it.number();case"Boolean":return it.boolean();case"Null":return it.null();case"Undefined":return it.undefined();case"Any":case"Unknown":return it.unknown();case"Never":return it.never();case"Literal":return it.literal(e.literal);case"Union":return $o(e);case"Objects":return zo(e);case"Arrays":return Uo(e);case"Declaration":return Bo(e);default:return Bt(e)}}t(Lo,"body");function Fo(e){if(e._tag!=="Union")return Bt(e);let r=e.types.filter(s=>s._tag!=="Undefined");return r.length===1?Ut(r[0]).optional():r.length>1?it.union(r.map(Ut)).optional():it.undefined().optional()}t(Fo,"opt");function $o(e){let r=e.types.map(Ut);if(r.length===1)return r[0];if(r.length<2)return Bt(e);let s=e.annotations?.discriminator;return s?it.discriminatedUnion(s,r):it.union(r)}t($o,"union");function zo(e){if(e.propertySignatures.length===0&&e.indexSignatures.length===1){let r=e.indexSignatures[0];return r.parameter._tag!=="String"?Bt(e):it.record(it.string(),Ut(r.type))}return e.indexSignatures.length>0?Bt(e):it.object(Object.fromEntries(e.propertySignatures.map(r=>[String(r.name),Ut(r.type)])))}t(zo,"object");function Uo(e){return e.elements.length>0||e.rest.length!==1?Bt(e):it.array(Ut(e.rest[0]))}t(Uo,"array");function Bo(e){return e.typeParameters.length!==1?Bt(e):Ut(e.typeParameters[0])}t(Bo,"decl");function Bt(e){let r=Jn.resolveIdentifier(e);throw new Error(`unsupported effect schema: ${r??e._tag}`)}t(Bt,"fail");var ca="opencode-oauth-dummy-key",Hn=Jo.join(z.Path.globalData,"auth.json"),Wn=t(e=>r=>new _n.AuthError({message:e,cause:r}),"fail"),_n;(i=>{class e extends Re.Class("OAuth")({type:Re.Literal("oauth"),refresh:Re.String,access:Re.String,expires:Re.Number,accountId:Re.optional(Re.String),enterpriseUrl:Re.optional(Re.String)}){static{t(this,"Oauth")}}i.Oauth=e;class r extends Re.Class("ApiAuth")({type:Re.Literal("api"),key:Re.String,metadata:Re.optional(Re.Record(Re.String,Re.String))}){static{t(this,"Api")}}i.Api=r;class s extends Re.Class("WellKnownAuth")({type:Re.Literal("wellknown"),key:Re.String,token:Re.String}){static{t(this,"WellKnown")}}i.WellKnown=s;let w=Re.Union([e,r,s]).annotate({discriminator:"type",identifier:"Auth"});i.Info=Object.assign(w,{zod:Yr(w)});class B extends Re.TaggedErrorClass()("AuthError",{message:Re.String,cause:Re.optional(Re.Defect)}){static{t(this,"AuthError")}}i.AuthError=B;class ce extends qo.Service()("@opencode/Auth"){static{t(this,"Service")}}i.Service=ce,i.layer=Xr.effect(ce,wt.gen(function*(){let c=yield*Pt.Service,C=Re.decodeUnknownOption(i.Info),E=wt.fn("Auth.all")(function*(){let se=yield*c.readJson(Hn).pipe(wt.orElseSucceed(()=>({})));return Ho.filterMap(se,oe=>Wo.fromOption(C(oe),()=>{}))}),b=wt.fn("Auth.rawAll")(function*(){return yield*c.readJson(Hn).pipe(wt.catchIf(se=>se?.reason?._tag==="NotFound"||se?.cause?.reason?._tag==="NotFound",()=>wt.succeed({})))}),x=wt.fn("Auth.get")(function*(se){return(yield*E())[se]}),P=wt.fn("Auth.set")(function*(se,oe){let Z=se.replace(/\/+$/,""),ue=yield*b().pipe(wt.mapError(Wn("Refusing to write auth data: existing auth.json could not be read")));Z!==se&&delete ue[se],delete ue[Z+"/"],yield*c.writeJson(Hn,{...ue,[Z]:oe},384).pipe(wt.mapError(Wn("Failed to write auth data")))}),V=wt.fn("Auth.remove")(function*(se){let oe=se.replace(/\/+$/,""),Z=yield*b().pipe(wt.mapError(Wn("Refusing to write auth data: existing auth.json could not be read")));delete Z[se],delete Z[oe],yield*c.writeJson(Hn,Z,384).pipe(wt.mapError(Wn("Failed to write auth data")))});return ce.of({get:x,all:E,set:P,remove:V})})),i.defaultLayer=i.layer.pipe(Xr.provide(Pt.defaultLayer));let{runPromise:F}=mt(ce,i.defaultLayer);async function K(c){return F(C=>C.get(c))}i.get=K,t(K,"get");async function l(){return F(c=>c.all())}i.all=l,t(l,"all");async function v(c,C){return F(E=>E.set(c,C))}i.set=v,t(v,"set");async function u(c){return F(C=>C.remove(c))}i.remove=u,t(u,"remove")})(_n||={});var br;(B=>{let e=Ie.state(()=>({...process.env}));function r(ce){return e()[ce]}B.get=r,t(r,"get");function s(){return e()}B.all=s,t(s,"all");function w(ce,W){let I=e();I[ce]=W}B.set=w,t(w,"set");function p(ce){let W=e();delete W[ce]}B.remove=p,t(p,"remove")})(br||={});import{applyEdits as Ti,modify as Ci,parse as Di,printParseErrorCode as ji}from"jsonc-parser";import G from"path";import Yo from"os";import{text as Xo}from"node:stream/consumers";import Ee from"fs/promises";import Qr from"path";var Ot;(r=>{async function e(s,w){if(process.platform==="win32"){let p=Qr.resolve(s),B=Qr.resolve(w),ce=`$global:ProgressPreference = 'SilentlyContinue'; Expand-Archive -Path '${p}' -DestinationPath '${B}' -Force`;await Ve.run(["powershell","-NoProfile","-NonInteractive","-Command",ce]);return}await Ve.run(["unzip","-o","-q",s,"-d",w])}r.extractZip=e,t(e,"extractZip")})(Ot||={});import{createRequire as Go}from"node:module";import Ko from"node:path";var cn;(r=>{function e(s,w){try{return Go(Ko.join(w,"package.json")).resolve(s)}catch{}}r.resolve=e,t(e,"resolve")})(cn||={});function me(e,r,s){let w=Array.isArray(r)?[...r]:[],p=Array.isArray(r)?s:r,B=Ve.spawn([e,...w],{...p??{},stdin:"pipe",stdout:"pipe",stderr:"pipe"});if(!B.stdin||!B.stdout||!B.stderr)throw new Error("Process output not available");return B}t(me,"spawn");import eo from"semver";import to from"zod";import $t from"path";import{readdir as Vo,rm as Zo}from"fs/promises";import{Arborist as no}from"@npmcli/arborist";var st;(K=>{let e=Xe.create({service:"npm"}),r=process.platform==="win32"?new Set(["<",">",":",'"',"|","?","*"]):void 0;K.InstallFailedError=ft.create("NpmInstallFailedError",to.object({pkg:to.string()}));function w(l){return r?Array.from(l,v=>r.has(v)||v.charCodeAt(0)<32?"_":v).join(""):l}K.sanitize=w,t(w,"sanitize");function p(l){return $t.join(z.Path.cache,"packages",w(l))}t(p,"directory");function B(l,v){let u;try{u=typeof Bun<"u"?import.meta.resolve(l,v):import.meta.resolve(v)}catch{}return{directory:v,entrypoint:u}}t(B,"resolveEntryPoint");async function ce(l,v){let u=await fetch(`https://registry.npmjs.org/${l}`);if(!u.ok)return e.warn("Failed to resolve latest version, using cached",{pkg:l,cachedVersion:v}),!1;let c=(await u.json())?.["dist-tags"]?.latest;return c?/[\s^~*xX<>|=]/.test(v)?!eo.satisfies(c,v):eo.lt(v,c):(e.warn("No latest version found, using cached",{pkg:l,cachedVersion:v}),!1)}K.outdated=ce,t(ce,"outdated");async function W(l){var b=[];try{let v=p(l);let u=Kt(b,await Ft.acquire(`npm-install:${L.resolve(v)}`),!0);e.info("installing package",{pkg:l});let i=new no({path:v,binLinks:!0,progress:!1,savePrefix:"",ignoreScripts:!0});let c=await i.loadVirtual().catch(()=>{});if(c){let oe=c.edgesOut.values().next().value?.to;if(oe)return B(oe.name,oe.path)}let C=await i.reify({add:[l],save:!0,saveType:"prod"}).catch(oe=>{throw new K.InstallFailedError({pkg:l},{cause:oe})});let E=C.edgesOut.values().next().value?.to;if(!E)throw new K.InstallFailedError({pkg:l});return B(E.name,E.path)}catch(x){var P=x,V=!0}finally{var se=Vt(b,P,V);se&&await se}}K.add=W,t(W,"add");async function I(l){var x=[];try{let v=Kt(x,await Ft.acquire(`npm-install:${l}`),!0);e.info("checking dependencies",{dir:l});let u=t(async()=>{await new no({path:l,binLinks:!0,progress:!1,savePrefix:"",ignoreScripts:!0}).reify().catch(()=>{})},"reify");if(!await L.exists($t.join(l,"node_modules"))){e.info("node_modules missing, reifying"),await u();return}let i=await L.readJson($t.join(l,"package.json")).catch(()=>({}));let c=await L.readJson($t.join(l,"package-lock.json")).catch(()=>({}));let C=new Set([...Object.keys(i.dependencies||{}),...Object.keys(i.devDependencies||{}),...Object.keys(i.peerDependencies||{}),...Object.keys(i.optionalDependencies||{})]);let E=c.packages?.[""]||{};let b=new Set([...Object.keys(E.dependencies||{}),...Object.keys(E.devDependencies||{}),...Object.keys(E.peerDependencies||{}),...Object.keys(E.optionalDependencies||{})]);for(let Z of C)if(!b.has(Z)){e.info("dependency not in lock file, reifying",{name:Z}),await u();return}e.info("dependencies in sync")}catch(P){var V=P,se=!0}finally{var oe=Vt(x,V,se);oe&&await oe}}K.install=I,t(I,"install");async function F(l){let v=p(l),u=$t.join(v,"node_modules",".bin"),i=t(async()=>{let E=await Vo(u).catch(()=>[]);if(E.length===0)return;if(E.length===1)return E[0];let b=await L.readJson($t.join(v,"node_modules",l,"package.json")).catch(()=>{});if(b?.bin){let x=l.startsWith("@")?l.split("/")[1]:l,P=b.bin;if(typeof P=="string")return x;let V=Object.keys(P);return V.length===1?V[0]:P[x]?x:V[0]}return E[0]},"pick"),c=await i();if(c)return $t.join(u,c);await Zo($t.join(v,"package-lock.json"),{force:!0}),await W(l);let C=await i();if(C)return $t.join(u,C)}K.which=F,t(F,"which")})(st||={});var wr;(te=>{let e=Xe.create({service:"lsp.server"}),r=t(async d=>Ee.stat(d).then(()=>!0).catch(()=>!1),"pathExists"),s=t((d,o={})=>Ve.run(d,{...o,nothrow:!0}),"run"),w=t((d,o={})=>Ve.text(d,{...o,nothrow:!0}),"output"),p=t((d,o)=>async m=>{if(o){let $=L.up({targets:o,start:G.dirname(m),stop:Ie.directory}),X=await $.next();if(await $.return(),X.value)return}let j=L.up({targets:d,start:G.dirname(m),stop:Ie.directory}),_=await j.next();return await j.return(),_.value?G.dirname(_.value):Ie.directory},"NearestRoot");te.Deno={id:"deno",root:t(async d=>{let o=L.up({targets:["deno.json","deno.jsonc"],start:G.dirname(d),stop:Ie.directory}),m=await o.next();if(await o.return(),!!m.value)return G.dirname(m.value)},"root"),extensions:[".ts",".tsx",".js",".jsx",".mjs"],async spawn(d){let o=pe("deno");if(!o){e.info("deno not found, please install deno first");return}return{process:me(o,["lsp"],{cwd:d})}}},te.Typescript={id:"typescript",root:p(["package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock"],["deno.json","deno.jsonc"]),extensions:[".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts"],async spawn(d){let o=cn.resolve("typescript/lib/tsserver.js",Ie.directory);if(e.info("typescript server",{tsserver:o}),!o)return;let m=await st.which("typescript-language-server");if(!m)return;let j=["--stdio","--tsserver-log-verbosity","off","--tsserver-path",o];return!await r(G.join(d,"tsconfig.json"))&&!await r(G.join(d,"jsconfig.json"))&&j.push("--ignore-node-modules"),{process:me(m,j,{cwd:d,env:{...process.env}}),initialization:{tsserver:{path:o}}}}},te.Vue={id:"vue",extensions:[".vue"],root:p(["package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock"]),async spawn(d){let o=pe("vue-language-server"),m=[];if(!o){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;let _=await st.which("@vue/language-server");if(!_)return;o=_}return m.push("--stdio"),{process:me(o,m,{cwd:d,env:{...process.env}}),initialization:{}}}},te.ESLint={id:"eslint",root:p(["package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock"]),extensions:[".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts",".vue"],async spawn(d){if(!cn.resolve("eslint",Ie.directory))return;e.info("spawning eslint server");let m=G.join(z.Path.bin,"vscode-eslint","server","out","eslintServer.js");if(!await L.exists(m)){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;e.info("downloading and building VS Code ESLint server");let _=await fetch("https://github.com/microsoft/vscode-eslint/archive/refs/heads/main.zip");if(!_.ok)return;let $=G.join(z.Path.bin,"vscode-eslint.zip");if(_.body&&await L.writeStream($,_.body),!await Ot.extractZip($,z.Path.bin).then(()=>!0).catch(Ce=>(e.error("Failed to extract vscode-eslint archive",{error:Ce}),!1)))return;await Ee.rm($,{force:!0});let J=G.join(z.Path.bin,"vscode-eslint-main"),Y=G.join(z.Path.bin,"vscode-eslint");await Ee.stat(Y).catch(()=>{})&&(e.info("removing old eslint installation",{path:Y}),await Ee.rm(Y,{force:!0,recursive:!0})),await Ee.rename(J,Y);let fe=process.platform==="win32"?"npm.cmd":"npm";await Ve.run([fe,"install"],{cwd:Y}),await Ve.run([fe,"run","compile"],{cwd:Y}),e.info("installed VS Code ESLint server",{serverPath:m})}return{process:me("node",[m,"--stdio"],{cwd:d,env:{...process.env}})}}},te.Oxlint={id:"oxlint",root:p([".oxlintrc.json","package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock","package.json"]),extensions:[".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts",".vue",".astro",".svelte"],async spawn(d){let o=process.platform==="win32"?".cmd":"",m=G.join("node_modules",".bin","oxc_language_server"+o),j=G.join("node_modules",".bin","oxlint"+o),_=t(async J=>{let Y=G.join(d,J);if(await L.exists(Y))return Y;let ye=L.up({targets:[J],start:d,stop:Ie.worktree}),fe=await ye.next();if(await ye.return(),fe.value)return fe.value},"resolveBin"),$=await _(j);if(!$){let J=pe("oxlint");J&&($=J)}if($){let J=me($,["--help"]);if(await J.exited,J.stdout&&(await Xo(J.stdout)).includes("--lsp"))return{process:me($,["--lsp"],{cwd:d})}}let X=await _(m);if(!X){let J=pe("oxc_language_server");J&&(X=J)}if(X)return{process:me(X,[],{cwd:d})};e.info("oxlint not found, please install oxlint")}},te.Biome={id:"biome",root:p(["biome.json","biome.jsonc","package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock"]),extensions:[".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts",".json",".jsonc",".vue",".astro",".svelte",".css",".graphql",".gql",".html"],async spawn(d){let o=G.join(d,"node_modules",".bin","biome"),m;if(await L.exists(o)&&(m=o),!m){let $=pe("biome");$&&(m=$)}let j=["lsp-proxy","--stdio"];if(!m){if(!cn.resolve("biome",d)||(m=await st.which("biome"),!m))return;j=["lsp-proxy","--stdio"]}return{process:me(m,j,{cwd:d,env:{...process.env}})}}},te.Gopls={id:"gopls",root:t(async d=>{let o=await p(["go.work"])(d);return o||p(["go.mod","go.sum"])(d)},"root"),extensions:[".go"],async spawn(d){let o=pe("gopls");if(!o){if(!pe("go")||ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;if(e.info("installing gopls"),await Ve.spawn(["go","install","golang.org/x/tools/gopls@latest"],{env:{...process.env,GOBIN:z.Path.bin},stdout:"pipe",stderr:"pipe",stdin:"pipe"}).exited!==0){e.error("Failed to install gopls");return}o=G.join(z.Path.bin,"gopls"+(process.platform==="win32"?".exe":"")),e.info("installed gopls",{bin:o})}return{process:me(o,{cwd:d})}}},te.Rubocop={id:"ruby-lsp",root:p(["Gemfile"]),extensions:[".rb",".rake",".gemspec",".ru"],async spawn(d){let o=pe("rubocop");if(!o){let m=pe("ruby"),j=pe("gem");if(!m||!j){e.info("Ruby not found, please install Ruby first");return}if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;if(e.info("installing rubocop"),await Ve.spawn(["gem","install","rubocop","--bindir",z.Path.bin],{stdout:"pipe",stderr:"pipe",stdin:"pipe"}).exited!==0){e.error("Failed to install rubocop");return}o=G.join(z.Path.bin,"rubocop"+(process.platform==="win32"?".exe":"")),e.info("installed rubocop",{bin:o})}return{process:me(o,["--lsp"],{cwd:d})}}},te.Ty={id:"ty",extensions:[".py",".pyi"],root:p(["pyproject.toml","ty.toml","setup.py","setup.cfg","requirements.txt","Pipfile","pyrightconfig.json"]),async spawn(d){if(!ae.OPENCODE_EXPERIMENTAL_LSP_TY)return;let o=pe("ty"),m={},j=[process.env.VIRTUAL_ENV,G.join(d,".venv"),G.join(d,"venv")].filter($=>$!==void 0);for(let $ of j){let J=process.platform==="win32"?G.join($,"Scripts","python.exe"):G.join($,"bin","python");if(await L.exists(J)){m.pythonPath=J;break}}if(!o)for(let $ of j){let J=process.platform==="win32"?G.join($,"Scripts","ty.exe"):G.join($,"bin","ty");if(await L.exists(J)){o=J;break}}if(!o){e.error("ty not found, please install ty first");return}return{process:me(o,["server"],{cwd:d}),initialization:m}}},te.Pyright={id:"pyright",extensions:[".py",".pyi"],root:p(["pyproject.toml","setup.py","setup.cfg","requirements.txt","Pipfile","pyrightconfig.json"]),async spawn(d){let o=pe("pyright-langserver"),m=[];if(!o){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;let X=await st.which("pyright");if(!X)return;o=X}m.push("--stdio");let j={},_=[process.env.VIRTUAL_ENV,G.join(d,".venv"),G.join(d,"venv")].filter(X=>X!==void 0);for(let X of _){let Y=process.platform==="win32"?G.join(X,"Scripts","python.exe"):G.join(X,"bin","python");if(await L.exists(Y)){j.pythonPath=Y;break}}return{process:me(o,m,{cwd:d,env:{...process.env}}),initialization:j}}},te.ElixirLS={id:"elixir-ls",extensions:[".ex",".exs"],root:p(["mix.exs","mix.lock"]),async spawn(d){let o=pe("elixir-ls");if(!o){let m=G.join(z.Path.bin,"elixir-ls");if(o=G.join(z.Path.bin,"elixir-ls-master","release",process.platform==="win32"?"language_server.bat":"language_server.sh"),!await L.exists(o)){if(!pe("elixir")){e.error("elixir is required to run elixir-ls");return}if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;e.info("downloading elixir-ls from GitHub releases");let _=await fetch("https://github.com/elixir-lsp/elixir-ls/archive/refs/heads/master.zip");if(!_.ok)return;let $=G.join(z.Path.bin,"elixir-ls.zip");if(_.body&&await L.writeStream($,_.body),!await Ot.extractZip($,z.Path.bin).then(()=>!0).catch(ye=>(e.error("Failed to extract elixir-ls archive",{error:ye}),!1)))return;await Ee.rm($,{force:!0,recursive:!0});let J=G.join(z.Path.bin,"elixir-ls-master"),Y={MIX_ENV:"prod",...process.env};await Ve.run(["mix","deps.get"],{cwd:J,env:Y}),await Ve.run(["mix","compile"],{cwd:J,env:Y}),await Ve.run(["mix","elixir_ls.release2","-o","release"],{cwd:J,env:Y}),e.info("installed elixir-ls",{path:m})}}return{process:me(o,{cwd:d})}}},te.Zls={id:"zls",extensions:[".zig",".zon"],root:p(["build.zig"]),async spawn(d){let o=pe("zls");if(!o){if(!pe("zig")){e.error("Zig is required to use zls. Please install Zig first.");return}if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;e.info("downloading zls from GitHub releases");let j=await fetch("https://api.github.com/repos/zigtools/zls/releases/latest");if(!j.ok){e.error("Failed to fetch zls release info");return}let _=await j.json(),$=process.platform,X=process.arch,J="",Y=X;X==="arm64"?Y="aarch64":X==="x64"?Y="x86_64":X==="ia32"&&(Y="x86");let ye=$;$==="darwin"?ye="macos":$==="win32"&&(ye="windows");let fe=$==="win32"?"zip":"tar.xz";if(J=`zls-${Y}-${ye}.${fe}`,!["zls-x86_64-linux.tar.xz","zls-x86_64-macos.tar.xz","zls-x86_64-windows.zip","zls-aarch64-linux.tar.xz","zls-aarch64-macos.tar.xz","zls-aarch64-windows.zip","zls-x86-linux.tar.xz","zls-x86-windows.zip"].includes(J)){e.error(`Platform ${$} and architecture ${X} is not supported by zls`);return}let ke=_.assets.find(Ue=>Ue.name===J);if(!ke){e.error(`Could not find asset ${J} in latest zls release`);return}let Pe=ke.browser_download_url,Me=await fetch(Pe);if(!Me.ok){e.error("Failed to download zls");return}let je=G.join(z.Path.bin,J);if(Me.body&&await L.writeStream(je,Me.body),fe==="zip"){if(!await Ot.extractZip(je,z.Path.bin).then(()=>!0).catch(kt=>(e.error("Failed to extract zls archive",{error:kt}),!1)))return}else await s(["tar","-xf",je],{cwd:z.Path.bin});if(await Ee.rm(je,{force:!0}),o=G.join(z.Path.bin,"zls"+($==="win32"?".exe":"")),!await L.exists(o)){e.error("Failed to extract zls binary");return}$!=="win32"&&await Ee.chmod(o,493).catch(()=>{}),e.info("installed zls",{bin:o})}return{process:me(o,{cwd:d})}}},te.CSharp={id:"csharp",root:p([".slnx",".sln",".csproj","global.json"]),extensions:[".cs"],async spawn(d){let o=pe("csharp-ls");if(!o){if(!pe("dotnet")){e.error(".NET SDK is required to install csharp-ls");return}if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;if(e.info("installing csharp-ls via dotnet tool"),await Ve.spawn(["dotnet","tool","install","csharp-ls","--tool-path",z.Path.bin],{stdout:"pipe",stderr:"pipe",stdin:"pipe"}).exited!==0){e.error("Failed to install csharp-ls");return}o=G.join(z.Path.bin,"csharp-ls"+(process.platform==="win32"?".exe":"")),e.info("installed csharp-ls",{bin:o})}return{process:me(o,{cwd:d})}}},te.FSharp={id:"fsharp",root:p([".slnx",".sln",".fsproj","global.json"]),extensions:[".fs",".fsi",".fsx",".fsscript"],async spawn(d){let o=pe("fsautocomplete");if(!o){if(!pe("dotnet")){e.error(".NET SDK is required to install fsautocomplete");return}if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;if(e.info("installing fsautocomplete via dotnet tool"),await Ve.spawn(["dotnet","tool","install","fsautocomplete","--tool-path",z.Path.bin],{stdout:"pipe",stderr:"pipe",stdin:"pipe"}).exited!==0){e.error("Failed to install fsautocomplete");return}o=G.join(z.Path.bin,"fsautocomplete"+(process.platform==="win32"?".exe":"")),e.info("installed fsautocomplete",{bin:o})}return{process:me(o,{cwd:d})}}},te.SourceKit={id:"sourcekit-lsp",extensions:[".swift",".objc","objcpp"],root:p(["Package.swift","*.xcodeproj","*.xcworkspace"]),async spawn(d){let o=pe("sourcekit-lsp");if(o)return{process:me(o,{cwd:d})};if(!pe("xcrun"))return;let m=await w(["xcrun","--find","sourcekit-lsp"]);if(m.code!==0)return;let j=m.text.trim();return{process:me(j,{cwd:d})}}},te.RustAnalyzer={id:"rust",root:t(async d=>{let o=await p(["Cargo.toml","Cargo.lock"])(d);if(o===void 0)return;let m=o;for(;m!==G.dirname(m);){let j=G.join(m,"Cargo.toml");try{if((await L.readText(j)).includes("[workspace]"))return m}catch{}let _=G.dirname(m);if(_===m||(m=_,!m.startsWith(Ie.worktree)))break}return o},"root"),extensions:[".rs"],async spawn(d){let o=pe("rust-analyzer");if(!o){e.info("rust-analyzer not found in path, please install it");return}return{process:me(o,{cwd:d})}}},te.Clangd={id:"clangd",root:p(["compile_commands.json","compile_flags.txt",".clangd","CMakeLists.txt","Makefile"]),extensions:[".c",".cpp",".cc",".cxx",".c++",".h",".hpp",".hh",".hxx",".h++"],async spawn(d){let o=["--background-index","--clang-tidy"],m=pe("clangd");if(m)return{process:me(m,o,{cwd:d})};let j=process.platform==="win32"?".exe":"",_=G.join(z.Path.bin,"clangd"+j);if(await L.exists(_))return{process:me(_,o,{cwd:d})};let $=await Ee.readdir(z.Path.bin,{withFileTypes:!0}).catch(()=>[]);for(let A of $){if(!A.isDirectory()||!A.name.startsWith("clangd_"))continue;let q=G.join(z.Path.bin,A.name,"bin","clangd"+j);if(await L.exists(q))return{process:me(q,o,{cwd:d})}}if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;e.info("downloading clangd from GitHub releases");let X=await fetch("https://api.github.com/repos/clangd/clangd/releases/latest");if(!X.ok){e.error("Failed to fetch clangd release info");return}let J=await X.json(),Y=J.tag_name;if(!Y){e.error("clangd release did not include a tag name");return}let ye=process.platform,Ce={darwin:"mac",linux:"linux",win32:"windows"}[ye];if(!Ce){e.error(`Platform ${ye} is not supported by clangd auto-download`);return}let ke=J.assets??[],Pe=t(A=>!A.name||!A.browser_download_url||!A.name.includes(Ce)?!1:A.name.includes(Y),"valid"),Me=ke.find(A=>Pe(A)&&A.name?.endsWith(".zip"))??ke.find(A=>Pe(A)&&A.name?.endsWith(".tar.xz"))??ke.find(A=>Pe(A));if(!Me?.name||!Me.browser_download_url){e.error("clangd could not match release asset",{tag:Y,platform:ye});return}let je=Me.name,Ue=await fetch(Me.browser_download_url);if(!Ue.ok){e.error("Failed to download clangd");return}let kt=G.join(z.Path.bin,je),ht=await Ue.arrayBuffer();if(ht.byteLength===0){e.error("Failed to write clangd archive");return}await L.write(kt,Buffer.from(ht));let k=je.endsWith(".zip"),h=je.endsWith(".tar.xz");if(!k&&!h){e.error("clangd encountered unsupported asset",{asset:je});return}if(k&&!await Ot.extractZip(kt,z.Path.bin).then(()=>!0).catch(q=>(e.error("Failed to extract clangd archive",{error:q}),!1)))return;h&&await s(["tar","-xf",kt],{cwd:z.Path.bin}),await Ee.rm(kt,{force:!0});let N=G.join(z.Path.bin,"clangd_"+Y,"bin","clangd"+j);if(!await L.exists(N)){e.error("Failed to extract clangd binary");return}return ye!=="win32"&&await Ee.chmod(N,493).catch(()=>{}),await Ee.unlink(G.join(z.Path.bin,"clangd")).catch(()=>{}),await Ee.symlink(N,G.join(z.Path.bin,"clangd")).catch(()=>{}),e.info("installed clangd",{bin:N}),{process:me(N,o,{cwd:d})}}},te.Svelte={id:"svelte",extensions:[".svelte"],root:p(["package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock"]),async spawn(d){let o=pe("svelteserver"),m=[];if(!o){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;let _=await st.which("svelte-language-server");if(!_)return;o=_}return m.push("--stdio"),{process:me(o,m,{cwd:d,env:{...process.env}}),initialization:{}}}},te.Astro={id:"astro",extensions:[".astro"],root:p(["package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock"]),async spawn(d){let o=cn.resolve("typescript/lib/tsserver.js",Ie.directory);if(!o){e.info("typescript not found, required for Astro language server");return}let m=G.dirname(o),j=pe("astro-ls"),_=[];if(!j){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;let X=await st.which("@astrojs/language-server");if(!X)return;j=X}return _.push("--stdio"),{process:me(j,_,{cwd:d,env:{...process.env}}),initialization:{typescript:{tsdk:m}}}}},te.JDTLS={id:"jdtls",root:t(async d=>{let o=["settings.gradle","settings.gradle.kts"],m=["gradlew","gradlew.bat"],j=m.concat(o),[_,$,X]=await Promise.all([p(["pom.xml","build.gradle","build.gradle.kts",".project",".classpath"],j)(d),p(m,o)(d),p(o)(d)]);if(_)return _;if($)return $;if(X)return X},"root"),extensions:[".java"],async spawn(d){let o=pe("java");if(!o){e.error("Java 21 or newer is required to run the JDTLS. Please install it first.");return}let m=await s(["java","-version"]).then(fe=>{let Ce=/"(\d+)\.\d+\.\d+"/.exec(fe.stderr.toString());return Ce?parseInt(Ce[1]):void 0});if(m==null||m<21){e.error("JDTLS requires at least Java 21.");return}let j=G.join(z.Path.bin,"jdtls"),_=G.join(j,"plugins");if(!await r(_)){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;e.info("Downloading JDTLS LSP server."),await Ee.mkdir(j,{recursive:!0});let fe="https://www.eclipse.org/downloads/download.php?file=/jdtls/snapshots/jdt-language-server-latest.tar.gz",Ce="release.tar.gz";e.info("Downloading JDTLS archive",{url:fe,dest:j});let ke=await fetch(fe);if(!ke.ok||!ke.body){e.error("Failed to download JDTLS",{status:ke.status,statusText:ke.statusText});return}await L.writeStream(G.join(j,Ce),ke.body),e.info("Extracting JDTLS archive");let Pe=await s(["tar","-xzf",Ce],{cwd:j});if(Pe.code!==0){e.error("Failed to extract JDTLS",{exitCode:Pe.code,stderr:Pe.stderr.toString()});return}await Ee.rm(G.join(j,Ce),{force:!0}),e.info("JDTLS download and extraction completed")}let X=(await Ee.readdir(_).catch(()=>[])).find(fe=>/^org\.eclipse\.equinox\.launcher_.*\.jar$/.test(fe))?.trim()??"",J=G.join(_,X);if(!await r(J)){e.error(`Failed to locate the JDTLS launcher module in the installed directory: ${j}.`);return}let Y=G.join(j,(()=>{switch(process.platform){case"darwin":return"config_mac";case"linux":return"config_linux";case"win32":return"config_win";default:return"config_linux"}})()),ye=await Ee.mkdtemp(G.join(Yo.tmpdir(),"opencode-jdtls-data"));return{process:me(o,["-jar",J,"-configuration",Y,"-data",ye,"-Declipse.application=org.eclipse.jdt.ls.core.id1","-Dosgi.bundles.defaultStartLevel=4","-Declipse.product=org.eclipse.jdt.ls.core.product","-Dlog.level=ALL","--add-modules=ALL-SYSTEM","--add-opens java.base/java.util=ALL-UNNAMED","--add-opens java.base/java.lang=ALL-UNNAMED"],{cwd:d})}}},te.KotlinLS={id:"kotlin-ls",extensions:[".kt",".kts"],root:t(async d=>{let o=await p(["settings.gradle.kts","settings.gradle"])(d);if(o)return o;let m=await p(["gradlew","gradlew.bat"])(d);if(m)return m;let j=await p(["build.gradle.kts","build.gradle"])(d);return j||p(["pom.xml"])(d)},"root"),async spawn(d){let o=G.join(z.Path.bin,"kotlin-ls"),m=process.platform==="win32"?G.join(o,"kotlin-lsp.cmd"):G.join(o,"kotlin-lsp.sh");if(!await L.exists(m)){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;e.info("Downloading Kotlin Language Server from GitHub.");let _=await fetch("https://api.github.com/repos/Kotlin/kotlin-lsp/releases/latest");if(!_.ok){e.error("Failed to fetch kotlin-lsp release info");return}let X=(await _.json()).name?.replace(/^v/,"");if(!X){e.error("Could not determine Kotlin LSP version from release");return}let J=process.platform,Y=process.arch,ye=Y;Y==="arm64"?ye="aarch64":Y==="x64"&&(ye="x64");let fe=J;J==="darwin"?fe="mac":J==="linux"?fe="linux":J==="win32"&&(fe="win");let Ce=["mac-x64","mac-aarch64","linux-x64","linux-aarch64","win-x64","win-aarch64"],ke=`${fe}-${ye}`;if(!Ce.includes(ke)){e.error(`Platform ${J}/${Y} is not supported by Kotlin LSP`);return}let Pe=`kotlin-lsp-${X}-${fe}-${ye}.zip`,Me=`https://download-cdn.jetbrains.com/kotlin-lsp/${X}/${Pe}`;await Ee.mkdir(o,{recursive:!0});let je=G.join(o,"kotlin-ls.zip"),Ue=await fetch(Me);if(!Ue.ok||!Ue.body){e.error("Failed to download Kotlin Language Server",{status:Ue.status,statusText:Ue.statusText});return}if(await L.writeStream(je,Ue.body),!await Ot.extractZip(je,o).then(()=>!0).catch(ht=>(e.error("Failed to extract Kotlin LS archive",{error:ht}),!1)))return;await Ee.rm(je,{force:!0}),process.platform!=="win32"&&await Ee.chmod(m,493).catch(()=>{}),e.info("Installed Kotlin Language Server",{path:m})}if(!await L.exists(m)){e.error(`Failed to locate the Kotlin LS launcher script in the installed directory: ${o}.`);return}return{process:me(m,["--stdio"],{cwd:d})}}},te.YamlLS={id:"yaml-ls",extensions:[".yaml",".yml"],root:p(["package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock"]),async spawn(d){let o=pe("yaml-language-server"),m=[];if(!o){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;let _=await st.which("yaml-language-server");if(!_)return;o=_}return m.push("--stdio"),{process:me(o,m,{cwd:d,env:{...process.env}})}}},te.LuaLS={id:"lua-ls",root:p([".luarc.json",".luarc.jsonc",".luacheckrc",".stylua.toml","stylua.toml","selene.toml","selene.yml"]),extensions:[".lua"],async spawn(d){let o=pe("lua-language-server");if(!o){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;e.info("downloading lua-language-server from GitHub releases");let m=await fetch("https://api.github.com/repos/LuaLS/lua-language-server/releases/latest");if(!m.ok){e.error("Failed to fetch lua-language-server release info");return}let j=await m.json(),_=process.platform,$=process.arch,X="",J=$;$==="arm64"?J="arm64":$==="x64"?J="x64":$==="ia32"&&(J="ia32");let Y=_;_==="darwin"?Y="darwin":_==="linux"?Y="linux":_==="win32"&&(Y="win32");let ye=_==="win32"?"zip":"tar.gz";X=`lua-language-server-${j.tag_name}-${Y}-${J}.${ye}`;let fe=["darwin-arm64.tar.gz","darwin-x64.tar.gz","linux-x64.tar.gz","linux-arm64.tar.gz","win32-x64.zip","win32-ia32.zip"],Ce=`${Y}-${J}.${ye}`;if(!fe.includes(Ce)){e.error(`Platform ${_} and architecture ${$} is not supported by lua-language-server`);return}let ke=j.assets.find(ht=>ht.name===X);if(!ke){e.error(`Could not find asset ${X} in latest lua-language-server release`);return}let Pe=ke.browser_download_url,Me=await fetch(Pe);if(!Me.ok){e.error("Failed to download lua-language-server");return}let je=G.join(z.Path.bin,X);Me.body&&await L.writeStream(je,Me.body);let Ue=G.join(z.Path.bin,`lua-language-server-${J}-${Y}`);if(await Ee.stat(Ue).catch(()=>{})&&await Ee.rm(Ue,{force:!0,recursive:!0}),await Ee.mkdir(Ue,{recursive:!0}),ye==="zip"){if(!await Ot.extractZip(je,Ue).then(()=>!0).catch(k=>(e.error("Failed to extract lua-language-server archive",{error:k}),!1)))return}else if(!await s(["tar","-xzf",je,"-C",Ue]).then(k=>k.code===0).catch(k=>(e.error("Failed to extract lua-language-server archive",{error:k}),!1)))return;if(await Ee.rm(je,{force:!0}),o=G.join(Ue,"bin","lua-language-server"+(_==="win32"?".exe":"")),!await L.exists(o)){e.error("Failed to extract lua-language-server binary");return}if(_!=="win32"&&!await Ee.chmod(o,493).then(()=>!0).catch(k=>(e.error("Failed to set executable permission for lua-language-server binary",{error:k}),!1)))return;e.info("installed lua-language-server",{bin:o})}return{process:me(o,{cwd:d})}}},te.PHPIntelephense={id:"php intelephense",extensions:[".php"],root:p(["composer.json","composer.lock",".php-version"]),async spawn(d){let o=pe("intelephense"),m=[];if(!o){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;let _=await st.which("intelephense");if(!_)return;o=_}return m.push("--stdio"),{process:me(o,m,{cwd:d,env:{...process.env}}),initialization:{telemetry:{enabled:!1}}}}},te.Prisma={id:"prisma",extensions:[".prisma"],root:p(["schema.prisma","prisma/schema.prisma","prisma"],["package.json"]),async spawn(d){let o=pe("prisma");if(!o){e.info("prisma not found, please install prisma");return}return{process:me(o,["language-server"],{cwd:d})}}},te.Dart={id:"dart",extensions:[".dart"],root:p(["pubspec.yaml","analysis_options.yaml"]),async spawn(d){let o=pe("dart");if(!o){e.info("dart not found, please install dart first");return}return{process:me(o,["language-server","--lsp"],{cwd:d})}}},te.Ocaml={id:"ocaml-lsp",extensions:[".ml",".mli"],root:p(["dune-project","dune-workspace",".merlin","opam"]),async spawn(d){let o=pe("ocamllsp");if(!o){e.info("ocamllsp not found, please install ocaml-lsp-server");return}return{process:me(o,{cwd:d})}}},te.BashLS={id:"bash",extensions:[".sh",".bash",".zsh",".ksh"],root:t(async()=>Ie.directory,"root"),async spawn(d){let o=pe("bash-language-server"),m=[];if(!o){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;let _=await st.which("bash-language-server");if(!_)return;o=_}return m.push("start"),{process:me(o,m,{cwd:d,env:{...process.env}})}}},te.TerraformLS={id:"terraform",extensions:[".tf",".tfvars"],root:p([".terraform.lock.hcl","terraform.tfstate","*.tf"]),async spawn(d){let o=pe("terraform-ls");if(!o){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;e.info("downloading terraform-ls from HashiCorp releases");let m=await fetch("https://api.releases.hashicorp.com/v1/releases/terraform-ls/latest");if(!m.ok){e.error("Failed to fetch terraform-ls release info");return}let j=await m.json(),_=process.platform,X=process.arch==="arm64"?"arm64":"amd64",J=_==="win32"?"windows":_,ye=(j.builds??[]).find(Pe=>Pe.arch===X&&Pe.os===J);if(!ye?.url){e.error(`Could not find build for ${J}/${X} terraform-ls release version ${j.version}`);return}let fe=await fetch(ye.url);if(!fe.ok){e.error("Failed to download terraform-ls");return}let Ce=G.join(z.Path.bin,"terraform-ls.zip");if(fe.body&&await L.writeStream(Ce,fe.body),!await Ot.extractZip(Ce,z.Path.bin).then(()=>!0).catch(Pe=>(e.error("Failed to extract terraform-ls archive",{error:Pe}),!1)))return;if(await Ee.rm(Ce,{force:!0}),o=G.join(z.Path.bin,"terraform-ls"+(_==="win32"?".exe":"")),!await L.exists(o)){e.error("Failed to extract terraform-ls binary");return}_!=="win32"&&await Ee.chmod(o,493).catch(()=>{}),e.info("installed terraform-ls",{bin:o})}return{process:me(o,["serve"],{cwd:d}),initialization:{experimentalFeatures:{prefillRequiredFields:!0,validateOnSave:!0}}}}},te.TexLab={id:"texlab",extensions:[".tex",".bib"],root:p([".latexmkrc","latexmkrc",".texlabroot","texlabroot"]),async spawn(d){let o=pe("texlab");if(!o){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;e.info("downloading texlab from GitHub releases");let m=await fetch("https://api.github.com/repos/latex-lsp/texlab/releases/latest");if(!m.ok){e.error("Failed to fetch texlab release info");return}let j=await m.json();if(!j.tag_name?.replace("v","")){e.error("texlab release did not include a version tag");return}let $=process.platform,J=process.arch==="arm64"?"aarch64":"x86_64",Y=$==="darwin"?"macos":$==="win32"?"windows":"linux",ye=$==="win32"?"zip":"tar.gz",fe=`texlab-${J}-${Y}.${ye}`,ke=(j.assets??[]).find(je=>je.name===fe);if(!ke?.browser_download_url){e.error(`Could not find asset ${fe} in texlab release`);return}let Pe=await fetch(ke.browser_download_url);if(!Pe.ok){e.error("Failed to download texlab");return}let Me=G.join(z.Path.bin,fe);if(Pe.body&&await L.writeStream(Me,Pe.body),ye==="zip"&&!await Ot.extractZip(Me,z.Path.bin).then(()=>!0).catch(Ue=>(e.error("Failed to extract texlab archive",{error:Ue}),!1)))return;if(ye==="tar.gz"&&await s(["tar","-xzf",Me],{cwd:z.Path.bin}),await Ee.rm(Me,{force:!0}),o=G.join(z.Path.bin,"texlab"+($==="win32"?".exe":"")),!await L.exists(o)){e.error("Failed to extract texlab binary");return}$!=="win32"&&await Ee.chmod(o,493).catch(()=>{}),e.info("installed texlab",{bin:o})}return{process:me(o,{cwd:d})}}},te.DockerfileLS={id:"dockerfile",extensions:[".dockerfile","Dockerfile"],root:t(async()=>Ie.directory,"root"),async spawn(d){let o=pe("docker-langserver"),m=[];if(!o){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;let _=await st.which("dockerfile-language-server-nodejs");if(!_)return;o=_}return m.push("--stdio"),{process:me(o,m,{cwd:d,env:{...process.env}})}}},te.Gleam={id:"gleam",extensions:[".gleam"],root:p(["gleam.toml"]),async spawn(d){let o=pe("gleam");if(!o){e.info("gleam not found, please install gleam first");return}return{process:me(o,["lsp"],{cwd:d})}}},te.Clojure={id:"clojure-lsp",extensions:[".clj",".cljs",".cljc",".edn"],root:p(["deps.edn","project.clj","shadow-cljs.edn","bb.edn","build.boot"]),async spawn(d){let o=pe("clojure-lsp");if(!o&&process.platform==="win32"&&(o=pe("clojure-lsp.exe")),!o){e.info("clojure-lsp not found, please install clojure-lsp first");return}return{process:me(o,["listen"],{cwd:d})}}},te.Nixd={id:"nixd",extensions:[".nix"],root:t(async d=>{let o=await p(["flake.nix"])(d);return o&&o!==Ie.directory?o:Ie.worktree&&Ie.worktree!==Ie.directory?Ie.worktree:Ie.directory},"root"),async spawn(d){let o=pe("nixd");if(!o){e.info("nixd not found, please install nixd first");return}return{process:me(o,[],{cwd:d,env:{...process.env}})}}},te.Tinymist={id:"tinymist",extensions:[".typ",".typc"],root:p(["typst.toml"]),async spawn(d){let o=pe("tinymist");if(!o){if(ae.OPENCODE_DISABLE_LSP_DOWNLOAD)return;e.info("downloading tinymist from GitHub releases");let m=await fetch("https://api.github.com/repos/Myriad-Dreamin/tinymist/releases/latest");if(!m.ok){e.error("Failed to fetch tinymist release info");return}let j=await m.json(),_=process.platform,X=process.arch==="arm64"?"aarch64":"x86_64",J,Y;_==="darwin"?(J="apple-darwin",Y="tar.gz"):_==="win32"?(J="pc-windows-msvc",Y="zip"):(J="unknown-linux-gnu",Y="tar.gz");let ye=`tinymist-${X}-${J}.${Y}`,Ce=(j.assets??[]).find(Me=>Me.name===ye);if(!Ce?.browser_download_url){e.error(`Could not find asset ${ye} in tinymist release`);return}let ke=await fetch(Ce.browser_download_url);if(!ke.ok){e.error("Failed to download tinymist");return}let Pe=G.join(z.Path.bin,ye);if(ke.body&&await L.writeStream(Pe,ke.body),Y==="zip"){if(!await Ot.extractZip(Pe,z.Path.bin).then(()=>!0).catch(je=>(e.error("Failed to extract tinymist archive",{error:je}),!1)))return}else await s(["tar","-xzf",Pe,"--strip-components=1"],{cwd:z.Path.bin});if(await Ee.rm(Pe,{force:!0}),o=G.join(z.Path.bin,"tinymist"+(_==="win32"?".exe":"")),!await L.exists(o)){e.error("Failed to extract tinymist binary");return}_!=="win32"&&await Ee.chmod(o,493).catch(()=>{}),e.info("installed tinymist",{bin:o})}return{process:me(o,{cwd:d})}}},te.HLS={id:"haskell-language-server",extensions:[".hs",".lhs"],root:p(["stack.yaml","cabal.project","hie.yaml","*.cabal"]),async spawn(d){let o=pe("haskell-language-server-wrapper");if(!o){e.info("haskell-language-server-wrapper not found, please install haskell-language-server");return}return{process:me(o,["--lsp"],{cwd:d})}}},te.JuliaLS={id:"julials",extensions:[".jl"],root:p(["Project.toml","Manifest.toml","*.jl"]),async spawn(d){let o=pe("julia");if(!o){e.info("julia not found, please install julia first (https://julialang.org/downloads/)");return}return{process:me(o,["--startup-file=no","--history-file=no","-e","using LanguageServer; runserver()"],{cwd:d})}}}})(wr||={});import qn from"gray-matter";import{z as xr}from"zod";var zt;(I=>{I.FILE_REGEX=/(?<![\w`])@(\.?[^\s`,.]*(?:\.[^\s`,.]+)*)/g,I.SHELL_REGEX=/!`([^`]+)`/g;function s(F){return Array.from(F.matchAll(I.FILE_REGEX))}I.files=s,t(s,"files");function w(F){return Array.from(F.matchAll(I.SHELL_REGEX))}I.shell=w,t(w,"shell");function p(F){let K=F.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!K)return F;let l=K[1],v=l.split(/\r?\n/),u=[];for(let c of v){if(c.trim().startsWith("#")||c.trim()===""){u.push(c);continue}if(c.match(/^\s+/)){u.push(c);continue}let C=c.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\s*:\s*(.*)$/);if(!C){u.push(c);continue}let E=C[1],b=C[2].trim();if(b===""||b===">"||b==="|"||b.startsWith('"')||b.startsWith("'")){u.push(c);continue}if(b.includes(":")){u.push(`${E}: |-`),u.push(` ${b}`);continue}u.push(c)}let i=u.join(`
|
|
14
|
+
`);return F.replace(l,()=>i)}I.fallbackSanitization=p,t(p,"fallbackSanitization");async function B(F){let K=await L.readText(F);try{return qn(K)}catch{try{return qn(p(K))}catch(l){throw new I.FrontmatterError({path:F,message:`${F}: Failed to parse YAML frontmatter: ${l instanceof Error?l.message:String(l)}`},{cause:l})}}}I.parse=B,t(B,"parse");function ce(F,K){try{return qn(F)}catch{try{return qn(p(F))}catch(l){throw new I.FrontmatterError({path:K,message:`${K}: Failed to parse YAML frontmatter: ${l instanceof Error?l.message:String(l)}`},{cause:l})}}}I.parseText=ce,t(ce,"parseText"),I.FrontmatterError=ft.create("ConfigFrontmatterError",xr.object({path:xr.string(),message:xr.string()}))})(zt||={});import{constants as Ii,existsSync as cr}from"fs";import ro from"zod";import{Effect as rt,Exit as Qo,Layer as ei,PubSub as Jt,Scope as Gn,ServiceMap as ti,Stream as Ht}from"effect";var Wt;(F=>{let e=Xe.create({service:"bus"});F.InstanceDisposed=ot.define("server.instance.disposed",ro.object({directory:ro.string()}));class s extends ti.Service()("@opencode/Bus"){static{t(this,"Service")}}F.Service=s,F.layer=ei.effect(s,rt.gen(function*(){let K=yield*_e.make(rt.fn("Bus.state")(function*(b){let x=yield*Jt.unbounded(),P=new Map;return yield*rt.addFinalizer(()=>rt.gen(function*(){yield*Jt.publish(x,{type:F.InstanceDisposed.type,properties:{directory:b.directory}}),yield*Jt.shutdown(x);for(let V of P.values())yield*Jt.shutdown(V)})),{wildcard:x,typed:P}}));function l(b,x){return rt.gen(function*(){let P=b.typed.get(x.type);return P||(P=yield*Jt.unbounded(),b.typed.set(x.type,P)),P})}t(l,"getOrCreate");function v(b,x){return rt.gen(function*(){let P=yield*_e.get(K),V={type:b.type,properties:x};e.info("publishing",{type:b.type});let se=P.typed.get(b.type);se&&(yield*Jt.publish(se,V)),yield*Jt.publish(P.wildcard,V);let oe=yield*_e.directory;Ln.emit("event",{directory:oe,payload:V})})}t(v,"publish");function u(b){return e.info("subscribing",{type:b.type}),Ht.unwrap(rt.gen(function*(){let x=yield*_e.get(K),P=yield*l(x,b);return Ht.fromPubSub(P)})).pipe(Ht.ensuring(rt.sync(()=>e.info("unsubscribing",{type:b.type}))))}t(u,"subscribe");function i(){return e.info("subscribing",{type:"*"}),Ht.unwrap(rt.gen(function*(){let b=yield*_e.get(K);return Ht.fromPubSub(b.wildcard)})).pipe(Ht.ensuring(rt.sync(()=>e.info("unsubscribing",{type:"*"}))))}t(i,"subscribeAll");function c(b,x,P){return rt.gen(function*(){e.info("subscribing",{type:x});let V=yield*Gn.make(),se=yield*Gn.provide(V)(Jt.subscribe(b));return yield*Gn.provide(V)(Ht.fromSubscription(se).pipe(Ht.runForEach(oe=>rt.tryPromise({try:t(()=>Promise.resolve().then(()=>P(oe)),"try"),catch:t(Z=>{e.error("subscriber failed",{type:x,cause:Z})},"catch")}).pipe(rt.ignore)),rt.forkScoped)),()=>{e.info("unsubscribing",{type:x}),rt.runFork(Gn.close(V,Qo.void))}})}t(c,"on");let C=rt.fn("Bus.subscribeCallback")(function*(b,x){let P=yield*_e.get(K),V=yield*l(P,b);return yield*c(V,b.type,x)}),E=rt.fn("Bus.subscribeAllCallback")(function*(b){let x=yield*_e.get(K);return yield*c(x.wildcard,"*",b)});return s.of({publish:v,subscribe:u,subscribeAll:i,subscribeCallback:C,subscribeAllCallback:E})}));let{runPromise:p,runSync:B}=mt(s,F.layer);async function ce(K,l){return p(v=>v.publish(K,l))}F.publish=ce,t(ce,"publish");function W(K,l){return B(v=>v.subscribeCallback(K,l))}F.subscribe=W,t(W,"subscribe");function I(K){return B(l=>l.subscribeAllCallback(K))}F.subscribeAll=I,t(I,"subscribeAll")})(Wt||={});import oo from"zod";var io={Connected:ot.define("server.connected",oo.object({})),Disposed:ot.define("global.disposed",oo.object({}))};import{Cache as ao,Clock as Xn,Duration as tn,Effect as $e,Layer as Sr,Option as Je,Schema as De,SchemaGetter as co,ServiceMap as ai}from"effect";import{FetchHttpClient as ci,HttpClient as kr,HttpClientRequest as Qe,HttpClientResponse as en}from"effect/unstable/http";import{eq as yn}from"drizzle-orm";import{Effect as at,Layer as oi,Option as jn,Schema as ii,ServiceMap as si}from"effect";import{sqliteTable as vr,text as Tt,integer as Kn,primaryKey as ni}from"drizzle-orm/sqlite-core";var xt=vr("account",{id:Tt().$type().primaryKey(),email:Tt().notNull(),url:Tt().notNull(),access_token:Tt().$type().notNull(),refresh_token:Tt().$type().notNull(),token_expiry:Kn(),...gr}),Xt=vr("account_state",{id:Kn().primaryKey(),active_account_id:Tt().$type().references(()=>xt.id,{onDelete:"set null"}),active_org_id:Tt().$type()}),xc=vr("control_account",{email:Tt().notNull(),url:Tt().notNull(),access_token:Tt().$type().notNull(),refresh_token:Tt().$type().notNull(),token_expiry:Kn(),active:Kn({mode:"boolean"}).notNull().$default(()=>!1),...gr},e=>[ni({columns:[e.email,e.url]})]);import{Schema as he}from"effect";var Vn=he.String.pipe(he.brand("AccountID"),Zt(e=>({make:t(r=>e.makeUnsafe(r),"make")}))),Er=he.String.pipe(he.brand("OrgID"),Zt(e=>({make:t(r=>e.makeUnsafe(r),"make")}))),Zn=he.String.pipe(he.brand("AccessToken"),Zt(e=>({make:t(r=>e.makeUnsafe(r),"make")}))),Cn=he.String.pipe(he.brand("RefreshToken"),Zt(e=>({make:t(r=>e.makeUnsafe(r),"make")}))),Dn=he.String.pipe(he.brand("DeviceCode"),Zt(e=>({make:t(r=>e.makeUnsafe(r),"make")}))),Yn=he.String.pipe(he.brand("UserCode"),Zt(e=>({make:t(r=>e.makeUnsafe(r),"make")}))),An=class extends he.Class("Account")({id:Vn,email:he.String,url:he.String,active_org_id:he.NullOr(Er)}){static{t(this,"Info")}},On=class extends he.Class("Org")({id:Er,name:he.String}){static{t(this,"Org")}},ln=class extends he.TaggedErrorClass()("AccountRepoError",{message:he.String,cause:he.optional(he.Defect)}){static{t(this,"AccountRepoError")}},Qt=class extends he.TaggedErrorClass()("AccountServiceError",{message:he.String,cause:he.optional(he.Defect)}){static{t(this,"AccountServiceError")}},Tn=class extends he.Class("Login")({code:Dn,user:Yn,url:he.String,server:he.String,expiry:he.Duration,interval:he.Duration}){static{t(this,"Login")}},dn=class extends he.TaggedClass()("PollSuccess",{email:he.String}){static{t(this,"PollSuccess")}},un=class extends he.TaggedClass()("PollPending",{}){static{t(this,"PollPending")}},pn=class extends he.TaggedClass()("PollSlow",{}){static{t(this,"PollSlow")}},fn=class extends he.TaggedClass()("PollExpired",{}){static{t(this,"PollExpired")}},mn=class extends he.TaggedClass()("PollDenied",{}){static{t(this,"PollDenied")}},gn=class extends he.TaggedClass()("PollError",{cause:he.Defect}){static{t(this,"PollError")}},ri=he.Union([dn,un,pn,fn,mn,gn]);var so=1,In=class e extends si.Service()("@opencode/AccountRepo"){static{t(this,"AccountRepo")}static layer=oi.effect(e,at.gen(function*(){let r=ii.decodeUnknownSync(An),s=t(u=>at.try({try:t(()=>mr.use(u),"try"),catch:t(i=>new ln({message:"Database operation failed",cause:i}),"catch")}),"query"),w=t(u=>at.try({try:t(()=>mr.transaction(u),"try"),catch:t(i=>new ln({message:"Database operation failed",cause:i}),"catch")}),"tx"),p=t(u=>{let i=u.select().from(Xt).where(yn(Xt.id,so)).get();if(!i?.active_account_id)return;let c=u.select().from(xt).where(yn(xt.id,i.active_account_id)).get();if(c)return{...c,active_org_id:i.active_org_id??null}},"current"),B=t((u,i,c)=>{let C=jn.getOrNull(c);return u.insert(Xt).values({id:so,active_account_id:i,active_org_id:C}).onConflictDoUpdate({target:Xt.id,set:{active_account_id:i,active_org_id:C}}).run()},"state"),ce=at.fn("AccountRepo.active")(()=>s(u=>p(u)).pipe(at.map(u=>u?jn.some(r(u)):jn.none()))),W=at.fn("AccountRepo.list")(()=>s(u=>u.select().from(xt).all().map(i=>r({...i,active_org_id:null})))),I=at.fn("AccountRepo.remove")(u=>w(i=>{i.update(Xt).set({active_account_id:null,active_org_id:null}).where(yn(Xt.active_account_id,u)).run(),i.delete(xt).where(yn(xt.id,u)).run()}).pipe(at.asVoid)),F=at.fn("AccountRepo.use")((u,i)=>s(c=>B(c,u,i)).pipe(at.asVoid)),K=at.fn("AccountRepo.getRow")(u=>s(i=>i.select().from(xt).where(yn(xt.id,u)).get()).pipe(at.map(jn.fromNullishOr))),l=at.fn("AccountRepo.persistToken")(u=>s(i=>i.update(xt).set({access_token:u.accessToken,refresh_token:u.refreshToken,token_expiry:jn.getOrNull(u.expiry)}).where(yn(xt.id,u.accountID)).run()).pipe(at.asVoid)),v=at.fn("AccountRepo.persistAccount")(u=>w(i=>{i.insert(xt).values({id:u.id,email:u.email,url:u.url,access_token:u.accessToken,refresh_token:u.refreshToken,token_expiry:u.expiry}).onConflictDoUpdate({target:xt.id,set:{email:u.email,url:u.url,access_token:u.accessToken,refresh_token:u.refreshToken,token_expiry:u.expiry}}).run(),B(i,u.id,u.orgID)}).pipe(at.asVoid));return e.of({active:ce,list:W,remove:I,use:F,getRow:K,persistToken:l,persistAccount:v})}))};var _r=class extends De.Class("RemoteConfig")({config:De.Record(De.String,De.Json)}){static{t(this,"RemoteConfig")}},Qn=De.Number.pipe(De.decodeTo(De.Duration,{decode:co.transform(e=>tn.seconds(e)),encode:co.transform(e=>tn.toSeconds(e))})),Ar=class extends De.Class("TokenRefresh")({access_token:Zn,refresh_token:Cn,expires_in:Qn}){static{t(this,"TokenRefresh")}},Or=class extends De.Class("DeviceAuth")({device_code:Dn,user_code:Yn,verification_uri_complete:De.String,expires_in:Qn,interval:Qn}){static{t(this,"DeviceAuth")}},Tr=class extends De.Class("DeviceTokenSuccess")({access_token:Zn,refresh_token:Cn,token_type:De.Literal("Bearer"),expires_in:Qn}){static{t(this,"DeviceTokenSuccess")}},er=class extends De.Class("DeviceTokenError")({error:De.String,error_description:De.String}){static{t(this,"DeviceTokenError")}toPollResult(){return this.error==="authorization_pending"?new un:this.error==="slow_down"?new pn:this.error==="expired_token"?new fn:this.error==="access_denied"?new mn:new gn({cause:this.error})}},li=De.Union([Tr,er]),Cr=class extends De.Class("User")({id:Vn,email:De.String}){static{t(this,"User")}},tr=class extends De.Class("ClientId")({client_id:De.String}){static{t(this,"ClientId")}},nr=class extends De.Class("DeviceTokenRequest")({grant_type:De.String,device_code:Dn,client_id:De.String}){static{t(this,"DeviceTokenRequest")}},rr=class extends De.Class("TokenRefreshRequest")({grant_type:De.String,refresh_token:Cn,client_id:De.String}){static{t(this,"TokenRefreshRequest")}},Pr="opencode-cli",di=tn.minutes(5),ui=tn.toMillis(di),lo=t((e,r)=>e!=null&&e>r+ui,"isTokenFresh"),Ct=t((e="Account service operation failed")=>r=>r.pipe($e.mapError(s=>s instanceof Qt?s:new Qt({message:e,cause:s}))),"mapAccountServiceError"),or;(l=>{class e extends ai.Service()("@opencode/Account"){static{t(this,"Service")}}l.Service=e,l.layer=Sr.effect(e,$e.gen(function*(){let v=yield*In,u=yield*kr.HttpClient,i=$n(u),c=kr.filterStatusOk(u),C=kr.filterStatusOk(i),E=t(O=>i.execute(O).pipe(Ct("HTTP request failed")),"executeRead"),b=t(O=>C.execute(O).pipe(Ct("HTTP request failed")),"executeReadOk"),x=t(O=>O.pipe($e.flatMap(T=>c.execute(T)),Ct("HTTP request failed")),"executeEffectOk"),P=t(O=>O.pipe($e.flatMap(T=>u.execute(T)),Ct("HTTP request failed")),"executeEffect"),V=$e.fnUntraced(function*(O){let T=yield*Xn.currentTimeMillis,y=yield*x(Qe.post(`${O.url}/auth/device/token`).pipe(Qe.acceptJson,Qe.schemaBodyJson(rr)(new rr({grant_type:"refresh_token",refresh_token:O.refresh_token,client_id:Pr})))),g=yield*en.schemaBodyJson(Ar)(y).pipe(Ct("Failed to decode response")),R=Je.some(T+tn.toMillis(g.expires_in));return yield*v.persistToken({accountID:O.id,accessToken:g.access_token,refreshToken:g.refresh_token,expiry:R}),g.access_token}),se=yield*ao.make({capacity:Number.POSITIVE_INFINITY,timeToLive:tn.zero,lookup:$e.fnUntraced(function*(O){let T=yield*v.getRow(O);if(Je.isNone(T))return yield*$e.fail(new Qt({message:"Account not found during token refresh"}));let y=T.value,g=yield*Xn.currentTimeMillis;return lo(y.token_expiry,g)?y.access_token:yield*V(y)})}),oe=$e.fnUntraced(function*(O){let T=yield*Xn.currentTimeMillis;return lo(O.token_expiry,T)?O.access_token:yield*ao.get(se,O.id)}),Z=$e.fnUntraced(function*(O){let T=yield*v.getRow(O);if(Je.isNone(T))return Je.none();let y=T.value,g=yield*oe(y);return Je.some({account:y,accessToken:g})}),ue=$e.fnUntraced(function*(O,T){let y=yield*b(Qe.get(`${O}/api/orgs`).pipe(Qe.acceptJson,Qe.bearerToken(T)));return yield*en.schemaBodyJson(De.Array(On))(y).pipe(Ct("Failed to decode response"))}),Le=$e.fnUntraced(function*(O,T){let y=yield*b(Qe.get(`${O}/api/user`).pipe(Qe.acceptJson,Qe.bearerToken(T)));return yield*en.schemaBodyJson(Cr)(y).pipe(Ct("Failed to decode response"))}),Se=$e.fn("Account.token")(O=>Z(O).pipe($e.map(Je.map(T=>T.accessToken)))),He=$e.fn("Account.activeOrg")(function*(){let O=yield*v.active();if(Je.isNone(O))return Je.none();let T=O.value;if(!T.active_org_id)return Je.none();let g=(yield*St(T.id)).find(R=>R.id===T.active_org_id);return g?Je.some({account:T,org:g}):Je.none()}),qe=$e.fn("Account.orgsByAccount")(function*(){let O=yield*v.list();return yield*$e.forEach(O,T=>St(T.id).pipe($e.catch(()=>$e.succeed([])),$e.map(y=>({account:T,orgs:y}))),{concurrency:3})}),St=$e.fn("Account.orgs")(function*(O){let T=yield*Z(O);if(Je.isNone(T))return[];let{account:y,accessToken:g}=T.value;return yield*ue(y.url,g)}),Ge=$e.fn("Account.config")(function*(O,T){let y=yield*Z(O);if(Je.isNone(y))return Je.none();let{account:g,accessToken:R}=y.value,le=yield*E(Qe.get(`${g.url}/api/config`).pipe(Qe.acceptJson,Qe.bearerToken(R),Qe.setHeaders({"x-org-id":T})));if(le.status===404)return Je.none();let xe=yield*en.filterStatusOk(le).pipe(Ct()),Ne=yield*en.schemaBodyJson(_r)(xe).pipe(Ct("Failed to decode response"));return Je.some(Ne.config)}),Dt=$e.fn("Account.login")(function*(O){let T=yield*x(Qe.post(`${O}/auth/device/code`).pipe(Qe.acceptJson,Qe.schemaBodyJson(tr)(new tr({client_id:Pr})))),y=yield*en.schemaBodyJson(Or)(T).pipe(Ct("Failed to decode response"));return new Tn({code:y.device_code,user:y.user_code,url:`${O}${y.verification_uri_complete}`,server:O,expiry:y.expires_in,interval:y.interval})}),Rt=$e.fn("Account.poll")(function*(O){let T=yield*P(Qe.post(`${O.server}/auth/device/token`).pipe(Qe.acceptJson,Qe.schemaBodyJson(nr)(new nr({grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:O.code,client_id:Pr})))),y=yield*en.schemaBodyJson(li)(T).pipe(Ct("Failed to decode response"));if(y instanceof er)return y.toPollResult();let g=y.access_token,R=Le(O.server,g),le=ue(O.server,g),[xe,Ne]=yield*$e.all([R,le],{concurrency:2}),te=Ne.length>0?Je.some(Ne[0].id):Je.none(),o=(yield*Xn.currentTimeMillis)+tn.toMillis(y.expires_in),m=y.refresh_token;return yield*v.persistAccount({id:xe.id,email:xe.email,url:O.server,accessToken:g,refreshToken:m,expiry:o,orgID:te}),new dn({email:xe.email})});return e.of({active:v.active,activeOrg:He,list:v.list,orgsByAccount:qe,remove:v.remove,use:v.use,orgs:St,config:Ge,token:Se,login:Dt,poll:Rt})})),l.defaultLayer=l.layer.pipe(Sr.provide(In.layer),Sr.provide(ci.layer)),{runPromise:l.runPromise}=mt(e,l.defaultLayer);async function p(){return Je.getOrUndefined(await(0,l.runPromise)(v=>v.active()))}l.active=p,t(p,"active");async function B(){return(0,l.runPromise)(v=>v.list())}l.list=B,t(B,"list");async function ce(){return Je.getOrUndefined(await(0,l.runPromise)(v=>v.activeOrg()))}l.activeOrg=ce,t(ce,"activeOrg");async function W(){return(0,l.runPromise)(v=>v.orgsByAccount())}l.orgsByAccount=W,t(W,"orgsByAccount");async function I(v){return(0,l.runPromise)(u=>u.orgs(v))}l.orgs=I,t(I,"orgs");async function F(v,u){return(0,l.runPromise)(i=>i.use(v,Je.some(u)))}l.switchOrg=F,t(F,"switchOrg");async function K(v){let u=await(0,l.runPromise)(i=>i.token(v));return Je.getOrUndefined(u)}l.token=K,t(K,"token")})(or||={});import hn from"path";import pi from"os";import nn from"zod";import{parse as fi,printParseErrorCode as mi}from"jsonc-parser";var bn;(K=>{async function e(l,v,u){return L.findUp([`${l}.json`,`${l}.jsonc`],v,u,{rootFirst:!0})}K.projectFiles=e,t(e,"projectFiles");async function r(l,v){return[z.Path.config,...ae.OPENCODE_DISABLE_PROJECT_CONFIG?[]:await Array.fromAsync(L.up({targets:[".opencode"],start:l,stop:v})),...await Array.fromAsync(L.up({targets:[".opencode"],start:z.Path.home,stop:z.Path.home})),...ae.OPENCODE_CONFIG_DIR?[ae.OPENCODE_CONFIG_DIR]:[]]}K.directories=r,t(r,"directories");function s(l,v){return[hn.join(l,`${v}.json`),hn.join(l,`${v}.jsonc`)]}K.fileInDirectory=s,t(s,"fileInDirectory"),K.JsonError=ft.create("ConfigJsonError",nn.object({path:nn.string(),message:nn.string().optional()})),K.InvalidError=ft.create("ConfigInvalidError",nn.object({path:nn.string(),issues:nn.custom().optional(),message:nn.string().optional()}));async function B(l){return L.readText(l).catch(v=>{if(v.code!=="ENOENT")throw new K.JsonError({path:l},{cause:v})})}K.readFile=B,t(B,"readFile");function ce(l){return typeof l=="string"?l:l.source}t(ce,"source");function W(l){return typeof l=="string"?hn.dirname(l):l.dir}t(W,"dir");async function I(l,v,u="error"){l=l.replace(/\{env:([^}]+)\}/g,(x,P)=>process.env[P]||"");let i=Array.from(l.matchAll(/\{file:[^}]+\}/g));if(!i.length)return l;let c=W(v),C=ce(v),E="",b=0;for(let x of i){let P=x[0],V=x.index;E+=l.slice(b,V);let se=l.lastIndexOf(`
|
|
15
|
+
`,V-1)+1;if(l.slice(se,V).trimStart().startsWith("//")){E+=P,b=V+P.length;continue}let Z=P.replace(/^\{file:/,"").replace(/\}$/,"");Z.startsWith("~/")&&(Z=hn.join(pi.homedir(),Z.slice(2)));let ue=hn.isAbsolute(Z)?Z:hn.resolve(c,Z),Le=(await L.readText(ue).catch(Se=>{if(u==="empty")return"";let He=`bad file reference: "${P}"`;throw Se.code==="ENOENT"?new K.InvalidError({path:C,message:He+` ${ue} does not exist`},{cause:Se}):new K.InvalidError({path:C,message:He},{cause:Se})})).trim();E+=JSON.stringify(Le).slice(1,-1),b=V+P.length}return E+=l.slice(b),E}t(I,"substitute");async function F(l,v,u="error"){let i=ce(v);l=await I(l,v,u);let c=[],C=fi(l,c,{allowTrailingComma:!0});if(c.length){let E=l.split(`
|
|
16
|
+
`),b=c.map(x=>{let P=l.substring(0,x.offset).split(`
|
|
17
|
+
`),V=P.length,se=P[P.length-1].length+1,oe=E[V-1],Z=`${mi(x.error)} at line ${V}, column ${se}`;return oe?`${Z}
|
|
18
|
+
Line ${V}: ${oe}
|
|
19
|
+
${"".padStart(se+9)}^`:Z}).join(`
|
|
20
|
+
`);throw new K.JsonError({path:i,message:`
|
|
21
|
+
--- JSONC Input ---
|
|
22
|
+
${l}
|
|
23
|
+
--- Errors ---
|
|
24
|
+
${b}
|
|
25
|
+
--- End ---`})}return C}K.parseText=F,t(F,"parseText")})(bn||={});import{Duration as Ri,Effect as ie,Layer as lr,Option as dr,ServiceMap as Ni}from"effect";import It from"path";import{fileURLToPath as ir,pathToFileURL as wn}from"url";import gi from"npm-package-arg";import Dr from"semver";var yi=["opencode-openai-codex-auth","opencode-copilot-auth"];function ul(e){return yi.some(r=>e.includes(r))}t(ul,"isDeprecatedPlugin");function po(e){try{return gi(e)}catch{}}t(po,"parse");function fo(e){let r=po(e);if(r?.type==="alias"&&!r.name){let s=r.subSpec;if(s?.name){let w=!s.rawSpec||s.rawSpec==="*"?"latest":s.rawSpec;return{pkg:s.name,version:w}}}return r?.name?r.raw===r.name?{pkg:r.name,version:"latest"}:{pkg:r.name,version:r.rawSpec}:{pkg:e,version:""}}t(fo,"parsePluginSpecifier");var hi=["index.ts","index.tsx","index.js","index.mjs","index.cjs"];function mo(e){return sr(e)?"file":"npm"}t(mo,"pluginSource");function bi(e,r){return e.startsWith("file://")?ir(e):It.isAbsolute(e)?e:It.resolve(r,e)}t(bi,"resolveExportPath");function wi(e){return It.isAbsolute(e)||/^[A-Za-z]:[\\/]/.test(e)}t(wi,"isAbsolutePath");function xi(e){if(typeof e=="string")return e;if(jt(e))for(let r of["import","default"]){let s=e[r];if(typeof s=="string")return s}}t(xi,"extractExportValue");function vi(e){let r=e.json.main;if(typeof r!="string")return;let s=r.trim();if(s)return s}t(vi,"packageMain");function Ei(e,r,s,w){let p=bi(r,w.dir),B=L.resolve(w.dir),ce=L.resolve(p);if(!L.contains(B,ce))throw new Error(`Plugin ${e} resolved ${s} entry outside plugin directory`);return ce}t(Ei,"resolvePackageFile");function uo(e,r,s,w){return wn(Ei(e,r,s,w)).href}t(uo,"resolvePackagePath");function Si(e,r,s){let w=s.json.exports;if(jt(w)){let B=xi(w[`./${r}`]);if(B)return uo(e,B,r,s)}if(r!=="server")return;let p=vi(s);if(p)return uo(e,p,r,s)}t(Si,"resolvePackageEntrypoint");function ki(e){if(e.startsWith("file://"))return ir(e);if(It.isAbsolute(e))return e}t(ki,"targetPath");async function jr(e){for(let r of hi){let s=It.join(e,r);if(await L.exists(s))return s}}t(jr,"resolveDirectoryIndex");async function Pi(e){let r=ki(e);if(!(!r||!(await L.statAsync(r))?.isDirectory()))return r}t(Pi,"resolveTargetDirectory");async function _i(e,r,s,w){let p=mo(e),B=w??(p==="npm"?await xn(r):await xn(r).catch(()=>{}));if(!B)return r;let ce=Si(e,s,B);if(ce)return ce;let W=await Pi(r);if(s==="tui"){if(p==="file"&&W){let I=await jr(W);if(I)return wn(I).href}return p==="npm"||W?void 0:r}if(W&&jt(B.json.exports)){if(p==="file"){let I=await jr(W);if(I)return wn(I).href}return}return r}t(_i,"resolvePluginEntrypoint");function sr(e){return e.startsWith("file://")||e.startsWith(".")||wi(e)}t(sr,"isPathPluginSpec");async function Ir(e){let r=e.startsWith("file://")?ir(e):e,s=It.isAbsolute(r)||/^[A-Za-z]:[\\/]/.test(r)?r:It.resolve(r);if(!(await L.statAsync(s))?.isDirectory())return e.startsWith("file://")?e:wn(s).href;if(await L.exists(It.join(s,"package.json")))return wn(s).href;let p=await jr(s);if(p)return wn(p).href;throw new Error(`Plugin directory ${s} is missing package.json or index file`)}t(Ir,"resolvePathPluginTarget");async function pl(e,r,s){if(!Dr.valid(r)||Dr.major(r)===0)return;let w=s??await xn(e).catch(()=>{});if(!w)return;let p=w.json.engines;if(!jt(p))return;let B=p.opencode;if(typeof B=="string"&&!Dr.satisfies(r,B))throw new Error(`Plugin requires opencode ${B} but running ${r}`)}t(pl,"checkPluginCompatibility");async function fl(e){if(sr(e))return Ir(e);let r=po(e),s=r?.name&&r.raw===r.name?`${r.name}@latest`:e;return(await st.add(s)).directory}t(fl,"resolvePluginTarget");async function xn(e){let r=e.startsWith("file://")?ir(e):e,w=(await L.statAsync(r))?.isDirectory()?r:It.dirname(r),p=It.join(w,"package.json"),B=await L.readJson(p);return{dir:w,pkg:p,json:B}}t(xn,"readPluginPackage");async function ml(e,r,s){let w=mo(e),p=w==="npm"?await xn(r):await xn(r).catch(()=>{}),B=await _i(e,r,s,p);return{spec:e,source:w,target:r,pkg:p,entry:B}}t(ml,"createPluginEntry");function gl(e,r){if(e===void 0)return;if(typeof e!="string")throw new TypeError(`Plugin ${r} has invalid id type ${typeof e}`);let s=e.trim();if(!s)throw new TypeError(`Plugin ${r} has an empty id`);return s}t(gl,"readPluginId");function yl(e,r,s,w="strict"){let p=e.default;if(!jt(p)){if(w==="detect")return;throw new TypeError(`Plugin ${r} must default export an object with ${s}()`)}if(w==="detect"&&!("id"in p)&&!("server"in p)&&!("tui"in p))return;let B="server"in p?p.server:void 0,ce="tui"in p?p.tui:void 0;if(B!==void 0&&typeof B!="function")throw new TypeError(`Plugin ${r} has invalid server export`);if(ce!==void 0&&typeof ce!="function")throw new TypeError(`Plugin ${r} has invalid tui export`);if(B!==void 0&&ce!==void 0)throw new TypeError(`Plugin ${r} must default export either server() or tui(), not both`);if(s==="server"&&B===void 0)throw new TypeError(`Plugin ${r} must default export an object with server()`);if(s==="tui"&&ce===void 0)throw new TypeError(`Plugin ${r} must default export an object with tui()`);return p}t(yl,"readV1Plugin");async function hl(e,r,s,w,p){if(e==="file"){if(w)return w;throw new TypeError(`Path plugin ${r} must export id`)}if(w)return w;let B=p??await xn(s);if(typeof B.json.name!="string"||!B.json.name.trim())throw new TypeError(`Plugin package ${B.pkg} is missing name`);return B.json.name.trim()}t(hl,"resolvePluginId");var ur;(k=>{let e=n.string().meta({$ref:"https://models.dev/model-schema.json#/$defs/Model"}),r=n.record(n.string(),n.unknown());k.PluginSpec=n.union([n.string(),n.tuple([n.string(),r])]);let w=Xe.create({service:"config"});function p(){switch(process.platform){case"darwin":return"/Library/Application Support/opencode";case"win32":return ze.join(process.env.ProgramData||"C:\\ProgramData","opencode");default:return"/etc/opencode"}}t(p,"systemManagedConfigDir");function B(){return process.env.OPENCODE_TEST_MANAGED_CONFIG_DIR||p()}k.managedConfigDir=B,t(B,"managedConfigDir");let ce=B(),W="ai.opencode.managed",I=new Set(["PayloadDisplayName","PayloadIdentifier","PayloadType","PayloadUUID","PayloadVersion","_manualProfile"]);function F(h,N){let A=JSON.parse(h);for(let q of Object.keys(A))I.has(q)&&delete A[q];return _(JSON.stringify(A),N)}k.parseManagedPlist=F,t(F,"parseManagedPlist");async function K(){if(process.platform!=="darwin")return{};let h=W,N=go.userInfo().username,A=[ze.join("/Library/Managed Preferences",N,`${h}.plist`),ze.join("/Library/Managed Preferences",`${h}.plist`)];for(let q of A){if(!cr(q))continue;w.info("reading macOS managed preferences",{path:q});let de=await Ve.run(["plutil","-convert","json","-o","-",q],{nothrow:!0});if(de.code!==0){w.warn("failed to convert managed preferences plist",{path:q});continue}return F(de.stdout.toString(),`mobileconfig:${q}`)}return{}}t(K,"readManagedPreferences");function l(h,N){let A=gt(h,N);return h.instructions&&N.instructions&&(A.instructions=Array.from(new Set([...h.instructions,...N.instructions]))),A}t(l,"mergeConfigConcatArrays");async function v(h,N){var Oe=[];try{if(!await u(h))return;let A=Kt(Oe,await Ft.acquire(`config-install:${L.resolve(h)}`,{signal:N?.signal,onWait:t(f=>N?.waitTick?.({dir:h,attempt:f.attempt,delay:f.delay,waited:f.waited}),"onWait")}),!0);N?.signal?.throwIfAborted();let q=ze.join(h,"package.json");let de=Lt.isLocal()?"*":Lt.VERSION;let ne=await L.readJson(q).catch(()=>({dependencies:{}}));ne.dependencies={...ne.dependencies,"@opencode-ai/plugin":de};await L.writeJson(q,ne);let ve=ze.join(h,".gitignore");let Be=await L.exists(ve);Be||await L.write(ve,["node_modules","package.json","package-lock.json","bun.lock",".gitignore"].join(`
|
|
26
|
+
`));await st.install(h)}catch(Ke){var vt=Ke,ct=!0}finally{var a=Vt(Oe,vt,ct);a&&await a}}k.installDependencies=v,t(v,"installDependencies");async function u(h){try{return await Rr.access(h,Ii.W_OK),!0}catch{return!1}}t(u,"isWritable");function i(h,N){let A=h.replaceAll("\\","/");for(let q of N){let de=A.indexOf(q);if(de!==-1)return A.slice(de+q.length)}}t(i,"rel");function c(h){let N=ze.extname(h);return N.length?h.slice(0,-N.length):h}t(c,"trim");async function C(h){let N={};for(let A of await Sn.scan("{command,commands}/**/*.md",{cwd:h,absolute:!0,dot:!0,symlink:!0})){let q=await zt.parse(A).catch(async Ke=>{let vt=zt.FrontmatterError.isInstance(Ke)?Ke.data.message:`Failed to parse command ${A}`,{Session:ct}=await import("./session-FWLEEJPX.js");Wt.publish(ct.Event.Error,{error:new ft.Unknown({message:vt}).toObject()}),w.error("failed to load command",{command:A,err:Ke})});if(!q)continue;let ne=i(A,["/.opencode/command/","/.opencode/commands/","/command/","/commands/"])??ze.basename(A),Be={name:c(ne),...q.data,template:q.content.trim()},Oe=k.Command.safeParse(Be);if(Oe.success){N[Be.name]=Oe.data;continue}throw new k.InvalidError({path:A,issues:Oe.error.issues},{cause:Oe.error})}return N}t(C,"loadCommand");async function E(h){let N={};for(let A of await Sn.scan("{agent,agents}/**/*.md",{cwd:h,absolute:!0,dot:!0,symlink:!0})){let q=await zt.parse(A).catch(async Ke=>{let vt=zt.FrontmatterError.isInstance(Ke)?Ke.data.message:`Failed to parse agent ${A}`,{Session:ct}=await import("./session-FWLEEJPX.js");Wt.publish(ct.Event.Error,{error:new ft.Unknown({message:vt}).toObject()}),w.error("failed to load agent",{agent:A,err:Ke})});if(!q)continue;let ne=i(A,["/.opencode/agent/","/.opencode/agents/","/agent/","/agents/"])??ze.basename(A),Be={name:c(ne),...q.data,prompt:q.content.trim()},Oe=k.Agent.safeParse(Be);if(Oe.success){N[Be.name]=Oe.data;continue}throw new k.InvalidError({path:A,issues:Oe.error.issues},{cause:Oe.error})}return N}t(E,"loadAgent");async function b(h){let N={};if(process.env.OPENCODE_CLIENT!=="alchemy")return N;let A=ze.join(h,".alchemy_lab","action-server.json"),q;for(let ne=0;ne<20&&!q;ne++)try{let ve=JSON.parse(await L.readText(A));ve?.port&&(q=ve.port)}catch{await new Promise(ve=>setTimeout(ve,500))}if(!q)return w.warn("alchemy agents: no action-server.json; agents unavailable until config reload"),N;let de=[];try{let ne=await fetch(`http://127.0.0.1:${q}/api/agents/markdown`,{signal:AbortSignal.timeout(8e3)});if(!ne.ok)throw new Error(`HTTP ${ne.status}`);de=(await ne.json()).data??[]}catch(ne){return w.warn("alchemy agents: fetch failed",{port:q,err:ne}),N}for(let ne of de){let ve;try{ve=zt.parseText(ne.markdown,`alchemy agent ${ne.name}`)}catch(Ke){w.error("failed to parse alchemy agent",{agent:ne.name,err:Ke});continue}let Be={name:ne.name,...ve.data,prompt:ve.content.trim()},Oe=k.Agent.safeParse(Be);Oe.success?N[ne.name]=Oe.data:w.error("invalid alchemy agent",{agent:ne.name,issues:Oe.error.issues})}return w.info("alchemy agents loaded in memory",{count:Object.keys(N).length,port:q}),N}t(b,"loadAlchemyAgents");async function x(h){let N={};for(let A of await Sn.scan("{mode,modes}/*.md",{cwd:h,absolute:!0,dot:!0,symlink:!0})){let q=await zt.parse(A).catch(async ve=>{let Be=zt.FrontmatterError.isInstance(ve)?ve.data.message:`Failed to parse mode ${A}`,{Session:Oe}=await import("./session-FWLEEJPX.js");Wt.publish(Oe.Event.Error,{error:new ft.Unknown({message:Be}).toObject()}),w.error("failed to load mode",{mode:A,err:ve})});if(!q)continue;let de={name:ze.basename(A,".md"),...q.data,prompt:q.content.trim()},ne=k.Agent.safeParse(de);if(ne.success){N[de.name]={...ne.data,mode:"primary"};continue}}return N}t(x,"loadMode");async function P(h){let N=[];for(let A of await Sn.scan("{plugin,plugins}/*.{ts,js}",{cwd:h,absolute:!0,dot:!0,symlink:!0}))N.push(ar(A).href);return N}t(P,"loadPlugin");function V(h){return Array.isArray(h)?h[0]:h}k.pluginSpecifier=V,t(V,"pluginSpecifier");function se(h){return Array.isArray(h)?h[1]:void 0}k.pluginOptions=se,t(se,"pluginOptions");async function oe(h,N){let A=V(h);if(!sr(A))return h;let q=ze.dirname(N),de=A.startsWith("file://")?A:ze.isAbsolute(A)||/^[A-Za-z]:[\\/]/.test(A)?ar(A).href:ar(ze.resolve(q,A)).href,ne=await Ir(de).catch(()=>de);return Array.isArray(h)?[ne,h[1]]:ne}k.resolvePluginSpec=oe,t(oe,"resolvePluginSpec");function Z(h){let N=new Set,A=[];for(let q of h.toReversed()){let de=V(q.spec),ne=de.startsWith("file://")?de:fo(de).pkg;N.has(ne)||(N.add(ne),A.push(q))}return A.toReversed()}k.deduplicatePluginOrigins=Z,t(Z,"deduplicatePluginOrigins"),k.McpLocal=n.object({type:n.literal("local").describe("Type of MCP server connection"),command:n.string().array().describe("Command and arguments to run the MCP server"),environment:n.record(n.string(),n.string()).optional().describe("Environment variables to set when running the MCP server"),enabled:n.boolean().optional().describe("Enable or disable the MCP server on startup"),timeout:n.number().int().positive().optional().describe("Timeout in ms for MCP server requests. Defaults to 5000 (5 seconds) if not specified.")}).strict().meta({ref:"McpLocalConfig"}),k.McpOAuth=n.object({clientId:n.string().optional().describe("OAuth client ID. If not provided, dynamic client registration (RFC 7591) will be attempted."),clientSecret:n.string().optional().describe("OAuth client secret (if required by the authorization server)"),scope:n.string().optional().describe("OAuth scopes to request during authorization")}).strict().meta({ref:"McpOAuthConfig"}),k.McpRemote=n.object({type:n.literal("remote").describe("Type of MCP server connection"),url:n.string().describe("URL of the remote MCP server"),enabled:n.boolean().optional().describe("Enable or disable the MCP server on startup"),headers:n.record(n.string(),n.string()).optional().describe("Headers to send with the request"),oauth:n.union([k.McpOAuth,n.literal(!1)]).optional().describe("OAuth authentication configuration for the MCP server. Set to false to disable OAuth auto-detection."),timeout:n.number().int().positive().optional().describe("Timeout in ms for MCP server requests. Defaults to 5000 (5 seconds) if not specified.")}).strict().meta({ref:"McpRemoteConfig"}),k.Mcp=n.discriminatedUnion("type",[k.McpLocal,k.McpRemote]),k.PermissionAction=n.enum(["ask","allow","deny"]).meta({ref:"PermissionActionConfig"}),k.PermissionObject=n.record(n.string(),k.PermissionAction).meta({ref:"PermissionObjectConfig"}),k.PermissionRule=n.union([k.PermissionAction,k.PermissionObject]).meta({ref:"PermissionRuleConfig"});let Dt=t(h=>typeof h=="object"&&h!==null&&!Array.isArray(h)?{__originalKeys:Object.keys(h),...h}:h,"permissionPreprocess"),Rt=t(h=>{if(typeof h=="string")return{"*":h};let N=h,{__originalKeys:A,...q}=N;if(!A)return q;let de={};for(let ne of A)ne in q&&(de[ne]=q[ne]);return de},"permissionTransform");k.Permission=n.preprocess(Dt,n.object({__originalKeys:n.string().array().optional(),read:k.PermissionRule.optional(),edit:k.PermissionRule.optional(),glob:k.PermissionRule.optional(),grep:k.PermissionRule.optional(),list:k.PermissionRule.optional(),bash:k.PermissionRule.optional(),task:k.PermissionRule.optional(),external_directory:k.PermissionRule.optional(),todowrite:k.PermissionAction.optional(),question:k.PermissionAction.optional(),webfetch:k.PermissionAction.optional(),websearch:k.PermissionAction.optional(),codesearch:k.PermissionAction.optional(),lsp:k.PermissionRule.optional(),doom_loop:k.PermissionAction.optional(),skill:k.PermissionRule.optional()}).catchall(k.PermissionRule).or(k.PermissionAction)).transform(Rt).meta({ref:"PermissionConfig"}),k.Command=n.object({template:n.string(),description:n.string().optional(),agent:n.string().optional(),model:e.optional(),subtask:n.boolean().optional()}),k.Skills=n.object({paths:n.array(n.string()).optional().describe("Additional paths to skill folders"),urls:n.array(n.string()).optional().describe("URLs to fetch skills from (e.g., https://example.com/.well-known/skills/)")}),k.Agent=n.object({model:e.optional(),variant:n.string().optional().describe("Default model variant for this agent (applies only when using the agent's configured model)."),temperature:n.number().optional(),top_p:n.number().optional(),prompt:n.string().optional(),tools:n.record(n.string(),n.boolean()).optional().describe("@deprecated Use 'permission' field instead"),disable:n.boolean().optional(),description:n.string().optional().describe("Description of when to use the agent"),mode:n.enum(["subagent","primary","all"]).optional(),hidden:n.boolean().optional().describe("Hide this subagent from the @ autocomplete menu (default: false, only applies to mode: subagent)"),options:n.record(n.string(),n.any()).optional(),color:n.union([n.string().regex(/^#[0-9a-fA-F]{6}$/,"Invalid hex color format"),n.enum(["primary","secondary","accent","success","warning","error","info"])]).optional().describe("Hex color code (e.g., #FF5733) or theme color (e.g., primary)"),steps:n.number().int().positive().optional().describe("Maximum number of agentic iterations before forcing text-only response"),maxSteps:n.number().int().positive().optional().describe("@deprecated Use 'steps' field instead."),permission:k.Permission.optional()}).catchall(n.any()).transform((h,N)=>{let A=new Set(["name","model","variant","prompt","description","temperature","top_p","mode","hidden","color","steps","maxSteps","options","permission","disable","tools"]),q={...h.options};for(let[ve,Be]of Object.entries(h))A.has(ve)||(q[ve]=Be);let de={};for(let[ve,Be]of Object.entries(h.tools??{})){let Oe=Be?"allow":"deny";ve==="write"||ve==="edit"||ve==="patch"||ve==="multiedit"?de.edit=Oe:de[ve]=Oe}Object.assign(de,h.permission);let ne=h.steps??h.maxSteps;return{...h,options:q,permission:de,steps:ne}}).meta({ref:"AgentConfig"}),k.Keybinds=n.object({leader:n.string().optional().default("ctrl+x").describe("Leader key for keybind combinations"),app_exit:n.string().optional().default("ctrl+c,ctrl+d,<leader>q").describe("Exit the application"),editor_open:n.string().optional().default("<leader>e").describe("Open external editor"),theme_list:n.string().optional().default("<leader>t").describe("List available themes"),sidebar_toggle:n.string().optional().default("<leader>b").describe("Toggle sidebar"),scrollbar_toggle:n.string().optional().default("none").describe("Toggle session scrollbar"),username_toggle:n.string().optional().default("none").describe("Toggle username visibility"),status_view:n.string().optional().default("<leader>s").describe("View status"),session_export:n.string().optional().default("<leader>x").describe("Export session to editor"),session_new:n.string().optional().default("<leader>n").describe("Create a new session"),session_list:n.string().optional().default("<leader>l").describe("List all sessions"),session_timeline:n.string().optional().default("<leader>g").describe("Show session timeline"),session_fork:n.string().optional().default("none").describe("Fork session from message"),session_rename:n.string().optional().default("ctrl+r").describe("Rename session"),session_delete:n.string().optional().default("ctrl+d").describe("Delete session"),stash_delete:n.string().optional().default("ctrl+d").describe("Delete stash entry"),model_provider_list:n.string().optional().default("ctrl+a").describe("Open provider list from model dialog"),model_favorite_toggle:n.string().optional().default("ctrl+f").describe("Toggle model favorite status"),session_share:n.string().optional().default("none").describe("Share current session"),session_unshare:n.string().optional().default("none").describe("Unshare current session"),session_interrupt:n.string().optional().default("escape").describe("Interrupt current session"),session_compact:n.string().optional().default("<leader>c").describe("Compact the session"),messages_page_up:n.string().optional().default("pageup,ctrl+alt+b").describe("Scroll messages up by one page"),messages_page_down:n.string().optional().default("pagedown,ctrl+alt+f").describe("Scroll messages down by one page"),messages_line_up:n.string().optional().default("ctrl+alt+y").describe("Scroll messages up by one line"),messages_line_down:n.string().optional().default("ctrl+alt+e").describe("Scroll messages down by one line"),messages_half_page_up:n.string().optional().default("ctrl+alt+u").describe("Scroll messages up by half page"),messages_half_page_down:n.string().optional().default("ctrl+alt+d").describe("Scroll messages down by half page"),messages_first:n.string().optional().default("ctrl+g,home").describe("Navigate to first message"),messages_last:n.string().optional().default("ctrl+alt+g,end").describe("Navigate to last message"),messages_next:n.string().optional().default("none").describe("Navigate to next message"),messages_previous:n.string().optional().default("none").describe("Navigate to previous message"),messages_last_user:n.string().optional().default("none").describe("Navigate to last user message"),messages_copy:n.string().optional().default("<leader>y").describe("Copy message"),messages_undo:n.string().optional().default("<leader>u").describe("Undo message"),messages_redo:n.string().optional().default("<leader>r").describe("Redo message"),messages_toggle_conceal:n.string().optional().default("<leader>h").describe("Toggle code block concealment in messages"),tool_details:n.string().optional().default("none").describe("Toggle tool details visibility"),model_list:n.string().optional().default("<leader>m").describe("List available models"),model_cycle_recent:n.string().optional().default("f2").describe("Next recently used model"),model_cycle_recent_reverse:n.string().optional().default("shift+f2").describe("Previous recently used model"),model_cycle_favorite:n.string().optional().default("none").describe("Next favorite model"),model_cycle_favorite_reverse:n.string().optional().default("none").describe("Previous favorite model"),command_list:n.string().optional().default("ctrl+p").describe("List available commands"),agent_list:n.string().optional().default("<leader>a").describe("List agents"),agent_cycle:n.string().optional().default("tab").describe("Next agent"),agent_cycle_reverse:n.string().optional().default("shift+tab").describe("Previous agent"),variant_cycle:n.string().optional().default("ctrl+t").describe("Cycle model variants"),input_clear:n.string().optional().default("ctrl+c").describe("Clear input field"),input_paste:n.string().optional().default("ctrl+v").describe("Paste from clipboard"),input_submit:n.string().optional().default("return").describe("Submit input"),input_newline:n.string().optional().default("shift+return,ctrl+return,alt+return,ctrl+j").describe("Insert newline in input"),input_move_left:n.string().optional().default("left,ctrl+b").describe("Move cursor left in input"),input_move_right:n.string().optional().default("right,ctrl+f").describe("Move cursor right in input"),input_move_up:n.string().optional().default("up").describe("Move cursor up in input"),input_move_down:n.string().optional().default("down").describe("Move cursor down in input"),input_select_left:n.string().optional().default("shift+left").describe("Select left in input"),input_select_right:n.string().optional().default("shift+right").describe("Select right in input"),input_select_up:n.string().optional().default("shift+up").describe("Select up in input"),input_select_down:n.string().optional().default("shift+down").describe("Select down in input"),input_line_home:n.string().optional().default("ctrl+a").describe("Move to start of line in input"),input_line_end:n.string().optional().default("ctrl+e").describe("Move to end of line in input"),input_select_line_home:n.string().optional().default("ctrl+shift+a").describe("Select to start of line in input"),input_select_line_end:n.string().optional().default("ctrl+shift+e").describe("Select to end of line in input"),input_visual_line_home:n.string().optional().default("alt+a").describe("Move to start of visual line in input"),input_visual_line_end:n.string().optional().default("alt+e").describe("Move to end of visual line in input"),input_select_visual_line_home:n.string().optional().default("alt+shift+a").describe("Select to start of visual line in input"),input_select_visual_line_end:n.string().optional().default("alt+shift+e").describe("Select to end of visual line in input"),input_buffer_home:n.string().optional().default("home").describe("Move to start of buffer in input"),input_buffer_end:n.string().optional().default("end").describe("Move to end of buffer in input"),input_select_buffer_home:n.string().optional().default("shift+home").describe("Select to start of buffer in input"),input_select_buffer_end:n.string().optional().default("shift+end").describe("Select to end of buffer in input"),input_delete_line:n.string().optional().default("ctrl+shift+d").describe("Delete line in input"),input_delete_to_line_end:n.string().optional().default("ctrl+k").describe("Delete to end of line in input"),input_delete_to_line_start:n.string().optional().default("ctrl+u").describe("Delete to start of line in input"),input_backspace:n.string().optional().default("backspace,shift+backspace").describe("Backspace in input"),input_delete:n.string().optional().default("ctrl+d,delete,shift+delete").describe("Delete character in input"),input_undo:n.string().optional().default("ctrl+-,super+z").describe("Undo in input"),input_redo:n.string().optional().default("ctrl+.,super+shift+z").describe("Redo in input"),input_word_forward:n.string().optional().default("alt+f,alt+right,ctrl+right").describe("Move word forward in input"),input_word_backward:n.string().optional().default("alt+b,alt+left,ctrl+left").describe("Move word backward in input"),input_select_word_forward:n.string().optional().default("alt+shift+f,alt+shift+right").describe("Select word forward in input"),input_select_word_backward:n.string().optional().default("alt+shift+b,alt+shift+left").describe("Select word backward in input"),input_delete_word_forward:n.string().optional().default("alt+d,alt+delete,ctrl+delete").describe("Delete word forward in input"),input_delete_word_backward:n.string().optional().default("ctrl+w,ctrl+backspace,alt+backspace").describe("Delete word backward in input"),history_previous:n.string().optional().default("up").describe("Previous history item"),history_next:n.string().optional().default("down").describe("Next history item"),session_child_first:n.string().optional().default("<leader>down").describe("Go to first child session"),session_child_cycle:n.string().optional().default("right").describe("Go to next child session"),session_child_cycle_reverse:n.string().optional().default("left").describe("Go to previous child session"),session_parent:n.string().optional().default("up").describe("Go to parent session"),terminal_suspend:n.string().optional().default("ctrl+z").describe("Suspend terminal"),terminal_title_toggle:n.string().optional().default("none").describe("Toggle terminal title"),tips_toggle:n.string().optional().default("<leader>h").describe("Toggle tips on home screen"),plugin_manager:n.string().optional().default("none").describe("Open plugin manager dialog"),display_thinking:n.string().optional().default("none").describe("Toggle thinking blocks visibility")}).strict().meta({ref:"KeybindsConfig"}),k.Server=n.object({port:n.number().int().positive().optional().describe("Port to listen on"),hostname:n.string().optional().describe("Hostname to listen on"),mdns:n.boolean().optional().describe("Enable mDNS service discovery"),mdnsDomain:n.string().optional().describe("Custom domain name for mDNS service (default: opencode.local)"),cors:n.array(n.string()).optional().describe("Additional domains to allow for CORS")}).strict().meta({ref:"ServerConfig"}),k.Layout=n.enum(["auto","stretch"]).meta({ref:"LayoutConfig"}),k.Provider=an.Provider.partial().extend({whitelist:n.array(n.string()).optional(),blacklist:n.array(n.string()).optional(),models:n.record(n.string(),an.Model.partial().extend({variants:n.record(n.string(),n.object({disabled:n.boolean().optional().describe("Disable this variant for the model")}).catchall(n.any())).optional().describe("Variant-specific configuration")})).optional(),options:n.object({apiKey:n.string().optional(),baseURL:n.string().optional(),enterpriseUrl:n.string().optional().describe("GitHub Enterprise URL for copilot authentication"),setCacheKey:n.boolean().optional().describe("Enable promptCacheKey for this provider (default false)"),timeout:n.union([n.number().int().positive().describe("Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout."),n.literal(!1).describe("Disable timeout for this provider entirely.")]).optional().describe("Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout."),chunkTimeout:n.number().int().positive().optional().describe("Timeout in milliseconds between streamed SSE chunks for this provider. If no chunk arrives within this window, the request is aborted.")}).catchall(n.any()).optional()}).strict().meta({ref:"ProviderConfig"}),k.Info=n.object({$schema:n.string().optional().describe("JSON schema reference for configuration validation"),logLevel:Xe.Level.optional().describe("Log level"),server:k.Server.optional().describe("Server configuration for opencode serve and web commands"),command:n.record(n.string(),k.Command).optional().describe("Command configuration, see https://opencode.ai/docs/commands"),skills:k.Skills.optional().describe("Additional skill folder paths"),watcher:n.object({ignore:n.array(n.string()).optional()}).optional(),snapshot:n.boolean().optional().describe("Enable or disable snapshot tracking. When false, filesystem snapshots are not recorded and undoing or reverting will not undo/redo file changes. Defaults to true."),plugin:k.PluginSpec.array().optional(),share:n.enum(["manual","auto","disabled"]).optional().describe("Control sharing behavior:'manual' allows manual sharing via commands, 'auto' enables automatic sharing, 'disabled' disables all sharing"),autoshare:n.boolean().optional().describe("@deprecated Use 'share' field instead. Share newly created sessions automatically"),autoupdate:n.union([n.boolean(),n.literal("notify")]).optional().describe("Automatically update to the latest version. Set to true to auto-update, false to disable, or 'notify' to show update notifications"),disabled_providers:n.array(n.string()).optional().describe("Disable providers that are loaded automatically"),enabled_providers:n.array(n.string()).optional().describe("When set, ONLY these providers will be enabled. All other providers will be ignored"),model:e.describe("Model to use in the format of provider/model, eg anthropic/claude-2").optional(),small_model:e.describe("Small model to use for tasks like title generation in the format of provider/model").optional(),default_agent:n.string().optional().describe("Default agent to use when none is specified. Must be a primary agent. Falls back to 'build' if not set or if the specified agent is invalid."),username:n.string().optional().describe("Custom username to display in conversations instead of system username"),mode:n.object({build:k.Agent.optional(),plan:k.Agent.optional()}).catchall(k.Agent).optional().describe("@deprecated Use `agent` field instead."),agent:n.object({plan:k.Agent.optional(),build:k.Agent.optional(),general:k.Agent.optional(),explore:k.Agent.optional(),title:k.Agent.optional(),summary:k.Agent.optional(),compaction:k.Agent.optional()}).catchall(k.Agent).optional().describe("Agent configuration, see https://opencode.ai/docs/agents"),provider:n.record(n.string(),k.Provider).optional().describe("Custom provider configurations and model overrides"),mcp:n.record(n.string(),n.union([k.Mcp,n.object({enabled:n.boolean()}).strict()])).optional().describe("MCP (Model Context Protocol) server configurations"),formatter:n.union([n.literal(!1),n.record(n.string(),n.object({disabled:n.boolean().optional(),command:n.array(n.string()).optional(),environment:n.record(n.string(),n.string()).optional(),extensions:n.array(n.string()).optional()}))]).optional(),lsp:n.union([n.literal(!1),n.record(n.string(),n.union([n.object({disabled:n.literal(!0)}),n.object({command:n.array(n.string()),extensions:n.array(n.string()).optional(),disabled:n.boolean().optional(),env:n.record(n.string(),n.string()).optional(),initialization:n.record(n.string(),n.any()).optional()})]))]).optional().refine(h=>{if(!h||typeof h=="boolean")return!0;let N=new Set(Object.values(wr).map(A=>A.id));return Object.entries(h).every(([A,q])=>q.disabled||N.has(A)?!0:!!q.extensions)},{error:"For custom LSP servers, 'extensions' array is required."}),instructions:n.array(n.string()).optional().describe("Additional instruction files or patterns to include"),layout:k.Layout.optional().describe("@deprecated Always uses stretch layout."),permission:k.Permission.optional(),tools:n.record(n.string(),n.boolean()).optional(),enterprise:n.object({url:n.string().optional().describe("Enterprise URL")}).optional(),compaction:n.object({auto:n.boolean().optional().describe("Enable automatic compaction when context is full (default: true)"),prune:n.boolean().optional().describe("Enable pruning of old tool outputs (default: true)"),reserved:n.number().int().min(0).optional().describe("Token buffer for compaction. Leaves enough window to avoid overflow during compaction.")}).optional(),experimental:n.object({disable_paste_summary:n.boolean().optional(),batch_tool:n.boolean().optional().describe("Enable the batch tool"),openTelemetry:n.boolean().optional().describe("Enable OpenTelemetry spans for AI SDK calls (using the 'experimental_telemetry' flag)"),primary_tools:n.array(n.string()).optional().describe("Tools that should only be available to primary agents."),continue_loop_on_deny:n.boolean().optional().describe("Continue the agent loop when a tool call is denied"),mcp_timeout:n.number().int().positive().optional().describe("Timeout in milliseconds for model context protocol (MCP) requests")}).optional()}).strict().meta({ref:"Config"});class d extends Ni.Service()("@opencode/Config"){static{t(this,"Service")}}k.Service=d;function o(){let h=["opencode.jsonc","opencode.json","config.json"].map(N=>ze.join(z.Path.config,N));for(let N of h)if(cr(N))return N;return h[0]}t(o,"globalConfigFile");function m(h,N,A=[]){if(!jt(N)){let q=Ci(h,A,N,{formattingOptions:{insertSpaces:!0,tabSize:2}});return Ti(h,q)}return Object.entries(N).reduce((q,[de,ne])=>ne===void 0?q:m(q,ne,[...A,de]),h)}t(m,"patchJsonc");function j(h){let{plugin_origins:N,...A}=h;return A}t(j,"writable");function _(h,N){let A=[],q=Di(h,A,{allowTrailingComma:!0});if(A.length){let ne=h.split(`
|
|
27
|
+
`),ve=A.map(Be=>{let Oe=h.substring(0,Be.offset).split(`
|
|
28
|
+
`),Ke=Oe.length,vt=Oe[Oe.length-1].length+1,ct=ne[Ke-1],a=`${ji(Be.error)} at line ${Ke}, column ${vt}`;return ct?`${a}
|
|
29
|
+
Line ${Ke}: ${ct}
|
|
30
|
+
${"".padStart(vt+9)}^`:a}).join(`
|
|
31
|
+
`);throw new k.JsonError({path:N,message:`
|
|
32
|
+
--- JSONC Input ---
|
|
33
|
+
${h}
|
|
34
|
+
--- Errors ---
|
|
35
|
+
${ve}
|
|
36
|
+
--- End ---`})}let de=k.Info.safeParse(q);if(de.success)return de.data;throw new k.InvalidError({path:N,issues:de.error.issues})}t(_,"parseConfig"),{JsonError:k.JsonError,InvalidError:k.InvalidError}=bn,k.ConfigDirectoryTypoError=ft.create("ConfigDirectoryTypoError",n.object({path:n.string(),dir:n.string(),suggestion:n.string()})),k.layer=lr.effect(d,ie.gen(function*(){let h=yield*Pt.Service,N=yield*_n.Service,A=yield*or.Service,q=ie.fnUntraced(function*(H){return yield*h.readFileString(H).pipe(ie.catchIf(Q=>Q.reason._tag==="NotFound",()=>ie.succeed(void 0)),ie.orDie)}),de=ie.fnUntraced(function*(H,Q){let U=H,Ye="path"in Q?Q.path:Q.source,et="path"in Q,Fe=yield*ie.promise(()=>bn.parseText(H,"path"in Q?Q.path:{source:Q.source,dir:Q.dir})),bt=(()=>{if(!Fe||typeof Fe!="object"||Array.isArray(Fe))return Fe;let pt={...Fe};return("theme"in pt||"keybinds"in pt||"tui"in pt)&&(delete pt.theme,delete pt.keybinds,delete pt.tui,w.warn("tui keys in opencode config are deprecated; move them to tui.json",{path:Ye})),pt})(),lt=k.Info.safeParse(bt);if(lt.success){if(!lt.data.$schema&&et){lt.data.$schema="https://opencode.ai/config.json";let Nt=U.replace(/^\s*\{/,`{
|
|
37
|
+
"$schema": "https://opencode.ai/config.json",`);yield*h.writeFileString(Q.path,Nt).pipe(ie.catch(()=>ie.void))}let pt=lt.data;if(pt.plugin&&et){let Nt=pt.plugin;for(let qt=0;qt<Nt.length;qt++)Nt[qt]=yield*ie.promise(()=>oe(Nt[qt],Q.path))}return pt}throw new k.InvalidError({path:Ye,issues:lt.error.issues})}),ne=ie.fnUntraced(function*(H){w.info("loading",{path:H});let Q=yield*q(H);return Q?yield*de(Q,{path:H}):{}}),ve=ie.fnUntraced(function*(){let H=Ai({},gt(yield*ne(ze.join(z.Path.config,"config.json"))),gt(yield*ne(ze.join(z.Path.config,"opencode.json"))),gt(yield*ne(ze.join(z.Path.config,"opencode.jsonc")))),Q=ze.join(z.Path.config,"config");return cr(Q)&&(yield*ie.promise(()=>import(ar(Q).href,{with:{type:"toml"}}).then(async U=>{let{provider:Ye,model:et,...Fe}=U.default;Ye&&et&&(H.model=`${Ye}/${et}`),H.$schema="https://opencode.ai/config.json",H=gt(H,Fe),await Rr.writeFile(ze.join(z.Path.config,"config.json"),JSON.stringify(H,null,2)),await Rr.unlink(Q)}).catch(()=>{}))),H}),[Be,Oe]=yield*ie.cachedInvalidateWithTTL(ve().pipe(ie.tapError(H=>ie.sync(()=>w.error("failed to load global config, using defaults",{error:String(H)}))),ie.orElseSucceed(()=>({}))),Ri.infinity),Ke=ie.fn("Config.getGlobal")(function*(){return yield*Be}),vt=ie.fnUntraced(function*(H){let Q=yield*N.all().pipe(ie.orDie),U={},Ye=new Set,et,Fe=t(ge=>ge.startsWith("http://")||ge.startsWith("https://")?"global":ge==="OPENCODE_CONFIG_CONTENT"||Ie.containsPath(ge)?"local":"global","scope"),bt=t((ge,Te,nt)=>{if(!Te?.length)return;let dt=nt??Fe(ge),Mt=Z([...U.plugin_origins??[],...Te.map(Gt=>({spec:Gt,source:ge,scope:dt}))]);U.plugin=Mt.map(Gt=>Gt.spec),U.plugin_origins=Mt},"track"),lt=t((ge,Te,nt)=>{U=l(U,Te),bt(ge,Te.plugin,nt)},"merge");for(let[ge,Te]of Object.entries(Q))if(Te.type==="wellknown"){let nt=ge.replace(/\/+$/,"");process.env[Te.key]=Te.token,w.debug("fetching remote config",{url:`${nt}/.well-known/opencode`});let dt=yield*ie.promise(()=>fetch(`${nt}/.well-known/opencode`));if(!dt.ok)throw new Error(`failed to fetch remote config from ${nt}: ${dt.status}`);let Gt=(yield*ie.promise(()=>dt.json())).config??{};Gt.$schema||(Gt.$schema="https://opencode.ai/config.json");let fr=`${nt}/.well-known/opencode`,vo=yield*de(JSON.stringify(Gt),{dir:ze.dirname(fr),source:fr});lt(fr,vo,"global"),w.debug("loaded remote config from well-known",{url:nt})}let pt=yield*Ke();if(lt(z.Path.config,pt,"global"),ae.OPENCODE_CONFIG&&(lt(ae.OPENCODE_CONFIG,yield*ne(ae.OPENCODE_CONFIG)),w.debug("loaded custom config",{path:ae.OPENCODE_CONFIG})),!ae.OPENCODE_DISABLE_PROJECT_CONFIG)for(let ge of yield*ie.promise(()=>bn.projectFiles("opencode",H.directory,H.worktree)))lt(ge,yield*ne(ge),"local");U.agent=U.agent||{},U.mode=U.mode||{},U.plugin=U.plugin||[];let Nt=yield*ie.promise(()=>bn.directories(H.directory,H.worktree));ae.OPENCODE_CONFIG_DIR&&w.debug("loading config from OPENCODE_CONFIG_DIR",{path:ae.OPENCODE_CONFIG_DIR});let qt=[];for(let ge of Oi(Nt)){if(ge.endsWith(".opencode")||ge===ae.OPENCODE_CONFIG_DIR)for(let dt of["opencode.json","opencode.jsonc"]){let Mt=ze.join(ge,dt);w.debug(`loading config from ${Mt}`),lt(Mt,yield*ne(Mt)),U.agent??={},U.mode??={},U.plugin??=[]}let Te=$r(async()=>{await v(ge)});Te.catch(dt=>{w.warn("background dependency install failed",{dir:ge,error:dt})}),qt.push(Te),U.command=gt(U.command??{},yield*ie.promise(()=>C(ge))),U.agent=gt(U.agent,yield*ie.promise(()=>E(ge))),U.agent=gt(U.agent,yield*ie.promise(()=>x(ge)));let nt=yield*ie.promise(()=>P(ge));bt(ge,nt)}if(U.agent=gt(U.agent,yield*ie.promise(()=>b(H.directory))),process.env.OPENCODE_CONFIG_CONTENT){let ge="OPENCODE_CONFIG_CONTENT",Te=yield*de(process.env.OPENCODE_CONFIG_CONTENT,{dir:H.directory,source:ge});lt(ge,Te,"local"),w.debug("loaded custom config from OPENCODE_CONFIG_CONTENT")}let on=dr.getOrUndefined(yield*A.activeOrg().pipe(ie.catch(()=>ie.succeed(dr.none()))));if(on&&(yield*ie.gen(function*(){let[ge,Te]=yield*ie.all([A.config(on.account.id,on.org.id),A.token(on.account.id)],{concurrency:2});if(dr.isSome(Te)&&(process.env.OPENCODE_CONSOLE_TOKEN=Te.value,br.set("OPENCODE_CONSOLE_TOKEN",Te.value)),et=on.org.name,dr.isSome(ge)){let nt=`${on.account.url}/api/config`,dt=yield*de(JSON.stringify(ge.value),{dir:ze.dirname(nt),source:nt});for(let Mt of Object.keys(dt.provider??{}))Ye.add(Mt);lt(nt,dt,"global")}}).pipe(ie.catch(ge=>(w.debug("failed to fetch remote account config",{error:ge instanceof Error?ge.message:String(ge)}),ie.void)))),cr(ce))for(let ge of["opencode.json","opencode.jsonc"]){let Te=ze.join(ce,ge);lt(Te,yield*ne(Te),"global")}U=l(U,yield*ie.promise(()=>K()));for(let[ge,Te]of Object.entries(U.mode??{}))U.agent=gt(U.agent??{},{[ge]:{...Te,mode:"primary"}});if(ae.OPENCODE_PERMISSION&&(U.permission=gt(U.permission??{},JSON.parse(ae.OPENCODE_PERMISSION))),U.tools){let ge={};for(let[Te,nt]of Object.entries(U.tools)){let dt=nt?"allow":"deny";if(Te==="write"||Te==="edit"||Te==="patch"||Te==="multiedit"){ge.edit=dt;continue}ge[Te]=dt}U.permission=gt(ge,U.permission??{})}return U.username||(U.username=go.userInfo().username),U.autoshare===!0&&!U.share&&(U.share="auto"),ae.OPENCODE_DISABLE_AUTOCOMPACT&&(U.compaction={...U.compaction,auto:!1}),ae.OPENCODE_DISABLE_PRUNE&&(U.compaction={...U.compaction,prune:!1}),{config:U,directories:Nt,deps:qt,consoleState:{consoleManagedProviders:Array.from(Ye),activeOrgName:et,switchableOrgCount:0}}}),ct=yield*_e.make(ie.fn("Config.state")(function*(H){return yield*vt(H)})),a=ie.fn("Config.get")(function*(){return yield*_e.use(ct,H=>H.config)}),f=ie.fn("Config.directories")(function*(){return yield*_e.use(ct,H=>H.directories)}),D=ie.fn("Config.getConsoleState")(function*(){return yield*_e.use(ct,H=>H.consoleState)}),M=ie.fn("Config.waitForDependencies")(function*(){yield*_e.useEffect(ct,H=>ie.promise(()=>Promise.all(H.deps).then(()=>{})))}),re=ie.fn("Config.update")(function*(H){let Q=yield*_e.directory,U=ze.join(Q,"config.json");Fr.assert(U,"config update");let Ye=yield*ne(U);yield*h.writeFileString(U,JSON.stringify(gt(j(Ye),j(H)),null,2)).pipe(ie.orDie),yield*ie.promise(()=>Ie.dispose())}),be=ie.fn("Config.invalidate")(function*(H){yield*Oe;let Q=Ie.disposeAll().catch(()=>{}).finally(()=>Ln.emit("event",{directory:"global",payload:{type:io.Disposed.type,properties:{}}}));H&&(yield*ie.promise(()=>Q))}),we=ie.fn("Config.updateGlobal")(function*(H){let Q=o(),U=(yield*q(Q))??"{}",Ye=j(H),et;if(Q.endsWith(".jsonc")){let Fe=m(U,Ye);et=_(Fe,Q),yield*h.writeFileString(Q,Fe).pipe(ie.orDie)}else{let Fe=_(U,Q),bt=gt(j(Fe),Ye);yield*h.writeFileString(Q,JSON.stringify(bt,null,2)).pipe(ie.orDie),et=bt}return yield*be(),et});return d.of({get:a,getGlobal:Ke,getConsoleState:D,update:re,updateGlobal:we,invalidate:be,directories:f,waitForDependencies:M})})),k.defaultLayer=k.layer.pipe(lr.provide(Pt.defaultLayer),lr.provide(_n.defaultLayer),lr.provide(or.defaultLayer));let{runPromise:fe}=mt(d,k.defaultLayer);async function Ce(){return fe(h=>h.get())}k.get=Ce,t(Ce,"get");async function ke(){return fe(h=>h.getGlobal())}k.getGlobal=ke,t(ke,"getGlobal");async function Pe(){return fe(h=>h.getConsoleState())}k.getConsoleState=Pe,t(Pe,"getConsoleState");async function Me(h){return fe(N=>N.update(h))}k.update=Me,t(Me,"update");async function je(h){return fe(N=>N.updateGlobal(h))}k.updateGlobal=je,t(je,"updateGlobal");async function Ue(h=!1){return fe(N=>N.invalidate(h))}k.invalidate=Ue,t(Ue,"invalidate");async function kt(){return fe(h=>h.directories())}k.directories=kt,t(kt,"directories");async function ht(){return fe(h=>h.waitForDependencies())}k.waitForDependencies=ht,t(ht,"waitForDependencies")})(ur||={});import Ae from"zod/v4";function Nr(e,r){let s;return Promise.race([e.then(w=>(clearTimeout(s),w)),new Promise((w,p)=>{s=setTimeout(()=>{p(new Error(`Operation timed out after ${r}ms`))},r)})])}t(Nr,"withTimeout");import Mi from"path";import yt from"zod";import{Effect as ut,Layer as yo,ServiceMap as Li}from"effect";var tt;(E=>{E.Tokens=yt.object({accessToken:yt.string(),refreshToken:yt.string().optional(),expiresAt:yt.number().optional(),scope:yt.string().optional()}),E.ClientInfo=yt.object({clientId:yt.string(),clientSecret:yt.string().optional(),clientIdIssuedAt:yt.number().optional(),clientSecretExpiresAt:yt.number().optional()}),E.Entry=yt.object({tokens:E.Tokens.optional(),clientInfo:E.ClientInfo.optional(),codeVerifier:yt.string().optional(),oauthState:yt.string().optional(),serverUrl:yt.string().optional()});let w=Mi.join(z.Path.globalData,"mcp-auth.json");class p extends Li.Service()("@opencode/McpAuth"){static{t(this,"Service")}}E.Service=p,E.layer=yo.effect(p,ut.gen(function*(){let b=yield*Pt.Service,x=ut.fn("McpAuth.all")(function*(){return yield*b.readJson(w).pipe(ut.map(O=>O),ut.catch(()=>ut.succeed({})))}),P=ut.fn("McpAuth.get")(function*(O){return(yield*x())[O]}),V=ut.fn("McpAuth.getForUrl")(function*(O,T){let y=yield*P(O);if(y&&y.serverUrl&&y.serverUrl===T)return y}),se=ut.fn("McpAuth.set")(function*(O,T,y){let g=yield*x();y&&(T.serverUrl=y),yield*b.writeJson(w,{...g,[O]:T},384).pipe(ut.orDie)}),oe=ut.fn("McpAuth.remove")(function*(O){let T=yield*x();delete T[O],yield*b.writeJson(w,T,384).pipe(ut.orDie)}),Z=t((O,T)=>ut.fn(`McpAuth.${T}`)(function*(y,g,R){let le=(yield*P(y))??{};le[O]=g,yield*se(y,le,R)}),"updateField"),ue=t((O,T)=>ut.fn(`McpAuth.${T}`)(function*(y){let g=yield*P(y);g&&(delete g[O],yield*se(y,g))}),"clearField"),Le=Z("tokens","updateTokens"),Se=Z("clientInfo","updateClientInfo"),He=Z("codeVerifier","updateCodeVerifier"),qe=Z("oauthState","updateOAuthState"),St=ue("codeVerifier","clearCodeVerifier"),Ge=ue("oauthState","clearOAuthState"),Dt=ut.fn("McpAuth.getOAuthState")(function*(O){return(yield*P(O))?.oauthState}),Rt=ut.fn("McpAuth.isTokenExpired")(function*(O){let T=yield*P(O);return T?.tokens?T.tokens.expiresAt?T.tokens.expiresAt<Date.now()/1e3:!1:null});return p.of({all:x,get:P,getForUrl:V,set:se,remove:oe,updateTokens:Le,updateClientInfo:Se,updateCodeVerifier:He,clearCodeVerifier:St,updateOAuthState:qe,getOAuthState:Dt,clearOAuthState:Ge,isTokenExpired:Rt})}));let ce=E.layer.pipe(yo.provide(Pt.defaultLayer)),{runPromise:W}=mt(p,ce);E.get=t(async b=>W(x=>x.get(b)),"get"),E.getForUrl=t(async(b,x)=>W(P=>P.getForUrl(b,x)),"getForUrl"),E.all=t(async()=>W(b=>b.all()),"all"),E.set=t(async(b,x,P)=>W(V=>V.set(b,x,P)),"set"),E.remove=t(async b=>W(x=>x.remove(b)),"remove"),E.updateTokens=t(async(b,x,P)=>W(V=>V.updateTokens(b,x,P)),"updateTokens"),E.updateClientInfo=t(async(b,x,P)=>W(V=>V.updateClientInfo(b,x,P)),"updateClientInfo"),E.updateCodeVerifier=t(async(b,x)=>W(P=>P.updateCodeVerifier(b,x)),"updateCodeVerifier"),E.updateOAuthState=t(async(b,x)=>W(P=>P.updateOAuthState(b,x)),"updateOAuthState")})(tt||={});var Rn=Xe.create({service:"mcp.oauth"}),rn=19876,Mr="/mcp/oauth/callback",Nn=class{constructor(r,s,w,p){this.mcpName=r;this.serverUrl=s;this.config=w;this.callbacks=p}mcpName;serverUrl;config;callbacks;static{t(this,"McpOAuthProvider")}get redirectUrl(){return`http://127.0.0.1:${rn}${Mr}`}get clientMetadata(){return{redirect_uris:[this.redirectUrl],client_name:"OpenCode",client_uri:"https://opencode.ai",grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:this.config.clientSecret?"client_secret_post":"none"}}async clientInformation(){if(this.config.clientId)return{client_id:this.config.clientId,client_secret:this.config.clientSecret};let r=await tt.getForUrl(this.mcpName,this.serverUrl);if(r?.clientInfo){if(r.clientInfo.clientSecretExpiresAt&&r.clientInfo.clientSecretExpiresAt<Date.now()/1e3){Rn.info("client secret expired, need to re-register",{mcpName:this.mcpName});return}return{client_id:r.clientInfo.clientId,client_secret:r.clientInfo.clientSecret}}}async saveClientInformation(r){await tt.updateClientInfo(this.mcpName,{clientId:r.client_id,clientSecret:r.client_secret,clientIdIssuedAt:r.client_id_issued_at,clientSecretExpiresAt:r.client_secret_expires_at},this.serverUrl),Rn.info("saved dynamically registered client",{mcpName:this.mcpName,clientId:r.client_id})}async tokens(){let r=await tt.getForUrl(this.mcpName,this.serverUrl);if(r?.tokens)return{access_token:r.tokens.accessToken,token_type:"Bearer",refresh_token:r.tokens.refreshToken,expires_in:r.tokens.expiresAt?Math.max(0,Math.floor(r.tokens.expiresAt-Date.now()/1e3)):void 0,scope:r.tokens.scope}}async saveTokens(r){await tt.updateTokens(this.mcpName,{accessToken:r.access_token,refreshToken:r.refresh_token,expiresAt:r.expires_in?Date.now()/1e3+r.expires_in:void 0,scope:r.scope},this.serverUrl),Rn.info("saved oauth tokens",{mcpName:this.mcpName})}async redirectToAuthorization(r){Rn.info("redirecting to authorization",{mcpName:this.mcpName,url:r.toString()}),await this.callbacks.onRedirect(r)}async saveCodeVerifier(r){await tt.updateCodeVerifier(this.mcpName,r)}async codeVerifier(){let r=await tt.get(this.mcpName);if(!r?.codeVerifier)throw new Error(`No code verifier saved for MCP server: ${this.mcpName}`);return r.codeVerifier}async saveState(r){await tt.updateOAuthState(this.mcpName,r)}async state(){let r=await tt.get(this.mcpName);if(r?.oauthState)return r.oauthState;let s=Array.from(crypto.getRandomValues(new Uint8Array(32))).map(w=>w.toString(16).padStart(2,"0")).join("");return await tt.updateOAuthState(this.mcpName,s),s}async invalidateCredentials(r){Rn.info("invalidating credentials",{mcpName:this.mcpName,type:r});let s=await tt.get(this.mcpName);if(s)switch(r){case"all":await tt.remove(this.mcpName);break;case"client":delete s.clientInfo,await tt.set(this.mcpName,s);break;case"tokens":delete s.tokens,await tt.set(this.mcpName,s);break}}};import{createConnection as Fi}from"net";import{createServer as $i}from"http";var vn=Xe.create({service:"mcp.oauth-callback"}),zi=`<!DOCTYPE html>
|
|
38
|
+
<html>
|
|
39
|
+
<head>
|
|
40
|
+
<title>OpenCode - Authorization Successful</title>
|
|
41
|
+
<style>
|
|
42
|
+
body { font-family: system-ui, -apple-system, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #1a1a2e; color: #eee; }
|
|
43
|
+
.container { text-align: center; padding: 2rem; }
|
|
44
|
+
h1 { color: #4ade80; margin-bottom: 1rem; }
|
|
45
|
+
p { color: #aaa; }
|
|
46
|
+
</style>
|
|
47
|
+
</head>
|
|
48
|
+
<body>
|
|
49
|
+
<div class="container">
|
|
50
|
+
<h1>Authorization Successful</h1>
|
|
51
|
+
<p>You can close this window and return to OpenCode.</p>
|
|
52
|
+
</div>
|
|
53
|
+
<script>setTimeout(() => window.close(), 2000);</script>
|
|
54
|
+
</body>
|
|
55
|
+
</html>`,pr=t(e=>`<!DOCTYPE html>
|
|
56
|
+
<html>
|
|
57
|
+
<head>
|
|
58
|
+
<title>OpenCode - Authorization Failed</title>
|
|
59
|
+
<style>
|
|
60
|
+
body { font-family: system-ui, -apple-system, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #1a1a2e; color: #eee; }
|
|
61
|
+
.container { text-align: center; padding: 2rem; }
|
|
62
|
+
h1 { color: #f87171; margin-bottom: 1rem; }
|
|
63
|
+
p { color: #aaa; }
|
|
64
|
+
.error { color: #fca5a5; font-family: monospace; margin-top: 1rem; padding: 1rem; background: rgba(248,113,113,0.1); border-radius: 0.5rem; }
|
|
65
|
+
</style>
|
|
66
|
+
</head>
|
|
67
|
+
<body>
|
|
68
|
+
<div class="container">
|
|
69
|
+
<h1>Authorization Failed</h1>
|
|
70
|
+
<p>An error occurred during authorization.</p>
|
|
71
|
+
<div class="error">${e}</div>
|
|
72
|
+
</div>
|
|
73
|
+
</body>
|
|
74
|
+
</html>`,"HTML_ERROR"),Mn;(v=>{let e,r=new Map,s=new Map,w=300*1e3;function p(u){for(let[i,c]of s)if(c===u){s.delete(i);break}}t(p,"cleanupStateIndex");function B(u,i){let c=new URL(u.url||"/",`http://localhost:${rn}`);if(c.pathname!==Mr){i.writeHead(404),i.end("Not found");return}let C=c.searchParams.get("code"),E=c.searchParams.get("state"),b=c.searchParams.get("error"),x=c.searchParams.get("error_description");if(vn.info("received oauth callback",{hasCode:!!C,state:E,error:b}),!E){let V="Missing required state parameter - potential CSRF attack";vn.error("oauth callback missing state parameter",{url:c.toString()}),i.writeHead(400,{"Content-Type":"text/html"}),i.end(pr(V));return}if(b){let V=x||b;if(r.has(E)){let se=r.get(E);clearTimeout(se.timeout),r.delete(E),p(E),se.reject(new Error(V))}i.writeHead(200,{"Content-Type":"text/html"}),i.end(pr(V));return}if(!C){i.writeHead(400,{"Content-Type":"text/html"}),i.end(pr("No authorization code provided"));return}if(!r.has(E)){let V="Invalid or expired state parameter - potential CSRF attack";vn.error("oauth callback with invalid state",{state:E,pendingStates:Array.from(r.keys())}),i.writeHead(400,{"Content-Type":"text/html"}),i.end(pr(V));return}let P=r.get(E);clearTimeout(P.timeout),r.delete(E),p(E),P.resolve(C),i.writeHead(200,{"Content-Type":"text/html"}),i.end(zi)}t(B,"handleRequest");async function ce(){if(e)return;if(await F()){vn.info("oauth callback server already running on another instance",{port:rn});return}e=$i(B),await new Promise((i,c)=>{e.listen(rn,()=>{vn.info("oauth callback server started",{port:rn}),i()}),e.on("error",c)})}v.ensureRunning=ce,t(ce,"ensureRunning");function W(u,i){return i&&s.set(i,u),new Promise((c,C)=>{let E=setTimeout(()=>{r.has(u)&&(r.delete(u),i&&s.delete(i),C(new Error("OAuth callback timeout - authorization took too long")))},w);r.set(u,{resolve:c,reject:C,timeout:E})})}v.waitForCallback=W,t(W,"waitForCallback");function I(u){let c=s.get(u)??u,C=r.get(c);C&&(clearTimeout(C.timeout),r.delete(c),s.delete(u),C.reject(new Error("Authorization cancelled")))}v.cancelPending=I,t(I,"cancelPending");async function F(){return new Promise(u=>{let i=Fi(rn,"127.0.0.1");i.on("connect",()=>{i.destroy(),u(!0)}),i.on("error",()=>{u(!1)})})}v.isPortInUse=F,t(F,"isPortInUse");async function K(){e&&(await new Promise(u=>e.close(()=>u())),e=void 0,vn.info("oauth callback server stopped"));for(let[u,i]of r)clearTimeout(i.timeout),i.reject(new Error("OAuth callback server stopped"));r.clear(),s.clear()}v.stop=K,t(K,"stop");function l(){return e!==void 0}v.isRunning=l,t(l,"isRunning")})(Mn||={});import Et from"zod";var Lr={PromptAppend:ot.define("tui.prompt.append",Et.object({text:Et.string()})),CommandExecute:ot.define("tui.command.execute",Et.object({command:Et.union([Et.enum(["session.list","session.new","session.share","session.interrupt","session.compact","session.page.up","session.page.down","session.line.up","session.line.down","session.half.page.up","session.half.page.down","session.first","session.last","prompt.clear","prompt.submit","agent.cycle"]),Et.string()])})),ToastShow:ot.define("tui.toast.show",Et.object({title:Et.string().optional(),message:Et.string(),variant:Et.enum(["info","success","warning","error"]),duration:Et.number().default(5e3).optional().describe("Duration in milliseconds")})),SessionSelect:ot.define("tui.session.select",Et.object({sessionID:Jr.zod.describe("Session ID to navigate to")}))};import Gi from"open";import{Effect as S,Exit as Ki,Layer as En,Option as Vi,ServiceMap as Zi,Stream as xo}from"effect";import{ChildProcess as Yi,ChildProcessSpawner as Xi}from"effect/unstable/process";var Qi;(y=>{let e=Xe.create({service:"mcp"}),r=3e4;y.Resource=Ae.object({name:Ae.string(),uri:Ae.string(),description:Ae.string().optional(),mimeType:Ae.string().optional(),client:Ae.string()}).meta({ref:"McpResource"}),y.ToolManifestEntry=Ae.object({name:Ae.string(),description:Ae.string().optional(),readOnly:Ae.boolean().optional()}).meta({ref:"MCPToolManifestEntry"}),y.ToolsChanged=ot.define("mcp.tools.changed",Ae.object({server:Ae.string()})),y.BrowserOpenFailed=ot.define("mcp.browser.open.failed",Ae.object({mcpName:Ae.string(),url:Ae.string()})),y.Failed=ft.create("MCPFailed",Ae.object({name:Ae.string()})),y.Status=Ae.discriminatedUnion("status",[Ae.object({status:Ae.literal("connected")}).meta({ref:"MCPStatusConnected"}),Ae.object({status:Ae.literal("disabled")}).meta({ref:"MCPStatusDisabled"}),Ae.object({status:Ae.literal("failed"),error:Ae.string()}).meta({ref:"MCPStatusFailed"}),Ae.object({status:Ae.literal("needs_auth")}).meta({ref:"MCPStatusNeedsAuth"}),Ae.object({status:Ae.literal("needs_client_registration"),error:Ae.string()}).meta({ref:"MCPStatusNeedsClientRegistration"})]).meta({ref:"MCPStatus"});let I=new Map;function F(g){return typeof g=="object"&&g!==null&&"type"in g}t(F,"isMcpConfigured");let K=t(g=>g.replace(/[^a-zA-Z0-9_-]/g,"_"),"sanitize");function l(g,R){if(URL.canParse(R))return new URL(R);e.warn("invalid remote mcp url",{key:g})}t(l,"remoteURL"),y.currentToolContext={};function u(g,R,le){let xe=g.inputSchema,Ne={...xe,type:"object",properties:xe.properties??{},additionalProperties:!1};return Ui({description:g.description??"",inputSchema:Bi(Ne),execute:t(async te=>{let d={};for(let[$,X]of Object.entries(te||{}))X!==null&&(d[$]=X);let o={};y.currentToolContext.sessionId&&(o.sessionId=y.currentToolContext.sessionId),y.currentToolContext.messageId&&(o.messageId=y.currentToolContext.messageId);let m=await R.callTool({name:g.name,arguments:d,_meta:Object.keys(o).length>0?o:void 0},Wi,{resetTimeoutOnProgress:!0,timeout:le,onprogress:t(()=>{},"onprogress")}),j=m._meta?.alchemy,_=Array.isArray(m.content)&&m.content.length===0&&m.structuredContent!==void 0&&m.structuredContent!==null?{...m,content:[{type:"text",text:JSON.stringify(m.structuredContent)}]}:m;return j?{..._,metadata:j}:_},"execute")})}t(u,"convertMcpTool");function i(g,R,le){return S.tryPromise({try:t(()=>Nr(R.listTools(),le??r),"try"),catch:t(xe=>xe instanceof Error?xe:new Error(String(xe)),"catch")}).pipe(S.map(xe=>xe.tools),S.catch(xe=>(e.error("failed to get tools from client",{key:g,error:xe}),S.succeed(void 0))))}t(i,"defs");function c(g,R,le,xe){return S.tryPromise({try:t(()=>le(R),"try"),catch:t(Ne=>(e.error(`failed to get ${xe}`,{clientName:g,error:Ne.message}),Ne),"catch")}).pipe(S.map(Ne=>{let te={},d=K(g);for(let o of Ne)te[d+":"+K(o.name)]={...o,client:g};return te}),S.orElseSucceed(()=>{}))}t(c,"fetchFromClient");class C extends Zi.Service()("@opencode/MCP"){static{t(this,"Service")}}y.Service=C,y.layer=En.effect(C,S.gen(function*(){let g=yield*Xi.ChildProcessSpawner,R=yield*tt.Service,le=yield*Wt.Service,xe=t((a,f)=>S.acquireUseRelease(S.succeed(a),D=>S.tryPromise({try:t(()=>{let M=new ho({name:"opencode",version:Lt.VERSION});return Nr(M.connect(D),f).then(()=>M)},"try"),catch:t(M=>M instanceof Error?M:new Error(String(M)),"catch")}),(D,M)=>Ki.isFailure(M)?S.tryPromise(()=>D.close()).pipe(S.ignore):S.void),"connectTransport"),Ne={status:{status:"disabled"}},te=S.fn("MCP.connectRemote")(function*(a,f){let D=f.oauth===!1,M=typeof f.oauth=="object"?f.oauth:void 0,re=l(a,f.url);if(!re)return{client:void 0,status:{status:"failed",error:`Invalid MCP URL for "${a}"`}};let be;D||(be=new Nn(a,f.url,{clientId:M?.clientId,clientSecret:M?.clientSecret,scope:M?.scope},{onRedirect:t(async U=>{e.info("oauth redirect requested",{key:a,url:U.toString()})},"onRedirect")}));let we=[{name:"StreamableHTTP",transport:new bo(re,{authProvider:be,requestInit:f.headers?{headers:f.headers}:void 0})},{name:"SSE",transport:new Ji(re,{authProvider:be,requestInit:f.headers?{headers:f.headers}:void 0})}],H=f.timeout??r,Q;for(let{name:U,transport:Ye}of we){let et=yield*xe(Ye,H).pipe(S.map(Fe=>({client:Fe,transportName:U})),S.catch(Fe=>{let bt=Fe instanceof Error?Fe:new Error(String(Fe));return Fe instanceof wo||be&&bt.message.includes("OAuth")?(e.info("mcp server requires authentication",{key:a,transport:U}),bt.message.includes("registration")||bt.message.includes("client_id")?(Q={status:"needs_client_registration",error:"Server does not support dynamic client registration. Please provide clientId in config."},le.publish(Lr.ToastShow,{title:"MCP Authentication Required",message:`Server "${a}" requires a pre-registered client ID. Add clientId to your config.`,variant:"warning",duration:8e3}).pipe(S.ignore,S.as(void 0))):(I.set(a,Ye),Q={status:"needs_auth"},le.publish(Lr.ToastShow,{title:"MCP Authentication Required",message:`Server "${a}" requires authentication. Run: opencode mcp auth ${a}`,variant:"warning",duration:8e3}).pipe(S.ignore,S.as(void 0)))):(e.debug("transport connection failed",{key:a,transport:U,url:f.url,error:bt.message}),Q={status:"failed",error:bt.message},S.succeed(void 0))}));if(et)return e.info("connected",{key:a,transport:et.transportName}),{client:et.client,status:{status:"connected"}};if(Q?.status==="needs_auth"||Q?.status==="needs_client_registration")break}return{client:void 0,status:Q??{status:"failed",error:"Unknown error"}}}),d=S.fn("MCP.connectLocal")(function*(a,f){let[D,...M]=f.command,re=Ie.directory,be=new Hi({stderr:"pipe",command:D,args:M,cwd:re,env:{...process.env,...D==="opencode"?{BUN_BE_BUN:"1"}:{},...f.environment}});be.stderr?.on("data",H=>{e.info(`mcp stderr: ${H.toString()}`,{key:a})});let we=f.timeout??r;return yield*xe(be,we).pipe(S.map(H=>({client:H,status:{status:"connected"}})),S.catch(H=>{let Q=H instanceof Error?H.message:String(H);return e.error("local mcp startup failed",{key:a,command:f.command,cwd:re,error:Q}),S.succeed({client:void 0,status:{status:"failed",error:Q}})}))}),o=S.fn("MCP.create")(function*(a,f){if(f.enabled===!1)return e.info("mcp server disabled",{key:a}),Ne;e.info("found",{key:a,type:f.type});let{client:D,status:M}=f.type==="remote"?yield*te(a,f):yield*d(a,f);if(!D)return{status:M};let re=yield*i(a,D,f.timeout);return re?(e.info("create() successfully created client",{key:a,toolCount:re.length}),{mcpClient:D,status:M,defs:re}):(yield*S.tryPromise(()=>D.close()).pipe(S.ignore),{status:{status:"failed",error:"Failed to get tools"}})}),m=yield*ur.Service,j=S.fnUntraced(function*(a){if(process.platform==="win32")return[];let f=[],D=[a];for(;D.length>0;){let M=D.shift(),re=yield*g.spawn(Yi.make("pgrep",["-P",String(M)],{stdin:"ignore"})),be=yield*xo.mkString(xo.decodeText(re.stdout));yield*re.exitCode;for(let we of be.split(`
|
|
75
|
+
`)){let H=parseInt(we,10);!isNaN(H)&&!f.includes(H)&&(f.push(H),D.push(H))}}return f},S.scoped,S.catch(()=>S.succeed([])));function _(a,f,D){let M=D.onclose;D.onclose=()=>{M?.(),a.clients[f]===D&&(e.warn("mcp server closed its connection",{name:f}),delete a.clients[f],delete a.defs[f],a.status[f]={status:"failed",error:"The server closed the connection"})}}t(_,"watchClose");function $(a,f,D,M){D.setNotificationHandler(qi,async()=>{if(e.info("tools list changed notification received",{server:f}),a.clients[f]!==D||a.status[f]?.status!=="connected")return;let re=await S.runPromise(i(f,D,M));re&&(a.clients[f]!==D||a.status[f]?.status!=="connected"||(a.defs[f]=re,await S.runPromise(le.publish(y.ToolsChanged,{server:f}).pipe(S.ignore))))})}t($,"watch");let X=new Map,J=t(a=>{let f=X.get(a);return f||(f=new Map,X.set(a,f)),f},"runtimeFor"),Y=yield*_e.make(S.fn("MCP.state")(function*(a){let f=yield*m.get(),D={...Object.fromEntries(J(a.directory)),...f.mcp??{}},M={status:{},clients:{},defs:{}};return yield*S.forEach(Object.entries(D),([re,be])=>S.gen(function*(){if(!F(be)){e.error("Ignoring MCP config entry without type",{key:re});return}if(be.enabled===!1){M.status[re]={status:"disabled"};return}let we=yield*o(re,be).pipe(S.catch(()=>S.succeed(void 0)));we&&(M.status[re]=we.status,we.mcpClient&&(M.clients[re]=we.mcpClient,M.defs[re]=we.defs,$(M,re,we.mcpClient,be.timeout),_(M,re,we.mcpClient)))}),{concurrency:"unbounded"}),yield*S.addFinalizer(()=>S.gen(function*(){yield*S.forEach(Object.values(M.clients),re=>S.gen(function*(){let be=re.transport?.pid;if(typeof be=="number"){let we=yield*j(be);for(let H of we)try{process.kill(H,"SIGTERM")}catch{}}yield*S.tryPromise(()=>re.close()).pipe(S.ignore)}),{concurrency:"unbounded"}),I.clear()})),M}));function ye(a,f){let D=a.clients[f];return delete a.defs[f],D?(D.onclose=void 0,S.tryPromise(()=>D.close()).pipe(S.ignore)):S.void}t(ye,"closeClient");let fe=S.fn("MCP.status")(function*(){let a=yield*_e.get(Y),f=yield*m.get(),D=yield*_e.directory,M={...Object.fromEntries(J(D)),...f.mcp??{}},re={};for(let[be,we]of Object.entries(M))F(we)&&(re[be]=a.status[be]??{status:"disabled"});return re}),Ce=S.fn("MCP.clients")(function*(){return(yield*_e.get(Y)).clients}),ke=S.fn("MCP.createAndStore")(function*(a,f){let D=yield*_e.get(Y),M=yield*o(a,f);return D.status[a]=M.status,M.mcpClient?(yield*ye(D,a),D.clients[a]=M.mcpClient,D.defs[a]=M.defs,$(D,a,M.mcpClient,f.timeout),_(D,a,M.mcpClient),M.status):(yield*ye(D,a),delete D.clients[a],M.status)}),Pe=S.fn("MCP.add")(function*(a,f){yield*ke(a,f);let D=yield*_e.directory;return J(D).set(a,f),{status:(yield*_e.get(Y)).status}}),Me=S.fn("MCP.connect")(function*(a){let f=yield*de(a);if(!f){e.error("MCP config not found or invalid",{name:a});return}yield*ke(a,{...f,enabled:!0})}),je=S.fn("MCP.disconnect")(function*(a){let f=yield*_e.get(Y);yield*ye(f,a),delete f.clients[a],f.status[a]={status:"disabled"};let D=yield*_e.directory;J(D).delete(a)}),Ue=S.fn("MCP.tools")(function*(){let a={},f=yield*_e.get(Y),D=yield*m.get(),M=D.mcp??{},re=D.experimental?.mcp_timeout,be=Object.entries(f.clients).filter(([we])=>f.status[we]?.status==="connected");return yield*S.forEach(be,([we,H])=>S.gen(function*(){let Q=M[we],U=Q&&F(Q)?Q:void 0,Ye=f.defs[we];if(!Ye){e.warn("missing cached tools for connected server",{clientName:we});return}let et=U?.timeout??re;for(let Fe of Ye)a[K(we)+"_"+K(Fe.name)]=u(Fe,H,et)}),{concurrency:"unbounded"}),a}),kt=S.fn("MCP.toolManifest")(function*(){let a=yield*_e.get(Y),f={};for(let[D]of Object.entries(a.clients).filter(([M])=>a.status[M]?.status==="connected")){let M=a.defs[D];M&&(f[D]=M.map(re=>({name:re.name,...re.description?{description:re.description}:{},...typeof re.annotations?.readOnlyHint=="boolean"?{readOnly:re.annotations.readOnlyHint}:{}})))}return f});function ht(a,f,D){return S.forEach(Object.entries(a.clients).filter(([M])=>a.status[M]?.status==="connected"),([M,re])=>c(M,re,f,D).pipe(S.map(be=>Object.entries(be??{}))),{concurrency:"unbounded"}).pipe(S.map(M=>Object.fromEntries(M.flat())))}t(ht,"collectFromConnected");let k=S.fn("MCP.prompts")(function*(){let a=yield*_e.get(Y);return yield*ht(a,f=>f.listPrompts().then(D=>D.prompts),"prompts")}),h=S.fn("MCP.resources")(function*(){let a=yield*_e.get(Y);return yield*ht(a,f=>f.listResources().then(D=>D.resources),"resources")}),N=S.fnUntraced(function*(a,f,D,M){let be=(yield*_e.get(Y)).clients[a];if(!be){e.warn(`client not found for ${D}`,{clientName:a});return}return yield*S.tryPromise({try:t(()=>f(be),"try"),catch:t(we=>(e.error(`failed to ${D}`,{clientName:a,...M,error:we?.message}),we),"catch")}).pipe(S.orElseSucceed(()=>{}))}),A=S.fn("MCP.getPrompt")(function*(a,f,D){return yield*N(a,M=>M.getPrompt({name:f,arguments:D}),"getPrompt",{promptName:f})}),q=S.fn("MCP.readResource")(function*(a,f){return yield*N(a,D=>D.readResource({uri:f}),"readResource",{resourceUri:f})}),de=S.fnUntraced(function*(a){let D=(yield*m.get()).mcp?.[a];if(!(!D||!F(D)))return D}),ne=S.fn("MCP.startAuth")(function*(a){let f=yield*de(a);if(!f)throw new Error(`MCP server ${a} not found or disabled`);if(f.type!=="remote")throw new Error(`MCP server ${a} is not a remote server`);if(f.oauth===!1)throw new Error(`MCP server ${a} has OAuth explicitly disabled`);let D=l(a,f.url);if(!D)throw new Error(`Invalid MCP URL for "${a}"`);yield*S.promise(()=>Mn.ensureRunning());let M=Array.from(crypto.getRandomValues(new Uint8Array(32))).map(Q=>Q.toString(16).padStart(2,"0")).join("");yield*R.updateOAuthState(a,M);let re=typeof f.oauth=="object"?f.oauth:void 0,be,we=new Nn(a,f.url,{clientId:re?.clientId,clientSecret:re?.clientSecret,scope:re?.scope},{onRedirect:t(async Q=>{be=Q},"onRedirect")}),H=new bo(D,{authProvider:we});return yield*S.tryPromise({try:t(()=>new ho({name:"opencode",version:Lt.VERSION}).connect(H).then(()=>({authorizationUrl:"",oauthState:M})),"try"),catch:t(Q=>Q,"catch")}).pipe(S.catch(Q=>Q instanceof wo&&be?(I.set(a,H),S.succeed({authorizationUrl:be.toString(),oauthState:M})):S.die(Q)))}),ve=S.fn("MCP.authenticate")(function*(a){let{authorizationUrl:f,oauthState:D}=yield*ne(a);if(!f)return{status:"connected"};e.info("opening browser for oauth",{mcpName:a,url:f,state:D});let M=Mn.waitForCallback(D,a);yield*S.tryPromise(()=>Gi(f)).pipe(S.flatMap(we=>S.callback(H=>{let Q=setTimeout(()=>H(S.void),500);we.on("error",U=>{clearTimeout(Q),H(S.fail(U))}),we.on("exit",U=>{U!==null&&U!==0&&(clearTimeout(Q),H(S.fail(new Error(`Browser open failed with exit code ${U}`))))})})),S.catch(()=>(e.warn("failed to open browser, user must open URL manually",{mcpName:a}),le.publish(y.BrowserOpenFailed,{mcpName:a,url:f}).pipe(S.ignore))));let re=yield*S.promise(()=>M);if((yield*R.getOAuthState(a))!==D)throw yield*R.clearOAuthState(a),new Error("OAuth state mismatch - potential CSRF attack");return yield*R.clearOAuthState(a),yield*Be(a,re)}),Be=S.fn("MCP.finishAuth")(function*(a,f){let D=I.get(a);if(!D)throw new Error(`No pending OAuth flow for MCP server: ${a}`);let M=yield*S.tryPromise({try:t(()=>D.finishAuth(f).then(()=>!0),"try"),catch:t(be=>(e.error("failed to finish oauth",{mcpName:a,error:be}),be),"catch")}).pipe(S.option);if(Vi.isNone(M))return{status:"failed",error:"OAuth completion failed"};yield*R.clearCodeVerifier(a),I.delete(a);let re=yield*de(a);return re?yield*ke(a,re):{status:"failed",error:"MCP config not found after auth"}}),Oe=S.fn("MCP.removeAuth")(function*(a){yield*R.remove(a),Mn.cancelPending(a),I.delete(a),e.info("removed oauth credentials",{mcpName:a})}),Ke=S.fn("MCP.supportsOAuth")(function*(a){let f=yield*de(a);return f?f.type==="remote"&&f.oauth!==!1:!1}),vt=S.fn("MCP.hasStoredTokens")(function*(a){return!!(yield*R.get(a))?.tokens}),ct=S.fn("MCP.getAuthStatus")(function*(a){return(yield*R.get(a))?.tokens?(yield*R.isTokenExpired(a))?"expired":"authenticated":"not_authenticated"});return C.of({status:fe,clients:Ce,tools:Ue,defs:kt,prompts:k,resources:h,add:Pe,connect:Me,disconnect:je,getPrompt:A,readResource:q,startAuth:ne,authenticate:ve,finishAuth:Be,removeAuth:Oe,supportsOAuth:Ke,hasStoredTokens:vt,getAuthStatus:ct})})),y.defaultLayer=y.layer.pipe(En.provide(tt.layer),En.provide(Wt.layer),En.provide(ur.defaultLayer),En.provide(Fn),En.provide(Pt.defaultLayer));let{runPromise:x}=mt(C,y.defaultLayer);y.status=t(async()=>x(g=>g.status()),"status"),y.tools=t(async()=>x(g=>g.tools()),"tools"),y.toolManifest=t(async()=>x(g=>g.defs()),"toolManifest"),y.prompts=t(async()=>x(g=>g.prompts()),"prompts"),y.resources=t(async()=>x(g=>g.resources()),"resources"),y.add=t(async(g,R)=>x(le=>le.add(g,R)),"add"),y.connect=t(async g=>x(R=>R.connect(g)),"connect"),y.disconnect=t(async g=>x(R=>R.disconnect(g)),"disconnect"),y.getPrompt=t(async(g,R,le)=>x(xe=>xe.getPrompt(g,R,le)),"getPrompt"),y.startAuth=t(async g=>x(R=>R.startAuth(g)),"startAuth"),y.authenticate=t(async g=>x(R=>R.authenticate(g)),"authenticate"),y.finishAuth=t(async(g,R)=>x(le=>le.finishAuth(g,R)),"finishAuth"),y.removeAuth=t(async g=>x(R=>R.removeAuth(g)),"removeAuth"),y.supportsOAuth=t(async g=>x(R=>R.supportsOAuth(g)),"supportsOAuth"),y.hasStoredTokens=t(async g=>x(R=>R.hasStoredTokens(g)),"hasStoredTokens"),y.getAuthStatus=t(async g=>x(R=>R.getAuthStatus(g)),"getAuthStatus")})(Qi||={});export{ca as a,_n as b,Hr as c,Ve as d,$n as e,Lt as f,Pn as g,an as h,br as i,me as j,st as k,wr as l,zt as m,Wt as n,Vn as o,Er as p,or as q,ul as r,fo as s,mo as t,pl as u,fl as v,ml as w,gl as x,yl as y,hl as z,Nr as A,Lr as B,Qi as C,ur as D};
|
|
@@ -9,4 +9,4 @@ if (typeof globalThis.Bun === 'undefined') {
|
|
|
9
9
|
if (typeof globalThis.__name === 'undefined') { globalThis.__name = (t, n) => { Object.defineProperty(t, 'name', { value: n, configurable: true }); return t; }; }
|
|
10
10
|
if (typeof globalThis.__export === 'undefined') { globalThis.__export = (t, a) => { for (const k in a) Object.defineProperty(t, k, { get: a[k], enumerable: true }); }; }
|
|
11
11
|
|
|
12
|
-
import{a as n}from"./chunk-MBZTOEAD.js";var i=n(t=>`standard-openapi: ${t}`,"errorMessageWrapper"),s=new Map,r=n(async t=>{let e=s.get(t);if(e)return e;let a;switch(t){case"valibot":a=(await import("./valibot-D_HTw1Gn-
|
|
12
|
+
import{a as n}from"./chunk-MBZTOEAD.js";var i=n(t=>`standard-openapi: ${t}`,"errorMessageWrapper"),s=new Map,r=n(async t=>{let e=s.get(t);if(e)return e;let a;switch(t){case"valibot":a=(await import("./valibot-D_HTw1Gn-E5NKVIOV.js")).default();break;case"zod":a=(await import("./zod-DSgpEGAE-DSH6V7MG.js")).default();break;default:a=(await import("./default-u_dwuiYb-652AQZKX.js")).default()}return s.set(t,a),a},"getToOpenAPISchemaFn"),d=n(async(t,e={})=>{let a=await r(t["~standard"].vendor),{components:o={},options:c}=e;return{schema:await a(t,{components:o,options:c}),components:Object.keys(o).length>0?o:void 0}},"toOpenAPISchema");export{i as a,d as b};
|
|
@@ -9,4 +9,4 @@ if (typeof globalThis.Bun === 'undefined') {
|
|
|
9
9
|
if (typeof globalThis.__name === 'undefined') { globalThis.__name = (t, n) => { Object.defineProperty(t, 'name', { value: n, configurable: true }); return t; }; }
|
|
10
10
|
if (typeof globalThis.__export === 'undefined') { globalThis.__export = (t, a) => { for (const k in a) Object.defineProperty(t, k, { get: a[k], enumerable: true }); }; }
|
|
11
11
|
|
|
12
|
-
import{a as e}from"./chunk-MBZTOEAD.js";var u=Symbol.for("quansync.getIsAsync"),f=class extends Error{static{e(this,"QuansyncError")}constructor(n="Unexpected promise in sync context"){super(n),this.name="QuansyncError"}};function y(n){return n&&typeof n=="object"&&typeof n.then=="function"}e(y,"isThenable");function x(n){return n&&typeof n=="object"&&typeof n[Symbol.iterator]=="function"&&"__quansync"in n}e(x,"isQuansyncGenerator");function d(n){let r=e(function*(...a){return(yield u)?yield n.async.apply(this,a):n.sync.apply(this,a)},"generator");function t(...a){let o=r.apply(this,a);return o.then=(...b)=>n.async.apply(this,a).then(...b),o.__quansync=!0,o}return e(t,"fn"),t.sync=n.sync,t.async=n.async,t}e(d,"fromObject");function _(n){return d({async:e(()=>Promise.resolve(n),"async"),sync:e(()=>{if(y(n))throw new f;return n},"sync")})}e(_,"fromPromise");function i(n,r){if(n===u)return r;if(x(n))return r?w(n):h(n);if(!r&&y(n))throw new f;return n}e(i,"unwrapYield");var p=e(n=>n,"DEFAULT_ON_YIELD");function h(n,r=p){let t=n.next();for(;!t.done;)try{t=n.next(i(r(t.value,!1)))}catch(a){t=n.throw(a)}return i(t.value)}e(h,"iterateSync");async function w(n,r=p){let t=n.next();for(;!t.done;)try{t=n.next(await i(r(t.value,!0),!0))}catch(a){t=n.throw(a)}return t.value}e(w,"iterateAsync");function S(n,r){return d({name:n.name,async(...t){return w(n.apply(this,t),r?.onYield)},sync(...t){return h(n.apply(this,t),r?.onYield)}})}e(S,"fromGeneratorFn");function s(n,r){return y(n)?_(n):typeof n=="function"?S(n,r):d(n)}e(s,"quansync");var E=s({async:e(()=>Promise.resolve(!0),"async"),sync:e(()=>!1,"sync")});var l=new Map,c=class extends Error{static{e(this,"UnsupportedVendorError")}constructor(r){super(`standard-json: Unsupported schema vendor "${r}".`)}},m=class extends Error{static{e(this,"MissingDependencyError")}constructor(r){super(`standard-json: Missing dependencies "${r}".`)}},k=e(async n=>{let r=l.get(n);if(r)return r;let t;switch(n){case"arktype":t=(await import("./arktype-aI7TBD0R-
|
|
12
|
+
import{a as e}from"./chunk-MBZTOEAD.js";var u=Symbol.for("quansync.getIsAsync"),f=class extends Error{static{e(this,"QuansyncError")}constructor(n="Unexpected promise in sync context"){super(n),this.name="QuansyncError"}};function y(n){return n&&typeof n=="object"&&typeof n.then=="function"}e(y,"isThenable");function x(n){return n&&typeof n=="object"&&typeof n[Symbol.iterator]=="function"&&"__quansync"in n}e(x,"isQuansyncGenerator");function d(n){let r=e(function*(...a){return(yield u)?yield n.async.apply(this,a):n.sync.apply(this,a)},"generator");function t(...a){let o=r.apply(this,a);return o.then=(...b)=>n.async.apply(this,a).then(...b),o.__quansync=!0,o}return e(t,"fn"),t.sync=n.sync,t.async=n.async,t}e(d,"fromObject");function _(n){return d({async:e(()=>Promise.resolve(n),"async"),sync:e(()=>{if(y(n))throw new f;return n},"sync")})}e(_,"fromPromise");function i(n,r){if(n===u)return r;if(x(n))return r?w(n):h(n);if(!r&&y(n))throw new f;return n}e(i,"unwrapYield");var p=e(n=>n,"DEFAULT_ON_YIELD");function h(n,r=p){let t=n.next();for(;!t.done;)try{t=n.next(i(r(t.value,!1)))}catch(a){t=n.throw(a)}return i(t.value)}e(h,"iterateSync");async function w(n,r=p){let t=n.next();for(;!t.done;)try{t=n.next(await i(r(t.value,!0),!0))}catch(a){t=n.throw(a)}return t.value}e(w,"iterateAsync");function S(n,r){return d({name:n.name,async(...t){return w(n.apply(this,t),r?.onYield)},sync(...t){return h(n.apply(this,t),r?.onYield)}})}e(S,"fromGeneratorFn");function s(n,r){return y(n)?_(n):typeof n=="function"?S(n,r):d(n)}e(s,"quansync");var E=s({async:e(()=>Promise.resolve(!0),"async"),sync:e(()=>!1,"sync")});var l=new Map,c=class extends Error{static{e(this,"UnsupportedVendorError")}constructor(r){super(`standard-json: Unsupported schema vendor "${r}".`)}},m=class extends Error{static{e(this,"MissingDependencyError")}constructor(r){super(`standard-json: Missing dependencies "${r}".`)}},k=e(async n=>{let r=l.get(n);if(r)return r;let t;switch(n){case"arktype":t=(await import("./arktype-aI7TBD0R-TFNARRIP.js")).default();break;case"effect":t=(await import("./effect-QlVUlMFu-JVYEXAZL.js")).default();break;case"sury":t=(await import("./sury-CWZTCd75-3YHH6KVI.js")).default();break;case"typebox":t=(await import("./typebox-Dei93FPO-GLI7OCTY.js")).default();break;case"valibot":t=(await import("./valibot--1zFm7rT-FSYJNYJ6.js")).default();break;case"zod":t=(await import("./zod-Bwrt9trS-HVDOFWRP.js")).default();break;default:throw new c(n)}let a=await t;return l.set(n,a),a},"getToJsonSchemaFn"),P=s({sync:e((n,r)=>{let t=n["~standard"].vendor,a=l.get(t);if(!a)throw new c(t);return a(n,r)},"sync"),async:e(async(n,r)=>(await k(n["~standard"].vendor))(n,r),"async")});export{m as a,P as b};
|
|
@@ -9,4 +9,4 @@ if (typeof globalThis.Bun === 'undefined') {
|
|
|
9
9
|
if (typeof globalThis.__name === 'undefined') { globalThis.__name = (t, n) => { Object.defineProperty(t, 'name', { value: n, configurable: true }); return t; }; }
|
|
10
10
|
if (typeof globalThis.__export === 'undefined') { globalThis.__export = (t, a) => { for (const k in a) Object.defineProperty(t, k, { get: a[k], enumerable: true }); }; }
|
|
11
11
|
|
|
12
|
-
import{F as D,a as z,b as V,h as q,k as C}from"./chunk-
|
|
12
|
+
import{F as D,a as z,b as V,h as q,k as C}from"./chunk-MN5GIJ5E.js";import{D as N,n as w,q as A}from"./chunk-22MFGOA6.js";import{B as J,h as S,j as O,k as b,l as B,n as F}from"./chunk-N7PLTD3P.js";import{e as K}from"./chunk-M4CB72HE.js";import{a as c}from"./chunk-MBZTOEAD.js";import{Effect as t,Exit as de,Layer as u,Option as j,Schema as k,Scope as G,ServiceMap as pe,Stream as fe}from"effect";import{FetchHttpClient as le,HttpClient as Q,HttpClientRequest as p,HttpClientResponse as ue}from"effect/unstable/http";import{sqliteTable as ce,text as I}from"drizzle-orm/sqlite-core";var l=ce("session_share",{session_id:I().primaryKey().references(()=>F.id,{onDelete:"cascade"}),id:I().notNull(),secret:I().notNull(),url:I().notNull(),...B});var ye;(x=>{let f=K.create({service:"share-next"}),y=process.env.OPENCODE_DISABLE_SHARE==="true"||process.env.OPENCODE_DISABLE_SHARE==="1",W=k.Struct({id:k.String,url:k.String,secret:k.String});class _ extends pe.Service()("@opencode/ShareNext"){static{c(this,"Service")}}x.Service=_;let $=c(i=>t.sync(()=>O.use(i)),"db");function U(i){return{create:`/api/${i}`,sync:c(d=>`/api/${i}/${d}/sync`,"sync"),remove:c(d=>`/api/${i}/${d}`,"remove"),data:c(d=>`/api/${i}/${d}/data`,"data")}}c(U,"api");let X=U("share"),Y=U("shares");function R(i){switch(i.type){case"session":return"session";case"message":return`message/${i.data.id}`;case"part":return`part/${i.data.messageID}/${i.data.id}`;case"session_diff":return"session_diff";case"model":return"model"}}c(R,"key"),x.layer=u.effect(_,t.gen(function*(){let i=yield*A.Service,d=yield*w.Service,te=yield*N.Service,H=yield*Q.HttpClient,L=Q.filterStatusOk(H),P=yield*C.Service,M=yield*D.Service;function m(e,s){return t.gen(function*(){if(y)return;let n=yield*S.get(E),r=n.queue.get(e);if(r){for(let a of s)r.data.set(R(a),a);return}let o=new Map(s.map(a=>[R(a),a]));n.queue.set(e,{data:o}),yield*re(e).pipe(t.delay(1e3),t.catchCause(a=>t.sync(()=>{f.error("share flush failed",{sessionID:e,cause:a})})),t.forkIn(n.scope))})}c(m,"sync");let E=yield*S.make(t.fn("ShareNext.state")(function*(e){let s={queue:new Map,scope:yield*G.make()};if(yield*t.addFinalizer(()=>G.close(s.scope,de.void).pipe(t.andThen(t.sync(()=>{s.queue.clear()})))),y)return s;let n=c((r,o)=>d.subscribe(r).pipe(fe.runForEach(a=>o(a).pipe(t.catchCause(v=>t.sync(()=>{f.error("share subscriber failed",{type:r.type,cause:v})})))),t.forkScoped),"watch");return yield*n(D.Event.Updated,r=>t.gen(function*(){let o=yield*M.get(r.properties.sessionID);yield*m(o.id,[{type:"session",data:o}])})),yield*n(q.Event.Updated,r=>t.gen(function*(){let o=r.properties.info;if(yield*m(o.sessionID,[{type:"message",data:o}]),o.role!=="user")return;let a=yield*P.getModel(o.model.providerID,o.model.modelID);yield*m(o.sessionID,[{type:"model",data:[a]}])})),yield*n(q.Event.PartUpdated,r=>m(r.properties.part.sessionID,[{type:"part",data:r.properties.part}])),yield*n(D.Event.Diff,r=>m(r.properties.sessionID,[{type:"session_diff",data:r.properties.diff}])),s})),h=t.fn("ShareNext.request")(function*(){let e={},s=yield*i.active();if(j.isNone(s)||!s.value.active_org_id){let r=(yield*te.get()).enterprise?.url??"https://opncd.ai";return{headers:e,api:X,baseUrl:r}}let n=yield*i.token(s.value.id);if(j.isNone(n))throw new Error("No active account token available for sharing");return e.authorization=`Bearer ${n.value}`,e["x-org-id"]=s.value.active_org_id,{headers:e,api:Y,baseUrl:s.value.url}}),T=t.fnUntraced(function*(e){let s=yield*$(n=>n.select().from(l).where((0,b.eq)(l.session_id,e)).get());if(s)return{id:s.id,secret:s.secret,url:s.url}}),re=t.fn("ShareNext.flush")(function*(e){if(y)return;let s=yield*S.get(E),n=s.queue.get(e);if(!n)return;s.queue.delete(e);let r=yield*T(e);if(!r)return;let o=yield*h(),a=yield*p.post(`${o.baseUrl}${o.api.sync(r.id)}`).pipe(p.setHeaders(o.headers),p.bodyJson({secret:r.secret,data:Array.from(n.data.values())}),t.flatMap(v=>H.execute(v)));a.status>=400&&f.warn("failed to sync share",{sessionID:e,shareID:r.id,status:a.status})}),se=t.fn("ShareNext.full")(function*(e){f.info("full sync",{sessionID:e});let s=yield*M.get(e),n=yield*M.diff(e),r=yield*t.sync(()=>Array.from(q.stream(e))),o=yield*t.forEach(Array.from(new Map(r.filter(a=>a.info.role==="user").map(a=>a.info.model).map(a=>[`${a.providerID}/${a.modelID}`,a])).values()),a=>P.getModel(z.make(a.providerID),V.make(a.modelID)),{concurrency:8});yield*m(e,[{type:"session",data:s},...r.map(a=>({type:"message",data:a.info})),...r.flatMap(a=>a.parts.map(v=>({type:"part",data:v}))),{type:"session_diff",data:n},{type:"model",data:o}])}),ne=t.fn("ShareNext.init")(function*(){y||(yield*S.get(E))}),ae=t.fn("ShareNext.url")(function*(){return(yield*h()).baseUrl}),ie=t.fn("ShareNext.create")(function*(e){if(y)return{id:"",url:"",secret:""};f.info("creating share",{sessionID:e});let s=yield*h(),n=yield*p.post(`${s.baseUrl}${s.api.create}`).pipe(p.setHeaders(s.headers),p.bodyJson({sessionID:e}),t.flatMap(o=>L.execute(o)),t.flatMap(ue.schemaBodyJson(W)));yield*$(o=>o.insert(l).values({session_id:e,id:n.id,secret:n.secret,url:n.url}).onConflictDoUpdate({target:l.session_id,set:{id:n.id,secret:n.secret,url:n.url}}).run());let r=yield*S.get(E);return yield*se(e).pipe(t.catchCause(o=>t.sync(()=>{f.error("share full sync failed",{sessionID:e,cause:o})})),t.forkIn(r.scope)),n}),oe=t.fn("ShareNext.remove")(function*(e){if(y)return;f.info("removing share",{sessionID:e});let s=yield*T(e);if(!s)return;let n=yield*h();yield*p.delete(`${n.baseUrl}${n.api.remove(s.id)}`).pipe(p.setHeaders(n.headers),p.bodyJson({secret:s.secret}),t.flatMap(r=>L.execute(r))),yield*$(r=>r.delete(l).where((0,b.eq)(l.session_id,e)).run())});return _.of({init:ne,url:ae,request:h,create:ie,remove:oe})})),x.defaultLayer=x.layer.pipe(u.provide(w.layer),u.provide(A.defaultLayer),u.provide(N.defaultLayer),u.provide(le.layer),u.provide(C.defaultLayer),u.provide(D.defaultLayer));let{runPromise:g}=J(_,x.defaultLayer);async function me(){return g(i=>i.init())}x.init=me,c(me,"init");async function Se(){return g(i=>i.url())}x.url=Se,c(Se,"url");async function ge(){return g(i=>i.request())}x.request=ge,c(ge,"request");async function he(i){return g(d=>d.create(i))}x.create=he,c(he,"create");async function ve(i){return g(d=>d.remove(i))}x.remove=ve,c(ve,"remove")})(ye||={});export{ye as a};
|