alchemylab-opencode 1.0.26 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/NODE_COMPAT.md +23 -174
  2. package/dist/20260127222353_familiar_lady_ursula-KV747FJX.js +14 -0
  3. package/dist/{chunk-LTCXIXYM.js → 20260211171708_add_project_commands-GDOHPDPF.js} +3 -1
  4. package/dist/20260213144116_wakeful_the_professor-ZVDD54AK.js +14 -0
  5. package/dist/20260225215848_workspace-ZMSOZSPA.js +14 -0
  6. package/dist/20260227213759_add_session_workspace_id-ROENWPKA.js +14 -0
  7. package/dist/20260228203230_blue_harpoon-IW3Z4TQZ.js +14 -0
  8. package/dist/20260303231226_add_workspace_fields-OUVZMNAG.js +14 -0
  9. package/dist/20260309230000_move_org_to_state-NOXAPU5V.js +14 -0
  10. package/dist/20260312043431_session_message_cursor-DJ4T3T4R.js +14 -0
  11. package/dist/20260323234822_events-72GIKJ2A.js +14 -0
  12. package/dist/20260410174513_workspace-name-JXSWFBJN.js +14 -0
  13. package/dist/20260413175956_chief_energizer-4HEWZ6U3.js +14 -0
  14. package/dist/20260423070820_add_icon_url_override-X5SHFGTI.js +14 -0
  15. package/dist/20260427172553_slow_nightmare-PS5T2AH2.js +14 -0
  16. package/dist/{chunk-PWFRMDDF.js → 20260428004200_add_session_path-LGW75WYA.js} +3 -0
  17. package/dist/{valibot--1zFm7rT-FSYJNYJ6.js → 20260501142318_next_venus-J3TLVXZ6.js} +3 -1
  18. package/dist/20260504145000_add_sync_owner-3R52GB4C.js +14 -0
  19. package/dist/20260507164347_add_workspace_time-JHDRCZAR.js +14 -0
  20. package/dist/20260510033149_session_usage-UGBVOXZB.js +53 -0
  21. package/dist/20260511000411_data_migration_state-FB4LBFSE.js +14 -0
  22. package/dist/20260511173437_session-metadata-T2XHGWHS.js +14 -0
  23. package/dist/20260601010001_normalize_storage_paths-5MAY5GT3.js +14 -0
  24. package/dist/{chunk-YRY5Y3QL.js → 20260601202201_amazing_prowler-PET224YG.js} +3 -1
  25. package/dist/20260602002951_lowly_union_jack-PG6XDMGL.js +14 -0
  26. package/dist/20260602182828_add_project_directories-ZCH2ACGG.js +14 -0
  27. package/dist/20260603001617_session_message_projection_indexes-XVLJTUF2.js +14 -0
  28. package/dist/20260603040000_session_message_projection_order-XG6RACZQ.js +14 -0
  29. package/dist/20260603141458_session_input_inbox-K2VQ7V6E.js +14 -0
  30. package/dist/20260603160727_jittery_ezekiel_stane-WKJLRDO7.js +14 -0
  31. package/dist/20260604172448_event_sourced_session_input-NTXOECR7.js +14 -0
  32. package/dist/20260605003541_add_session_context_snapshot-DXMQEXMT.js +14 -0
  33. package/dist/{zod-Bwrt9trS-HVDOFWRP.js → 20260605042240_add_context_epoch_agent-W6IQYZXE.js} +3 -1
  34. package/dist/20260611035744_credential-XTMSYTJD.js +14 -0
  35. package/dist/20260611192811_lush_chimera-XPLIQMJD.js +14 -0
  36. package/dist/20260612174303_project_dir_strategy-FR2NGQKK.js +14 -0
  37. package/dist/20260622142730_simplify_session_context_epoch-NTQZR3RE.js +14 -0
  38. package/dist/20260622170816_reset_v2_session_state-5JPHJTZG.js +14 -0
  39. package/dist/20260622202450_simplify_session_input-2EXF2HMV.js +14 -0
  40. package/dist/app-runtime-6NGO2HRS.js +14 -0
  41. package/dist/chunk-4K2RXRZL.js +14 -0
  42. package/dist/chunk-BM2C7NHL.js +41 -0
  43. package/dist/chunk-E47SMIVL.js +186 -0
  44. package/dist/chunk-OMDJ6ZZ2.js +684 -0
  45. package/dist/chunk-PLQOF3WF.js +393 -0
  46. package/dist/chunk-QRABYJKL.js +14 -0
  47. package/dist/chunk-RHIWAYN5.js +14 -0
  48. package/dist/{arktype-aI7TBD0R-TFNARRIP.js → chunk-VURLSDCB.js} +3 -1
  49. package/dist/chunk-Z5TLIUAI.js +28 -0
  50. package/dist/chunk-ZMHNE2MU.js +865 -0
  51. package/dist/chunk-ZWLTE2TM.js +1455 -0
  52. package/dist/code-mode-YFX4N2VN.js +40 -0
  53. package/dist/copilot-provider-TX4YFKJZ.js +14 -0
  54. package/dist/photon-VQS5F5BI.js +14 -0
  55. package/dist/pty.node-Y3N2XKYG.js +14 -0
  56. package/dist/run.js +3 -1
  57. package/dist/serve.js +3 -1
  58. package/dist/server-TI57TGPO.js +17 -0
  59. package/dist/session-6RNXZNG6.js +14 -0
  60. package/dist/{chunk-2ANK3QEN.js → worktree-3RZQEGVC.js} +3 -1
  61. package/package.json +83 -50
  62. package/patches/@ai-sdk%2Famazon-bedrock@4.0.166.patch +164 -0
  63. package/patches/@ai-sdk%2Fanthropic@3.0.111.patch +528 -0
  64. package/patches/@ai-sdk%2Fgoogle@3.0.73.patch +69 -0
  65. package/patches/@ai-sdk%2Fgroq@3.0.31.patch +79 -0
  66. package/patches/@ai-sdk%2Fmistral@3.0.51.patch +714 -0
  67. package/patches/@ai-sdk%2Fopenai-compatible@2.0.41.patch +39 -0
  68. package/patches/@ai-sdk%2Fopenai@3.0.88.patch +280 -0
  69. package/patches/@ai-sdk%2Fxai@3.0.139.patch +296 -0
  70. package/patches/@modelcontextprotocol%2Fsdk@1.29.0.patch +647 -0
  71. package/patches/@npmcli%2Fagent@4.0.2.patch +13 -0
  72. package/patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch +285 -0
  73. package/patches/effect@4.0.0-beta.83.patch +57 -0
  74. package/patches/gcp-metadata@8.1.2.patch +14 -0
  75. package/patches/pacote@21.5.0.patch +18 -0
  76. package/postinstall.cjs +146 -0
  77. package/dist/chunk-5P5WLADX.js +0 -18
  78. package/dist/chunk-7KKA6WBY.js +0 -12
  79. package/dist/chunk-A7EXZZPC.js +0 -12
  80. package/dist/chunk-CZVKIDQZ.js +0 -12
  81. package/dist/chunk-FXLFZ5DL.js +0 -12
  82. package/dist/chunk-G752V4OP.js +0 -2187
  83. package/dist/chunk-GBXMNWYD.js +0 -18
  84. package/dist/chunk-IR6PDN4W.js +0 -13
  85. package/dist/chunk-M4CB72HE.js +0 -13
  86. package/dist/chunk-MBZTOEAD.js +0 -12
  87. package/dist/default-u_dwuiYb-652AQZKX.js +0 -12
  88. package/dist/effect-QlVUlMFu-JVYEXAZL.js +0 -12
  89. package/dist/log-MVJ7H4K5.js +0 -12
  90. package/dist/pty.node-X2EITEZ4.js +0 -12
  91. package/dist/registry-ISXIFNPG.js +0 -12
  92. package/dist/run-AUCA7EKA.js +0 -20
  93. package/dist/run-service-MT3LOWLS.js +0 -12
  94. package/dist/schema-YWIVP7UR.js +0 -12
  95. package/dist/server-PIYRZLBG.js +0 -12
  96. package/dist/session-ACBIJ2VE.js +0 -12
  97. package/dist/share-next-MPGA7EO4.js +0 -12
  98. package/dist/sury-CWZTCd75-3YHH6KVI.js +0 -12
  99. package/dist/typebox-Dei93FPO-GLI7OCTY.js +0 -12
  100. package/dist/valibot-D_HTw1Gn-E5NKVIOV.js +0 -12
  101. package/dist/worktree-E4DGSBLJ.js +0 -12
  102. package/dist/zod-DSgpEGAE-DSH6V7MG.js +0 -12
  103. package/packages/opencode/migration/20260127222353_familiar_lady_ursula/migration.sql +0 -90
  104. package/packages/opencode/migration/20260127222353_familiar_lady_ursula/snapshot.json +0 -796
  105. package/packages/opencode/migration/20260211171708_add_project_commands/migration.sql +0 -1
  106. package/packages/opencode/migration/20260211171708_add_project_commands/snapshot.json +0 -806
  107. package/packages/opencode/migration/20260213144116_wakeful_the_professor/migration.sql +0 -11
  108. package/packages/opencode/migration/20260213144116_wakeful_the_professor/snapshot.json +0 -897
  109. package/packages/opencode/migration/20260225215848_workspace/migration.sql +0 -7
  110. package/packages/opencode/migration/20260225215848_workspace/snapshot.json +0 -959
  111. package/packages/opencode/migration/20260227213759_add_session_workspace_id/migration.sql +0 -2
  112. package/packages/opencode/migration/20260227213759_add_session_workspace_id/snapshot.json +0 -983
  113. package/packages/opencode/migration/20260228203230_blue_harpoon/migration.sql +0 -17
  114. package/packages/opencode/migration/20260228203230_blue_harpoon/snapshot.json +0 -1102
  115. package/packages/opencode/migration/20260303231226_add_workspace_fields/migration.sql +0 -5
  116. package/packages/opencode/migration/20260303231226_add_workspace_fields/snapshot.json +0 -1013
  117. package/packages/opencode/migration/20260309230000_move_org_to_state/migration.sql +0 -3
  118. package/packages/opencode/migration/20260309230000_move_org_to_state/snapshot.json +0 -1156
  119. package/packages/opencode/migration/20260312043431_session_message_cursor/migration.sql +0 -4
  120. package/packages/opencode/migration/20260312043431_session_message_cursor/snapshot.json +0 -1168
  121. package/packages/opencode/migration/20260323234822_events/migration.sql +0 -13
  122. package/packages/opencode/migration/20260323234822_events/snapshot.json +0 -1271
  123. package/packages/opencode/migration/20260409000000_add_session_metadata/migration.sql +0 -1
@@ -0,0 +1,17 @@
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
+ import { createRequire as __alchemyCreateRequire } from 'node:module';
12
+ const require = __alchemyCreateRequire(import.meta.url);
13
+
14
+ import{A as uc,B as lc,C as Zs,D as fe,E as yc,F as Gn,G as ei,a as $p,b as rt,c as ec,d as ea,e as Vt,f as Gr,g as tc,h as Po,i as zs,j as Ys,k as _r,l as nc,m as sc,n as Ks,o as $r,p as ic,q as pc,r as qo,s as Vr,t as cc,u as ta,v as Js,w as Xs,x as Qt,y as mc,z as mt}from"./chunk-ZWLTE2TM.js";import"./chunk-VURLSDCB.js";import{C as gc,E as Qr,F as Me,G as zt,a as bp,c as Bp,d as Fs,e as Tt,f as jr,g as ot,h as Gp,i as ge,j as Ho,k as Ws,p as Ki,q as _p,r as Wn,s as Ne,u as Xp,y as ac}from"./chunk-PLQOF3WF.js";import"./chunk-4K2RXRZL.js";import{N as z,c as $s,d as Kp,e as Jp,f as _,g as xo,h as Zi,l as Vs,m as Qs}from"./chunk-Z5TLIUAI.js";import{a as dc,b as Mo,f as dt,g as wt,h as fc,w as mo}from"./chunk-E47SMIVL.js";import{C as rc,D as qe,b as kp,c as wp,d as Yi,e as Fn,f as Ur,g as Lp,h as Ns,i as Op,j as Np,k as Us,m as Wp,n as js,s as Wr,u as pr,v as Zp,w as Br,y as oc,z as oe}from"./chunk-ZMHNE2MU.js";import{a as ar,c as Ls,e as wo}from"./chunk-QRABYJKL.js";import{$ as Nr,Aa as Fr,B as Mp,C as jn,Sa as kt,Va as co,Wa as $t,X as Tp,Xa as Yp,Ya as Bn,_ as Or,a as sr,aa as Dt,b as gp,c as _e,d as V,da as Up,e as Cp,ea as jp,f as Hp,g as xp,h as Ro,ha as Fp,i as Pp,j as qp,ja as Vp,k as Os,ka as Qp,la as Bs,na as _t,oa as Gs,pa as _s,qa as Ji,r as bo,t as zi,ta as ae,u as Co,ua as Xi,v as Un,va as Oe,wa as zp}from"./chunk-OMDJ6ZZ2.js";import{Ab as ir,Bc as Ts,C as Pe,Cc as le,E as qt,F as Tn,Fc as Dp,G as hp,Gc as Ge,Hc as Nn,Ja as Ip,K as Ln,L as qs,M as Sp,Ma as po,Ob as Ep,Oc as Rp,P as Eo,Pc as ko,Q as Ms,R as On,a as xs,b as Ao,e as nr,f as De,g as Et,h as ke,j as yp,mb as Do,nb as Ap,pa as vp,pb as Lr,q as F,qb as Mt,t as ct,u as Vi,v as tt,w as Ps,x as Mn,xb as Be,yb as ie,zc as Qi}from"./chunk-BM2C7NHL.js";import{a as n,d as xe}from"./chunk-RHIWAYN5.js";var fp={};xe(fp,{Default:()=>fD,Server:()=>fp,listen:()=>gD,openapi:()=>yD,url:()=>Gi});import{NodeHttpServer as cD}from"@effect/platform-node";import{ConfigProvider as Yl,Context as Bi,Effect as se,Exit as lp,Layer as Tr,Scope as bs}from"effect";import{HttpRouter as dD,HttpServer as mD}from"effect/unstable/http";import{OpenApi as uD}from"effect/unstable/httpapi";import{createServer as lD}from"node:http";var zr={};xe(zr,{MDNS:()=>zr,publish:()=>lf,unpublish:()=>hc});import{Bonjour as uf}from"bonjour-service";var Yt,ti;function lf(e,t){if(ti!==e){Yt&&hc();try{let o=t??"opencode.local",r=`opencode-${e}`;Yt=new uf,Yt.publish({name:r,type:"http",host:o,port:e,txt:{path:"/"}}).on("error",()=>{}),ti=e}catch{if(Yt)try{Yt.destroy()}catch{}Yt=void 0,ti=void 0}}}n(lf,"publish");function hc(){if(Yt){try{Yt.unpublishAll(),Yt.destroy()}catch{}Yt=void 0,ti=void 0}}n(hc,"unpublish");var rr={};xe(rr,{HttpApiApp:()=>rr,context:()=>zE,createRoutes:()=>Ql,routes:()=>zl,webHandler:()=>pD});import{Context as BE,Effect as _l,Layer as X}from"effect";import{HttpApiBuilder as Rs,OpenApi as GE}from"effect/unstable/httpapi";import{HttpClient as _E,HttpMiddleware as $E,HttpRouter as Wi,HttpServer as VE,HttpServerResponse as QE}from"effect/unstable/http";import*as $l from"effect/unstable/socket/Socket";var _n={};xe(_n,{PluginPtyEnvironment:()=>_n,layer:()=>vf});var Kt={};xe(Kt,{PtyEnvironment:()=>Kt,Service:()=>Yr,layer:()=>Sc,node:()=>hf});import{Context as ff,Effect as yf,Layer as gf}from"effect";var Yr=class extends ff.Service()("@opencode/ServerPtyEnvironment"){static{n(this,"Service")}},Sc=gf.succeed(Yr,Yr.of({get:n(()=>yf.succeed({}),"get")})),hf=Ao({service:Yr,layer:Sc,deps:[]});import{Effect as oa,Layer as Sf}from"effect";var vf=Sf.effect(Kt.Service,oa.gen(function*(){let e=yield*Qr.Service,t=yield*wt.Service;return Kt.Service.of({get:oa.fn("PtyEnvironment.get")(function*(o){return yield*t.provide({directory:o.directory},e.trigger("shell.env",{cwd:o.cwd},{env:{}}).pipe(oa.map(r=>r.env)))})})}));var Lt={};xe(Lt,{ApplyChangesError:()=>Vn,CaptureChangesError:()=>Qn,Destination:()=>vc,DestinationProjectMismatchError:()=>oi,Input:()=>kf,MoveSession:()=>Lt,ResetSourceChangesError:()=>zn,Service:()=>Kr,node:()=>Rf});import{Context as If,DateTime as Af,Effect as $n,Layer as Ef,Schema as ut}from"effect";import Df from"path";var vc=ut.Struct({directory:ke}).annotate({identifier:"MoveSession.Destination"}),kf=ut.Struct({sessionID:Cp.ID,destination:vc,moveChanges:ut.optional(ut.Boolean)}).annotate({identifier:"MoveSession.Input"}),oi=class extends ut.TaggedErrorClass()("MoveSession.DestinationProjectMismatchError",{expected:Be.ID,actual:Be.ID}){static{n(this,"DestinationProjectMismatchError")}},Vn=class extends ut.TaggedErrorClass()("MoveSession.ApplyChangesError",{message:ut.String}){static{n(this,"ApplyChangesError")}},Qn=class extends ut.TaggedErrorClass()("MoveSession.CaptureChangesError",{message:ut.String}){static{n(this,"CaptureChangesError")}},zn=class extends ut.TaggedErrorClass()("MoveSession.ResetSourceChangesError",{directory:ke,message:ut.String,cause:ut.optional(ut.Defect())}){static{n(this,"ResetSourceChangesError")}},Kr=class extends If.Service()("@opencode/ControlPlaneMoveSession"){static{n(this,"Service")}},wf=Ef.effect(Kr,$n.gen(function*(){let e=yield*Lr.Service,t=yield*le.Service,o=yield*Be.Service,r=yield*Or.Service,s=$n.fn("MoveSession.moveSession")(function*(i){let c=yield*r.get(i.sessionID);if(!c)return yield*new Dt.NotFoundError({sessionID:i.sessionID});let h=ke.make(i.destination.directory);if(c.location.directory===h)return;let y=yield*o.resolve(c.location.directory),u=yield*o.resolve(h);if(c.projectID!==u.id)return yield*new oi({expected:c.projectID,actual:u.id});let a=i.moveChanges&&y.directory!==u.directory,l=a?yield*e.repo.discover(c.location.directory):void 0;if(a&&!l)return yield*new Qn({message:"Source is not a Git repository"});let A=l?yield*e.change.capture({repository:l,path:c.location.directory}).pipe($n.mapError(E=>new Qn({message:E.message}))):Lr.ChangeSet.make("");if(A){let E=yield*e.repo.discover(h);if(!E)return yield*new Vn({message:"Destination is not a Git repository"});yield*e.change.apply({repository:E,path:h,changes:A}).pipe($n.mapError(f=>new Vn({message:f.message})))}if(yield*t.publish(ir.Moved,{sessionID:i.sessionID,location:ie.Ref.make({directory:h}),subdirectory:Et.make(Df.relative(u.directory,h).replaceAll("\\","/")),timestamp:yield*Af.now}),A){let E=yield*e.repo.discover(c.location.directory);if(!E)return yield*new zn({directory:c.location.directory,message:"Source is not a Git repository"});yield*e.change.discard({repository:E,path:c.location.directory,index:"preserve",untracked:"remove"}).pipe($n.mapError(f=>new zn({directory:c.location.directory,message:f.message,cause:f.cause})))}});return Kr.of({moveSession:s})})),Rf=Ao({service:Kr,layer:wf,deps:[Lr.node,le.node,Be.node,Or.node]});var Rt={};xe(Rt,{ConnectToken:()=>qf,PtyTicket:()=>Rt,Service:()=>Jr,make:()=>Ac,node:()=>Of});var cr={};xe(cr,{ConnectToken:()=>bf,PtyTicket:()=>cr});import{Schema as Ic}from"effect";var bf=Ic.Struct({ticket:Ic.String,expires_in:nr}).annotate({identifier:"PtyTicket.ConnectToken"});import{Cache as ra,Context as Cf,Duration as na,Effect as ri,Layer as Hf}from"effect";var xf=na.seconds(60),Pf=1e4,qf=cr.ConnectToken,Jr=class extends Cf.Service()("@opencode/PtyTicket"){static{n(this,"Service")}};function Mf(e,t){return e.ptyID===t.ptyID&&e.directory===t.directory&&e.workspaceID===t.workspaceID}n(Mf,"matches");var Tf=n(()=>ri.die("PtyTicket cache must be used via set/invalidateWhen, never get"),"noLookup"),Ac=n((e=xf)=>ri.gen(function*(){let t=yield*ra.make({capacity:Pf,lookup:Tf,timeToLive:e}),o=Math.max(1,Math.round(na.toSeconds(na.fromInputUnsafe(e))));return Jr.of({issue:ri.fn("PtyTicket.issue")(function*(r){let s=crypto.randomUUID();return yield*ra.set(t,s,r),{ticket:s,expires_in:o}}),consume:ri.fn("PtyTicket.consume")(function*(r){return yield*ra.invalidateWhen(t,r.ticket,s=>Mf(s,r))})})}),"make"),Lf=Hf.effect(Jr,Ac()),Of=Ao({service:Jr,layer:Lf,deps:[]});import{Cause as Wf,Effect as Lo,Layer as Bf}from"effect";var Yn={};xe(Yn,{SessionRunCoordinator:()=>Yn,make:()=>Ff});import{Deferred as To,Effect as $e,Exit as Nf,Fiber as Uf,FiberSet as jf}from"effect";var Ff=n(e=>$e.gen(function*(){let t=new Map,o=yield*jf.makeRuntime(),r=n(()=>({done:To.makeUnsafe(),pendingWake:!1,stopping:!1}),"makeEntry"),s=n((u,a,l,A=!1)=>{let E=To.makeUnsafe(),f=o((A?$e.yieldNow:To.await(E)).pipe($e.andThen($e.suspend(()=>e.drain(u,l))),$e.onExit(v=>$e.sync(()=>i(u,a,v))),$e.exit,$e.asVoid));a.owner=f,A||To.doneUnsafe(E,$e.void)},"start"),i=n((u,a,l)=>{if(Nf.isSuccess(l)&&!a.stopping&&a.pendingWake){a.pendingWake=!1,s(u,a,!1,!0);return}let A=a.pendingWake?r():void 0;A===void 0?t.delete(u):(t.set(u,A),s(u,A,!1,!0)),To.doneUnsafe(a.done,l)},"settle"),c=n(u=>$e.uninterruptibleMask(a=>{let l=t.get(u);if(l!==void 0)return l.stopping?a(To.await(l.done).pipe($e.andThen(c(u)))):a(To.await(l.done));let A=r();return t.set(u,A),s(u,A,!0),a(To.await(A.done))}),"run"),h=n(u=>$e.sync(()=>{let a=t.get(u);if(a!==void 0){a.pendingWake=!0;return}let l=r();t.set(u,l),s(u,l,!1)}),"wake"),y=n(u=>$e.suspend(()=>{let a=t.get(u);return a?.owner===void 0?$e.void:(a.stopping=!0,a.pendingWake=!1,Uf.interrupt(a.owner))}),"interrupt");return{active:$e.sync(()=>new Set(t.keys())),run:c,wake:h,interrupt:y}}),"make");var Gf=Bf.effect(Nr.Service,Lo.gen(function*(){let e=yield*Or.Service,t=yield*_e.Service,o=yield*Yn.make({drain:Lo.fnUntraced(function*(r,s){let i=yield*e.get(r);return i?yield*Tp.Service.use(c=>c.run({sessionID:r,force:s})).pipe(Lo.provide(t.get(i.location)),Lo.tapCause(c=>Wf.hasInterruptsOnly(c)?Lo.void:Lo.logError("Failed to drain Session",c).pipe(Lo.annotateLogs({sessionID:r})))):yield*Lo.die(`Session not found: ${r}`)})});return Nr.Service.of({active:o.active,interrupt:o.interrupt,resume:o.run,wake:o.wake})})),Ec=Ao({service:Nr.Service,layer:Gf,deps:[Or.node,_e.node]});function Kn(e){let t,o=!1,r=n(()=>(o||(t=e(),o=!0),t),"result");return r.reset=()=>{o=!1,t=void 0},r.loaded=()=>o,r}n(Kn,"lazy");import{Context as _f}from"effect";var $f=/^https:\/\/([a-z0-9-]+\.)*opencode\.ai$/,dr=_f.Reference("@opencode/ServerCorsConfig",{defaultValue:n(()=>{},"defaultValue")});function sa(e,t){return!e||e.startsWith("http://localhost:")||e.startsWith("http://127.0.0.1:")||e.startsWith("oc://renderer")||e==="tauri://localhost"||e==="http://tauri.localhost"||e==="https://tauri.localhost"||$f.test(e)?!0:t?.cors?.includes(e)??!1}n(sa,"isAllowedCorsOrigin");function Jn(e,t,o){return!e||t&&Vf(e,t)?!0:sa(e,o)}n(Jn,"isAllowedRequestOrigin");function Vf(e,t){try{return new URL(e).host===t}catch{return!1}}n(Vf,"sameHost");import{Effect as Xr,Stream as kc}from"effect";import{HttpBody as wc,HttpClientRequest as Xf,HttpServerResponse as ni}from"effect/unstable/http";import{createHash as Zf}from"node:crypto";var uo={};xe(uo,{ProxyUtil:()=>uo,headers:()=>Yf,websocketProtocols:()=>Kf,websocketTargetURL:()=>Jf});var Qf=new Set(["connection","keep-alive","proxy-authenticate","proxy-authorization","proxy-connection","te","trailer","transfer-encoding","upgrade","host"]);function zf(e){for(let t of Qf)e.delete(t);e.delete("accept-encoding"),e.delete("x-opencode-directory"),e.delete("x-opencode-workspace")}n(zf,"sanitize");function Yf(e,t){let o=e instanceof Request?e.headers:e,r=new Headers(o instanceof Headers?o:Object.entries(o));if(zf(r),!t)return r;for(let[s,i]of new Headers(t).entries())r.set(s,i);return r}n(Yf,"headers");function Kf(e){let t=e instanceof Request?e.headers.get("sec-websocket-protocol"):e["sec-websocket-protocol"];return t?t.split(",").map(o=>o.trim()).filter(Boolean):[]}n(Kf,"websocketProtocols");function Jf(e){let t=new URL(e);return t.protocol==="http:"&&(t.protocol="ws:"),t.protocol==="https:"&&(t.protocol="wss:"),t.toString()}n(Jf,"websocketTargetURL");var ey,bc=new URL("https://app.opencode.ai"),ia=n((e="")=>`default-src 'self'; script-src 'self' 'wasm-unsafe-eval'${e?` 'sha256-${e}'`:""}; style-src 'self' 'unsafe-inline'; img-src 'self' data: https: blob:; font-src 'self' data:; media-src 'self' data:; connect-src * data: blob:`,"csp"),Mk=ia();function ty(e){return e.match(/<script\b(?![^>]*\bsrc\s*=)[^>]*\bid=(['"])oc-theme-preload-script\1[^>]*>([\s\S]*?)<\/script>/i)}n(ty,"themePreloadHash");function Cc(e){let t=ty(e);return ia(t?Zf("sha256").update(t[2]).digest("base64"):"")}n(Cc,"cspForHtml");function oy(e){if(e.method==="GET"||e.method==="HEAD")return wc.empty;let t=e.headers["content-length"];return wc.stream(e.stream,e.headers["content-type"],t===void 0?void 0:Number(t))}n(oy,"requestBody");function ry(e){let t=new Headers(e);return t.delete("content-encoding"),t.delete("content-length"),t.delete("transfer-encoding"),t}n(ry,"proxyResponseHeaders");function ny(e){return new URL(e,bc).toString()}n(ny,"upstreamURL");function sy(e){return e?Promise.resolve(null):ey??=import("opencode-web-ui.gen.ts").then(t=>t.default).catch(()=>null)}n(sy,"embeddedUI");function Rc(){return ni.jsonUnsafe({error:"Not Found"},{status:404})}n(Rc,"notFound");function iy(e,t){let o=po.mimeType(e),r=new Headers({"content-type":o});return o.startsWith("text/html")&&r.set("content-security-policy",Cc(new TextDecoder().decode(t))),ni.raw(t,{headers:r})}n(iy,"embeddedUIResponse");function ay(e,t,o){let r=o[e.replace(/^\//,"")]??o["index.html"]??null;return r?t.readFile(r).pipe(Xr.map(s=>iy(r,s)),Xr.catchReason("PlatformError","NotFound",()=>Xr.succeed(Rc()))):Xr.succeed(Rc())}n(ay,"serveEmbeddedUIEffect");function Hc(e,t){return Xr.gen(function*(){let o=yield*Xr.promise(()=>sy(t.disableEmbeddedWebUi)),r=new URL(e.url,"http://localhost").pathname;if(o)return yield*ay(r,t.fs,o);let s=yield*t.client.execute(Xf.make(e.method)(ny(r),{headers:uo.headers(e.headers,{host:bc.host}),body:oy(e)})),i=ry(s.headers);if(s.headers["content-type"]?.includes("text/html")){let c=yield*s.text;return i.set("Content-Security-Policy",Cc(c)),ni.text(c,{status:s.status,headers:i})}return i.set("Content-Security-Policy",ia()),ni.stream(s.stream.pipe(kc.catchCause(()=>kc.empty)),{status:s.status,headers:i})})}n(Hc,"serveUIEffect");import{Schema as Ba}from"effect";import{HttpApi as bi}from"effect/unstable/httpapi";var lo={};xe(lo,{Definitions:()=>si,Durable:()=>Ts,EventManifest:()=>lo,Latest:()=>aa});var Xn={};xe(Xn,{Definitions:()=>si,Durable:()=>Ts,EventManifest:()=>Xn,Latest:()=>aa,ServerDefinitions:()=>uy});var mr={};xe(mr,{Connected:()=>xc,Definitions:()=>py,Disposed:()=>Pc,ServerEvent:()=>mr});var xc=ct.define({type:"server.connected",schema:{}}),Pc=ct.define({type:"global.disposed",schema:{}}),py=ct.inventory(xc,Pc);var cy=Qi.Event.Definitions.filter(e=>e.durable!==void 0),dy=Qi.Event.Definitions.filter(e=>e.durable===void 0),my=ct.inventory(...cy,...ir.Definitions),qc=ct.inventory(...Wp.Event.Definitions,...tt.Event.Definitions,...hp.Event.Definitions,...my),Mc=ct.inventory(...ar.Event.Definitions,...Ns.Event.Definitions,...Pe.Event.Definitions,...Lp.Event.Definitions,...Bp.Event.Definitions,...bp.Event.Definitions,...ot.Event.Definitions,...Ho.Event.Definitions),uy=ct.inventory(...qc,...Mc,...Ki.Event.Definitions),si=ct.inventory(...qc,...dy,...yc.Definitions,...Mc,...Ki.Event.Definitions,...pc.Definitions,...Ep.Event.Definitions,...oe.Definitions,...rc.Definitions,...dc.Definitions,...Mt.Event.Definitions,...tc.Definitions,...ec.Event.Definitions,...sc.Definitions,...mc.Definitions,...Hp.Definitions,...fc.Definitions,...mr.Definitions),aa=ct.latest(si);import{Schema as Zn}from"effect";var Tc=mr,ii=Zn.Struct({id:Zn.String,type:Zn.Literal("server.instance.disposed"),properties:Zn.Struct({directory:Zn.String})}).annotate({identifier:"Event.server.instance.disposed"});import{HttpApi as Rg,HttpApiEndpoint as va,HttpApiError as bg,HttpApiGroup as Cg,OpenApi as ns}from"effect/unstable/httpapi";import{Effect as Ve,Encoding as Oy,Layer as Jc,Redacted as Xc}from"effect";import{HttpEffect as Ny,HttpRouter as Uy,HttpServerRequest as ua,HttpServerResponse as Zc}from"effect/unstable/http";import{HttpApiError as la,HttpApiMiddleware as ed}from"effect/unstable/httpapi";var es="ticket",Lc="x-opencode-ticket";var ly=/^\/pty\/[^/]+\/connect$/;function fy(e){return ly.test(e)}n(fy,"isPtyConnectPath");function Oc(e){return fy(e.pathname)&&!!e.searchParams.get(es)}n(Oc,"hasPtyConnectTicketURL");var yy=new Set(["/site.webmanifest","/web-app-manifest-192x192.png","/web-app-manifest-512x512.png"]);function Nc(e,t){return e==="GET"&&yy.has(t)}n(Nc,"isPublicUIPath");var ur={};xe(ur,{Config:()=>pa,ServerAuth:()=>ur,authorized:()=>Iy,header:()=>Fc,headers:()=>Ay,required:()=>vy});import{Config as ts,Context as gy,Effect as hy,Layer as Uc,Option as jc,Redacted as Sy}from"effect";var pa=class e extends gy.Service()("@opencode/ServerAuthConfig"){static{n(this,"Config")}static configLayer(t){return Uc.succeed(this,this.of(t))}static get layer(){return Uc.effect(this,hy.gen(function*(){return e.of(yield*ts.all({password:ts.string("OPENCODE_SERVER_PASSWORD").pipe(ts.option),username:ts.string("OPENCODE_SERVER_USERNAME").pipe(ts.withDefault("opencode"))}))}))}};function vy(e){return jc.isSome(e.password)&&e.password.value!==""}n(vy,"required");function Iy(e,t){return jc.isSome(t.password)&&e.username===t.username&&Sy.value(e.password)===t.password.value}n(Iy,"authorized");function Fc(e){let t=e?.password??process.env.OPENCODE_SERVER_PASSWORD;if(t)return`Basic ${Buffer.from(`${e?.username??process.env.OPENCODE_SERVER_USERNAME??"opencode"}:${t}`).toString("base64")}`}n(Fc,"header");function Ay(e){let t=Fc(e);if(t)return{Authorization:t}}n(Ay,"headers");import{Schema as T}from"effect";var be=class extends T.TaggedErrorClass()("InvalidRequestError",{message:T.String,kind:T.optional(T.String),field:T.optional(T.String)},{httpApiStatus:400}){static{n(this,"InvalidRequestError")}},Zr=class extends T.TaggedErrorClass()("UnauthorizedError",{message:T.String},{httpApiStatus:401}){static{n(this,"UnauthorizedError")}},en=class extends T.TaggedErrorClass()("ConflictError",{message:T.String,resource:T.optional(T.String)},{httpApiStatus:409}){static{n(this,"ConflictError")}},lt=class extends T.TaggedErrorClass()("ServiceUnavailableError",{message:T.String,service:T.optional(T.String)},{httpApiStatus:503}){static{n(this,"ServiceUnavailableError")}},nt=class extends T.TaggedErrorClass()("UnknownError",{message:T.String,ref:T.optional(T.String)},{httpApiStatus:500}){static{n(this,"UnknownError")}},tn=class extends T.TaggedErrorClass()("ProviderNotFoundError",{providerID:T.String,message:T.String},{httpApiStatus:404}){static{n(this,"ProviderNotFoundError")}},x=class extends T.TaggedErrorClass()("SessionNotFoundError",{sessionID:T.String,message:T.String},{httpApiStatus:404}){static{n(this,"SessionNotFoundError")}},Oo=class extends T.TaggedErrorClass()("MessageNotFoundError",{sessionID:T.String,messageID:T.String,message:T.String},{httpApiStatus:404}){static{n(this,"MessageNotFoundError")}},Ot=class extends T.TaggedErrorClass()("InvalidCursorError",{message:T.String},{httpApiStatus:400}){static{n(this,"InvalidCursorError")}},lr=class extends T.TaggedErrorClass()("PermissionNotFoundError",{requestID:T.String,message:T.String},{httpApiStatus:404}){static{n(this,"PermissionNotFoundError")}},fr=class extends T.TaggedErrorClass()("QuestionNotFoundError",{requestID:T.String,message:T.String},{httpApiStatus:404}){static{n(this,"QuestionNotFoundError")}},yr=class extends T.TaggedErrorClass()("ForbiddenError",{message:T.String},{httpApiStatus:403}){static{n(this,"ForbiddenError")}},ft=class extends T.TaggedErrorClass()("PtyNotFoundError",{ptyID:T.String,message:T.String},{httpApiStatus:404}){static{n(this,"PtyNotFoundError")}};import{HttpApiMiddleware as Ey}from"effect/unstable/httpapi";var Jt=class extends Ey.Service()("@opencode/HttpApiAuthorization",{error:Zr}){static{n(this,"Authorization")}};import{Schema as Gc}from"effect";import{HttpApiEndpoint as hr,HttpApiGroup as wy,HttpApiSchema as Ry,OpenApi as No}from"effect/unstable/httpapi";import{Schema as gr}from"effect";import{HttpApiEndpoint as Dy,HttpApiGroup as ky,OpenApi as Wc}from"effect/unstable/httpapi";var q=gr.Struct({location:gr.optional(gr.Struct({directory:gr.optional(gr.String),workspace:gr.optional(gr.String)}))}).annotate({identifier:"LocationQuery"}),M=Wc.annotations({transform:n(e=>{let t=e.parameters;return Array.isArray(t)?{...e,parameters:t.map(o=>o?.name==="location"&&o?.in==="query"?{...o,style:"deepObject",explode:!0}:o)}:e},"transform")}),Bc=ky.make("server.location").add(Dy.get("location.get","/api/location",{query:q,success:F.Info}).annotateMerge(M).annotateMerge(Wc.annotations({identifier:"v2.location.get",summary:"Get location",description:"Resolve the requested location or the server default location."})));var ai="ticket",_c="x-opencode-ticket",$c="1",by=/^\/api\/pty\/[^/]+\/connect$/;function Vc(e){return by.test(e.pathname)&&!!e.searchParams.get(ai)}n(Vc,"hasPtyConnectTicketURL");var Qc=wy.make("server.pty").add(hr.get("pty.list","/api/pty",{query:q,success:F.response(Gc.Array(ot.Info))}).annotateMerge(M).annotateMerge(No.annotations({identifier:"v2.pty.list",summary:"List PTY sessions",description:"List PTY sessions for a location, including exited sessions retained until removal."}))).add(hr.post("pty.create","/api/pty",{query:q,payload:ot.CreateInput,success:F.response(ot.Info)}).annotateMerge(M).annotateMerge(No.annotations({identifier:"v2.pty.create",summary:"Create PTY session",description:"Create a pseudo-terminal session for a location."}))).add(hr.get("pty.get","/api/pty/:ptyID",{params:{ptyID:ot.ID},query:q,success:F.response(ot.Info),error:ft}).annotateMerge(M).annotateMerge(No.annotations({identifier:"v2.pty.get",summary:"Get PTY session",description:"Get one PTY session, including its exit code once exited."}))).add(hr.put("pty.update","/api/pty/:ptyID",{params:{ptyID:ot.ID},query:q,payload:ot.UpdateInput,success:F.response(ot.Info),error:ft}).annotateMerge(M).annotateMerge(No.annotations({identifier:"v2.pty.update",summary:"Update PTY session",description:"Update the title or viewport size of one PTY session."}))).add(hr.delete("pty.remove","/api/pty/:ptyID",{params:{ptyID:ot.ID},query:q,success:Ry.NoContent,error:ft}).annotateMerge(M).annotateMerge(No.annotations({identifier:"v2.pty.remove",summary:"Remove PTY session",description:"Terminate and remove one PTY session."}))).add(hr.post("pty.connectToken","/api/pty/:ptyID/connect-token",{params:{ptyID:ot.ID},query:q,success:F.response(cr.ConnectToken),error:[yr,ft]}).annotateMerge(M).annotateMerge(No.annotations({identifier:"v2.pty.connectToken",summary:"Create PTY WebSocket token",description:"Create a short-lived single-use ticket for opening a PTY WebSocket connection."}))).add(hr.get("pty.connect","/api/pty/:ptyID/connect",{params:{ptyID:ot.ID},success:Gc.Boolean,error:[yr,ft]}).annotateMerge(No.annotations({identifier:"v2.pty.connect",summary:"Connect to PTY session",description:"Establish a WebSocket connection streaming PTY output and accepting terminal input.",transform:n(e=>({...e,"x-websocket":!0,parameters:[...e.parameters??[],...["location[directory]","location[workspace]","cursor",ai].map(t=>({in:"query",name:t,schema:{type:"string"}}))]}),"transform")}))).annotateMerge(No.annotations({title:"pty",description:"Experimental location-scoped PTY routes."}));import{Effect as on,Encoding as Cy,Layer as Hy,Redacted as Yc}from"effect";import{HttpEffect as xy,HttpServerRequest as Py,HttpServerResponse as qy}from"effect/unstable/http";var My="auth_token",Ty='Basic realm="Secure Area"';function ca(){return{username:"",password:Yc.make("")}}n(ca,"emptyCredential");function zc(e){return on.fromResult(Cy.decodeBase64String(e)).pipe(on.match({onFailure:ca,onSuccess:n(t=>{let o=t.indexOf(":");return o===-1?ca():{username:t.slice(0,o),password:Yc.make(t.slice(o+1))}},"onSuccess")}))}n(zc,"decodeCredential");function Ly(e){let o=new URL(e.url,"http://localhost").searchParams.get(My);if(o)return zc(o);let r=/^Basic\s+(.+)$/i.exec(e.headers.authorization??"");return r?zc(r[1]):on.succeed(ca())}n(Ly,"credentialFromRequest");var da=Hy.effect(Jt,on.gen(function*(){let e=yield*ur.Config;return ur.required(e)?Jt.of(t=>on.gen(function*(){let o=yield*Py.HttpServerRequest;if(Vc(new URL(o.url,"http://localhost")))return yield*t;let r=yield*Ly(o);return ur.authorized(r,e)?yield*t:(yield*xy.appendPreResponseHandler((s,i)=>on.succeed(qy.setHeader(i,"www-authenticate",Ty))),yield*new Zr({message:"Authentication required"}))})):Jt.of(t=>t)}));var jy="auth_token",Fy=401,td='Basic realm="Secure Area"',L=class extends ed.Service()("@opencode/ExperimentalHttpApiAuthorization",{error:la.UnauthorizedNoContent}){static{n(this,"Authorization")}},Sr=class extends ed.Service()("@opencode/ExperimentalHttpApiPtyConnectAuthorization",{error:la.UnauthorizedNoContent}){static{n(this,"PtyConnectAuthorization")}};function ma(){return{username:"",password:Xc.make("")}}n(ma,"emptyCredential");function od(e,t,o){return Ve.gen(function*(){return Ne.required(o)?Ne.authorized(t,o)?yield*e:(yield*Ny.appendPreResponseHandler((r,s)=>Ve.succeed(Zc.setHeader(s,"www-authenticate",td))),yield*new la.Unauthorized({})):yield*e})}n(od,"validateCredential");function Kc(e){return Ve.fromResult(Oy.decodeBase64String(e)).pipe(Ve.match({onFailure:ma,onSuccess:n(t=>{let o=t.indexOf(":");return o===-1?ma():{username:t.slice(0,o),password:Xc.make(t.slice(o+1))}},"onSuccess")}))}n(Kc,"decodeCredential");function Wy(e){return fa(new URL(e.url,"http://localhost"),e)}n(Wy,"credentialFromRequest");function fa(e,t){let o=e.searchParams.get(jy);if(o)return Kc(o);let r=/^Basic\s+(.+)$/i.exec(t.headers.authorization??"");return r?Kc(r[1]):Ve.succeed(ma())}n(fa,"credentialFromURL");function By(e,t,o){return Ne.required(o)?Ne.authorized(t,o)?e:Ve.succeed(Zc.empty({status:Fy,headers:{"www-authenticate":td}})):e}n(By,"validateRawCredential");var rd=Uy.middleware()(Ve.gen(function*(){let e=yield*Ne.Config;return Ne.required(e)?t=>Ve.gen(function*(){let o=yield*ua.HttpServerRequest,r=new URL(o.url,"http://localhost");return Nc(o.method,r.pathname)?yield*t:yield*fa(r,o).pipe(Ve.flatMap(s=>By(t,s,e)))}):t=>t})),nd=Jc.effect(L,Ve.gen(function*(){let e=yield*Ne.Config;return Ne.required(e)?L.of(t=>Ve.gen(function*(){let o=yield*ua.HttpServerRequest;return yield*Wy(o).pipe(Ve.flatMap(r=>od(t,r,e)))})):L.of(t=>t)})),sd=Jc.effect(Sr,Ve.gen(function*(){let e=yield*Ne.Config;return Ne.required(e)?Sr.of(t=>Ve.gen(function*(){let o=yield*ua.HttpServerRequest,r=new URL(o.url,"http://localhost");return Oc(r)?yield*t:yield*fa(r,o).pipe(Ve.flatMap(s=>od(t,s,e)))})):Sr.of(t=>t)}));import{Effect as di,Layer as Eg}from"effect";import"effect/unstable/http";import{HttpApiMiddleware as Dg}from"effect/unstable/httpapi";var nn={};xe(nn,{HttpApiProxy:()=>nn,http:()=>Zy,websocket:()=>Xy});import{Effect as Q,Stream as ad}from"effect";import{HttpBody as ya,HttpClientRequest as Ky,HttpServerResponse as os}from"effect/unstable/http";import*as rn from"effect/unstable/socket/Socket";var Qe={};xe(Qe,{SERVER_CLOSING_EVENT:()=>Vy,Service:()=>vr,WebSocketTracker:()=>Qe,node:()=>zy,register:()=>Yy});import{Context as Gy,Effect as Xt,Layer as _y,Option as $y}from"effect";import*as id from"effect/unstable/socket/Socket";var Vy=n(()=>new id.CloseEvent(1001,"server closing"),"SERVER_CLOSING_EVENT"),vr=class extends Gy.Service()("@opencode/HttpApiWebSocketTracker"){static{n(this,"Service")}},Qy=_y.sync(vr)(()=>{let e=new Set,t=!1;return vr.of({add:n(o=>Xt.gen(function*(){return t?!1:(e.add(o),!0)}),"add"),remove:n(o=>Xt.sync(()=>{e.delete(o)}),"remove"),closeAll:Xt.gen(function*(){t=!0;let o=Array.from(e);e.clear(),yield*Xt.all(o.map(r=>r.pipe(Xt.timeout("1 second"),Xt.catch(()=>Xt.void))),{concurrency:"unbounded",discard:!0})})})}),zy=xs.make({service:vr,layer:Qy,deps:[]}),Yy=n(e=>Xt.gen(function*(){let t=yield*Xt.serviceOption(vr);return $y.isNone(t)?!0:(yield*t.value.add(e))?(yield*Xt.addFinalizer(()=>t.value.remove(e)),!0):!1}),"register");function Jy(e){if(e.method==="GET"||e.method==="HEAD")return ya.empty;if(e.source instanceof Request&&e.source.body===null)return ya.empty;let t=e.headers["content-length"];return ya.stream(e.stream,e.headers["content-type"],t?Number(t):void 0)}n(Jy,"requestBody");function Xy(e,t){return Q.scoped(Q.gen(function*(){let o=yield*Q.orDie(e.upgrade),r=yield*rn.makeWebSocket(uo.websocketTargetURL(t),{protocols:uo.websocketProtocols(e.headers)}),s=yield*o.writer,i=yield*r.writer,c=n((u,a)=>u.runRaw(()=>Q.void,{onOpen:a(Qe.SERVER_CLOSING_EVENT()).pipe(Q.catch(()=>Q.void))}).pipe(Q.timeout("1 second"),Q.catchReason("SocketError","SocketCloseError",()=>Q.void),Q.catch(()=>Q.void)),"closeSocket"),h=Q.all([c(o,s),c(r,i)],{concurrency:"unbounded",discard:!0});return(yield*Qe.register(Q.all([s(Qe.SERVER_CLOSING_EVENT()),i(Qe.SERVER_CLOSING_EVENT())],{concurrency:"unbounded",discard:!0})))?(yield*r.runRaw(u=>s(u)).pipe(Q.catchReason("SocketError","SocketCloseError",u=>s(new rn.CloseEvent(u.code,u.closeReason)).pipe(Q.catch(()=>Q.void))),Q.catch(()=>s(new rn.CloseEvent(1011,"proxy error")).pipe(Q.catch(()=>Q.void))),Q.forkScoped),yield*o.runRaw(u=>i(typeof u=="string"?u:u.slice())).pipe(Q.catch(()=>Q.void),Q.ensuring(i(new rn.CloseEvent).pipe(Q.catch(()=>Q.void)))),os.empty()):(yield*h,os.empty())}).pipe(Q.orDie))}n(Xy,"websocket");function pd(e){return e.source?.statusText}n(pd,"statusText");function Zy(e,t,o,r){return Q.gen(function*(){let s=yield*e.execute(Ky.make(r.method)(t,{headers:uo.headers(r.headers,o),body:Jy(r)})),i=new Headers(s.headers);if(i.delete("content-encoding"),i.delete("content-length"),s.status>=500){let c=yield*s.text.pipe(Q.catch(()=>Q.succeed(""))),h=s.headers["content-type"]??"application/json";return i.delete("content-type"),yield*Q.logError("workspace proxy upstream error",{url:t.toString(),method:r.method,status:s.status,body:c.slice(0,2e3)}),os.text(c,{status:s.status,statusText:pd(s),headers:i,contentType:h})}return os.stream(s.stream.pipe(ad.catchCause(()=>ad.empty)),{status:s.status,statusText:pd(s),headers:i})}).pipe(Q.catch(()=>Q.succeed(os.empty({status:500}))))}n(Zy,"http");import{inArray as eg}from"drizzle-orm";import{Effect as rs}from"effect";var ga="x-opencode-sync";function ha(e,t){return rs.gen(function*(){let o=yield*(t?.length?e.select().from(Ms).where(eg(Ms.aggregate_id,t)).all():e.select().from(Ms).all()).pipe(rs.orDie);return Object.fromEntries(o.map(r=>[r.aggregate_id,r.seq]))})}n(ha,"load");function cd(e,t){let o=new Set([...Object.keys(e),...Object.keys(t)]);return Object.fromEntries([...o].map(r=>[r,t[r]??-1]).filter(([r,s])=>(e[r]??-1)!==s))}n(cd,"diff");function dd(e){let t=e.get(ga);if(!t)return;let o;try{o=JSON.parse(t)}catch{return}if(!(!o||typeof o!="object"))return Object.fromEntries(Object.entries(o).filter(r=>typeof r[0]=="string"&&Number.isInteger(r[1])))}n(dd,"parse");function md(e,t,o){return rs.gen(function*(){yield*rs.logInfo("waiting for state",{workspaceID:e,state:t}),yield*fe.Service.use(r=>r.waitForSync(e,t,o)),yield*rs.logInfo("state fully synced",{workspaceID:e,state:t})})}n(md,"wait");var tg=[{path:"/experimental/workspace",action:"local"},{path:"/session/status",action:"forward"},{method:"GET",path:"/session",action:"local"}];function ld(e,t){for(let o of tg){if(o.method&&o.method!==e)continue;if(o.exact?t===o.path:t===o.path||t.startsWith(o.path+"/"))return o.action==="local"}return!1}n(ld,"isLocalWorkspaceRoute");function fd(e){if(e.pathname==="/session/status")return null;let t=e.pathname.match(/^\/session\/([^/]+)(?:\/|$)/)?.[1]??e.pathname.match(/^\/experimental\/session\/([^/]+)\/background$/)?.[1];return t?_.make(t):null}n(fd,"getWorkspaceRouteSessionID");function yd(e,t){let o=new URL(e);return o.pathname=`${o.pathname.replace(/\/$/,"")}${t.pathname}`,o.search=t.search,o.hash=t.hash,o.searchParams.delete("workspace"),o.searchParams.delete("directory"),o}n(yd,"workspaceProxyURL");import{Context as og,Data as rg,Effect as Ce,Layer as ng,Option as sg,Schema as pn}from"effect";import{HttpClient as ig,HttpServerRequest as ag,HttpServerResponse as ci}from"effect/unstable/http";import{HttpApiMiddleware as pg}from"effect/unstable/httpapi";import*as Sa from"effect/unstable/socket/Socket";import{Schema as g}from"effect";var Ir=class extends g.TaggedErrorClass()("InvalidRequestError",{message:g.String,kind:g.optional(g.String),field:g.optional(g.String)},{httpApiStatus:400}){static{n(this,"InvalidRequestError")}},gd=class extends g.TaggedErrorClass()("UnauthorizedError",{message:g.String},{httpApiStatus:401}){static{n(this,"UnauthorizedError")}},hd=class extends g.TaggedErrorClass()("ForbiddenError",{message:g.String},{httpApiStatus:403}){static{n(this,"ForbiddenError")}},Sd=class extends g.TaggedErrorClass()("ConflictError",{message:g.String,resource:g.optional(g.String)},{httpApiStatus:409}){static{n(this,"ConflictError")}},vd=class extends g.TaggedErrorClass()("UpstreamError",{message:g.String,service:g.optional(g.String),status:g.optional(g.Number)},{httpApiStatus:502}){static{n(this,"UpstreamError")}},Id=class extends g.TaggedErrorClass()("ServiceUnavailableError",{message:g.String,service:g.optional(g.String)},{httpApiStatus:503}){static{n(this,"ServiceUnavailableError")}},Ad=class extends g.TaggedErrorClass()("TimeoutError",{message:g.String,operation:g.optional(g.String)},{httpApiStatus:504}){static{n(this,"TimeoutError")}},Ed=class extends g.TaggedErrorClass()("UnknownError",{message:g.String,ref:g.optional(g.String)},{httpApiStatus:500}){static{n(this,"UnknownError")}},Dd=class extends g.TaggedErrorClass()("ProviderNotFoundError",{providerID:g.String,message:g.String},{httpApiStatus:404}){static{n(this,"ProviderNotFoundError")}},kd=class extends g.TaggedErrorClass()("ModelNotFoundError",{providerID:g.String,modelID:g.String,suggestions:g.Array(g.String),message:g.String},{httpApiStatus:404}){static{n(this,"ModelNotFoundError")}},wd=class extends g.TaggedErrorClass()("SessionNotFoundError",{sessionID:g.String,message:g.String},{httpApiStatus:404}){static{n(this,"SessionNotFoundError")}},Rd=class extends g.TaggedErrorClass()("MessageNotFoundError",{sessionID:g.String,messageID:g.String,message:g.String},{httpApiStatus:404}){static{n(this,"MessageNotFoundError")}},bd=class extends g.TaggedErrorClass()("InvalidCursorError",{message:g.String},{httpApiStatus:400}){static{n(this,"InvalidCursorError")}},fo=class extends g.TaggedErrorClass()("SessionBusyError",{sessionID:g.String,message:g.String},{httpApiStatus:409}){static{n(this,"SessionBusyError")}},Uo=class extends g.TaggedErrorClass()("QuestionNotFoundError",{requestID:g.String,message:g.String},{httpApiStatus:404}){static{n(this,"QuestionNotFoundError")}},Zt=class extends g.TaggedErrorClass()("PermissionNotFoundError",{requestID:g.String,message:g.String},{httpApiStatus:404}){static{n(this,"PermissionNotFoundError")}},Ue=class extends g.TaggedErrorClass()("McpServerNotFoundError",{name:g.String,message:g.String},{httpApiStatus:404}){static{n(this,"McpServerNotFoundError")}},bt=class extends g.TaggedErrorClass()("PtyNotFoundError",{ptyID:g.String,message:g.String},{httpApiStatus:404}){static{n(this,"PtyNotFoundError")}},sn=class extends g.TaggedErrorClass()("PtyForbiddenError",{message:g.String},{httpApiStatus:403}){static{n(this,"PtyForbiddenError")}},an=class extends g.TaggedErrorClass()("ProjectNotFoundError",{projectID:g.String,message:g.String},{httpApiStatus:404}){static{n(this,"ProjectNotFoundError")}},J=class extends g.ErrorClass("NotFoundError")({name:g.Literal("NotFoundError"),data:g.Struct({message:g.String})},{httpApiStatus:404}){static{n(this,"ApiNotFoundError")}};function pi(e){return new J({name:"NotFoundError",data:{message:e}})}n(pi,"notFound");var we={directory:pn.optional(pn.String),workspace:pn.optional(pn.String)},m=pn.Struct(we),cn=rg.taggedEnum(),Hd=Symbol("InvalidWorkspaceID"),dn=class extends og.Service()("@opencode/ExperimentalHttpApiWorkspaceRouteContext"){static{n(this,"WorkspaceRouteContext")}},N=class extends pg.Service()("@opencode/ExperimentalHttpApiWorkspaceRouting"){static{n(this,"WorkspaceRoutingMiddleware")}};function xd(e){return new URL(e.url,"http://localhost")}n(xd,"requestURL");function cg(){return Ln.OPENCODE_WORKSPACE_ID?Ro.ID.make(Ln.OPENCODE_WORKSPACE_ID):void 0}n(cg,"configuredWorkspaceID");function dg(e,t){let o=e.searchParams.get("workspace");return t??(o?Ro.ID.make(o):void 0)}n(dg,"selectedWorkspaceID");function mg(e,t){if(t)return t;let o=e.searchParams.get("workspace");if(!o)return;let r=pn.decodeUnknownOption(Ro.ID)(o);return sg.isNone(r)?Hd:r.value}n(mg,"selectedV2WorkspaceID");function ug(e,t){return t.searchParams.get("directory")||e.headers["x-opencode-directory"]||process.cwd()}n(ug,"defaultDirectory");function lg(e,t){return ld(e.method,t.pathname)||t.pathname.startsWith("/console")}n(lg,"shouldStayOnControlPlane");function fg(e,t){return!e||t?Ce.void:fe.Service.use(o=>o.get(e))}n(fg,"resolveWorkspace");function yg(e){return ci.text(`Workspace not found: ${e}`,{status:500,contentType:"text/plain; charset=utf-8"})}n(yg,"missingWorkspaceResponse");function gg(e){return uc.target(e)}n(gg,"resolveTarget");function hg(e,t,o,r,s){return Ce.gen(function*(){if(!(yield*fe.Service.use(a=>a.isSyncing(o.id))))return ci.text(`broken sync connection for workspace: ${o.id}`,{status:503,contentType:"text/plain; charset=utf-8"});let c=yd(r.url,s);if(t.headers.upgrade?.toLowerCase()==="websocket")return yield*nn.websocket(t,c);let y=yield*nn.http(e,c,r.headers,t),u=dd(new Headers(y.headers));if(u){let a=yield*md(o.id,u,t.source instanceof Request?t.source.signal:void 0).pipe(Ce.as(void 0),Ce.catch(l=>Ce.succeed(ci.text(l.message,{status:503}))));if(a)return a}return y})}n(hg,"proxyRemote");function Sg(e,t,o){return Ce.gen(function*(){let r=yield*gg(o);return r.type==="remote"?cn.Remote({request:e,workspace:o,target:r,url:t}):cn.Local({directory:r.directory,workspaceID:o.id})})}n(Sg,"planWorkspaceRequest");function vg(e,t){return Ce.gen(function*(){let o=xd(e),r=cg(),s=o.pathname.startsWith("/api/")?mg(o,t?.workspaceID):dg(o,t?.workspaceID);if(s===Hd)return cn.InvalidWorkspace();let i=yield*fg(s,r);return s&&i===void 0&&!r?cn.MissingWorkspace({workspaceID:s}):i!==void 0&&!r&&!lg(e,o)?yield*Sg(e,o,i):cn.Local({directory:t?.directory||ug(e,o),workspaceID:r??s})})}n(vg,"planRequest");function Ig(e,t,o){return cn.$match(o,{InvalidWorkspace:n(()=>Ce.succeed(ci.jsonUnsafe(new Ir({message:"Invalid workspace query parameter",kind:"Query",field:"workspace"}),{status:400})),"InvalidWorkspace"),MissingWorkspace:n(({workspaceID:r})=>Ce.succeed(yg(r)),"MissingWorkspace"),Remote:n(({request:r,workspace:s,target:i,url:c})=>hg(e,r,s,i,c),"Remote"),Local:n(({directory:r,workspaceID:s})=>t.pipe(Ce.provideService(dn,dn.of({directory:r,workspaceID:s}))),"Local")})}n(Ig,"routeWorkspace");function Ag(e,t){return Ce.gen(function*(){let o=yield*ag.HttpServerRequest,r=fd(xd(o)),s=r?yield*z.Service.use(c=>c.get(r)).pipe(Ce.catchIf(c=>Kp.isInstance(c),()=>Ce.succeed(void 0)),Ce.catchDefect(()=>Ce.succeed(void 0))):void 0,i=yield*vg(o,s);return yield*Ig(e,t,i)})}n(Ag,"routeHttpApiWorkspace");var Pd=ng.effect(N,Ce.gen(function*(){let e=yield*Sa.WebSocketConstructor,t=yield*fe.Service,o=yield*ig.HttpClient;return N.of(r=>Ag(o,r).pipe(Ce.provideService(Sa.WebSocketConstructor,e),Ce.provideService(fe.Service,t)))}));var U=class extends Dg.Service()("@opencode/ExperimentalHttpApiInstanceContext"){static{n(this,"InstanceContextMiddleware")}};function kg(e){try{return decodeURIComponent(e)}catch{return e}}n(kg,"decode");function wg(e,t){return di.gen(function*(){let o=yield*dn,r=yield*t.load({directory:kg(o.directory)});return yield*e.pipe(di.provideService(Gs,r),di.provideService(_s,o.workspaceID))})}n(wg,"provideInstanceContext");var mi=Eg.effect(U,di.gen(function*(){let e=yield*wt.Service;return U.of(t=>wg(t,e))}));import"effect";import{OpenApi as eb}from"effect/unstable/httpapi";function p(e,t){return e.annotate({description:t})}n(p,"described");var Ia="/config",qd=Rg.make("config").add(Cg.make("config").add(va.get("get",Ia,{query:m,success:p(ko.Info,"Get config info")}).annotateMerge(ns.annotations({identifier:"config.get",summary:"Get configuration",description:"Retrieve the current OpenCode configuration settings and preferences."})),va.patch("update",Ia,{query:m,payload:ko.Info,success:p(ko.Info,"Successfully updated config"),error:bg.BadRequest}).annotateMerge(ns.annotations({identifier:"config.update",summary:"Update configuration",description:"Update OpenCode configuration settings and preferences."})),va.get("providers",`${Ia}/providers`,{query:m,success:p(Me.ConfigProvidersResult,"List of providers")}).annotateMerge(ns.annotations({identifier:"config.providers",summary:"List config providers",description:"Get a list of all configured AI providers and their default models."}))).annotateMerge(ns.annotations({title:"config",description:"Experimental HttpApi config routes."})).middleware(U).middleware(N).middleware(L)).annotateMerge(ns.annotations({title:"opencode experimental HttpApi",version:"0.0.1",description:"Experimental HttpApi surface for selected instance routes."}));import{Schema as P}from"effect";import{HttpApi as Hg,HttpApiEndpoint as mn,HttpApiGroup as xg,OpenApi as Ar}from"effect/unstable/httpapi";var Pg=P.Struct({paused:P.Boolean,waiting:P.Array(P.String)}),qg=P.Struct({paused:P.Boolean}),Mg=P.Struct({paused:P.Boolean,stopped:P.optional(P.Array(P.String)),waiting:P.optional(P.Array(P.String))}),Tg=P.Struct({ok:P.Boolean,deferred:P.optional(P.Boolean)}),Lg=P.Struct({kind:P.String,label:P.String,usedPercent:P.Number,resetsAt:P.NullOr(P.Number)}),Og=P.Struct({fetchedAt:P.Number,providers:P.Array(P.Struct({providerID:P.String,plan:P.NullOr(P.String),error:P.optional(P.String),readAt:P.optional(P.Number),windows:P.Array(Lg)}))}),Ng=P.Struct({exa:P.Boolean,tavily:P.Boolean}),Md=Hg.make("alchemy").add(xg.make("alchemy").add(mn.get("pauseState","/config/pause",{query:m,success:p(Pg,"Pause state")}).annotateMerge(Ar.annotations({identifier:"config.pauseState",summary:"Pause state",description:"Whether this project's turns are paused, and the sessions whose turns wait for Resume."})),mn.post("pause","/config/pause",{query:m,payload:qg,success:p(Mg,"The new state; stopped on pause, waiting on resume")}).annotateMerge(Ar.annotations({identifier:"config.pause",summary:"Pause or resume the project",description:"Paused, no turn runs: running turns stop and their sessions wait, and anything sent meanwhile lands and waits. Resume returns the sessions that wait, for the caller to wake."})),mn.post("reload","/config/reload",{query:m,success:p(Tg,"Config cache invalidated")}).annotateMerge(Ar.annotations({identifier:"config.reload",summary:"Reload configuration",description:"Drop cached config and agent state so the next request reads them again. While a session is busy the reload waits for all sessions to be idle (two minutes at most)."})),mn.get("usage","/config/usage",{query:P.Struct({...we,force:P.optional(P.String)}),success:p(Og,"Per-provider usage windows")}).annotateMerge(Ar.annotations({identifier:"config.usage",summary:"Plan usage",description:"Percent used and reset times of the usage windows on the OAuth providers this instance is signed into."})),mn.get("mcpTools","/mcp/tools",{query:m,success:p(P.Record(P.String,P.Array(qe.ToolManifestEntry)),"Tools per connected server")}).annotateMerge(Ar.annotations({identifier:"mcp.tools",summary:"List MCP tools",description:"The tool catalogue each connected MCP server advertises, with read-only annotations intact. This is the catalogue, not the callable tool set: use it to show or govern what a server offers."})),mn.get("searchKeys","/websearch/keys",{query:m,success:p(Ng,"Whether each search service has a key")}).annotateMerge(Ar.annotations({identifier:"websearch.keys",summary:"Web search keys",description:"Which web search services have a key of the user's own set. Yes or no, never a key."}))).annotateMerge(Ar.annotations({title:"alchemy",description:"AlchemyLab fork routes."})).middleware(U).middleware(N).middleware(L));import{Schema as Ae}from"effect";import{HttpApi as Ug,HttpApiEndpoint as Aa,HttpApiError as Ea,HttpApiGroup as jg,OpenApi as ui}from"effect/unstable/httpapi";var Td=Ae.Struct({providerID:qt.ID}),Fg=Ae.Struct({directory:Ae.optional(Ae.String),workspace:Ae.optional(Ae.String)}),Wg=Ae.Struct({service:Ae.String.annotate({description:"Service name for the log entry"}),level:Ae.Union([Ae.Literal("debug"),Ae.Literal("info"),Ae.Literal("error"),Ae.Literal("warn")]).annotate({description:"Log level"}),message:Ae.String.annotate({description:"Log message"}),extra:Ae.optional(Ae.Record(Ae.String,Ae.Unknown)).annotate({description:"Additional metadata for the log entry"})}),Da={auth:"/auth/:providerID",log:"/log"},Ld=Ug.make("control").add(jg.make("control").add(Aa.put("authSet",Da.auth,{params:Td,payload:_t.Info,success:p(Ae.Boolean,"Successfully set authentication credentials"),error:Ea.BadRequest}).annotateMerge(ui.annotations({identifier:"auth.set",summary:"Set auth credentials",description:"Set authentication credentials"})),Aa.delete("authRemove",Da.auth,{params:Td,success:p(Ae.Boolean,"Successfully removed authentication credentials"),error:Ea.BadRequest}).annotateMerge(ui.annotations({identifier:"auth.remove",summary:"Remove auth credentials",description:"Remove authentication credentials"})),Aa.post("log",Da.log,{query:Fg,payload:Wg,success:p(Ae.Boolean,"Log entry written successfully"),error:Ea.BadRequest}).annotateMerge(ui.annotations({identifier:"app.log",summary:"Write log",description:"Write a log entry to the server logs with specified level and metadata."}))).annotateMerge(ui.annotations({title:"control",description:"Control plane routes."})));import{Schema as ss}from"effect";import{HttpApi as Bg,HttpApiEndpoint as Gg,HttpApiGroup as _g,HttpApiSchema as $g,OpenApi as Od}from"effect/unstable/httpapi";var Vg="/experimental/control-plane",Qg=ss.Struct({...Lt.Input.fields}),is=class extends ss.ErrorClass("MoveSessionError")({name:ss.Literal("MoveSessionError"),data:ss.Struct({message:ss.String})},{httpApiStatus:400}){static{n(this,"ApiMoveSessionError")}},Nd=Bg.make("controlPlane").add(_g.make("controlPlane").add(Gg.post("moveSession",`${Vg}/move-session`,{payload:Qg,success:p($g.NoContent,"Session moved"),error:is}).annotateMerge(Od.annotations({identifier:"experimental.controlPlane.moveSession",summary:"Move session",description:"Move a session to another project directory, optionally transferring local changes."}))).annotateMerge(Od.annotations({title:"controlPlane",description:"Control-plane orchestration routes."})));import{Schema as zg}from"effect";import{HttpApi as Yg,HttpApiEndpoint as Kg,HttpApiGroup as Jg,HttpApiSchema as Xg,OpenApi as Ud}from"effect/unstable/httpapi";var Zg={event:"/event"},un=Yg.make("event").add(Jg.make("event").add(Kg.get("subscribe",Zg.event,{query:m,success:zg.String.pipe(Xg.asText({contentType:"text/event-stream"}))}).annotateMerge(Ud.annotations({identifier:"event.subscribe",summary:"Subscribe to events",description:"Get events"}))).middleware(U).middleware(N).middleware(L).annotateMerge(Ud.annotations({title:"event",description:"Instance event stream route."})));import{Schema as w}from"effect";import{HttpApi as eh,HttpApiEndpoint as yt,HttpApiError as ln,HttpApiGroup as th,HttpApiSchema as oh,OpenApi as ze}from"effect/unstable/httpapi";import{Schema as ka,SchemaGetter as jd}from"effect";var as=ka.Literals(["true","false"]).pipe(ka.decodeTo(ka.Boolean,{decode:jd.transform(e=>e==="true"),encode:jd.transform(e=>e?"true":"false")})),ps={anyOf:[{type:"boolean"},{type:"string",enum:["true","false"]}]};var rh=w.Struct({consoleManagedProviders:w.mutable(w.Array(w.String)),activeOrgName:w.optionalKey(w.String),switchableOrgCount:De}).annotate({identifier:"ConsoleState"}),nh=w.Struct({backgroundSubagents:w.Boolean}).annotate({identifier:"ExperimentalCapabilities"}),sh=w.Struct({accountID:w.String,accountEmail:w.String,accountUrl:w.String,orgID:w.String,orgName:w.String,active:w.Boolean}),ih=w.Struct({orgs:w.Array(sh)}),ah=w.Struct({accountID:Vp,orgID:Qp}),ph=w.Array(w.String).annotate({identifier:"ToolIDs"}),ch=w.Struct({id:w.String,description:w.String,parameters:w.Unknown}).annotate({identifier:"ToolListItem"}),dh=w.Array(ch).annotate({identifier:"ToolList"}),mh=w.Struct({...we,provider:qt.ID,model:Tn.ID}),uh=w.Array(w.String),lh=w.Union([w.Literal("WorktreeNotGitError"),w.Literal("WorktreeNameGenerationFailedError"),w.Literal("WorktreeCreateFailedError"),w.Literal("WorktreeStartCommandFailedError"),w.Literal("WorktreeRemoveFailedError"),w.Literal("WorktreeResetFailedError"),w.Literal("WorktreeListFailedError")]),jo=class extends w.ErrorClass("WorktreeError")({name:lh,data:w.Struct({message:w.String})},{httpApiStatus:400}){static{n(this,"WorktreeApiError")}},fh=w.Struct({...we,roots:w.optional(as),start:w.optional(w.NumberFromString),cursor:w.optional(w.NumberFromString),search:w.optional(w.String),limit:w.optional(w.NumberFromString),archived:w.optional(as)}),gt={capabilities:"/experimental/capabilities",console:"/experimental/console",consoleOrgs:"/experimental/console/orgs",consoleSwitch:"/experimental/console/switch",tool:"/experimental/tool",toolIDs:"/experimental/tool/ids",worktree:"/experimental/worktree",worktreeReset:"/experimental/worktree/reset",session:"/experimental/session",sessionBackground:"/experimental/session/:sessionID/background",resource:"/experimental/resource"},Fd=eh.make("experimental").add(th.make("experimental").add(yt.get("capabilities",gt.capabilities,{query:m,success:p(nh,"Experimental capabilities")}).annotateMerge(ze.annotations({identifier:"experimental.capabilities.get",summary:"Get experimental capabilities",description:"Get experimental features enabled on the OpenCode server."})),yt.get("console",gt.console,{query:m,success:p(rh,"Active Console provider metadata"),error:ln.InternalServerError}).annotateMerge(ze.annotations({identifier:"experimental.console.get",summary:"Get active Console provider metadata",description:"Get the active Console org name and the set of provider IDs managed by that Console org."})),yt.get("consoleOrgs",gt.consoleOrgs,{query:m,success:p(ih,"Switchable Console orgs"),error:ln.InternalServerError}).annotateMerge(ze.annotations({identifier:"experimental.console.listOrgs",summary:"List switchable Console orgs",description:"Get the available Console orgs across logged-in accounts, including the current active org."})),yt.post("consoleSwitch",gt.consoleSwitch,{query:m,payload:ah,success:p(w.Boolean,"Switch success"),error:ln.BadRequest}).annotateMerge(ze.annotations({identifier:"experimental.console.switchOrg",summary:"Switch active Console org",description:"Persist a new active Console account/org selection for the current local OpenCode state."})),yt.get("tool",gt.tool,{query:mh,success:p(dh,"Tools"),error:ln.BadRequest}).annotateMerge(ze.annotations({identifier:"tool.list",summary:"List tools",description:"Get a list of available tools with their JSON schema parameters for a specific provider and model combination."})),yt.get("toolIDs",gt.toolIDs,{query:m,success:p(ph,"Tool IDs"),error:ln.BadRequest}).annotateMerge(ze.annotations({identifier:"tool.ids",summary:"List tool IDs",description:"Get a list of all available tool IDs, including both built-in tools and dynamically registered tools."})),yt.get("worktree",gt.worktree,{query:m,success:p(uh,"List of worktree directories"),error:jo}).annotateMerge(ze.annotations({identifier:"worktree.list",summary:"List worktrees",description:"List all sandbox worktrees for the current project."})),yt.post("worktreeCreate",gt.worktree,{disableCodecs:!0,query:m,payload:[oh.NoContent,mo.CreateInput],success:p(mo.Info,"Worktree created"),error:jo}).annotateMerge(ze.annotations({identifier:"worktree.create",summary:"Create worktree",description:"Create a new git worktree for the current project and run any configured startup scripts."})),yt.delete("worktreeRemove",gt.worktree,{query:m,payload:mo.RemoveInput,success:p(w.Boolean,"Worktree removed"),error:jo}).annotateMerge(ze.annotations({identifier:"worktree.remove",summary:"Remove worktree",description:"Remove a git worktree and delete its branch."})),yt.post("worktreeReset",gt.worktreeReset,{query:m,payload:mo.ResetInput,success:p(w.Boolean,"Worktree reset"),error:jo}).annotateMerge(ze.annotations({identifier:"worktree.reset",summary:"Reset worktree",description:"Reset a worktree branch to the primary default branch."})),yt.get("session",gt.session,{query:fh,success:p(w.Array(z.GlobalInfo),"List of sessions")}).annotateMerge(ze.annotations({identifier:"experimental.session.list",summary:"List sessions",description:"Get a list of all OpenCode sessions across projects, sorted by most recently updated. Archived sessions are excluded by default."})),yt.post("sessionBackground",gt.sessionBackground,{params:{sessionID:_},query:m,success:p(w.Boolean,"Backgrounded subagents"),error:ln.BadRequest}).annotateMerge(ze.annotations({identifier:"experimental.session.background",summary:"Background subagents",description:"Detach any synchronous subagents currently blocking the session and continue them in the background."})),yt.get("resource",gt.resource,{query:m,success:p(w.Record(w.String,qe.Resource),"MCP resources")}).annotateMerge(ze.annotations({identifier:"experimental.resource.list",summary:"Get MCP resources",description:"Get all available MCP resources from connected servers. Optionally filter by name."}))).annotateMerge(ze.annotations({title:"experimental",description:"Experimental HttpApi read-only routes."})).middleware(U).middleware(N).middleware(L)).annotateMerge(ze.annotations({title:"opencode experimental HttpApi",version:"0.0.1",description:"Experimental HttpApi surface for selected instance routes."}));import{Schema as I}from"effect";import{HttpApi as yh,HttpApiEndpoint as fn,HttpApiGroup as gh,OpenApi as Fo}from"effect/unstable/httpapi";var Wd=I.Struct({...we,path:I.String}),hh=I.Struct({...we,pattern:I.String}),Sh=I.Struct({...we,query:I.String,dirs:I.optional(I.Literals(["true","false"])),type:I.optional(I.Literals(["file","directory"])),limit:I.optional(I.NumberFromString.check(I.isInt(),I.isGreaterThanOrEqualTo(1),I.isLessThanOrEqualTo(200)))}),vh=I.Struct({...we,query:I.String}),Ih=I.Struct({path:I.Struct({text:I.String}),lines:I.Struct({text:I.String}),line_number:De,absolute_offset:De,submatches:I.Array(I.Struct({match:I.Struct({text:I.String}),start:De,end:De}))}),Ah=I.Struct({name:I.String,path:I.String,absolute:I.String,type:I.Literals(["file","directory"]),ignored:I.Boolean}).annotate({identifier:"FileNode"}),Eh=I.Struct({type:I.Literals(["text","binary"]),content:I.String,diff:I.optional(I.String),patch:I.optional(I.Struct({oldFileName:I.String,newFileName:I.String,oldHeader:I.optional(I.String),newHeader:I.optional(I.String),hunks:I.Array(I.Struct({oldStart:De,oldLines:De,newStart:De,newLines:De,lines:I.Array(I.String)})),index:I.optional(I.String)})),encoding:I.optional(I.Literal("base64")),mimeType:I.optional(I.String)}).annotate({identifier:"FileContent"}),Dh=I.Struct({path:I.String,added:De,removed:De,status:I.Literals(["added","deleted","modified"])}).annotate({identifier:"File"}),yn={findText:"/find",findFile:"/find/file",findSymbol:"/find/symbol",list:"/file",content:"/file/content",status:"/file/status"},Bd=yh.make("file").add(gh.make("file").add(fn.get("findText",yn.findText,{query:hh,success:p(I.Array(Ih),"Matches")}).annotateMerge(Fo.annotations({identifier:"find.text",summary:"Find text",description:"Search for text patterns across files in the project using ripgrep."})),fn.get("findFile",yn.findFile,{query:Sh,success:p(I.Array(I.String),"File paths")}).annotateMerge(Fo.annotations({identifier:"find.files",summary:"Find files",description:"Search for files or directories by name or pattern in the project directory."})),fn.get("findSymbol",yn.findSymbol,{query:vh,success:p(I.Array(qo.Symbol),"Symbols")}).annotateMerge(Fo.annotations({identifier:"find.symbols",summary:"Find symbols",description:"Search for workspace symbols like functions, classes, and variables using LSP."})),fn.get("list",yn.list,{query:Wd,success:p(I.Array(Ah),"Files and directories")}).annotateMerge(Fo.annotations({identifier:"file.list",summary:"List files",description:"List files and directories in a specified path."})),fn.get("content",yn.content,{query:Wd,success:p(Eh,"File content")}).annotateMerge(Fo.annotations({identifier:"file.read",summary:"Read file",description:"Read the content of a specified file."})),fn.get("status",yn.status,{query:m,success:p(I.Array(Dh),"File status")}).annotateMerge(Fo.annotations({identifier:"file.status",summary:"Get file status",description:"Get the git status of all files in the project."}))).annotateMerge(Fo.annotations({title:"file",description:"Experimental HttpApi file routes."})).middleware(U).middleware(N).middleware(L)).annotateMerge(Fo.annotations({title:"opencode experimental HttpApi",version:"0.0.1",description:"Experimental HttpApi surface for selected instance routes."}));import{Schema as de}from"effect";import{HttpApi as kh,HttpApiEndpoint as Ct,HttpApiGroup as wh,HttpApiSchema as Rh,OpenApi as st}from"effect/unstable/httpapi";var bh=de.Struct({home:de.String,state:de.String,config:de.String,worktree:de.String,directory:de.String}).annotate({identifier:"Path"}),Ch=de.Struct({...we,mode:mt.Mode,context:de.optional(de.NumberFromString.check(de.isInt(),de.isGreaterThanOrEqualTo(0)))}),yo=class extends de.ErrorClass("VcsApplyError")({name:de.Literal("VcsApplyError"),data:de.Struct({message:de.String,reason:de.Literals(["non-git","not-clean"])})},{httpApiStatus:400}){static{n(this,"ApiVcsApplyError")}},Ht={dispose:"/instance/dispose",path:"/path",vcs:"/vcs",vcsStatus:"/vcs/status",vcsDiff:"/vcs/diff",vcsDiffRaw:"/vcs/diff/raw",vcsApply:"/vcs/apply",command:"/command",agent:"/agent",skill:"/skill",lsp:"/lsp",formatter:"/formatter"},Gd=kh.make("instance").add(wh.make("instance").add(Ct.post("dispose",Ht.dispose,{query:m,success:p(de.Boolean,"Instance disposed")}).annotateMerge(st.annotations({identifier:"instance.dispose",summary:"Dispose instance",description:"Clean up and dispose the current OpenCode instance, releasing all resources."})),Ct.get("path",Ht.path,{query:m,success:bh}).annotateMerge(st.annotations({identifier:"path.get",summary:"Get paths",description:"Retrieve the current working directory and related path information for the OpenCode instance."})),Ct.get("vcs",Ht.vcs,{query:m,success:p(mt.Info,"VCS info")}).annotateMerge(st.annotations({identifier:"vcs.get",summary:"Get VCS info",description:"Retrieve version control system (VCS) information for the current project, such as git branch."})),Ct.get("vcsStatus",Ht.vcsStatus,{query:m,success:p(de.Array(mt.FileStatus),"VCS status")}).annotateMerge(st.annotations({identifier:"vcs.status",summary:"Get VCS status",description:"Retrieve changed files in the current working tree without patches."})),Ct.get("vcsDiff",Ht.vcsDiff,{query:Ch,success:p(de.Array(mt.FileDiff),"VCS diff")}).annotateMerge(st.annotations({identifier:"vcs.diff",summary:"Get VCS diff",description:"Retrieve the current git diff for the working tree or against the default branch."})),Ct.get("vcsDiffRaw",Ht.vcsDiffRaw,{query:m,success:p(de.String.pipe(Rh.asText({contentType:"text/x-diff; charset=utf-8"})),"Raw VCS diff")}).annotateMerge(st.annotations({identifier:"vcs.diff.raw",summary:"Get raw VCS diff",description:"Retrieve a raw patch for current uncommitted changes."})),Ct.post("vcsApply",Ht.vcsApply,{query:m,payload:mt.ApplyInput,success:p(mt.ApplyResult,"VCS patch applied"),error:yo}).annotateMerge(st.annotations({identifier:"vcs.apply",summary:"Apply VCS patch",description:"Apply a raw patch to the current working tree."})),Ct.get("command",Ht.command,{query:m,success:p(de.Array(Mo.Info),"List of commands")}).annotateMerge(st.annotations({identifier:"command.list",summary:"List commands",description:"Get a list of all available commands in the OpenCode system."})),Ct.get("agent",Ht.agent,{query:m,success:p(de.Array(zt.Info),"List of agents")}).annotateMerge(st.annotations({identifier:"app.agents",summary:"List agents",description:"Get a list of all available AI agents in the OpenCode system."})),Ct.get("skill",Ht.skill,{query:m,success:p(de.Array(Br.Info),"List of skills")}).annotateMerge(st.annotations({identifier:"app.skills",summary:"List skills",description:"Get a list of all available skills in the OpenCode system."})),Ct.get("lsp",Ht.lsp,{query:m,success:p(de.Array(qo.Status),"LSP server status")}).annotateMerge(st.annotations({identifier:"lsp.status",summary:"Get LSP status",description:"Get LSP server status"})),Ct.get("formatter",Ht.formatter,{query:m,success:p(de.Array(Vr.Status),"Formatter status")}).annotateMerge(st.annotations({identifier:"formatter.status",summary:"Get formatter status",description:"Get formatter status"}))).annotateMerge(st.annotations({title:"instance",description:"Experimental HttpApi instance read routes."})).middleware(U).middleware(N).middleware(L)).annotateMerge(st.annotations({title:"opencode experimental HttpApi",version:"0.0.1",description:"Experimental HttpApi surface for selected instance routes."}));import{Schema as he}from"effect";import{HttpApi as Hh,HttpApiEndpoint as Wo,HttpApiError as _d,HttpApiGroup as xh,OpenApi as eo}from"effect/unstable/httpapi";var Ph=he.Struct({name:he.String,config:Rp.Info}),wa=he.Record(he.String,qe.Status),qh=he.Struct({authorizationUrl:he.String,oauthState:he.String}),Mh=he.Struct({code:he.String}),Th=he.Struct({success:he.Literal(!0)}),Er=class extends he.ErrorClass("McpUnsupportedOAuthError")({error:he.String},{httpApiStatus:400}){static{n(this,"UnsupportedOAuthError")}},Bo={status:"/mcp",auth:"/mcp/:name/auth",authCallback:"/mcp/:name/auth/callback",authAuthenticate:"/mcp/:name/auth/authenticate",connect:"/mcp/:name/connect",disconnect:"/mcp/:name/disconnect"},$d=Hh.make("mcp").add(xh.make("mcp").add(Wo.get("status",Bo.status,{query:m,success:p(he.Record(he.String,qe.Status),"MCP server status")}).annotateMerge(eo.annotations({identifier:"mcp.status",summary:"Get MCP status",description:"Get the status of all Model Context Protocol (MCP) servers."})),Wo.post("add",Bo.status,{query:m,payload:Ph,success:p(wa,"MCP server added successfully"),error:_d.BadRequest}).annotateMerge(eo.annotations({identifier:"mcp.add",summary:"Add MCP server",description:"Dynamically add a new Model Context Protocol (MCP) server to the system."})),Wo.post("authStart",Bo.auth,{params:{name:he.String},query:m,success:p(qh,"OAuth flow started"),error:[Er,Ue]}).annotateMerge(eo.annotations({identifier:"mcp.auth.start",summary:"Start MCP OAuth",description:"Start OAuth authentication flow for a Model Context Protocol (MCP) server."})),Wo.post("authCallback",Bo.authCallback,{params:{name:he.String},query:m,payload:Mh,success:p(qe.Status,"OAuth authentication completed"),error:[_d.BadRequest,Ue]}).annotateMerge(eo.annotations({identifier:"mcp.auth.callback",summary:"Complete MCP OAuth",description:"Complete OAuth authentication for a Model Context Protocol (MCP) server using the authorization code."})),Wo.post("authAuthenticate",Bo.authAuthenticate,{params:{name:he.String},query:m,success:p(qe.Status,"OAuth authentication completed"),error:[Er,Ue]}).annotateMerge(eo.annotations({identifier:"mcp.auth.authenticate",summary:"Authenticate MCP OAuth",description:"Start OAuth flow and wait for callback (opens browser)."})),Wo.delete("authRemove",Bo.auth,{params:{name:he.String},query:m,success:p(Th,"OAuth credentials removed"),error:Ue}).annotateMerge(eo.annotations({identifier:"mcp.auth.remove",summary:"Remove MCP OAuth",description:"Remove OAuth credentials for an MCP server."})),Wo.post("connect",Bo.connect,{params:{name:he.String},query:m,success:p(he.Boolean,"MCP server connected successfully"),error:Ue}).annotateMerge(eo.annotations({identifier:"mcp.connect",description:"Connect an MCP server."})),Wo.post("disconnect",Bo.disconnect,{params:{name:he.String},query:m,success:p(he.Boolean,"MCP server disconnected successfully"),error:Ue}).annotateMerge(eo.annotations({identifier:"mcp.disconnect",description:"Disconnect an MCP server."}))).annotateMerge(eo.annotations({title:"mcp",description:"Experimental HttpApi MCP routes."})).middleware(U).middleware(N).middleware(L)).annotateMerge(eo.annotations({title:"opencode experimental HttpApi",version:"0.0.1",description:"Experimental HttpApi surface for selected instance routes."}));import{Schema as cs}from"effect";import{HttpApi as Lh,HttpApiEndpoint as Vd,HttpApiError as Oh,HttpApiGroup as Nh,OpenApi as li}from"effect/unstable/httpapi";var Qd="/permission",Uh=cs.Struct({reply:Co.Reply,message:cs.optional(cs.String)}),zd=Lh.make("permission").add(Nh.make("permission").add(Vd.get("list",Qd,{query:m,success:p(cs.Array(Co.Request),"List of pending permissions")}).annotateMerge(li.annotations({identifier:"permission.list",summary:"List pending permissions",description:"Get all pending permission requests across all sessions."})),Vd.post("reply",`${Qd}/:requestID/reply`,{params:{requestID:Co.ID},query:m,payload:Uh,success:p(cs.Boolean,"Permission processed successfully"),error:[Oh.BadRequest,Zt]}).annotateMerge(li.annotations({identifier:"permission.reply",summary:"Respond to permission request",description:"Approve or deny a permission request from the AI assistant."}))).annotateMerge(li.annotations({title:"permission",description:"Experimental HttpApi permission routes."})).middleware(U).middleware(N).middleware(L)).annotateMerge(li.annotations({title:"opencode experimental HttpApi",version:"0.0.1",description:"Experimental HttpApi surface for selected instance routes."}));import{Schema as gn}from"effect";import{HttpApi as jh,HttpApiEndpoint as ds,HttpApiError as Fh,HttpApiGroup as Wh,OpenApi as Dr}from"effect/unstable/httpapi";var ms="/project",Bh=gn.Struct({name:gn.optional(gn.String),icon:gn.optional(dt.Info.fields.icon),commands:gn.optional(dt.Info.fields.commands)}),Yd=jh.make("project").add(Wh.make("project").add(ds.get("list",ms,{query:m,success:p(gn.Array(dt.Info),"List of projects")}).annotateMerge(Dr.annotations({identifier:"project.list",summary:"List all projects",description:"Get a list of projects that have been opened with OpenCode."})),ds.get("current",`${ms}/current`,{query:m,success:p(dt.Info,"Current project information")}).annotateMerge(Dr.annotations({identifier:"project.current",summary:"Get current project",description:"Retrieve the currently active project that OpenCode is working with."})),ds.post("initGit",`${ms}/git/init`,{query:m,success:p(dt.Info,"Project information after git initialization")}).annotateMerge(Dr.annotations({identifier:"project.initGit",summary:"Initialize git repository",description:"Create a git repository for the current project and return the refreshed project info."})),ds.patch("update",`${ms}/:projectID`,{params:{projectID:Be.ID},query:m,payload:Bh,success:p(dt.Info,"Updated project information"),error:[Fh.BadRequest,an]}).annotateMerge(Dr.annotations({identifier:"project.update",summary:"Update project",description:"Update project properties such as name, icon, and commands."})),ds.get("directories",`${ms}/:projectID/directories`,{params:{projectID:Be.ID},query:m,success:p(Be.Directories,"Project directories")}).annotateMerge(Dr.annotations({identifier:"project.directories",summary:"List project directories",description:"List known local absolute directories for a project."}))).annotateMerge(Dr.annotations({title:"project",description:"Experimental HttpApi project routes."})).middleware(U).middleware(N).middleware(L)).annotateMerge(Dr.annotations({title:"opencode experimental HttpApi",version:"0.0.1",description:"Experimental HttpApi surface for selected instance routes."}));import{Schema as us}from"effect";import{HttpApi as Gh,HttpApiEndpoint as _h,HttpApiGroup as $h,OpenApi as Kd}from"effect/unstable/httpapi";var Vh=us.Struct({context:us.optional(us.String)}),Jd=Gh.make("projectCopyName").add($h.make("projectCopyName").add(_h.post("generateName","/experimental/project/:projectID/copy/generate-name",{params:{projectID:Be.ID},query:m,payload:Vh,success:us.Struct({name:us.String})}).annotateMerge(Kd.annotations({identifier:"experimental.projectCopy.generateName",summary:"Generate project copy name",description:"Generate a short name for a project copy from task context."}))).annotateMerge(Kd.annotations({title:"projectCopy",description:"Project copy naming routes."})).middleware(U).middleware(N).middleware(L));import{Schema as Te}from"effect";import{HttpApi as Qh,HttpApiEndpoint as fi,HttpApiGroup as zh,OpenApi as hn}from"effect/unstable/httpapi";var yi="/provider",Yh=Te.Union([Te.Literal("BadRequest"),Te.Literal("ProviderAuthOauthMissing"),Te.Literal("ProviderAuthOauthCodeMissing"),Te.Literal("ProviderAuthOauthCallbackFailed"),Te.Literal("ProviderAuthValidationFailed")]),Nt=class extends Te.ErrorClass("ProviderAuthError")({name:Yh,data:Te.Struct({providerID:Te.optional(qt.ID),field:Te.optional(Te.String),message:Te.optional(Te.String),kind:Te.optional(Te.String)})},{httpApiStatus:400}){static{n(this,"ProviderAuthApiError")}},Xd=Qh.make("provider").add(zh.make("provider").add(fi.get("list",yi,{query:m,success:p(Me.ListResult,"List of providers")}).annotateMerge(hn.annotations({identifier:"provider.list",summary:"List providers",description:"Get a list of all available AI providers, including both available and connected ones."})),fi.get("auth",`${yi}/auth`,{query:m,success:p(rt.Methods,"Provider auth methods")}).annotateMerge(hn.annotations({identifier:"provider.auth",summary:"Get provider auth methods",description:"Retrieve available authentication methods for all AI providers."})),fi.post("authorize",`${yi}/:providerID/oauth/authorize`,{params:{providerID:qt.ID},query:m,payload:rt.AuthorizeInput,success:p(Te.UndefinedOr(rt.Authorization),"Authorization URL and method"),error:Nt}).annotateMerge(hn.annotations({identifier:"provider.oauth.authorize",summary:"Start OAuth authorization",description:"Start the OAuth authorization flow for a provider."})),fi.post("callback",`${yi}/:providerID/oauth/callback`,{params:{providerID:qt.ID},query:m,payload:rt.CallbackInput,success:p(Te.Boolean,"OAuth callback processed successfully"),error:Nt}).annotateMerge(hn.annotations({identifier:"provider.oauth.callback",summary:"Handle OAuth callback",description:"Handle the OAuth callback from a provider after user authorization."}))).annotateMerge(hn.annotations({title:"provider",description:"Experimental HttpApi provider routes."})).middleware(U).middleware(N).middleware(L)).annotateMerge(hn.annotations({title:"opencode experimental HttpApi",version:"0.0.1",description:"Experimental HttpApi surface for selected instance routes."}));import{Schema as xt}from"effect";import{HttpApi as Zd,HttpApiEndpoint as _o,HttpApiError as gi,HttpApiGroup as em,OpenApi as Ut}from"effect/unstable/httpapi";var Go="/pty",Kh=xt.Struct({ptyID:jr}),tm=xt.Struct({...we,cursor:xt.optional(xt.String)}),Jh=xt.Struct({path:xt.String,name:xt.String,acceptable:xt.Boolean}),$o={shells:`${Go}/shells`,list:Go,create:Go,get:`${Go}/:ptyID`,update:`${Go}/:ptyID`,remove:`${Go}/:ptyID`,connectToken:`${Go}/:ptyID/connect-token`,connect:`${Go}/:ptyID/connect`},om=Zd.make("pty").add(em.make("pty").add(_o.get("shells",$o.shells,{query:m,success:p(xt.Array(Jh),"List of shells")}).annotateMerge(Ut.annotations({identifier:"pty.shells",summary:"List available shells",description:"Get a list of available shells on the system."})),_o.get("list",$o.list,{query:m,success:p(xt.Array(ge.Info),"List of sessions")}).annotateMerge(Ut.annotations({identifier:"pty.list",summary:"List PTY sessions",description:"Get a list of all active pseudo-terminal (PTY) sessions managed by OpenCode."})),_o.post("create",$o.create,{query:m,payload:ge.CreateInput,success:p(ge.Info,"Created session"),error:gi.BadRequest}).annotateMerge(Ut.annotations({identifier:"pty.create",summary:"Create PTY session",description:"Create a new pseudo-terminal (PTY) session for running shell commands and processes."})),_o.get("get",$o.get,{params:{ptyID:jr},query:m,success:p(ge.Info,"Session info"),error:bt}).annotateMerge(Ut.annotations({identifier:"pty.get",summary:"Get PTY session",description:"Retrieve detailed information about a specific pseudo-terminal (PTY) session."})),_o.put("update",$o.update,{params:{ptyID:jr},query:m,payload:ge.UpdateInput,success:p(ge.Info,"Updated session"),error:[bt,gi.BadRequest]}).annotateMerge(Ut.annotations({identifier:"pty.update",summary:"Update PTY session",description:"Update properties of an existing pseudo-terminal (PTY) session."})),_o.delete("remove",$o.remove,{params:{ptyID:jr},query:m,success:p(xt.Boolean,"Session removed"),error:bt}).annotateMerge(Ut.annotations({identifier:"pty.remove",summary:"Remove PTY session",description:"Remove and terminate a specific pseudo-terminal (PTY) session."})),_o.post("connectToken",$o.connectToken,{params:{ptyID:jr},query:m,success:p(Rt.ConnectToken,"WebSocket connect token"),error:[sn,bt]}).annotateMerge(Ut.annotations({identifier:"pty.connectToken",summary:"Create PTY WebSocket token",description:"Create a short-lived ticket for opening a PTY WebSocket connection."}))).annotateMerge(Ut.annotations({title:"pty",description:"Experimental HttpApi PTY routes."})).middleware(U).middleware(N).middleware(L)).annotateMerge(Ut.annotations({title:"opencode experimental HttpApi",version:"0.0.1",description:"Experimental HttpApi surface for selected instance routes."})),Sn=Zd.make("pty-connect").add(em.make("pty-connect").add(_o.get("connect",$o.connect,{params:Kh,success:p(xt.Boolean,"Connected session"),error:[gi.Forbidden,gi.NotFound]}).annotateMerge(Ut.annotations({identifier:"pty.connect",summary:"Connect to PTY session",description:"Establish a WebSocket connection to interact with a pseudo-terminal (PTY) session in real-time.",transform:n(e=>({...e,parameters:[...e.parameters??[],...["directory","workspace","cursor",es].map(t=>({in:"query",name:t,schema:{type:"string"}}))]}),"transform")}))).annotateMerge(Ut.annotations({title:"pty",description:"PTY websocket route."})).middleware(U).middleware(N).middleware(Sr));import{Schema as fs}from"effect";import{HttpApi as Xh,HttpApiEndpoint as Ra,HttpApiError as rm,HttpApiGroup as Zh,OpenApi as ls}from"effect/unstable/httpapi";var ba="/question",eS=fs.Struct({answers:fs.Array(Vt.Answer).annotate({description:"User answers in order of questions (each answer is an array of selected labels)"})}),nm=Xh.make("question").add(Zh.make("question").add(Ra.get("list",ba,{query:m,success:p(fs.Array(Vt.Request),"List of pending questions")}).annotateMerge(ls.annotations({identifier:"question.list",summary:"List pending questions",description:"Get all pending question requests across all sessions."})),Ra.post("reply",`${ba}/:requestID/reply`,{params:{requestID:ea},query:m,payload:eS,success:p(fs.Boolean,"Question answered successfully"),error:[rm.BadRequest,Uo]}).annotateMerge(ls.annotations({identifier:"question.reply",summary:"Reply to question request",description:"Provide answers to a question request from the AI assistant."})),Ra.post("reject",`${ba}/:requestID/reject`,{params:{requestID:ea},query:m,success:p(fs.Boolean,"Question rejected successfully"),error:[rm.BadRequest,Uo]}).annotateMerge(ls.annotations({identifier:"question.reject",summary:"Reject question request",description:"Reject a question request from the AI assistant."}))).annotateMerge(ls.annotations({title:"question",description:"Question routes."})).middleware(U).middleware(N).middleware(L)).annotateMerge(ls.annotations({title:"opencode HttpApi",version:"0.0.1",description:"Effect HttpApi surface for instance routes."}));import{Schema as R,Struct as vn}from"effect";import{HttpApi as tS,HttpApiEndpoint as re,HttpApiError as me,HttpApiGroup as oS,HttpApiSchema as Ca,OpenApi as Z}from"effect/unstable/httpapi";var pe="/session",rS=R.Struct({...we,scope:R.optional(R.Literals(["project"])),path:R.optional(R.String),roots:R.optional(as),start:R.optional(R.NumberFromString),search:R.optional(R.String),limit:R.optional(R.NumberFromString)}),nS=R.Struct({...we,...vn.omit(_r.DiffInput.fields,["sessionID"])}),sS=R.Struct({...we,limit:R.optional(R.NumberFromString.check(R.isInt(),R.isGreaterThanOrEqualTo(0))),before:R.optional(R.String)}),iS=R.Record(R.String,Po.Info),aS=R.Struct({title:R.optional(R.String),metadata:R.optional(z.Metadata),permission:R.optional(Co.Ruleset),time:R.optional(R.Struct({archived:R.optional(z.ArchivedTimestamp)}))}),Ha=R.Struct(vn.omit(z.ForkInput.fields,["sessionID"])),pS=R.Struct({modelID:Tn.ID,providerID:qt.ID,messageID:xo}),cS=R.Struct({providerID:qt.ID,modelID:Tn.ID,auto:R.optional(R.Boolean)}),sm=R.Struct(vn.omit(Qt.PromptInput.fields,["sessionID"])),dS=R.Struct(vn.omit(Qt.CommandInput.fields,["sessionID"])),mS=R.Struct(vn.omit(Qt.ShellInput.fields,["sessionID"])),uS=R.Struct(vn.omit($r.RevertInput.fields,["sessionID"])),lS=R.Struct({response:Co.Reply}),ne={list:pe,status:`${pe}/status`,get:`${pe}/:sessionID`,children:`${pe}/:sessionID/children`,todo:`${pe}/:sessionID/todo`,diff:`${pe}/:sessionID/diff`,messages:`${pe}/:sessionID/message`,message:`${pe}/:sessionID/message/:messageID`,create:pe,remove:`${pe}/:sessionID`,update:`${pe}/:sessionID`,fork:`${pe}/:sessionID/fork`,abort:`${pe}/:sessionID/abort`,share:`${pe}/:sessionID/share`,init:`${pe}/:sessionID/init`,summarize:`${pe}/:sessionID/summarize`,prompt:`${pe}/:sessionID/message`,promptAsync:`${pe}/:sessionID/prompt_async`,command:`${pe}/:sessionID/command`,shell:`${pe}/:sessionID/shell`,revert:`${pe}/:sessionID/revert`,unrevert:`${pe}/:sessionID/unrevert`,permissions:`${pe}/:sessionID/permissions/:permissionID`,deleteMessage:`${pe}/:sessionID/message/:messageID`,deletePart:`${pe}/:sessionID/message/:messageID/part/:partID`,updatePart:`${pe}/:sessionID/message/:messageID/part/:partID`},im=tS.make("session").add(oS.make("session").add(re.get("list",ne.list,{query:rS,success:p(R.Array(z.Info),"List of sessions")}).annotateMerge(Z.annotations({identifier:"session.list",summary:"List sessions",description:"Get a list of all OpenCode sessions, sorted by most recently updated."})),re.get("status",ne.status,{query:m,success:p(iS,"Get session status"),error:me.BadRequest}).annotateMerge(Z.annotations({identifier:"session.status",summary:"Get session status",description:"Retrieve the current status of all sessions, including active, idle, and completed states."})),re.get("get",ne.get,{params:{sessionID:_},query:m,success:p(z.Info,"Get session"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"session.get",summary:"Get session",description:"Retrieve detailed information about a specific OpenCode session."})),re.get("children",ne.children,{params:{sessionID:_},query:m,success:p(R.Array(z.Info),"List of children"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"session.children",summary:"Get session children",description:"Retrieve all child sessions that were forked from the specified parent session."})),re.get("todo",ne.todo,{params:{sessionID:_},query:m,success:p(R.Array(Gr.Info),"Todo list"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"session.todo",summary:"Get session todos",description:"Retrieve the todo list associated with a specific session, showing tasks and action items."})),re.get("diff",ne.diff,{params:{sessionID:_},query:nS,success:p(R.Array(Qs.FileDiff),"Successfully retrieved diff")}).annotateMerge(Z.annotations({identifier:"session.diff",summary:"Get message diff",description:"Get the file changes (diff) that resulted from a specific user message in the session."})),re.get("messages",ne.messages,{params:{sessionID:_},query:sS,success:p(R.Array(bo.WithParts),"List of messages"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"session.messages",summary:"Get session messages",description:"Retrieve all messages in a session, including user prompts and AI responses."})),re.get("message",ne.message,{params:{sessionID:_,messageID:xo},query:m,success:p(bo.WithParts,"Message"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"session.message",summary:"Get message",description:"Retrieve a specific message from a session by its message ID."})),re.post("create",ne.create,{query:m,payload:[Ca.NoContent,z.CreateInput],success:p(z.Info,"Successfully created session"),error:me.BadRequest}).annotateMerge(Z.annotations({identifier:"session.create",summary:"Create session",description:"Create a new OpenCode session for interacting with AI assistants and managing conversations."})),re.delete("remove",ne.remove,{params:{sessionID:_},query:m,success:p(R.Boolean,"Successfully deleted session"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"session.delete",summary:"Delete session",description:"Delete a session and permanently remove all associated data, including messages and history."})),re.patch("update",ne.update,{params:{sessionID:_},query:m,payload:aS,success:p(z.Info,"Successfully updated session"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"session.update",summary:"Update session",description:"Update properties of an existing session, such as title or other metadata."})),re.post("fork",ne.fork,{params:{sessionID:_},query:m,payload:[Ca.NoContent,Ha],success:p(z.Info,"200"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"session.fork",summary:"Fork session",description:"Create a new session by forking an existing session at a specific message point."})),re.post("abort",ne.abort,{params:{sessionID:_},query:m,success:p(R.Boolean,"Aborted session"),error:me.BadRequest}).annotateMerge(Z.annotations({identifier:"session.abort",summary:"Abort session",description:"Abort an active session and stop any ongoing AI processing or command execution."})),re.post("init",ne.init,{params:{sessionID:_},query:m,payload:pS,success:p(R.Boolean,"200"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"session.init",summary:"Initialize session",description:"Analyze the current application and create an AGENTS.md file with project-specific agent configurations."})),re.post("share",ne.share,{params:{sessionID:_},query:m,success:p(z.Info,"Successfully shared session"),error:[me.InternalServerError,J]}).annotateMerge(Z.annotations({identifier:"session.share",summary:"Share session",description:"Create a shareable link for a session, allowing others to view the conversation."})),re.delete("unshare",ne.share,{params:{sessionID:_},query:m,success:p(z.Info,"Successfully unshared session"),error:[me.InternalServerError,J]}).annotateMerge(Z.annotations({identifier:"session.unshare",summary:"Unshare session",description:"Remove the shareable link for a session, making it private again."})),re.post("summarize",ne.summarize,{params:{sessionID:_},query:m,payload:cS,success:p(R.Boolean,"Summarized session"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"session.summarize",summary:"Summarize session",description:"Generate a concise summary of the session using AI compaction to preserve key information."})),re.post("prompt",ne.prompt,{params:{sessionID:_},query:m,payload:sm,success:p(bo.WithParts,"Created message"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"session.prompt",summary:"Send message",description:"Create and send a new message to a session, streaming the AI response."})),re.post("promptAsync",ne.promptAsync,{params:{sessionID:_},query:m,payload:sm,success:p(Ca.NoContent,"Prompt accepted"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"session.prompt_async",summary:"Send async message",description:"Create and send a new message to a session asynchronously, starting the session if needed and returning immediately."})),re.post("command",ne.command,{params:{sessionID:_},query:m,payload:dS,success:p(bo.WithParts,"Created message"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"session.command",summary:"Send command",description:"Send a new command to a session for execution by the AI assistant."})),re.post("shell",ne.shell,{params:{sessionID:_},query:m,payload:mS,success:p(bo.WithParts,"Created message"),error:[me.BadRequest,J,fo]}).annotateMerge(Z.annotations({identifier:"session.shell",summary:"Run shell command",description:"Execute a shell command within the session context and return the AI's response."})),re.post("revert",ne.revert,{params:{sessionID:_},query:m,payload:uS,success:p(z.Info,"Updated session"),error:[me.BadRequest,J,fo]}).annotateMerge(Z.annotations({identifier:"session.revert",summary:"Revert message",description:"Revert a specific message in a session, undoing its effects and restoring the previous state."})),re.post("unrevert",ne.unrevert,{params:{sessionID:_},query:m,success:p(z.Info,"Updated session"),error:[me.BadRequest,J,fo]}).annotateMerge(Z.annotations({identifier:"session.unrevert",summary:"Restore reverted messages",description:"Restore all previously reverted messages in a session."})),re.post("permissionRespond",ne.permissions,{params:{sessionID:_,permissionID:Co.ID},query:m,payload:lS,success:p(R.Boolean,"Permission processed successfully"),error:[me.BadRequest,J,Zt]}).annotateMerge(Z.annotations({identifier:"permission.respond",summary:"Respond to permission",description:"Approve or deny a permission request from the AI assistant.",deprecated:!0})),re.delete("deleteMessage",ne.deleteMessage,{params:{sessionID:_,messageID:xo},query:m,success:p(R.Boolean,"Successfully deleted message"),error:[me.BadRequest,J,fo]}).annotateMerge(Z.annotations({identifier:"session.deleteMessage",summary:"Delete message",description:"Permanently delete a specific message and all of its parts from a session without reverting file changes."})),re.delete("deletePart",ne.deletePart,{params:{sessionID:_,messageID:xo,partID:Zi},query:m,success:p(R.Boolean,"Successfully deleted part"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"part.delete",description:"Delete a part from a message."})),re.patch("updatePart",ne.updatePart,{params:{sessionID:_,messageID:xo,partID:Zi},query:m,payload:bo.Part,success:p(bo.Part,"Successfully updated part"),error:[me.BadRequest,J]}).annotateMerge(Z.annotations({identifier:"part.update",description:"Update a part in a message."}))).annotateMerge(Z.annotations({title:"session",description:"Experimental HttpApi session routes."})).middleware(U).middleware(N).middleware(L)).annotateMerge(Z.annotations({title:"opencode experimental HttpApi",version:"0.0.1",description:"Experimental HttpApi surface for selected instance routes."}));import{Schema as Se}from"effect";import{HttpApi as fS,HttpApiEndpoint as hi,HttpApiError as xa,HttpApiGroup as yS,OpenApi as In}from"effect/unstable/httpapi";var Si="/sync",gS=Se.Struct({id:le.ID,aggregateID:Se.String,seq:De,type:Se.String,data:Se.Record(Se.String,Se.Unknown)}),hS=Se.Struct({directory:Se.String,events:Se.NonEmptyArray(gS)}),SS=Se.Struct({sessionID:Se.String}),am=Se.Struct({sessionID:_}),vS=Se.Record(Se.String,De),IS=Se.Struct({id:le.ID,aggregate_id:Se.String,seq:De,type:Se.String,data:Se.Record(Se.String,Se.Unknown)}),vi={start:`${Si}/start`,replay:`${Si}/replay`,steal:`${Si}/steal`,history:`${Si}/history`},pm=fS.make("sync").add(yS.make("sync").add(hi.post("start",vi.start,{query:m,success:p(Se.Boolean,"Workspace sync started")}).annotateMerge(In.annotations({identifier:"sync.start",summary:"Start workspace sync",description:"Start sync loops for workspaces in the current project that have active sessions."})),hi.post("replay",vi.replay,{query:m,payload:hS,success:p(SS,"Replayed sync events"),error:xa.BadRequest}).annotateMerge(In.annotations({identifier:"sync.replay",summary:"Replay sync events",description:"Validate and replay a complete sync event history."})),hi.post("steal",vi.steal,{query:m,payload:am,success:p(am,"Session stolen into workspace"),error:xa.BadRequest}).annotateMerge(In.annotations({identifier:"sync.steal",summary:"Steal session into workspace",description:"Update a session to belong to the current workspace through the sync event system."})),hi.post("history",vi.history,{query:m,payload:vS,success:p(Se.Array(IS),"Sync events"),error:xa.BadRequest}).annotateMerge(In.annotations({identifier:"sync.history.list",summary:"List sync events",description:"List sync events for all aggregates. Keys are aggregate IDs the client already knows about, values are the last known sequence ID. Events with seq > value are returned for those aggregates. Aggregates not listed in the input get their full history."}))).annotateMerge(In.annotations({title:"sync",description:"Experimental HttpApi sync routes."})).middleware(U).middleware(N).middleware(L)).annotateMerge(In.annotations({title:"opencode experimental HttpApi",version:"0.0.1",description:"Experimental HttpApi surface for selected instance routes."}));var ys=class{static{n(this,"AsyncQueue")}queue=[];resolvers=[];push(t){let o=this.resolvers.shift();o?o(t):this.queue.push(t)}async next(){return this.queue.length>0?this.queue.shift():new Promise(t=>this.resolvers.push(t))}async*[Symbol.asyncIterator](){for(;;)yield await this.next()}};import{Schema as Pa}from"effect";var cm=Pa.Struct({path:Pa.String,body:Pa.Unknown}),AS=new ys,ES=new ys;function dm(){return AS.next()}n(dm,"nextTuiRequest");function mm(e){ES.push(e)}n(mm,"submitTuiResponse");import{Schema as ye}from"effect";import{HttpApi as DS,HttpApiEndpoint as ht,HttpApiError as Ii,HttpApiGroup as kS,OpenApi as Ye}from"effect/unstable/httpapi";var St="/tui",wS=ye.Struct({command:ye.String}),RS=ye.Struct({type:ye.Literal(oe.PromptAppend.type),properties:oe.PromptAppend.data}).annotate({identifier:"EventTuiPromptAppend"}),bS=ye.Struct({type:ye.Literal(oe.CommandExecute.type),properties:oe.CommandExecute.data}).annotate({identifier:"EventTuiCommandExecute"}),CS=ye.Struct({type:ye.Literal(oe.ToastShow.type),properties:oe.ToastShow.data}).annotate({identifier:"EventTuiToastShow"}),HS=ye.Struct({type:ye.Literal(oe.SessionSelect.type),properties:oe.SessionSelect.data}).annotate({identifier:"EventTuiSessionSelect"}),xS=ye.Union([RS,bS,CS,HS]),vt={appendPrompt:`${St}/append-prompt`,openHelp:`${St}/open-help`,openSessions:`${St}/open-sessions`,openThemes:`${St}/open-themes`,openModels:`${St}/open-models`,submitPrompt:`${St}/submit-prompt`,clearPrompt:`${St}/clear-prompt`,executeCommand:`${St}/execute-command`,showToast:`${St}/show-toast`,publish:`${St}/publish`,selectSession:`${St}/select-session`,controlNext:`${St}/control/next`,controlResponse:`${St}/control/response`},um=DS.make("tui").add(kS.make("tui").add(ht.post("appendPrompt",vt.appendPrompt,{query:m,payload:oe.PromptAppend.data,success:p(ye.Boolean,"Prompt processed successfully"),error:Ii.BadRequest}).annotateMerge(Ye.annotations({identifier:"tui.appendPrompt",summary:"Append TUI prompt",description:"Append prompt to the TUI."})),ht.post("openHelp",vt.openHelp,{query:m,success:p(ye.Boolean,"Help dialog opened successfully")}).annotateMerge(Ye.annotations({identifier:"tui.openHelp",summary:"Open help dialog",description:"Open the help dialog in the TUI to display user assistance information."})),ht.post("openSessions",vt.openSessions,{query:m,success:p(ye.Boolean,"Session dialog opened successfully")}).annotateMerge(Ye.annotations({identifier:"tui.openSessions",summary:"Open sessions dialog",description:"Open the session dialog."})),ht.post("openThemes",vt.openThemes,{query:m,success:p(ye.Boolean,"Theme dialog opened successfully")}).annotateMerge(Ye.annotations({identifier:"tui.openThemes",summary:"Open themes dialog",description:"Open the theme dialog."})),ht.post("openModels",vt.openModels,{query:m,success:p(ye.Boolean,"Model dialog opened successfully")}).annotateMerge(Ye.annotations({identifier:"tui.openModels",summary:"Open models dialog",description:"Open the model dialog."})),ht.post("submitPrompt",vt.submitPrompt,{query:m,success:p(ye.Boolean,"Prompt submitted successfully")}).annotateMerge(Ye.annotations({identifier:"tui.submitPrompt",summary:"Submit TUI prompt",description:"Submit the prompt."})),ht.post("clearPrompt",vt.clearPrompt,{query:m,success:p(ye.Boolean,"Prompt cleared successfully")}).annotateMerge(Ye.annotations({identifier:"tui.clearPrompt",summary:"Clear TUI prompt",description:"Clear the prompt."})),ht.post("executeCommand",vt.executeCommand,{query:m,payload:wS,success:p(ye.Boolean,"Command executed successfully"),error:Ii.BadRequest}).annotateMerge(Ye.annotations({identifier:"tui.executeCommand",summary:"Execute TUI command",description:"Execute a TUI command."})),ht.post("showToast",vt.showToast,{query:m,payload:oe.ToastShow.data,success:p(ye.Boolean,"Toast notification shown successfully")}).annotateMerge(Ye.annotations({identifier:"tui.showToast",summary:"Show TUI toast",description:"Show a toast notification in the TUI."})),ht.post("publish",vt.publish,{query:m,payload:xS,success:p(ye.Boolean,"Event published successfully"),error:Ii.BadRequest}).annotateMerge(Ye.annotations({identifier:"tui.publish",summary:"Publish TUI event",description:"Publish a TUI event."})),ht.post("selectSession",vt.selectSession,{query:m,payload:oe.SessionSelect.data,success:p(ye.Boolean,"Session selected successfully"),error:[Ii.BadRequest,J]}).annotateMerge(Ye.annotations({identifier:"tui.selectSession",summary:"Select session",description:"Navigate the TUI to display the specified session."})),ht.get("controlNext",vt.controlNext,{query:m,success:p(cm,"Next TUI request")}).annotateMerge(Ye.annotations({identifier:"tui.control.next",summary:"Get next TUI request",description:"Retrieve the next TUI request from the queue for processing."})),ht.post("controlResponse",vt.controlResponse,{query:m,payload:ye.Unknown,success:p(ye.Boolean,"Response submitted successfully")}).annotateMerge(Ye.annotations({identifier:"tui.control.response",summary:"Submit TUI response",description:"Submit a response to the TUI request queue to complete a pending request."}))).annotateMerge(Ye.annotations({title:"tui",description:"Experimental HttpApi TUI routes."})).middleware(U).middleware(N).middleware(L)).annotateMerge(Ye.annotations({title:"opencode experimental HttpApi",version:"0.0.1",description:"Experimental HttpApi surface for selected instance routes."}));import{Schema as Ke,Struct as PS}from"effect";import{HttpApi as qS,HttpApiEndpoint as kr,HttpApiError as lm,HttpApiGroup as MS,HttpApiSchema as fm,OpenApi as go}from"effect/unstable/httpapi";var An="/experimental/workspace",TS=Ke.Struct(PS.omit(fe.CreateInput.fields,["projectID"])),LS=Ke.Struct({id:Ke.NullOr(fe.Info.fields.id),sessionID:fe.SessionWarpInput.fields.sessionID,copyChanges:fe.SessionWarpInput.fields.copyChanges}),gs=class extends Ke.ErrorClass("WorkspaceWarpError")({name:Ke.Literal("WorkspaceWarpError"),data:Ke.Struct({message:Ke.String})},{httpApiStatus:400}){static{n(this,"ApiWorkspaceWarpError")}},hs=class extends Ke.ErrorClass("WorkspaceCreateError")({name:Ke.Literal("WorkspaceCreateError"),data:Ke.Struct({message:Ke.String})},{httpApiStatus:400}){static{n(this,"ApiWorkspaceCreateError")}},wr={adapters:`${An}/adapter`,list:An,syncList:`${An}/sync-list`,status:`${An}/status`,remove:`${An}/:id`,warp:`${An}/warp`},ym=qS.make("workspace").add(MS.make("workspace").add(kr.get("adapters",wr.adapters,{query:m,success:p(Ke.Array(Xp),"Workspace adapters")}).annotateMerge(go.annotations({identifier:"experimental.workspace.adapter.list",summary:"List workspace adapters",description:"List all available workspace adapters for the current project."})),kr.get("list",wr.list,{query:m,success:p(Ke.Array(fe.Info),"Workspaces")}).annotateMerge(go.annotations({identifier:"experimental.workspace.list",summary:"List workspaces",description:"List all workspaces."})),kr.post("create",wr.list,{query:m,payload:TS,success:p(fe.Info,"Workspace created"),error:[hs,lm.BadRequest]}).annotateMerge(go.annotations({identifier:"experimental.workspace.create",summary:"Create workspace",description:"Create a workspace for the current project."})),kr.post("syncList",wr.syncList,{query:m,success:p(fm.NoContent,"Workspace list synced")}).annotateMerge(go.annotations({identifier:"experimental.workspace.syncList",summary:"Sync workspace list",description:"Register missing workspaces returned by workspace adapters."})),kr.get("status",wr.status,{query:m,success:p(Ke.Array(fe.ConnectionStatus),"Workspace status")}).annotateMerge(go.annotations({identifier:"experimental.workspace.status",summary:"Workspace status",description:"Get connection status for workspaces in the current project."})),kr.delete("remove",wr.remove,{params:{id:fe.Info.fields.id},query:m,success:p(Ke.UndefinedOr(fe.Info),"Workspace removed"),error:lm.BadRequest}).annotateMerge(go.annotations({identifier:"experimental.workspace.remove",summary:"Remove workspace",description:"Remove an existing workspace."})),kr.post("warp",wr.warp,{query:m,payload:LS,success:p(fm.NoContent,"Session warped"),error:[gs,yo,J]}).annotateMerge(go.annotations({identifier:"experimental.workspace.warp",summary:"Warp session into workspace",description:"Move a session's sync history into the target workspace, or detach it to the local project."}))).annotateMerge(go.annotations({title:"workspace",description:"Experimental HttpApi workspace routes."})).middleware(U).middleware(N).middleware(L)).annotateMerge(go.annotations({title:"opencode experimental HttpApi",version:"0.0.1",description:"Experimental HttpApi surface for selected instance routes."}));import"effect";import{HttpApi as Uv,OpenApi as jv}from"effect/unstable/httpapi";import{HttpApiMiddleware as OS}from"effect/unstable/httpapi";var Rr=class extends OS.Service()("@opencode/HttpApiSchemaError",{error:be}){static{n(this,"SchemaErrorMiddleware")}};import{Schema as Re}from"effect";import{HttpApiEndpoint as NS,HttpApiGroup as US,OpenApi as gm}from"effect/unstable/httpapi";var jS=Re.Struct({limit:Re.optional(Re.NumberFromString.check(Re.isInt(),Re.isGreaterThanOrEqualTo(1),Re.isLessThanOrEqualTo(200))).annotate({description:"Maximum number of messages to return. When omitted, the endpoint returns its default page size."}),order:Re.optional(Re.Union([Re.Literal("asc"),Re.Literal("desc")])).annotate({description:"Message order for the first page. Use desc for newest first or asc for oldest first."}),cursor:Re.optional(Re.String.annotate({description:"Opaque pagination cursor returned as cursor.previous or cursor.next in the previous response. Do not combine with order."}))}).annotate({identifier:"SessionMessagesQuery"}),hm=US.make("server.message").add(NS.get("session.messages","/api/session/:sessionID/message",{params:{sessionID:V.ID},query:jS,success:Re.Struct({data:Re.Array(Do.Message),cursor:Re.Struct({previous:Re.String.pipe(Re.optional),next:Re.String.pipe(Re.optional)})}).annotate({identifier:"SessionMessagesResponse"}),error:[Ot,x,nt]}).annotateMerge(gm.annotations({identifier:"v2.session.messages",summary:"Get session messages",description:"Retrieve projected messages for a session. Items keep the requested order across pages; use cursor.next or cursor.previous to move through the ordered timeline."}))).annotateMerge(gm.annotations({title:"messages",description:"Experimental message routes."}));import{Schema as FS}from"effect";import{HttpApiEndpoint as WS,HttpApiGroup as BS,OpenApi as Sm}from"effect/unstable/httpapi";var vm=BS.make("server.model").add(WS.get("model.list","/api/model",{query:q,success:F.response(FS.Array(Mn.Info)),error:lt}).annotateMerge(M).annotateMerge(Sm.annotations({identifier:"v2.model.list",summary:"List models",description:"Retrieve available models ordered by release date."}))).annotateMerge(Sm.annotations({title:"models",description:"Experimental model routes."}));import{Schema as GS}from"effect";import{HttpApiEndpoint as Im,HttpApiGroup as _S,OpenApi as qa}from"effect/unstable/httpapi";var Am=_S.make("server.provider").add(Im.get("provider.list","/api/provider",{query:q,success:F.response(GS.Array(Ps.Info)),error:lt}).annotateMerge(M).annotateMerge(qa.annotations({identifier:"v2.provider.list",summary:"List providers",description:"Retrieve active AI providers so clients can show provider availability and configuration."}))).add(Im.get("provider.get","/api/provider/:providerID",{params:{providerID:Ps.ID},query:q,success:F.response(Ps.Info),error:[tn,lt]}).annotateMerge(M).annotateMerge(qa.annotations({identifier:"v2.provider.get",summary:"Get provider",description:"Retrieve a single AI provider so clients can inspect its availability and endpoint settings."}))).annotateMerge(qa.annotations({title:"providers",description:"Experimental provider routes."}));import{Effect as Ma,Encoding as Em,Result as $S,Schema as S,Struct as VS}from"effect";import{HttpApiEndpoint as Le,HttpApiGroup as QS,HttpApiSchema as Vo,OpenApi as He}from"effect/unstable/httpapi";var Ai={workspace:xp.ID.pipe(S.optional),limit:S.NumberFromString.pipe(S.decodeTo(nr),S.optional).annotate({description:"Maximum number of sessions to return. Defaults to the newest 50 sessions."}),order:S.optional(S.Union([S.Literal("asc"),S.Literal("desc")])).annotate({description:"Session order for the first page. Use desc for newest first or asc for oldest first."}),search:S.optional(S.String)},zS=S.Struct({...Ai,directory:ke}),YS=S.Struct({...Ai,project:Mt.ID,subpath:Et.pipe(S.optional)}),KS=S.Struct(Ai),Ta=n(e=>e.mapFields(t=>({...VS.omit(t,["limit"]),anchor:V.ListAnchor})),"withCursor"),JS=S.Union([Ta(zS),Ta(YS),Ta(KS)]),km=S.fromJsonString(JS),XS=S.encodeSync(km),ZS=S.decodeUnknownEffect(km),Dm="Invalid cursor",br=S.String.pipe(S.brand("SessionsCursor"),yp(e=>{let t=e.make.bind(e);return{make:n(o=>t(Em.encodeBase64Url(XS(o))),"make"),parse:n(o=>Ma.suspend(()=>{let r=Em.decodeBase64UrlString(o);return $S.isFailure(r)?Ma.fail(Dm):ZS(r.success).pipe(Ma.mapError(()=>Dm))}),"parse")}})),ev=S.Struct({type:S.Literal("running")}).annotate({identifier:"SessionActive"}),tv=nr.check(S.isLessThanOrEqualTo(100)),ov=S.Struct({limit:S.NumberFromString.pipe(S.decodeTo(tv),S.optional),after:S.NumberFromString.pipe(S.decodeTo(De),S.optional)}),rv=br.annotate({description:"Opaque pagination cursor returned as cursor.previous or cursor.next in the previous response."}),nv=S.Struct({...Ai,directory:ke.pipe(S.optional),project:Mt.ID.pipe(S.optional),subpath:Et.pipe(S.optional),cursor:rv.pipe(S.optional)}).annotate({identifier:"SessionsQuery"}),wm=n(e=>QS.make("server.session").add(Le.get("session.list","/api/session",{query:nv,success:S.Struct({data:S.Array(V.Info),cursor:S.Struct({previous:br.pipe(S.optional),next:br.pipe(S.optional)})}).annotate({identifier:"SessionsResponse"}),error:[Ot,be]}).annotateMerge(He.annotations({identifier:"v2.session.list",summary:"List sessions",description:"Retrieve sessions in the requested order. Items keep that order across pages; use cursor.next or cursor.previous to move through the ordered list."}))).add(Le.post("session.create","/api/session",{payload:S.Struct({id:V.ID.pipe(S.optional),agent:sr.ID.pipe(S.optional),model:Mn.Ref.pipe(S.optional),location:F.Ref.pipe(S.optional)}),success:S.Struct({data:V.Info})}).annotateMerge(He.annotations({identifier:"v2.session.create",summary:"Create session",description:"Create a session at the requested location."}))).add(Le.get("session.active","/api/session/active",{success:S.Struct({data:S.Record(V.ID,ev)})}).annotateMerge(He.annotations({identifier:"v2.session.active",summary:"List active sessions",description:"Retrieve foreground Session drains currently owned by this OpenCode process. Sessions absent from the result are inactive."}))).add(Le.get("session.get","/api/session/:sessionID",{params:{sessionID:V.ID},success:S.Struct({data:V.Info}),error:x}).middleware(e).annotateMerge(He.annotations({identifier:"v2.session.get",summary:"Get session",description:"Retrieve a session by ID."}))).add(Le.post("session.switchAgent","/api/session/:sessionID/agent",{params:{sessionID:V.ID},payload:S.Struct({agent:sr.ID}),success:Vo.NoContent,error:x}).middleware(e).annotateMerge(He.annotations({identifier:"v2.session.switchAgent",summary:"Switch session agent",description:"Switch the agent used by subsequent provider turns."}))).add(Le.post("session.switchModel","/api/session/:sessionID/model",{params:{sessionID:V.ID},payload:S.Struct({model:Mn.Ref}),success:Vo.NoContent,error:x}).middleware(e).annotateMerge(He.annotations({identifier:"v2.session.switchModel",summary:"Switch session model",description:"Switch the model used by subsequent provider turns."}))).add(Le.post("session.prompt","/api/session/:sessionID/prompt",{params:{sessionID:V.ID},payload:S.Struct({id:Do.ID.pipe(S.optional),prompt:qp.Prompt,delivery:zi.Delivery.pipe(S.optional),resume:S.Boolean.pipe(S.optional)}),success:S.Struct({data:zi.Admitted}),error:[en,x]}).middleware(e).annotateMerge(He.annotations({identifier:"v2.session.prompt",summary:"Send message",description:"Durably admit one session input and schedule agent-loop execution unless resume is false."}))).add(Le.post("session.compact","/api/session/:sessionID/compact",{params:{sessionID:V.ID},success:Vo.NoContent,error:[x,lt]}).middleware(e).annotateMerge(He.annotations({identifier:"v2.session.compact",summary:"Compact session",description:"Compact a session conversation."}))).add(Le.post("session.wait","/api/session/:sessionID/wait",{params:{sessionID:V.ID},success:Vo.NoContent,error:[x,lt]}).middleware(e).annotateMerge(He.annotations({identifier:"v2.session.wait",summary:"Wait for session",description:"Wait for a session agent loop to become idle."}))).add(Le.post("session.revert.stage","/api/session/:sessionID/revert/stage",{params:{sessionID:V.ID},payload:S.Struct({messageID:Do.ID,files:S.Boolean.pipe(S.optional)}),success:S.Struct({data:Ap.State}),error:[Oo,x,nt]}).middleware(e).annotateMerge(He.annotations({identifier:"v2.session.revert.stage",summary:"Stage session revert",description:"Stage or move a reversible session boundary and optionally apply its file changes."}))).add(Le.post("session.revert.clear","/api/session/:sessionID/revert/clear",{params:{sessionID:V.ID},success:Vo.NoContent,error:[x,nt]}).middleware(e).annotateMerge(He.annotations({identifier:"v2.session.revert.clear",summary:"Clear staged revert"}))).add(Le.post("session.revert.commit","/api/session/:sessionID/revert/commit",{params:{sessionID:V.ID},success:Vo.NoContent,error:x}).middleware(e).annotateMerge(He.annotations({identifier:"v2.session.revert.commit",summary:"Commit staged revert"}))).add(Le.get("session.context","/api/session/:sessionID/context",{params:{sessionID:V.ID},success:S.Struct({data:S.Array(Do.Message)}),error:[x,nt]}).middleware(e).annotateMerge(He.annotations({identifier:"v2.session.context",summary:"Get session context",description:"Retrieve the active context messages for a session (all messages after the last compaction)."}))).add(Le.get("session.history","/api/session/:sessionID/history",{params:{sessionID:V.ID},query:ov,success:S.Struct({data:S.Array(ir.Durable),hasMore:S.Boolean}).annotate({identifier:"SessionHistory"}),error:x}).middleware(e).annotateMerge(He.annotations({identifier:"v2.session.history",summary:"Get session history",description:"Read one finite page of public durable Session events after an exclusive aggregate sequence. Newly committed events may appear on later pages."}))).add(Le.get("session.events","/api/session/:sessionID/event",{params:{sessionID:V.ID},query:{after:S.NumberFromString.pipe(S.decodeTo(De),S.optional)},success:Vo.StreamSse({data:ir.Durable}),error:x}).middleware(e).annotateMerge(He.annotations({identifier:"v2.session.events",summary:"Subscribe to session events",description:"Replay durable events after an aggregate sequence, then continue with new durable events."}))).add(Le.post("session.interrupt","/api/session/:sessionID/interrupt",{params:{sessionID:V.ID},success:Vo.NoContent,error:x}).middleware(e).annotateMerge(He.annotations({identifier:"v2.session.interrupt",summary:"Interrupt session execution",description:"Interrupt active execution owned by this OpenCode process. Idle interruption is a no-op."}))).add(Le.get("session.message","/api/session/:sessionID/message/:messageID",{params:{sessionID:V.ID,messageID:Do.ID},success:S.Struct({data:Do.Message}),error:[x,Oo]}).middleware(e).annotateMerge(He.annotations({identifier:"v2.session.message",summary:"Get session message",description:"Retrieve one projected message owned by the Session."}))).annotateMerge(He.annotations({title:"sessions",description:"Experimental session routes."})),"makeSessionGroup");import{Schema as je}from"effect";import{HttpApiEndpoint as Cr,HttpApiGroup as sv,HttpApiSchema as Rm,OpenApi as Qo}from"effect/unstable/httpapi";var bm=n((e,t)=>sv.make("server.permission").add(Cr.get("permission.request.list","/api/permission/request",{query:q,success:F.response(je.Array(Pe.Request))}).annotateMerge(M).annotateMerge(Qo.annotations({identifier:"v2.permission.request.list",summary:"List pending permission requests",description:"Retrieve pending permission requests for a location."}))).add(Cr.get("permission.saved.list","/api/permission/saved",{query:je.Struct({projectID:Mt.ID.pipe(je.optional)}),success:je.Struct({data:je.Array(Yi.Info)})}).annotateMerge(Qo.annotations({identifier:"v2.permission.saved.list",summary:"List saved permissions",description:"Retrieve saved permissions, optionally filtered by project."}))).add(Cr.delete("permission.saved.remove","/api/permission/saved/:id",{params:{id:Yi.ID},success:Rm.NoContent}).annotateMerge(Qo.annotations({identifier:"v2.permission.saved.remove",summary:"Remove saved permission",description:"Remove a saved permission by ID."}))).middleware(e).add(Cr.post("session.permission.create","/api/session/:sessionID/permission",{params:{sessionID:V.ID},payload:je.Struct({id:Pe.ID.pipe(je.optional),action:Pe.Request.fields.action,resources:Pe.Request.fields.resources,save:Pe.Request.fields.save,metadata:Pe.Request.fields.metadata,source:Pe.Request.fields.source,agent:sr.ID.pipe(je.optional)}),success:je.Struct({data:je.Struct({id:Pe.ID,effect:Pe.Effect})}),error:x}).middleware(t).annotateMerge(Qo.annotations({identifier:"v2.session.permission.create",summary:"Create permission request",description:"Evaluate and, when approval is required, create a permission request for a session."}))).add(Cr.get("session.permission.list","/api/session/:sessionID/permission",{params:{sessionID:V.ID},success:je.Struct({data:je.Array(Pe.Request)}),error:x}).middleware(t).annotateMerge(Qo.annotations({identifier:"v2.session.permission.list",summary:"List session permission requests",description:"Retrieve pending permission requests owned by a session."}))).add(Cr.get("session.permission.get","/api/session/:sessionID/permission/:requestID",{params:{sessionID:V.ID,requestID:Pe.ID},success:je.Struct({data:Pe.Request}),error:[x,lr]}).middleware(t).annotateMerge(Qo.annotations({identifier:"v2.session.permission.get",summary:"Get permission request",description:"Retrieve a pending permission request owned by a session."}))).add(Cr.post("session.permission.reply","/api/session/:sessionID/permission/:requestID/reply",{params:{sessionID:V.ID,requestID:Pe.ID},payload:je.Struct({reply:Pe.Reply,message:je.String.pipe(je.optional)}),success:Rm.NoContent,error:[x,lr]}).middleware(t).annotateMerge(Qo.annotations({identifier:"v2.session.permission.reply",summary:"Reply to pending permission request",description:"Respond to a pending permission request owned by a session."}))).annotateMerge(Qo.annotations({title:"permissions",description:"Experimental permission routes."})),"makePermissionGroup");import{Schema as ho}from"effect";import{HttpApiEndpoint as La,HttpApiGroup as iv,HttpApiSchema as av,OpenApi as Ei}from"effect/unstable/httpapi";var pv=ho.Struct({...q.fields,path:Et.pipe(ho.optional)}),cv=ho.Struct({...q.fields,query:ar.FindInput.fields.query,type:ar.FindInput.fields.type,limit:ho.NumberFromString.pipe(ho.decodeTo(nr),ho.optional)}),Cm=iv.make("server.fs").add(La.get("fs.read","/api/fs/read/*",{query:q,success:ho.Uint8Array.pipe(av.asUint8Array())}).annotateMerge(M).annotateMerge(Ei.annotations({identifier:"v2.fs.read",summary:"Read file",description:"Serve one file relative to the requested location."}))).add(La.get("fs.list","/api/fs/list",{query:pv,success:F.response(ho.Array(ar.Entry))}).annotateMerge(M).annotateMerge(Ei.annotations({identifier:"v2.fs.list",summary:"List directory",description:"List direct children of one directory relative to the requested location."}))).add(La.get("fs.find","/api/fs/find",{query:cv,success:F.response(ho.Array(ar.Entry))}).annotateMerge(M).annotateMerge(Ei.annotations({identifier:"v2.fs.find",summary:"Find files",description:"Find recursively ranked filesystem entries relative to the requested location."}))).annotateMerge(Ei.annotations({title:"filesystem",description:"Experimental location-scoped filesystem routes."}));import{Schema as dv}from"effect";import{HttpApiEndpoint as mv,HttpApiGroup as uv,OpenApi as Hm}from"effect/unstable/httpapi";var xm=uv.make("server.command").add(mv.get("command.list","/api/command",{query:q,success:F.response(dv.Array(kp.Info))}).annotateMerge(M).annotateMerge(Hm.annotations({identifier:"v2.command.list",summary:"List commands",description:"Retrieve currently registered commands."}))).annotateMerge(Hm.annotations({title:"commands",description:"Experimental command routes."}));import{Schema as lv}from"effect";import{HttpApiEndpoint as fv,HttpApiGroup as yv,OpenApi as Pm}from"effect/unstable/httpapi";var qm=yv.make("server.skill").add(fv.get("skill.list","/api/skill",{query:q,success:F.response(lv.Array(Np.Info))}).annotateMerge(M).annotateMerge(Pm.annotations({identifier:"v2.skill.list",summary:"List skills",description:"Retrieve currently registered skills."}))).annotateMerge(Pm.annotations({title:"skills",description:"Experimental skill routes."}));import{Schema as it}from"effect";import{HttpApiEndpoint as gv,HttpApiGroup as hv,HttpApiSchema as Sv,OpenApi as Mm}from"effect/unstable/httpapi";var vv={id:ct.ID,metadata:it.optional(it.Record(it.String,it.Unknown)),durable:it.optional(it.Struct({aggregateID:it.String,seq:it.Int,version:it.Int})),location:it.optional(F.Ref)},Iv=n(e=>it.Union([...e,...e.some(t=>t.type==="server.connected")?[]:[it.Struct({...vv,type:it.Literal("server.connected"),data:it.Struct({})}).annotate({identifier:"V2Event.server.connected"})]]).annotate({identifier:"V2Event"}),"schema"),Tm=n(e=>{let t=Iv(e);return{schema:t,group:hv.make("server.event").add(gv.get("event.subscribe","/api/event",{success:Sv.StreamSse({data:t})}).annotateMerge(Mm.annotations({identifier:"v2.event.subscribe",summary:"Subscribe to events",description:"Subscribe to native event payloads for the server."}))).annotateMerge(Mm.annotations({title:"events",description:"Experimental event stream route."}))}},"make"),Lm=n(e=>Tm(e).group,"makeEventGroup"),Om=Tm(Xn.ServerDefinitions),Nm=Om.group,Um=Om.schema;import{Schema as Av}from"effect";import{HttpApiEndpoint as Ev,HttpApiGroup as Dv,OpenApi as kv}from"effect/unstable/httpapi";var jm=Dv.make("server.agent").add(Ev.get("agent.list","/api/agent",{query:q,success:F.response(Av.Array(sr.Info))}).annotateMerge(M).annotateMerge(kv.annotations({identifier:"v2.agent.list",summary:"List agents",description:"Retrieve currently registered agents."})));import{Schema as Fm}from"effect";import{HttpApiEndpoint as wv,HttpApiGroup as Rv,OpenApi as bv}from"effect/unstable/httpapi";var Wm=Rv.make("server.health").add(wv.get("health.get","/api/health",{success:Fm.Struct({healthy:Fm.Literal(!0)})}).annotateMerge(bv.annotations({identifier:"v2.health.get",summary:"Check server health",description:"Check whether the API server is ready to accept requests."})));import{Schema as Oa}from"effect";import{HttpApiEndpoint as Di,HttpApiGroup as Cv,HttpApiSchema as Bm,OpenApi as En}from"effect/unstable/httpapi";var Gm=n((e,t)=>Cv.make("server.question").add(Di.get("question.request.list","/api/question/request",{query:q,success:F.response(Oa.Array(Ho.Request))}).annotateMerge(M).annotateMerge(En.annotations({identifier:"v2.question.request.list",summary:"List pending question requests",description:"Retrieve pending question requests for a location."}))).annotateMerge(En.annotations({title:"questions",description:"Experimental question routes."})).middleware(e).add(Di.get("session.question.list","/api/session/:sessionID/question",{params:{sessionID:V.ID},success:Oa.Struct({data:Oa.Array(Ho.Request)}),error:x}).middleware(t).annotateMerge(En.annotations({identifier:"v2.session.question.list",summary:"List session question requests",description:"Retrieve pending question requests owned by a session."}))).add(Di.post("session.question.reply","/api/session/:sessionID/question/:requestID/reply",{params:{sessionID:V.ID,requestID:Ho.ID},payload:Ho.Reply,success:Bm.NoContent,error:[x,fr]}).middleware(t).annotateMerge(En.annotations({identifier:"v2.session.question.reply",summary:"Reply to pending question request",description:"Answer a pending question request owned by a session."}))).add(Di.post("session.question.reject","/api/session/:sessionID/question/:requestID/reject",{params:{sessionID:V.ID,requestID:Ho.ID},success:Bm.NoContent,error:[x,fr]}).middleware(t).annotateMerge(En.annotations({identifier:"v2.session.question.reject",summary:"Reject pending question request",description:"Reject a pending question request owned by a session."}))).annotateMerge(En.annotations({title:"session questions",description:"Experimental session question routes."})),"makeQuestionGroup");import{Schema as Hv}from"effect";import{HttpApiEndpoint as xv,HttpApiGroup as Pv,OpenApi as _m}from"effect/unstable/httpapi";var $m=Pv.make("server.reference").add(xv.get("reference.list","/api/reference",{query:q,success:F.response(Hv.Array(Ns.Info))}).annotateMerge(M).annotateMerge(_m.annotations({identifier:"v2.reference.list",summary:"List references",description:"List references available in the requested location."}))).annotateMerge(_m.annotations({title:"reference",description:"Location-scoped project references."}));import{Schema as Je}from"effect";import{HttpApiEndpoint as Hr,HttpApiGroup as qv,HttpApiSchema as Na,OpenApi as zo}from"effect/unstable/httpapi";var Mv=Je.Record(Je.String,Je.String),Vm=qv.make("server.integration").add(Hr.get("integration.list","/api/integration",{query:q,success:F.response(Je.Array(tt.Info))}).annotateMerge(M).annotateMerge(zo.annotations({identifier:"v2.integration.list",summary:"List integrations",description:"Retrieve available integrations and their authentication methods."}))).add(Hr.get("integration.get","/api/integration/:integrationID",{params:{integrationID:tt.ID},query:q,success:F.response(Je.UndefinedOr(tt.Info))}).annotateMerge(M).annotateMerge(zo.annotations({identifier:"v2.integration.get",summary:"Get integration",description:"Retrieve one integration and its authentication methods."}))).add(Hr.post("integration.connect.key","/api/integration/:integrationID/connect/key",{params:{integrationID:tt.ID},query:q,payload:Je.Struct({key:Je.String,label:Je.optional(Je.String)}),success:Na.NoContent,error:be}).annotateMerge(M).annotateMerge(zo.annotations({identifier:"v2.integration.connect.key",summary:"Connect with key",description:"Run a key authentication method and store the resulting credential."}))).add(Hr.post("integration.connect.oauth","/api/integration/:integrationID/connect/oauth",{params:{integrationID:tt.ID},query:q,payload:Je.Struct({methodID:tt.MethodID,inputs:Mv,label:Je.optional(Je.String)}),success:F.response(tt.Attempt),error:be}).annotateMerge(M).annotateMerge(zo.annotations({identifier:"v2.integration.connect.oauth",summary:"Begin OAuth connection",description:"Start an OAuth attempt and return the authorization details."}))).add(Hr.get("integration.attempt.status","/api/integration/attempt/:attemptID",{params:{attemptID:tt.AttemptID},query:q,success:F.response(tt.AttemptStatus)}).annotateMerge(M).annotateMerge(zo.annotations({identifier:"v2.integration.attempt.status",summary:"Get OAuth attempt status",description:"Poll the current status of an OAuth attempt."}))).add(Hr.post("integration.attempt.complete","/api/integration/attempt/:attemptID/complete",{params:{attemptID:tt.AttemptID},query:q,payload:Je.Struct({code:Je.optional(Je.String)}),success:Na.NoContent,error:be}).annotateMerge(M).annotateMerge(zo.annotations({identifier:"v2.integration.attempt.complete",summary:"Complete OAuth connection",description:"Complete a code-based OAuth attempt and store the resulting credential."}))).add(Hr.delete("integration.attempt.cancel","/api/integration/attempt/:attemptID",{params:{attemptID:tt.AttemptID},query:q,success:Na.NoContent}).annotateMerge(M).annotateMerge(zo.annotations({identifier:"v2.integration.attempt.cancel",summary:"Cancel OAuth connection",description:"Cancel an OAuth attempt and release its resources."}))).annotateMerge(zo.annotations({title:"integrations",description:"Integration discovery and authentication routes."}));import{Schema as Qm}from"effect";import{HttpApiEndpoint as zm,HttpApiGroup as Tv,HttpApiSchema as Ym,OpenApi as Km}from"effect/unstable/httpapi";var Jm=Tv.make("server.credential").add(zm.patch("credential.update","/api/credential/:credentialID",{params:{credentialID:Vi.ID},query:q,payload:Qm.Struct({label:Qm.String}),success:Ym.NoContent}).annotateMerge(M).annotateMerge(Km.annotations({identifier:"v2.credential.update",summary:"Update credential",description:"Update a stored credential label."}))).add(zm.delete("credential.remove","/api/credential/:credentialID",{params:{credentialID:Vi.ID},query:q,success:Ym.NoContent}).annotateMerge(M).annotateMerge(Km.annotations({identifier:"v2.credential.remove",summary:"Remove credential",description:"Remove a stored integration credential."})));import{Schema as Yo,Struct as Zm}from"effect";import{HttpApiEndpoint as Ua,HttpApiGroup as Lv,HttpApiSchema as Xm,OpenApi as ki}from"effect/unstable/httpapi";var ja="/experimental/project/:projectID/copy",xr=class extends Yo.ErrorClass("ProjectCopyError")({name:Yo.Literal("ProjectCopyError"),data:Yo.Struct({message:Yo.String,forceRequired:Yo.optional(Yo.Boolean)})},{httpApiStatus:400}){static{n(this,"ProjectCopyError")}},Ov=Yo.Struct(Zm.omit(Fs.CreateInput.fields,["projectID","sourceDirectory"])),Nv=Yo.Struct(Zm.omit(Fs.RemoveInput.fields,["projectID"])),eu=Lv.make("server.projectCopy").add(Ua.post("projectCopy.create",ja,{params:{projectID:Mt.ID},query:q,payload:Ov,success:Fs.Copy,error:xr}).annotateMerge(M).annotateMerge(ki.annotations({identifier:"v2.projectCopy.create"}))).add(Ua.delete("projectCopy.remove",ja,{params:{projectID:Mt.ID},query:q,payload:Nv,success:Xm.NoContent,error:xr}).annotateMerge(M).annotateMerge(ki.annotations({identifier:"v2.projectCopy.remove"}))).add(Ua.post("projectCopy.refresh",`${ja}/refresh`,{params:{projectID:Mt.ID},query:q,success:Xm.NoContent,error:xr}).annotateMerge(M).annotateMerge(ki.annotations({identifier:"v2.projectCopy.refresh"}))).annotateMerge(ki.annotations({title:"projectCopy",description:"Project copy management routes."}));var tu=n((e,t,o)=>Uv.make("server").add(Wm).add(Bc.middleware(t)).add(jm.middleware(t)).add(wm(o)).add(hm.middleware(o)).add(vm.middleware(t)).add(Am.middleware(t)).add(Vm.middleware(t)).add(Jm.middleware(t)).add(bm(t,o)).add(Cm.middleware(t)).add(xm.middleware(t)).add(qm.middleware(t)).add(e).add(Qc.middleware(t)).add(Gm(t,o)).add($m.middleware(t)).add(eu.middleware(t)).annotateMerge(jv.annotations({title:"opencode HttpApi",version:"0.0.1",description:"Experimental HttpApi surface for selected instance routes."})).middleware(Jt).middleware(Rr),"makeApiFromGroup"),ou=n(e=>tu(Lm(e.definitions),e.locationMiddleware,e.sessionLocationMiddleware),"makeApi"),ru=n(e=>tu(Nm,e.locationMiddleware,e.sessionLocationMiddleware),"makeDefaultApi");import{Effect as wi,Layer as Fv}from"effect";import{HttpServerRequest as Wv}from"effect/unstable/http";import{HttpApiMiddleware as Bv}from"effect/unstable/httpapi";var Ko=class extends Bv.Service()("@opencode/HttpApiLocation"){static{n(this,"LocationMiddleware")}};function Y(e){return wi.gen(function*(){let t=yield*ie.Service;return{location:new ie.Info({directory:t.directory,workspaceID:t.workspaceID,project:t.project}),data:yield*e}})}n(Y,"response");function Gv(e){let t=new URL(e.url,"http://localhost").searchParams,o=t.get("location[workspace]")||e.headers["x-opencode-workspace"],r=t.get("location[directory]")||(e.headers["x-opencode-directory"]?_v(e.headers["x-opencode-directory"]):process.cwd());return ie.Ref.make({directory:ke.make(r),workspaceID:o?Ro.ID.make(o):void 0})}n(Gv,"ref");function _v(e){try{return decodeURIComponent(e)}catch{return e}}n(_v,"decode");var nu=Fv.effect(Ko,wi.gen(function*(){let e=yield*_e.Service;return Ko.of(t=>wi.gen(function*(){let o=yield*Wv.HttpServerRequest;return yield*t.pipe(wi.provide(e.get(Gv(o))))}))}));import{eq as $v}from"drizzle-orm";import{Effect as Ss,Layer as Vv,Schema as Qv}from"effect";import{HttpRouter as zv}from"effect/unstable/http";import{HttpApiMiddleware as Yv}from"effect/unstable/httpapi";var Jo=class extends Yv.Service()("@opencode/HttpApiSessionLocation",{error:[be,x]}){static{n(this,"SessionLocationMiddleware")}},Kv=Qv.decodeUnknownEffect(Dt.ID),su=Vv.effect(Jo,Ss.gen(function*(){let{db:e}=yield*Eo.Service,t=yield*_e.Service;return Jo.of(o=>Ss.gen(function*(){let r=yield*zv.RouteContext,s=yield*Kv(r.params.sessionID).pipe(Ss.mapError(()=>new be({message:"Invalid session ID",field:"sessionID"}))),i=yield*e.select({directory:Un.directory,workspaceID:Un.workspace_id}).from(Un).where($v(Un.id,s)).get().pipe(Ss.orDie);return i?yield*o.pipe(Ss.provide(t.get(ie.Ref.make({directory:ke.make(i.directory),workspaceID:i.workspaceID?Ro.ID.make(i.workspaceID):void 0})))):yield*new x({sessionID:s,message:`Session not found: ${s}`})}))}));import{Schema as ee}from"effect";import{HttpApi as Jv,HttpApiEndpoint as Dn,HttpApiError as iu,HttpApiGroup as Xv,OpenApi as Pr}from"effect/unstable/httpapi";import Zv from"semver";var eI=ee.Struct({healthy:ee.Literal(!0),version:ee.String}),tI=lo.Latest.values().flatMap(e=>e.durable?[ee.Struct({type:ee.Literal("sync"),id:le.ID,syncEvent:ee.Struct({type:ee.Literal(le.versionedType(e.type,e.durable.version)),id:le.ID,seq:ee.Finite,aggregateID:ee.String,data:e.data})}).annotate({identifier:`SyncEvent.${e.type}`})]:[]).toArray(),oI=ee.Struct({directory:ee.String,project:ee.optional(ee.String),workspace:ee.optional(ee.String),payload:ee.Union([...lo.Latest.values().map(e=>ee.Struct({id:le.ID,type:ee.Literal(e.type),properties:e.data})).toArray(),ii,...tI])}).annotate({identifier:"GlobalEvent"}),rI=ee.Struct({target:ee.String.check(ee.makeFilter(e=>Zv.valid(e)===null?"Expected a semantic version":void 0))}),nI=ee.Union([ee.Struct({success:ee.Literal(!0),version:ee.String}),ee.Struct({success:ee.Literal(!1),error:ee.String})]),kn={health:"/global/health",event:"/global/event",config:"/global/config",dispose:"/global/dispose",upgrade:"/global/upgrade"},au=Jv.make("global").add(Xv.make("global").add(Dn.get("health",kn.health,{success:p(eI,"Health information")}).annotateMerge(Pr.annotations({identifier:"global.health",summary:"Get health",description:"Get health information about the OpenCode server."})),Dn.get("event",kn.event,{success:oI}).annotateMerge(Pr.annotations({identifier:"global.event",summary:"Get global events",description:"Subscribe to global events from the OpenCode system using server-sent events."})),Dn.get("configGet",kn.config,{success:p(ko.Info,"Get global config info")}).annotateMerge(Pr.annotations({identifier:"global.config.get",summary:"Get global configuration",description:"Retrieve the current global OpenCode configuration settings and preferences."})),Dn.patch("configUpdate",kn.config,{payload:ko.Info,success:p(ko.Info,"Successfully updated global config"),error:iu.BadRequest}).annotateMerge(Pr.annotations({identifier:"global.config.update",summary:"Update global configuration",description:"Update global OpenCode configuration settings and preferences."})),Dn.post("dispose",kn.dispose,{success:p(ee.Boolean,"Global disposed")}).annotateMerge(Pr.annotations({identifier:"global.dispose",summary:"Dispose instance",description:"Clean up and dispose all OpenCode instances, releasing all resources."})),Dn.post("upgrade",kn.upgrade,{payload:rI,success:p(nI,"Upgrade result"),error:iu.BadRequest}).annotateMerge(Pr.annotations({identifier:"global.upgrade",summary:"Upgrade opencode",description:"Upgrade opencode to the specified version."}))).annotateMerge(Pr.annotations({title:"global",description:"Global server routes."})));import{Effect as Ri}from"effect";import{HttpServerResponse as sI}from"effect/unstable/http";import{HttpApiMiddleware as pu}from"effect/unstable/httpapi";var Fa=1024;function iI(e){return e.length<=Fa?e:e.slice(0,Fa)+`\u2026 (${e.length-Fa} more chars)`}n(iI,"truncateReason");var wn=class extends pu.Service()("@opencode/HttpApiSchemaError",{error:Ir}){static{n(this,"SchemaErrorMiddleware")}},Wa=pu.layerSchemaErrorTransform(wn,(e,t)=>{let o=iI(e.cause.message),r=t.endpoint.path.startsWith("/api/")?Ri.fail(new Ir({message:o,kind:e.kind})):Ri.succeed(sI.jsonUnsafe({name:"BadRequest",data:{message:o,kind:e.kind}},{status:400}));return Ri.logWarning("schema rejection",{kind:e.kind,reason:o}).pipe(Ri.andThen(r))});var aI=Ba.Union([...lo.Latest.values().map(e=>Ba.Struct({id:le.ID,type:Ba.Literal(e.type),properties:e.data}).annotate({identifier:`Event.${e.type}`})).toArray(),ii]).annotate({identifier:"Event"}),pI=ou({definitions:lo.Latest.values().toArray(),locationMiddleware:Ko,sessionLocationMiddleware:Jo}),So=bi.make("opencode-root").addHttpApi(Ld).addHttpApi(Nd).addHttpApi(au).middleware(wn).middleware(L),W=bi.make("opencode-instance").addHttpApi(Md).addHttpApi(qd).addHttpApi(Fd).addHttpApi(Bd).addHttpApi(Gd).addHttpApi($d).addHttpApi(Yd).addHttpApi(Jd).addHttpApi(om).addHttpApi(nm).addHttpApi(zd).addHttpApi(Xd).addHttpApi(im).addHttpApi(pm).addHttpApi(um).addHttpApi(ym).middleware(wn),Ga=bi.make("opencode").addHttpApi(So).addHttpApi(un).addHttpApi(W).addHttpApi(pI).addHttpApi(Sn).annotate(bi.AdditionalSchemas,[aI,Vt.Replied,Vt.Rejected,Dp.Value,Ge.Inputs,Ge.Method,Ge.Ref,Us.Source]);var j=ru({locationMiddleware:Ko,sessionLocationMiddleware:Jo});import{OpenApi as du}from"effect/unstable/httpapi";var cI={"GET /experimental/session start":{type:"number"},"GET /experimental/session roots":ps,"GET /experimental/session archived":ps,"GET /find/file limit":{type:"integer",minimum:1,maximum:200},"GET /experimental/session cursor":{type:"number"},"GET /experimental/session limit":{type:"number"},"GET /session start":{type:"number"},"GET /session roots":ps,"GET /session limit":{type:"number"},"GET /session/{sessionID}/message limit":{type:"integer",minimum:0,maximum:Number.MAX_SAFE_INTEGER},"GET /vcs/diff context":{type:"integer",minimum:0},"GET /api/session limit":{type:"number"},"GET /api/session start":{type:"number"},"GET /api/session roots":ps,"GET /api/session/{sessionID}/message limit":{type:"number"}},dI={LogLevel:"Log level",ServerConfig:"Server configuration for opencode serve and web commands",LayoutConfig:"@deprecated Always uses stretch layout."};function mI(e){let t=e;kI(t);for(let[o,r]of Object.entries(t.components?.schemas??{}))t.components.schemas[o]=It(structuredClone(r));yI(t),fI(t),hI(t),SI(t),lI(t),delete t.components?.securitySchemes;for(let[o,r]of Object.entries(t.paths??{}))for(let s of["get","post","put","delete","patch"]){let i=r[s];if(!i)continue;let c=uI(o);if(i.requestBody){c||delete i.requestBody.required;let y=i.requestBody.content?.["application/json"];if(y?.schema&&(y.schema=It(structuredClone(y.schema))),o==="/experimental/workspace"&&s==="post"){let u=i.requestBody.content?.["application/json"]?.schema?.$ref?.replace("#/components/schemas/",""),a=u?t.components?.schemas?.[u]?.properties:i.requestBody.content?.["application/json"]?.schema?.properties;a?.branch&&(a.branch={anyOf:[a.branch,{type:"null"}]}),a?.extra&&(a.extra={anyOf:[a.extra,{type:"null"}]})}if(o==="/experimental/workspace/warp"&&s==="post"){let u=i.requestBody.content?.["application/json"]?.schema?.$ref?.replace("#/components/schemas/",""),a=u?t.components?.schemas?.[u]?.properties:i.requestBody.content?.["application/json"]?.schema?.properties;a?.id&&(a.id={anyOf:[a.id,{type:"null"}]})}}for(let y of Object.values(i.responses??{}))for(let u of Object.values(y.content??{}))u.schema&&(u.schema=It(structuredClone(u.schema)));c||(delete i.security,delete i.responses?.[401],II(i)),EI(i,o,s),(o==="/event"||o==="/global/event"||o==="/api/event")&&s==="get"&&(i.responses[200]={description:"Event stream",content:{"text/event-stream":{schema:o==="/event"?{$ref:"#/components/schemas/Event"}:o==="/global/event"?{$ref:"#/components/schemas/GlobalEvent"}:{$ref:"#/components/schemas/V2Event"}}}});let h=`${s.toUpperCase()} ${o}`;for(let y of i.parameters??[])CI(y,h)}return AI(t),e}n(mI,"matchLegacyOpenApi");function uI(e){return e==="/api"||e.startsWith("/api/")}n(uI,"isV2ApiPath");function lI(e){e.components?.schemas&&(e.components.schemas.BadRequestError={type:"object",required:["name","data"],properties:{name:{type:"string",enum:["BadRequest"]},data:{type:"object",required:["message"],properties:{message:{type:"string"},kind:{type:"string",enum:["Params","Headers","Query","Body","Payload"]}}}}},e.components.schemas.NotFoundError={type:"object",required:["name","data"],properties:{name:{type:"string",enum:["NotFoundError"]},data:{type:"object",required:["message"],properties:{message:{type:"string"}}}}})}n(lI,"addLegacyErrorSchemas");function fI(e){let t=e.components?.schemas;if(t)for(let o of Object.keys(t)){let r=o.replace(/\d+$/,"");r===o||!t[r]||Ci(t[o],t)===Ci(t[r],t)&&(vs(e,o,r),delete t[o])}}n(fI,"collapseDuplicateComponents");function yI(e){let t=e.components?.schemas;if(t)for(let o of Object.keys(t)){let r=gI(o);if(r!==o){if(t[r]){Ci(t[o],t)===Ci(t[r],t)&&(vs(e,o,r),delete t[o]);continue}t[r]=t[o],vs(e,o,r),delete t[o]}}}n(yI,"normalizeComponentNames");function gI(e){return e.includes(".")?e.split(".").filter(t=>!/^\d+$/.test(t)).map(t=>t.slice(0,1).toUpperCase()+t.slice(1)).join(""):e}n(gI,"componentTypeName");function hI(e){let t=e.components?.schemas;if(!t)return;t.AgentConfig&&(t.AgentConfig.additionalProperties={}),t.Command?.properties?.template&&(t.Command.properties.template={type:"string"}),t.Workspace?.properties&&(t.Workspace.properties.branch=Rn(t.Workspace.properties.branch),t.Workspace.properties.directory=Rn(t.Workspace.properties.directory),t.Workspace.properties.extra=Rn(t.Workspace.properties.extra)),t.GlobalSession?.properties?.project&&(t.GlobalSession.properties.project=Rn(t.GlobalSession.properties.project));let o=t.ProviderConfig?.properties?.options;o&&(o.additionalProperties={});let r=t.ProviderConfig?.properties?.models?.additionalProperties,s=typeof r=="object"?r.properties?.variants?.additionalProperties:void 0;s&&typeof s=="object"&&(s.additionalProperties={});let i=t.SyncEventSessionUpdated?.properties?.data?.properties?.info;i?.properties&&mu(i.properties)}n(hI,"applyLegacySchemaOverrides");function SI(e){for(let[t,o]of Object.entries(e.components?.schemas??{})){let r=dI[t];if(r){o.description=r;continue}delete o.description}}n(SI,"normalizeComponentDescriptions");function mu(e){for(let[t,o]of Object.entries(e)){if(t==="share"&&o.properties?.url){o.properties.url=Rn(o.properties.url);continue}if(t==="time"&&o.properties){mu(o.properties);continue}e[t]=Rn(o)}}n(mu,"makePropertiesNullable");function Rn(e){return Va(e.anyOf??e.oneOf)?.some(t=>t.type==="null")?e:{anyOf:[e,{type:"null"}]}}n(Rn,"nullable");function Ci(e,t){return JSON.stringify(_a(e,t))}n(Ci,"stableSchema");function _a(e,t){if(Array.isArray(e))return e.map(r=>_a(r,t));if(!e||typeof e!="object")return e;let o=e;return o.$ref?{$ref:vI(o.$ref,t)}:Object.fromEntries(Object.entries(e).filter(([r])=>r!=="description").sort(([r],[s])=>r.localeCompare(s)).map(([r,s])=>[r,_a(s,t)]))}n(_a,"canonicalizeSchema");function vI(e,t){let o=e.replace("#/components/schemas/",""),r=o.replace(/\d+$/,"");return r!==o&&t[r]?`#/components/schemas/${r}`:e}n(vI,"canonicalRef");function vs(e,t,o){if(Array.isArray(e)){for(let s of e)vs(s,t,o);return}if(!e||typeof e!="object")return;let r=e;r.$ref===`#/components/schemas/${t}`&&(r.$ref=`#/components/schemas/${o}`);for(let s of Object.values(e))vs(s,t,o)}n(vs,"rewriteRefs");function II(e){e.responses?.["400"]&&DI(e.responses[400])&&(e.responses[400]=cu("Bad request","BadRequestError")),e.responses?.["404"]&&lu(e.responses[404],"NotFound")&&(e.responses[404]=cu("Not found","NotFoundError"))}n(II,"normalizeLegacyErrorResponses");function AI(e){for(let t of["Unauthorized","EffectHttpApiErrorBadRequest","EffectHttpApiErrorNotFound","effect_HttpApiError_BadRequest","effect_HttpApiError_NotFound"])$a(e.paths,t)||delete e.components?.schemas?.[t]}n(AI,"deleteUnusedLegacyErrorComponents");function $a(e,t){return Array.isArray(e)?e.some(o=>$a(o,t)):!e||typeof e!="object"?!1:e.$ref===`#/components/schemas/${t}`?!0:Object.values(e).some(o=>$a(o,t))}n($a,"referencesComponent");function EI(e,t,o){if(t==="/experimental/console/switch"&&o==="post"&&delete e.responses?.[400],t!=="/session/{sessionID}/message"&&t!=="/session/{sessionID}/command"||o!=="post")return;let r=e.responses?.["200"]?.content?.["application/json"];r&&(r.schema={type:"object",required:["info","parts"],properties:{info:{$ref:"#/components/schemas/AssistantMessage"},parts:{type:"array",items:{$ref:"#/components/schemas/Part"}}}})}n(EI,"normalizeLegacyOperation");function uu(e,t){return e.content?.["application/json"]?.schema?.$ref===`#/components/schemas/${t}`}n(uu,"isRefResponse");function lu(e,t){return e.description===t||uu(e,`EffectHttpApiError${t}`)}n(lu,"isBuiltInErrorResponse");function DI(e){return lu(e,"BadRequest")||uu(e,"InvalidRequestError")}n(DI,"isLegacyBadRequestResponse");function cu(e,t){return{description:e,content:{"application/json":{schema:{$ref:`#/components/schemas/${t}`}}}}}n(cu,"legacyErrorResponse");function kI(e){let t=e.components?.schemas;if(!t)return;let o=new Set;for(let[i,c]of Object.entries(t))c.$ref===`#/components/schemas/${i}`&&o.add(i);if(o.size===0)return;for(let[,i]of Object.entries(t))for(let c of i.anyOf??i.oneOf??[]){let h=c.$ref?.replace("#/components/schemas/","");!h||o.has(h)}let s=du.fromApi(Ga).components?.schemas;if(s)for(let i of o)s[i]&&(t[i]=s[i])}n(kI,"fixSelfReferencingComponents");function It(e){if(e.allOf?.length===1){let[o]=e.allOf;return delete e.allOf,It({...e,...o})}if(wI(e))return{type:"object",properties:{}};let t=Va(e.anyOf??e.oneOf);if(t){let o=t.filter(r=>r.type!=="null");if(o.length===1)return It(o[0]);e.anyOf&&(e.anyOf=o.map(It)),e.oneOf&&(e.oneOf=o.map(It))}if(e.allOf){let o=e.allOf.map(It);if(e.type){delete e.allOf;for(let r of o)Object.assign(e,r)}else e.allOf=o}if(e.prefixItems&&e.items&&delete e.prefixItems,e.items&&(e.items=It(e.items)),e.properties)for(let[o,r]of Object.entries(e.properties))e.properties[o]=It(r);return e.additionalProperties&&typeof e.additionalProperties=="object"&&(e.additionalProperties=It(e.additionalProperties)),e}n(It,"stripOptionalNull");function wI(e){let t=e.anyOf??e.oneOf;return t?.length===2&&t.some(RI)&&t.some(bI)}n(wI,"isEmptyObjectUnion");function RI(e){return e.type==="object"&&!e.properties&&!e.additionalProperties}n(RI,"isBareObjectSchema");function bI(e){return e.type==="array"&&!e.items&&!e.prefixItems}n(bI,"isBareArraySchema");function Va(e){return e?.flatMap(t=>Va(t.anyOf??t.oneOf)??[t])}n(Va,"flattenOptions");function CI(e,t){if(!(!e.schema||typeof e.schema!="object")){if(e.in==="path"){e.schema=It(e.schema);return}if(e.in==="query"){let o=cI[`${t} ${e.name}`];if(o){e.schema=o;return}}e.schema=It(e.schema)}}n(CI,"normalizeParameter");var Hi=Ga.annotateMerge(du.annotations({title:"opencode",version:"1.0.0",description:"opencode api",transform:mI}));import{Effect as to,Queue as Qa}from"effect";import*as te from"effect/Stream";import{HttpServerResponse as HI}from"effect/unstable/http";import{HttpApiBuilder as xI}from"effect/unstable/httpapi";import*as fu from"effect/unstable/encoding/Sse";function PI(e){return{_tag:"Event",event:"message",id:void 0,data:JSON.stringify(e)}}n(PI,"eventData");function za(){return le.ID.create()}n(za,"eventID");function qI(e){return to.gen(function*(){let t=yield*Oe.context,o=yield*Oe.workspaceID,r=yield*Qa.unbounded(),s=yield*e.listen(u=>to.sync(()=>Qa.offerUnsafe(r,u)));yield*to.addFinalizer(()=>s);let i=te.fromQueue(r).pipe(te.filter(u=>u.location?.directory===t.directory&&(u.location.workspaceID===void 0||u.location.workspaceID===o)),te.map(u=>({id:u.id,type:u.type,properties:u.data}))),c=te.callback(u=>{let a=n(l=>{l.directory!==t.directory||l.payload.type!=="server.instance.disposed"||Qa.offerUnsafe(u,{id:l.payload.id??za(),type:"server.instance.disposed",properties:l.payload.properties??{}})},"listener");return to.acquireRelease(to.sync(()=>co.on("event",a)),()=>to.sync(()=>co.off("event",a)))}),h=i.pipe(te.merge(c,{haltStrategy:"left"}),te.takeUntil(u=>u.type==="server.instance.disposed")),y=te.tick("10 seconds").pipe(te.drop(1),te.map(()=>({id:za(),type:"server.heartbeat",properties:{}})));return yield*to.logInfo("event connected"),HI.stream(te.make({id:za(),type:"server.connected",properties:{}}).pipe(te.concat(h.pipe(te.merge(y,{haltStrategy:"left"}))),te.map(PI),te.pipeThroughChannel(fu.encode()),te.encodeText,te.ensuring(to.logInfo("event disconnected"))),{contentType:"text/event-stream",headers:{"Cache-Control":"no-cache, no-transform","X-Accel-Buffering":"no","X-Content-Type-Options":"nosniff"}})})}n(qI,"eventResponse");var yu=xI.group(un,"event",e=>to.gen(function*(){let t=yield*$t.Service;return e.handleRaw("subscribe",to.fn("EventHttpApi.subscribe")(function*(){return yield*qI(t)}))}));import{Effect as qi}from"effect";import{HttpApiBuilder as TI}from"effect/unstable/httpapi";import{Effect as oo}from"effect";import{HttpEffect as gu,HttpServerRequest as MI}from"effect/unstable/http";var Ya=new WeakMap,hu=n(e=>oo.gen(function*(){return{ctx:e,store:yield*wt.Service,bridge:yield*Wr.make()}}),"mark"),xi=n(e=>oo.gen(function*(){let t=yield*hu(e);return yield*gu.appendPreResponseHandler((o,r)=>oo.sync(()=>(Ya.set(o.source,t),r)))}),"markInstanceForDisposal"),Su=n((e,t)=>oo.gen(function*(){let o=yield*hu(e);return yield*gu.appendPreResponseHandler((r,s)=>oo.as(oo.uninterruptible(o.bridge.run(o.store.reload(t))),s))}),"markInstanceForReload"),Pi=n(e=>oo.gen(function*(){let t=yield*e,o=yield*MI.HttpServerRequest,r=Ya.get(o.source);return r&&(Ya.delete(o.source),yield*oo.uninterruptible(r.bridge.run(r.store.dispose(r.ctx))).pipe(oo.catchCause(s=>oo.logWarning("instance disposal failed",{cause:s})))),t}),"disposeMiddleware");var vu=TI.group(W,"config",e=>qi.gen(function*(){let t=yield*Me.Service,o=yield*kt.Service,r=qi.fn("ConfigHttpApi.get")(function*(){return yield*o.get()}),s=qi.fn("ConfigHttpApi.update")(function*(c){return yield*o.update(c.payload),yield*xi(yield*ae),c.payload}),i=qi.fn("ConfigHttpApi.providers")(function*(){let c=yield*t.list();return{providers:Object.values(c).map(Me.toPublicInfo),default:Me.defaultModelIDs(c)}});return e.handle("get",r).handle("update",s).handle("providers",i)}));var bn,Iu=new Map;async function Au(e,t){let o=await fetch(e,{headers:t,signal:AbortSignal.timeout(1e4)});if(!o.ok)throw new Error(`HTTP ${o.status}`);return o.json()}n(Au,"readUsageJson");function LI(e){let t=[];for(let o of["primary_window","secondary_window"]){let r=e?.[o];if(!r||typeof r!="object")continue;let s=Number(r.limit_window_seconds??0),i=s>=5e5?"7d":s>0&&s<=21600?"5h":"other";t.push({kind:i,label:i==="7d"?"weekly":i==="5h"?"5-hour window":`${Math.round(s/3600)}h window`,usedPercent:Number(r.used_percent??0),resetsAt:typeof r.reset_at=="number"?r.reset_at:null})}return t}n(LI,"openaiWindows");async function OI(e){let t={authorization:`Bearer ${e.access}`};e.accountId&&(t["ChatGPT-Account-Id"]=e.accountId);let o=await Au("https://chatgpt.com/backend-api/wham/usage",t);return{providerID:"openai",plan:typeof o?.plan_type=="string"?o.plan_type:null,windows:LI(o?.rate_limit)}}n(OI,"openaiUsage");async function NI(e){let t=await Au("https://api.anthropic.com/api/oauth/usage",{authorization:`Bearer ${e.access}`,"anthropic-beta":"oauth-2025-04-20"}),o=n(s=>typeof s=="string"&&!Number.isNaN(Date.parse(s))?Math.floor(Date.parse(s)/1e3):null,"toTs"),r=[];t?.five_hour&&typeof t.five_hour=="object"&&r.push({kind:"5h",label:"5-hour window",usedPercent:Number(t.five_hour.utilization??0),resetsAt:o(t.five_hour.resets_at)}),t?.seven_day&&typeof t.seven_day=="object"&&r.push({kind:"7d",label:"weekly",usedPercent:Number(t.seven_day.utilization??0),resetsAt:o(t.seven_day.resets_at)});for(let s of Array.isArray(t?.limits)?t.limits:[]){let i=s?.scope?.model?.display_name;s?.kind==="weekly_scoped"&&typeof i=="string"&&i&&r.push({kind:"other",label:`weekly, ${i}`,usedPercent:Number(s.percent??0),resetsAt:o(s.resets_at)})}return{providerID:"anthropic",plan:null,windows:r}}n(NI,"anthropicUsage");async function Eu(e,t=!1){if(!t&&bn&&Date.now()-bn.at<6e4)return{providers:bn.data,fetchedAt:bn.at};let o=[];for(let[r,s]of Object.entries(e)){if(s.type!=="oauth"||r!=="openai"&&r!=="anthropic")continue;let i=s;if(i.expires<Date.now()){o.push({providerID:r,plan:null,windows:[],error:"token expired; it refreshes on the next model call"});continue}try{let c={...r==="openai"?await OI(i):await NI(i),readAt:Date.now()};Iu.set(r,c),o.push(c)}catch(c){let h=c instanceof Error?c.message:String(c),y=Iu.get(r);o.push(y?{...y,error:h}:{providerID:r,plan:null,windows:[],error:h})}}return bn={at:Date.now(),data:o},{providers:o,fetchedAt:bn.at}}n(Eu,"providerUsage");import{Effect as At}from"effect";import{HttpApiBuilder as UI}from"effect/unstable/httpapi";var Mi,Du=UI.group(W,"alchemy",e=>At.gen(function*(){let t=yield*_t.Service,o=yield*kt.Service,r=yield*qe.Service,s=yield*Qt.Service,i=yield*Po.Service,c=yield*wt.Service,h=At.fn("AlchemyHttpApi.anyBusy")(function*(){for(let v of(yield*i.list()).values())if(v.type!=="idle")return!0;return!1}),y=At.fn("AlchemyHttpApi.reloadNow")(function*(){yield*o.invalidate(),yield*c.disposeAll()}),u=At.fn("AlchemyHttpApi.pauseState")(function*(){return Xs.state()}),a=At.fn("AlchemyHttpApi.pause")(function*(v){return v.payload.paused?(Xs.pause(),{paused:!0,stopped:yield*s.stopForPause()}):{paused:!1,waiting:Xs.resume()}}),l=At.fn("AlchemyHttpApi.reload")(function*(){if(yield*h()){if(!Mi){let v=yield*Wr.make(),D=Date.now();Mi=setInterval(()=>{v.promise(At.gen(function*(){(yield*h())&&Date.now()-D<12e4||(clearInterval(Mi),Mi=void 0,yield*y())})).catch(()=>{})},2e3)}return{ok:!0,deferred:!0}}return yield*y(),{ok:!0}}),A=At.fn("AlchemyHttpApi.usage")(function*(v){let D=yield*t.all().pipe(At.orElseSucceed(()=>({})));return yield*At.promise(()=>Eu(D,v.query.force==="1"))}),E=At.fn("AlchemyHttpApi.mcpTools")(function*(){return yield*r.defs()}),f=At.fn("AlchemyHttpApi.searchKeys")(function*(){let v=yield*t.all().pipe(At.orElseSucceed(()=>({}))),D=n(C=>{let O=v[C];return O?.type==="api"&&O.key.trim().length>0},"has");return{exa:D(ta.exa),tavily:D(ta.tavily)}});return e.handle("pauseState",u).handle("pause",a).handle("reload",l).handle("usage",A).handle("mcpTools",E).handle("searchKeys",f)}));import{Effect as jt}from"effect";import{HttpApiBuilder as jI}from"effect/unstable/httpapi";var ku=jI.group(So,"control",e=>jt.gen(function*(){let t=yield*_t.Service,o=jt.fn("ControlHttpApi.authSet")(function*(i){return yield*t.set(i.params.providerID,i.payload).pipe(jt.orDie),!0}),r=jt.fn("ControlHttpApi.authRemove")(function*(i){return yield*t.remove(i.params.providerID).pipe(jt.orDie),!0}),s=jt.fn("ControlHttpApi.log")(function*(i){return yield*(i.payload.level==="debug"?jt.logDebug:i.payload.level==="info"?jt.logInfo:i.payload.level==="warn"?jt.logWarning:jt.logError)(i.payload.message).pipe(jt.annotateLogs(i.payload.extra??{})),!0});return e.handle("authSet",o).handle("authRemove",r).handle("log",s)}));import{Effect as Ka}from"effect";import{HttpApiBuilder as FI}from"effect/unstable/httpapi";var wu=FI.group(So,"controlPlane",e=>Ka.gen(function*(){let t=yield*Lt.Service,o=Ka.fn("ControlPlaneHttpApi.moveSession")(function*(r){yield*t.moveSession(r.payload).pipe(Ka.mapError(s=>new is({name:"MoveSessionError",data:{message:WI(s)}})))});return e.handle("moveSession",o)}));function WI(e){return e instanceof Dt.NotFoundError?`Session not found: ${e.sessionID}`:e instanceof Lt.DestinationProjectMismatchError?"Destination directory belongs to another project":e instanceof Lt.ApplyChangesError?"Unable to apply your changes in the destination directory. The files may conflict with existing changes.":e.message}n(WI,"message");import{Effect as ce,Option as Ru}from"effect";import*as bu from"effect/unstable/http/HttpServerResponse";import{HttpApiBuilder as BI,HttpApiError as Ti}from"effect/unstable/httpapi";function Ja(e){return e.pipe(ce.mapError(t=>new jo({name:t._tag,data:{message:t.message}})))}n(Ja,"mapWorktreeError");var Cu=BI.group(W,"experimental",e=>ce.gen(function*(){let t=yield*Bs.Service,o=yield*zt.Service,r=yield*kt.Service,s=yield*qe.Service,i=yield*dt.Service,c=yield*Js.Service,h=yield*mo.Service,y=yield*z.Service,u=yield*$s.Service,a=yield*Bn.Service,l=ce.fn("ExperimentalHttpApi.capabilities")(function*(){return{backgroundSubagents:a.experimentalBackgroundSubagents}}),A=ce.fn("ExperimentalHttpApi.console")(function*(){let[$,We]=yield*ce.all([r.getConsoleState(),t.orgsByAccount().pipe(ce.catch(()=>ce.fail(new Ti.InternalServerError({}))))],{concurrency:"unbounded"});return{consoleManagedProviders:$.consoleManagedProviders,...$.activeOrgName?{activeOrgName:$.activeOrgName}:{},switchableOrgCount:We.reduce((et,ue)=>et+ue.orgs.length,0)}}),E=ce.fn("ExperimentalHttpApi.consoleOrgs")(function*(){let[$,We]=yield*ce.all([t.orgsByAccount().pipe(ce.catch(()=>ce.fail(new Ti.InternalServerError({})))),t.active().pipe(ce.catch(()=>ce.fail(new Ti.InternalServerError({}))))],{concurrency:"unbounded"}),et=Ru.getOrUndefined(We);return{orgs:$.flatMap(ue=>ue.orgs.map(Gt=>({accountID:ue.account.id,accountEmail:ue.account.email,accountUrl:ue.account.url,orgID:Gt.id,orgName:Gt.name,active:!!et&&et.id===ue.account.id&&et.active_org_id===Gt.id})))}}),f=ce.fn("ExperimentalHttpApi.consoleSwitch")(function*($){return yield*t.use($.payload.accountID,Ru.some($.payload.orgID)).pipe(ce.catch(()=>ce.fail(new Ti.BadRequest({})))),!0}),v=ce.fn("ExperimentalHttpApi.tool")(function*($){return(yield*c.tools({providerID:$.query.provider,modelID:$.query.model,agent:yield*o.defaultInfo()})).map(et=>({id:et.id,description:et.description,parameters:cc.fromTool(et)}))}),D=ce.fn("ExperimentalHttpApi.toolIDs")(function*(){return yield*c.ids()}),C=ce.fn("ExperimentalHttpApi.worktree")(function*(){let $=yield*Oe.context;return yield*i.sandboxes($.project.id)}),O=ce.fn("ExperimentalHttpApi.worktreeCreate")(function*($){return yield*Ja(h.create($.payload??void 0))}),G=ce.fn("ExperimentalHttpApi.worktreeRemove")(function*($){let We=yield*Oe.context;return yield*Ja(h.remove($.payload)),yield*i.removeSandbox(We.project.id,$.payload.directory),!0}),at=ce.fn("ExperimentalHttpApi.worktreeReset")(function*($){return yield*Ja(h.reset($.payload)),!0}),_i=ce.fn("ExperimentalHttpApi.session")(function*($){let We=$.query.limit??100,et=$.query.directory?yield*Oe.directory:void 0,ue=yield*y.listGlobal({directory:et,roots:$.query.roots,start:$.query.start,cursor:$.query.cursor,search:$.query.search,limit:We+1,archived:$.query.archived}),Gt=ue.length>We?ue.slice(0,We):ue;return bu.jsonUnsafe(Gt,{headers:ue.length>We&&Gt.length>0?{"x-next-cursor":String(Gt[Gt.length-1].time.updated)}:void 0})}),$i=ce.fn("ExperimentalHttpApi.sessionBackground")(function*($){if(!a.experimentalBackgroundSubagents)return!1;let We=(yield*u.list()).filter(ue=>ue.type==="task"&&ue.status==="running"&&ue.metadata?.parentSessionId===$.params.sessionID&&ue.metadata.background!==!0);return(yield*ce.forEach(We,ue=>u.promote(ue.id),{concurrency:"unbounded"})).some(ue=>ue!==void 0)}),Hs=ce.fn("ExperimentalHttpApi.resource")(function*(){return yield*s.resources()});return e.handle("capabilities",l).handle("console",A).handle("consoleOrgs",E).handle("consoleSwitch",f).handle("tool",v).handle("toolIDs",D).handle("worktree",C).handle("worktreeCreate",O).handle("worktreeRemove",G).handle("worktreeReset",at).handle("session",_i).handle("sessionBackground",$i).handle("resource",Hs)}));import{Effect as ve,Layer as GI,Option as Hu}from"effect";import _I from"ignore";import qr from"path";import{HttpApiBuilder as $I}from"effect/unstable/httpapi";var xu=$I.group(W,"file",e=>ve.gen(function*(){let t=yield*Ls.Service,o=yield*_e.Service,r=ve.fnUntraced(function*(a){return yield*a.pipe(ve.provide(o.get(ie.Ref.make({directory:ke.make((yield*ae).directory)}))))}),s=ve.fn("FileHttpApi.findText")(function*(a){return(yield*t.grep({cwd:(yield*ae).directory,pattern:a.query.pattern,limit:10}).pipe(ve.orDie)).map(l=>({path:{text:l.entry.path},lines:{text:l.text},line_number:l.line,absolute_offset:l.offset,submatches:l.submatches.map(A=>({match:{text:A.text},start:A.start,end:A.end}))}))}),i=ve.fn("FileHttpApi.findFile")(function*(a){let l=(yield*ae).directory,A=a.query.limit??10,E=a.query.type??(a.query.dirs==="false"?"file":void 0),f=performance.now(),v=yield*r(wo.Service.use(D=>D.find({query:a.query.query,limit:A,type:E})));return yield*ve.logInfo("find file",{query:a.query.query,type:E,directory:l,limit:A,results:v.length,duration:Math.round(performance.now()-f)}),v.map(D=>D.path)}),c=ve.fn("FileHttpApi.findSymbol")(function*(){return[]}),h=ve.fn("FileHttpApi.list")(function*(a){let l=(yield*ae).directory;return yield*r(ve.gen(function*(){let A=yield*wo.Service,E=yield*po.Service,f=yield*ie.Service,v=_I(),D=yield*E.readFileString(qr.join(f.project.directory,".gitignore")).pipe(ve.catch(()=>ve.succeed("")));D&&v.add(D);let C=yield*E.readFileString(qr.join(f.project.directory,".ignore")).pipe(ve.catch(()=>ve.succeed("")));return C&&v.add(C),(yield*A.list({path:Et.make(a.query.path)})).map(O=>({name:qr.basename(O.path),path:O.path,absolute:qr.resolve(f.directory,O.path),type:O.type,ignored:v.ignores(qr.relative(f.project.directory,qr.resolve(f.directory,O.path))+(O.type==="directory"?"/":""))}))}))}),y=ve.fn("FileHttpApi.content")(function*(a){let l=(yield*ae).directory,A=qr.resolve(l,a.query.path);return po.contains(l,A)?(yield*po.Service.use(E=>E.existsSafe(A)))?yield*r(wo.Service.use(E=>E.read({path:Et.make(a.query.path)}))).pipe(ve.flatMap(E=>ve.gen(function*(){let f=E.content.includes(0)?Hu.none():yield*ve.sync(()=>new TextDecoder("utf-8",{fatal:!0}).decode(E.content)).pipe(ve.option);return{item:E,text:f}})),ve.map(({item:E,text:f})=>Hu.isSome(f)?{type:"text",content:f.value.trim()}:{type:"binary",content:Buffer.from(E.content).toString("base64"),encoding:"base64",mimeType:E.mime})):{type:"text",content:""}:yield*ve.die(new Error("Path escapes the location"))}),u=ve.fn("FileHttpApi.status")(function*(){return[]});return e.handle("findText",s).handle("findFile",i).handle("findSymbol",c).handle("list",h).handle("content",y).handle("status",u)})).pipe(GI.provide(Wn));import{Effect as Cn}from"effect";var VI=Cn.sync(()=>co.emit("event",{directory:"global",payload:{type:Tc.Disposed.type,properties:{}}})),Xa=Cn.fn("Server.disposeAllInstancesAndEmitGlobalDisposed")(function*(e){let t=yield*wt.Service;yield*Cn.gen(function*(){yield*e?.swallowErrors?t.disposeAll().pipe(Cn.catchCause(o=>Cn.logWarning("global disposal failed",{cause:o}))):t.disposeAll(),yield*VI}).pipe(Cn.uninterruptible)});import{Effect as Fe,Queue as zI}from"effect";import*as Ee from"effect/Stream";import{HttpServerResponse as Li}from"effect/unstable/http";import{HttpApiBuilder as YI}from"effect/unstable/httpapi";import*as Pu from"effect/unstable/encoding/Sse";function KI(e){return{_tag:"Event",event:"message",id:void 0,data:JSON.stringify(e)}}n(KI,"eventData");function JI(){return Fe.gen(function*(){yield*Fe.logInfo("global event connected");let e=Ee.callback(o=>{let r=n(s=>zI.offerUnsafe(o,s),"handler");return Fe.acquireRelease(Fe.sync(()=>co.on("event",r)),()=>Fe.sync(()=>co.off("event",r)))}),t=Ee.tick("10 seconds").pipe(Ee.drop(1),Ee.map(()=>({payload:{id:le.ID.create(),type:"server.heartbeat",properties:{}}})));return Li.stream(Ee.make({payload:{id:le.ID.create(),type:"server.connected",properties:{}}}).pipe(Ee.concat(e.pipe(Ee.merge(t,{haltStrategy:"left"}))),Ee.map(KI),Ee.pipeThroughChannel(Pu.encode()),Ee.encodeText,Ee.ensuring(Fe.logInfo("global event disconnected"))),{contentType:"text/event-stream",headers:{"Cache-Control":"no-cache, no-transform","X-Accel-Buffering":"no","X-Content-Type-Options":"nosniff"}})})}n(JI,"eventResponse");var qu=YI.group(So,"global",e=>Fe.gen(function*(){let t=yield*kt.Service,o=yield*Gn.Service,r=yield*Wr.make(),s=Fe.fn("GlobalHttpApi.health")(function*(){return{healthy:!0,version:Sp}}),i=Fe.fn("GlobalHttpApi.event")(function*(){return yield*JI()}),c=Fe.fn("GlobalHttpApi.configGet")(function*(){return yield*t.getGlobal()}),h=Fe.fn("GlobalHttpApi.configUpdate")(function*(a){let l=yield*t.updateGlobal(a.payload);return l.changed&&r.fork(Xa({swallowErrors:!0})),l.info}),y=Fe.fn("GlobalHttpApi.dispose")(function*(){return yield*Xa(),!0}),u=Fe.fn("GlobalHttpApi.upgrade")(function*(a){let l=yield*o.method();if(l==="unknown")return Li.jsonUnsafe({success:!1,error:"Unknown installation method"},{status:400});let A=a.payload.target,E=yield*o.upgrade(l,A).pipe(Fe.as({success:!0,version:A}),Fe.catch(f=>Fe.succeed({success:!1,error:f instanceof Error?f.message:String(f)})));return E.success?(co.emit("event",{directory:"global",payload:{type:Gn.Event.Updated.type,properties:{version:A}}}),Li.jsonUnsafe(E)):Li.jsonUnsafe(E,{status:500})});return e.handle("health",s).handleRaw("event",i).handle("configGet",c).handle("configUpdate",h).handle("dispose",y).handle("upgrade",u)}));import{Effect as Xe}from"effect";import{HttpApiBuilder as XI}from"effect/unstable/httpapi";var Mu=XI.group(W,"instance",e=>Xe.gen(function*(){let t=yield*zt.Service,o=yield*Mo.Service,r=yield*Vr.Service,s=yield*qo.Service,i=yield*Br.Service,c=yield*mt.Service,h=Xe.fn("InstanceHttpApi.dispose")(function*(){return yield*xi(yield*ae),!0}),y=Xe.fn("InstanceHttpApi.path")(function*(){let G=yield*ae;return{home:qs.Path.home,state:qs.Path.state,config:qs.Path.config,worktree:G.worktree,directory:G.directory}}),u=Xe.fn("InstanceHttpApi.vcs")(function*(){let[G,at]=yield*Xe.all([c.branch(),c.defaultBranch()],{concurrency:"unbounded"});return{branch:G,default_branch:at}}),a=Xe.fn("InstanceHttpApi.vcsStatus")(function*(){return yield*c.status()}),l=Xe.fn("InstanceHttpApi.vcsDiff")(function*(G){return yield*c.diff(G.query.mode,{context:G.query.context})}),A=Xe.fn("InstanceHttpApi.vcsDiffRaw")(function*(){return yield*c.diffRaw()}),E=Xe.fn("InstanceHttpApi.vcsApply")(function*(G){return yield*c.apply(G.payload).pipe(Xe.mapError(at=>new yo({name:"VcsApplyError",data:{message:at.message,reason:at.reason}})))}),f=Xe.fn("InstanceHttpApi.command")(function*(){return yield*o.list()}),v=Xe.fn("InstanceHttpApi.agent")(function*(){return yield*t.list()}),D=Xe.fn("InstanceHttpApi.skill")(function*(){return yield*i.all()}),C=Xe.fn("InstanceHttpApi.lsp")(function*(){return yield*s.status()}),O=Xe.fn("InstanceHttpApi.formatter")(function*(){return yield*r.status()});return e.handle("dispose",h).handle("path",y).handle("vcs",u).handle("vcsStatus",a).handle("vcsDiff",l).handle("vcsDiffRaw",A).handle("vcsApply",E).handle("command",f).handle("agent",v).handle("skill",D).handle("lsp",C).handle("formatter",O)}));import{Effect as Ie,Schema as ZI}from"effect";import{HttpApiBuilder as eA,HttpApiError as tA}from"effect/unstable/httpapi";var Tu=eA.group(W,"mcp",e=>Ie.gen(function*(){let t=yield*qe.Service,o=Ie.fn("McpHttpApi.status")(function*(){return yield*t.status()}),r=Ie.fn("McpHttpApi.add")(function*(a){let l=(yield*t.add(a.payload.name,a.payload.config)).status;return yield*ZI.decodeUnknownEffect(wa)("status"in l?{[a.payload.name]:l}:l).pipe(Ie.mapError(()=>new tA.BadRequest({})))}),s=Ie.fn("McpHttpApi.authStart")(function*(a){return yield*Ie.gen(function*(){return(yield*t.supportsOAuth(a.params.name))?yield*t.startAuth(a.params.name):yield*new Er({error:`MCP server ${a.params.name} does not support OAuth`})}).pipe(Ie.catchTag("MCP.NotFoundError",l=>Ie.fail(new Ue({name:l.name,message:`MCP server not found: ${l.name}`}))))}),i=Ie.fn("McpHttpApi.authCallback")(function*(a){return yield*t.finishAuth(a.params.name,a.payload.code).pipe(Ie.catchTag("MCP.NotFoundError",l=>Ie.fail(new Ue({name:l.name,message:`MCP server not found: ${l.name}`}))))}),c=Ie.fn("McpHttpApi.authAuthenticate")(function*(a){return yield*Ie.gen(function*(){return(yield*t.supportsOAuth(a.params.name))?yield*t.authenticate(a.params.name):yield*new Er({error:`MCP server ${a.params.name} does not support OAuth`})}).pipe(Ie.catchTag("MCP.NotFoundError",l=>Ie.fail(new Ue({name:l.name,message:`MCP server not found: ${l.name}`}))))}),h=Ie.fn("McpHttpApi.authRemove")(function*(a){let l=yield*t.status();return a.params.name in l?(yield*t.removeAuth(a.params.name),{success:!0}):yield*new Ue({name:a.params.name,message:`MCP server not found: ${a.params.name}`})}),y=Ie.fn("McpHttpApi.connect")(function*(a){return yield*t.connect(a.params.name).pipe(Ie.catchTag("MCP.NotFoundError",l=>Ie.fail(new Ue({name:l.name,message:`MCP server not found: ${l.name}`})))),!0}),u=Ie.fn("McpHttpApi.disconnect")(function*(a){return yield*t.disconnect(a.params.name).pipe(Ie.catchTag("MCP.NotFoundError",l=>Ie.fail(new Ue({name:l.name,message:`MCP server not found: ${l.name}`})))),!0});return e.handle("status",o).handle("add",r).handle("authStart",s).handle("authCallback",i).handle("authAuthenticate",c).handle("authRemove",h).handle("connect",y).handle("disconnect",u)}));import{Effect as Is}from"effect";import{HttpApiBuilder as oA}from"effect/unstable/httpapi";var Lu=oA.group(W,"permission",e=>Is.gen(function*(){let t=yield*pr.Service,o=Is.fn("PermissionHttpApi.list")(function*(){return yield*t.list()}),r=Is.fn("PermissionHttpApi.reply")(function*(s){return yield*t.reply({requestID:s.params.requestID,reply:s.payload.reply,message:s.payload.message}).pipe(Is.catchTag("Permission.NotFoundError",i=>Is.fail(new Zt({requestID:String(i.requestID),message:`Permission request not found: ${i.requestID}`})))),!0});return e.handle("list",o).handle("reply",r)}));import{Effect as Xo}from"effect";import{HttpApiBuilder as rA}from"effect/unstable/httpapi";var Ou=rA.group(W,"project",e=>Xo.gen(function*(){let t=yield*dt.Service,o=yield*Be.Service,r=Xo.fn("ProjectHttpApi.list")(function*(){return yield*t.list()}),s=Xo.fn("ProjectHttpApi.current")(function*(){return(yield*ae).project}),i=Xo.fn("ProjectHttpApi.initGit")(function*(){let y=yield*ae,u=yield*t.initGit({directory:y.directory,project:y.project});return u.id===y.project.id&&u.vcs===y.project.vcs&&u.worktree===y.project.worktree||(yield*Su(y,{directory:y.directory,worktree:y.directory,project:u})),u}),c=Xo.fn("ProjectHttpApi.update")(function*(y){return yield*t.update({...y.payload,projectID:y.params.projectID}).pipe(Xo.catchTag("Project.NotFoundError",u=>Xo.fail(new an({projectID:u.projectID,message:`Project not found: ${u.projectID}`}))))}),h=Xo.fn("ProjectHttpApi.directories")(y=>o.directories({projectID:y.params.projectID}));return e.handle("list",r).handle("current",s).handle("initGit",i).handle("update",c).handle("directories",h)}));import{Effect as Zo,Stream as Za}from"effect";import{HttpApiBuilder as nA}from"effect/unstable/httpapi";var Nu={name:"project-copy-name",mode:"primary",permission:[],options:{},native:!0,prompt:""},Uu=nA.group(W,"projectCopyName",e=>Zo.gen(function*(){let t=yield*Ys.Service,o=yield*Me.Service,r=Zo.fn("ProjectCopyHttpApi.generateName")(function*(s){let i=s?.trim();if(!i)return jn.create();let c=yield*o.defaultModel().pipe(Zo.catch(()=>Zo.succeed(void 0)));if(!c)return jn.create();let h=(yield*o.getSmallModel(c.providerID))??(yield*o.getModel(c.providerID,c.modelID)),y=_.descending(),a=(yield*t.stream({agent:Nu,user:{id:xo.ascending(),sessionID:y,role:"user",time:{created:Date.now()},agent:Nu.name,model:{providerID:h.providerID,modelID:h.id}},system:[],small:!0,tools:{},model:h,sessionID:y,retries:2,messages:[{role:"user",content:`Generate a short 2-3 word name that describes this task:
15
+ ${i}`}]}).pipe(Za.filter(vp.is.textDelta),Za.map(l=>l.text),Za.mkString)).trim();return a?sA(a.split(/\s+/).slice(0,3).join(" ")):jn.create()});return e.handle("generateName",s=>r(s.payload.context).pipe(Zo.catchCause(i=>Zo.logWarning("project copy name generation failed",{projectID:s.params.projectID,cause:i}).pipe(Zo.as(jn.create()))),Zo.map(i=>({name:i}))))}));function sA(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+/,"").replace(/-+$/,"")}n(sA,"slugify");import{mapValues as iA}from"remeda";import{Effect as ro,Schema as ju}from"effect";import{HttpServerResponse as aA}from"effect/unstable/http";import{HttpApiBuilder as pA}from"effect/unstable/httpapi";function Fu(e){return e.pipe(ro.mapError(t=>t instanceof rt.OauthMissing?new Nt({name:t._tag,data:{providerID:t.providerID}}):t instanceof rt.OauthCodeMissing?new Nt({name:t._tag,data:{providerID:t.providerID}}):t instanceof rt.OauthCallbackFailed?new Nt({name:t._tag,data:{}}):t instanceof rt.ValidationFailed?new Nt({name:t._tag,data:{field:t.field,message:t.message}}):new Nt({name:"BadRequest",data:{}})))}n(Fu,"mapProviderAuthError");var Wu=pA.group(W,"provider",e=>ro.gen(function*(){let t=yield*kt.Service,o=yield*Me.Service,r=yield*rt.Service,s=yield*_t.Service,i=ro.fn("ProviderHttpApi.list")(function*(){let a=yield*t.get(),l=yield*js.Service.use(O=>O.get()),A=new Set(a.disabled_providers??[]),E=a.enabled_providers?new Set(a.enabled_providers):void 0,f={};for(let[O,G]of Object.entries(l))(!E||E.has(O))&&!A.has(O)&&(f[O]=G);let v=yield*o.list(),D=yield*s.all().pipe(ro.orDie),C=Object.assign(iA(f,O=>Me.fromModelsDevProvider(O)),v);return{all:Object.values(C).map(Me.toPublicInfo),default:Me.defaultModelIDs(C),connected:Object.keys(C).filter(O=>O in v||D[O])}}),c=ro.fn("ProviderHttpApi.auth")(function*(){return yield*r.methods()}),h=ro.fn("ProviderHttpApi.authorize")(function*(a){return yield*Fu(r.authorize({providerID:a.params.providerID,method:a.payload.method,inputs:a.payload.inputs}))}),y=ro.fn("ProviderHttpApi.authorizeRaw")(function*(a){let l=yield*ro.orDie(a.request.text),A=yield*ju.decodeUnknownEffect(ju.fromJsonString(rt.AuthorizeInput))(l).pipe(ro.mapError(()=>new Nt({name:"BadRequest",data:{}}))),E=yield*h({params:a.params,payload:A});return aA.jsonUnsafe(E??null)}),u=ro.fn("ProviderHttpApi.callback")(function*(a){return yield*Fu(r.callback({providerID:a.params.providerID,method:a.payload.method,code:a.payload.code})),!0});return e.handle("list",i).handle("auth",c).handleRaw("authorize",y).handle("callback",u)}));var Ft={};xe(Ft,{PtyProtocol:()=>Ft,REPLAY_CHUNK:()=>ep,chunks:()=>uA,decodeInput:()=>lA,metaFrame:()=>mA});var cA=new TextEncoder,dA=new TextDecoder("utf-8",{fatal:!0}),ep=64*1024;function mA(e){let t=cA.encode(JSON.stringify({cursor:e})),o=new Uint8Array(t.length+1);return o[0]=0,o.set(t,1),o}n(mA,"metaFrame");function uA(e){let t=[];for(let o=0;o<e.length;o+=ep)t.push(e.slice(o,o+ep));return t}n(uA,"chunks");function lA(e){if(typeof e=="string")return e;try{return dA.decode(e instanceof ArrayBuffer?new Uint8Array(e):e)}catch{return}}n(lA,"decodeInput");import{Effect as b,Layer as Bu,Option as yA,Queue as Hn,Schema as gA}from"effect";import{HttpServerRequest as Gu,HttpServerResponse as xn}from"effect/unstable/http";import{HttpApiBuilder as _u}from"effect/unstable/httpapi";import*as As from"effect/unstable/socket/Socket";function $u(e,t){return Jn(e.headers.origin,e.headers.host,t)}n($u,"validOrigin");var Vu=b.gen(function*(){let e=yield*Gs,t=yield*_s;return{directory:e?.directory,workspaceID:t}}),Qu=_u.group(W,"pty",e=>b.gen(function*(){let t=yield*Rt.Service,o=yield*dr,r=yield*Qr.Service,s=yield*_e.Service,i=Ji(f=>b.runPromise(s.invalidate(ie.Ref.make({directory:ke.make(f)}))));yield*b.addFinalizer(()=>b.sync(i));let c=b.fnUntraced(function*(f){return yield*f.pipe(b.provide(s.get(ie.Ref.make({directory:ke.make((yield*ae).directory)}))))}),h=b.fn("PtyHttpApi.shells")(function*(){return yield*b.promise(()=>Gp.list())}),y=b.fn("PtyHttpApi.list")(function*(){return(yield*c(ge.Service.use(v=>v.list()))).filter(v=>v.status==="running")}),u=b.fn("PtyHttpApi.create")(function*(f){let v=f.payload.cwd||(yield*ae).directory,D=yield*r.trigger("shell.env",{cwd:v},{env:{}});return yield*c(ge.Service.use(C=>C.create({...f.payload,args:f.payload.args?[...f.payload.args]:void 0,cwd:v,env:{...f.payload.env,...D.env}})))}),a=b.fn("PtyHttpApi.get")(function*(f){return yield*c(ge.Service.use(v=>v.get(f.params.ptyID))).pipe(b.catchTag("Pty.NotFoundError",v=>new bt({ptyID:v.ptyID,message:`PTY session not found: ${v.ptyID}`})),b.flatMap(v=>v.status==="running"?b.succeed(v):new bt({ptyID:f.params.ptyID,message:`PTY session not found: ${f.params.ptyID}`})))}),l=b.fn("PtyHttpApi.update")(function*(f){return yield*a(f),yield*c(ge.Service.use(v=>v.update(f.params.ptyID,{...f.payload,size:f.payload.size?{...f.payload.size}:void 0}))).pipe(b.catchTag("Pty.NotFoundError",v=>new bt({ptyID:v.ptyID,message:`PTY session not found: ${v.ptyID}`})))}),A=b.fn("PtyHttpApi.remove")(function*(f){return yield*a(f),yield*c(ge.Service.use(v=>v.remove(f.params.ptyID))).pipe(b.catchTag("Pty.NotFoundError",v=>new bt({ptyID:v.ptyID,message:`PTY session not found: ${v.ptyID}`}))),!0}),E=b.fn("PtyHttpApi.connectToken")(function*(f){let v=yield*Gu.HttpServerRequest;return v.headers[Lc]!=="1"||!$u(v,o)?yield*new sn({message:"Invalid PTY connect token request"}):(yield*a(f),yield*t.issue({ptyID:f.params.ptyID,...yield*Vu}))});return e.handle("shells",h).handle("list",y).handle("create",u).handle("get",a).handle("update",l).handle("remove",A).handle("connectToken",E)})).pipe(Bu.provide(Wn)),zu=_u.group(Sn,"pty-connect",e=>b.gen(function*(){let t=yield*Rt.Service,o=yield*dr,r=yield*_e.Service,s=Ji(c=>b.runPromise(r.invalidate(ie.Ref.make({directory:ke.make(c)}))));yield*b.addFinalizer(()=>b.sync(s));let i=b.fnUntraced(function*(c){return yield*c.pipe(b.provide(r.get(ie.Ref.make({directory:ke.make((yield*ae).directory)}))))});return e.handleRaw("connect",b.fn("PtyHttpApi.connect")(function*(c){if(!(yield*i(ge.Service.use(G=>G.get(c.params.ptyID))).pipe(b.map(G=>G.status==="running"),b.catchTag("Pty.NotFoundError",()=>b.succeed(!1)))))return xn.empty({status:404});let y=gA.decodeUnknownOption(tm)(yield*Gu.ParsedSearchParams);if(yA.isNone(y))return xn.empty({status:400});let u=new URL(c.request.url,"http://localhost").searchParams.get(es);if(u&&!($u(c.request,o)?yield*t.consume({ticket:u,ptyID:c.params.ptyID,...yield*Vu}):!1))return xn.empty({status:403});let a=y.value.cursor===void 0?void 0:Number(y.value.cursor),l=a!==void 0&&Number.isSafeInteger(a)&&a>=-1?a:void 0,A=yield*b.orDie(c.request.upgrade),E=yield*A.writer,f=n(G=>A.runRaw(()=>b.void,{onOpen:E(G).pipe(b.catch(()=>b.void))}).pipe(b.timeout("1 second"),b.catchReason("SocketError","SocketCloseError",()=>b.void),b.catch(()=>b.void)),"closeAccepted");if(!(yield*Qe.register(E(Qe.SERVER_CLOSING_EVENT()))))return yield*f(Qe.SERVER_CLOSING_EVENT()),xn.empty();let D=yield*Hn.unbounded(),C=yield*i(ge.Service.use(G=>G.attach(c.params.ptyID,{cursor:l,onData:n(at=>Hn.offerUnsafe(D,at),"onData"),onEnd:n(()=>Hn.offerUnsafe(D,new As.CloseEvent(1e3)),"onEnd")}))).pipe(b.catchTags({"Pty.NotFoundError":n(()=>f(new As.CloseEvent(4404,"session not found")).pipe(b.as(void 0)),"Pty.NotFoundError"),"Pty.ExitedError":n(()=>f(new As.CloseEvent(4404,"session not found")).pipe(b.as(void 0)),"Pty.ExitedError")}));if(!C)return xn.empty();for(let G of Ft.chunks(C.replay))Hn.offerUnsafe(D,G);Hn.offerUnsafe(D,Ft.metaFrame(C.cursor)),C.activate();let O=b.gen(function*(){for(;;){let G=yield*Hn.take(D);if(yield*E(G),G instanceof As.CloseEvent)return}});return yield*b.race(O,A.runRaw(G=>{let at=Ft.decodeInput(G);at!==void 0&&C.write(at)})).pipe(b.catchReason("SocketError","SocketCloseError",()=>b.void),b.ensuring(b.sync(()=>C.detach())),b.orDie),xn.empty()}))})).pipe(Bu.provide(Wn));import{Effect as er}from"effect";import{HttpApiBuilder as hA}from"effect/unstable/httpapi";var Yu=hA.group(W,"question",e=>er.gen(function*(){let t=yield*Vt.Service,o=er.fn("QuestionHttpApi.list")(function*(){return yield*t.list()}),r=er.fn("QuestionHttpApi.reply")(function*(i){return yield*t.reply({requestID:i.params.requestID,answers:i.payload.answers}).pipe(er.catchTag("Question.NotFoundError",c=>er.fail(new Uo({requestID:String(c.requestID),message:`Question request not found: ${c.requestID}`})))),!0}),s=er.fn("QuestionHttpApi.reject")(function*(i){return yield*t.reject(i.params.requestID).pipe(er.catchTag("Question.NotFoundError",c=>er.fail(new Uo({requestID:String(c.requestID),message:`Question request not found: ${c.requestID}`})))),!0});return e.handle("list",o).handle("reply",r).handle("reject",s)}));import{Cause as SA,Effect as H,Option as vA,Schema as Ju,Scope as IA}from"effect";import*as Oi from"effect/Stream";import{HttpServerRequest as Xu,HttpServerResponse as Zu}from"effect/unstable/http";import{HttpApiBuilder as AA,HttpApiError as Wt,HttpApiSchema as EA}from"effect/unstable/httpapi";import{Effect as tp}from"effect";function no(e){return e.pipe(tp.mapError(t=>pi(t.message)))}n(no,"mapStorageNotFound");function Es(e){return e.pipe(tp.catchTag("SessionBusyError",t=>tp.fail(new fo({sessionID:t.sessionID,message:`Session is busy: ${t.sessionID}`}))))}n(Es,"mapBusy");var el=n(e=>H.try({try:n(()=>JSON.parse(e),"try"),catch:n(()=>new Wt.BadRequest({}),"catch")}),"tryParseJson"),tl=AA.group(W,"session",e=>H.gen(function*(){let t=yield*z.Service,o=yield*ei.Service,r=yield*Qt.Service,s=yield*$r.Service,i=yield*Ks.Service,c=yield*zs.Service,h=yield*zt.Service,y=yield*pr.Service,u=yield*Po.Service,a=yield*Gr.Service,l=yield*_r.Service,A=yield*$t.Service,E=yield*IA.Scope,f=H.fn("SessionHttpApi.list")(function*(d){let K=d.query.directory?yield*Oe.directory:void 0;return yield*t.list({directory:d.query.scope==="project"?void 0:K,scope:d.query.scope,path:d.query.path,roots:d.query.roots,start:d.query.start,search:d.query.search,limit:d.query.limit})}),v=H.fn("SessionHttpApi.status")(function*(){return Object.fromEntries(yield*u.list())}),D=H.fn("SessionHttpApi.requireSession")(function*(d){return yield*no(t.get(d))}),C=H.fn("SessionHttpApi.get")(function*(d){return yield*D(d.params.sessionID)}),O=H.fn("SessionHttpApi.children")(function*(d){return yield*D(d.params.sessionID),yield*t.children(d.params.sessionID)}),G=H.fn("SessionHttpApi.todo")(function*(d){return yield*D(d.params.sessionID),yield*a.get(d.params.sessionID)}),at=H.fn("SessionHttpApi.diff")(function*(d){return yield*l.diff({sessionID:d.params.sessionID,messageID:d.query.messageID})}),_i=H.fn("SessionHttpApi.messages")(function*(d){if(d.query.before&&d.query.limit===void 0)return yield*new Wt.BadRequest({});if(d.query.before){let qn=d.query.before;yield*H.try({try:n(()=>Vs.cursor.decode(qn),"try"),catch:n(()=>new Wt.BadRequest({}),"catch")})}if(yield*D(d.params.sessionID),d.query.limit===void 0||d.query.limit===0)return yield*no(t.messages({sessionID:d.params.sessionID}));let K=yield*no(Vs.page({sessionID:d.params.sessionID,limit:d.query.limit,before:d.query.before}));if(!K.cursor)return K.items;let Io=yield*Xu.HttpServerRequest,pt=vA.getOrElse(Xu.toURL(Io),()=>new URL(Io.url,"http://localhost"));return pt.searchParams.set("limit",d.query.limit.toString()),pt.searchParams.set("before",K.cursor),Zu.jsonUnsafe(K.items,{headers:{"Access-Control-Expose-Headers":"Link, X-Next-Cursor",Link:`<${pt.toString()}>; rel="next"`,"X-Next-Cursor":K.cursor}})}),$i=H.fn("SessionHttpApi.message")(function*(d){return yield*no(Vs.get({sessionID:d.params.sessionID,messageID:d.params.messageID}))}),Hs=H.fn("SessionHttpApi.create")(function*(d){return yield*o.create(d.payload)}),$=H.fn("SessionHttpApi.createRaw")(function*(d){let K=yield*H.orDie(d.request.text);if(K.trim().length===0)return yield*Hs({});let Io=yield*el(K),pt=yield*Ju.decodeUnknownEffect(z.CreateInput)(Io).pipe(H.mapError(()=>new Wt.BadRequest({}))),qn=pt&&{...pt,permission:pt.permission?[...pt.permission]:void 0};return yield*Hs({payload:qn})}),We=H.fn("SessionHttpApi.remove")(function*(d){return yield*no(t.remove(d.params.sessionID)),!0}),et=H.fn("SessionHttpApi.update")(function*(d){let K=yield*D(d.params.sessionID);return d.payload.title!==void 0&&(yield*t.setTitle({sessionID:d.params.sessionID,title:d.payload.title})),d.payload.metadata!==void 0&&(yield*t.setMetadata({sessionID:d.params.sessionID,metadata:d.payload.metadata})),d.payload.permission!==void 0&&(yield*t.setPermission({sessionID:d.params.sessionID,permission:pr.merge(K.permission??[],d.payload.permission)})),d.payload.time?.archived!==void 0&&(yield*t.setArchived({sessionID:d.params.sessionID,time:d.payload.time.archived})),yield*D(d.params.sessionID)}),ue=H.fn("SessionHttpApi.fork")(function*(d){return yield*no(t.fork({sessionID:d.params.sessionID,messageID:d.payload?.messageID}))}),Gt=H.fn("SessionHttpApi.forkRaw")(function*(d){let K=yield*H.orDie(d.request.text);if(K.trim().length===0)return yield*ue({params:d.params});let Io=yield*el(K),pt=yield*Ju.decodeUnknownEffect(Ha)(Io).pipe(H.mapError(()=>new Wt.BadRequest({})));return yield*ue({params:d.params,payload:pt})}),Kl=H.fn("SessionHttpApi.abort")(function*(d){return yield*r.cancel(d.params.sessionID),!0}),Jl=H.fn("SessionHttpApi.init")(function*(d){return yield*D(d.params.sessionID),yield*r.command({sessionID:d.params.sessionID,messageID:d.payload.messageID,model:`${d.payload.providerID}/${d.payload.modelID}`,command:Mo.Default.INIT,arguments:""}).pipe(H.mapError(()=>new Wt.BadRequest({}))),!0}),Xl=H.fn("SessionHttpApi.share")(function*(d){return yield*D(d.params.sessionID),yield*o.share(d.params.sessionID).pipe(H.mapError(()=>new Wt.InternalServerError({}))),yield*D(d.params.sessionID)}),Zl=H.fn("SessionHttpApi.unshare")(function*(d){return yield*D(d.params.sessionID),yield*o.unshare(d.params.sessionID).pipe(H.mapError(()=>new Wt.InternalServerError({}))),yield*D(d.params.sessionID)}),ef=H.fn("SessionHttpApi.summarize")(function*(d){yield*s.cleanup(yield*D(d.params.sessionID));let K=yield*no(t.messages({sessionID:d.params.sessionID})),Io=yield*h.defaultAgent(),pt=K.findLast(qn=>qn.info.role==="user")?.info.agent??Io;return yield*i.create({sessionID:d.params.sessionID,agent:pt,model:{providerID:d.payload.providerID,modelID:d.payload.modelID},auto:d.payload.auto??!1}),yield*r.loop({sessionID:d.params.sessionID}),!0}),tf=H.fn("SessionHttpApi.prompt")(function*(d){yield*D(d.params.sessionID);let K=yield*r.prompt({...d.payload,sessionID:d.params.sessionID}).pipe(H.mapError(()=>new Wt.BadRequest({})));return Zu.stream(Oi.make(JSON.stringify(K)).pipe(Oi.encodeText),{contentType:"application/json"})}),of=H.fn("SessionHttpApi.promptAsync")(function*(d){return yield*D(d.params.sessionID),yield*r.prompt({...d.payload,sessionID:d.params.sessionID}).pipe(H.catchCause(K=>H.gen(function*(){yield*H.logError("prompt_async failed",{sessionID:d.params.sessionID,cause:K}),yield*A.publish(z.Event.Error,{sessionID:d.params.sessionID,error:new Os.Unknown({message:SA.pretty(K)}).toObject()})})),H.forkIn(E,{startImmediately:!0})),EA.NoContent.make()}),rf=H.fn("SessionHttpApi.command")(function*(d){return yield*D(d.params.sessionID),yield*r.command({...d.payload,sessionID:d.params.sessionID}).pipe(H.mapError(()=>new Wt.BadRequest({})))}),nf=H.fn("SessionHttpApi.shell")(function*(d){return yield*D(d.params.sessionID),yield*Es(r.shell({...d.payload,sessionID:d.params.sessionID}))}),sf=H.fn("SessionHttpApi.revert")(function*(d){return yield*D(d.params.sessionID),yield*Es(s.revert({sessionID:d.params.sessionID,...d.payload}))}),af=H.fn("SessionHttpApi.unrevert")(function*(d){return yield*D(d.params.sessionID),yield*Es(s.unrevert({sessionID:d.params.sessionID}))}),pf=H.fn("SessionHttpApi.permissionRespond")(function*(d){return yield*D(d.params.sessionID),yield*y.reply({requestID:d.params.permissionID,reply:d.payload.response}).pipe(H.catchTag("Permission.NotFoundError",K=>H.fail(new Zt({requestID:String(K.requestID),message:`Permission request not found: ${K.requestID}`})))),!0}),cf=H.fn("SessionHttpApi.deleteMessage")(function*(d){return yield*D(d.params.sessionID),yield*Es(c.assertNotBusy(d.params.sessionID)),yield*t.removeMessage(d.params),!0}),df=H.fn("SessionHttpApi.deletePart")(function*(d){return yield*D(d.params.sessionID),yield*t.removePart(d.params),!0}),mf=H.fn("SessionHttpApi.updatePart")(function*(d){yield*D(d.params.sessionID);let K=d.payload;return K.id!==d.params.partID||K.messageID!==d.params.messageID||K.sessionID!==d.params.sessionID?yield*new Wt.BadRequest({}):yield*t.updatePart(K)});return e.handle("list",f).handle("status",v).handle("get",C).handle("children",O).handle("todo",G).handle("diff",at).handle("messages",_i).handle("message",$i).handleRaw("create",$).handle("remove",We).handle("update",et).handleRaw("fork",Gt).handle("abort",Kl).handle("init",Jl).handle("share",Xl).handle("unshare",Zl).handle("summarize",ef).handle("prompt",tf).handle("promptAsync",of).handle("command",rf).handle("shell",nf).handle("revert",sf).handle("unrevert",af).handle("permissionRespond",pf).handle("deleteMessage",cf).handle("deletePart",df).handle("updatePart",mf)}));import{asc as DA}from"drizzle-orm";import{and as kA}from"drizzle-orm";import{eq as wA}from"drizzle-orm";import{lte as RA}from"drizzle-orm";import{not as bA}from"drizzle-orm";import{or as CA}from"drizzle-orm";import{Effect as Bt,Scope as HA}from"effect";import{HttpApiBuilder as xA,HttpApiError as PA}from"effect/unstable/httpapi";var ol=xA.group(W,"sync",e=>Bt.gen(function*(){let t=yield*fe.Service,o=yield*z.Service,r=yield*HA.Scope,s=yield*$t.Service,{db:i}=yield*Eo.Service,c=Bt.fn("SyncHttpApi.start")(function*(){return yield*t.startWorkspaceSyncing((yield*ae).project.id).pipe(Bt.ignore,Bt.forkIn(r)),!0}),h=Bt.fn("SyncHttpApi.replay")(function*(a){let l=a.payload.events.map(f=>({id:f.id,aggregateID:f.aggregateID,seq:f.seq,type:f.type,data:{...f.data}})),A=l[0].aggregateID;yield*Bt.logInfo("sync replay requested",{sessionID:A,events:l.length,first:l[0]?.seq,last:l.at(-1)?.seq,directory:a.payload.directory});let E=yield*Xi;return yield*s.replayAll(l,{ownerID:E,strictOwner:!0}),yield*Bt.logInfo("sync replay complete",{sessionID:A,events:l.length,first:l[0]?.seq,last:l.at(-1)?.seq}),{sessionID:A}}),y=Bt.fn("SyncHttpApi.steal")(function*(a){let l=yield*Xi;return l?(yield*o.setWorkspace({sessionID:a.payload.sessionID,workspaceID:l}),yield*Bt.logInfo("sync session stolen",{sessionID:a.payload.sessionID,workspaceID:l}),{sessionID:a.payload.sessionID}):yield*new PA.BadRequest({})}),u=Bt.fn("SyncHttpApi.history")(function*(a){let l=Object.entries(a.payload);return yield*i.select().from(On).where(l.length>0?bA(CA(...l.map(([A,E])=>kA(wA(On.aggregate_id,A),RA(On.seq,E))))):void 0).orderBy(DA(On.seq)).all().pipe(Bt.orDie)});return e.handle("start",c).handle("replay",h).handle("steal",y).handle("history",u)}));import{Effect as Ze}from"effect";import{HttpApiBuilder as qA,HttpApiError as MA}from"effect/unstable/httpapi";var TA={session_new:"session.new",session_share:"session.share",session_interrupt:"session.interrupt",session_compact:"session.compact",messages_page_up:"session.page.up",messages_page_down:"session.page.down",messages_line_up:"session.line.up",messages_line_down:"session.line.down",messages_half_page_up:"session.half.page.up",messages_half_page_down:"session.half.page.down",messages_first:"session.first",messages_last:"session.last",agent_cycle:"agent.cycle"},rl=qA.group(W,"tui",e=>Ze.gen(function*(){let t=yield*$t.Service,o=yield*z.Service,r=n(C=>t.publish(oe.CommandExecute,{command:C}),"publishCommand"),s=Ze.fn("TuiHttpApi.appendPrompt")(function*(C){return yield*t.publish(oe.PromptAppend,C.payload),!0}),i=Ze.fn("TuiHttpApi.openHelp")(function*(){return yield*r("help.show"),!0}),c=Ze.fn("TuiHttpApi.openSessions")(function*(){return yield*r("session.list"),!0}),h=Ze.fn("TuiHttpApi.openThemes")(function*(){return yield*r("session.list"),!0}),y=Ze.fn("TuiHttpApi.openModels")(function*(){return yield*r("model.list"),!0}),u=Ze.fn("TuiHttpApi.submitPrompt")(function*(){return yield*r("prompt.submit"),!0}),a=Ze.fn("TuiHttpApi.clearPrompt")(function*(){return yield*r("prompt.clear"),!0}),l=Ze.fn("TuiHttpApi.executeCommand")(function*(C){return yield*r(TA[C.payload.command]),!0}),A=Ze.fn("TuiHttpApi.showToast")(function*(C){return yield*t.publish(oe.ToastShow,C.payload),!0}),E=Ze.fn("TuiHttpApi.publish")(function*(C){return C.payload.type===oe.PromptAppend.type&&(yield*t.publish(oe.PromptAppend,C.payload.properties)),C.payload.type===oe.CommandExecute.type&&(yield*t.publish(oe.CommandExecute,C.payload.properties)),C.payload.type===oe.ToastShow.type&&(yield*t.publish(oe.ToastShow,C.payload.properties)),C.payload.type===oe.SessionSelect.type&&(yield*t.publish(oe.SessionSelect,C.payload.properties)),!0}),f=Ze.fn("TuiHttpApi.selectSession")(function*(C){return C.payload.sessionID.startsWith("ses")?(yield*no(o.get(C.payload.sessionID)),yield*t.publish(oe.SessionSelect,C.payload),!0):yield*new MA.BadRequest({})}),v=Ze.fn("TuiHttpApi.controlNext")(function*(){return yield*Ze.promise(()=>dm())}),D=Ze.fn("TuiHttpApi.controlResponse")(function*(C){return mm(C.payload),!0});return e.handle("appendPrompt",s).handle("openHelp",i).handle("openSessions",c).handle("openThemes",h).handle("openModels",y).handle("submitPrompt",u).handle("clearPrompt",a).handle("executeCommand",l).handle("showToast",A).handle("publish",E).handle("selectSession",f).handle("controlNext",v).handle("controlResponse",D)}));import{Layer as gE}from"effect";import{Effect as so,Schema as tr}from"effect";import{HttpApiBuilder as LA}from"effect/unstable/httpapi";var OA=50,NA=tr.Struct({id:Pp.ID,order:tr.Union([tr.Literal("asc"),tr.Literal("desc")]),direction:tr.Union([tr.Literal("previous"),tr.Literal("next")])}),UA=tr.decodeUnknownSync(NA),op={encode(e,t,o){return Buffer.from(JSON.stringify({id:e.id,order:t,direction:o})).toString("base64url")},decode(e){return UA(JSON.parse(Buffer.from(e,"base64url").toString("utf8")))}},nl=LA.group(j,"server.message",e=>so.gen(function*(){let t=yield*Dt.Service;return e.handle("session.messages",so.fn(function*(o){if(o.query.cursor&&o.query.order!==void 0)return yield*new Ot({message:"Cursor cannot be combined with order"});let r=yield*so.try({try:n(()=>o.query.cursor?op.decode(o.query.cursor):void 0,"try"),catch:n(()=>new Ot({message:"Invalid cursor"}),"catch")}),s=r?.order??o.query.order??"desc",i=yield*t.messages({sessionID:o.params.sessionID,limit:o.query.limit??OA,order:s,cursor:r?{id:r.id,direction:r.direction}:void 0}).pipe(so.catchTag("Session.NotFoundError",y=>so.fail(new x({sessionID:y.sessionID,message:`Session not found: ${y.sessionID}`}))),so.catchTag("Session.MessageDecodeError",y=>{let u=`err_${crypto.randomUUID().slice(0,8)}`;return so.logError("failed to decode session message").pipe(so.annotateLogs({ref:u,sessionID:y.sessionID,messageID:y.messageID}),so.andThen(so.fail(new nt({message:"Unexpected server error. Check server logs for details.",ref:u}))))})),c=i[0],h=i.at(-1);return{data:i,cursor:{previous:c?op.encode(c,s,"previous"):void 0,next:h?op.encode(h,s,"next"):void 0}}}))}));import{Effect as sl}from"effect";import{HttpApiBuilder as jA}from"effect/unstable/httpapi";var il=jA.group(j,"server.model",e=>sl.gen(function*(){return e.handle("model.list",sl.fn(function*(){let t=yield*Nn.Service;return yield*Y(t.model.available())}))}));import{Effect as Ni}from"effect";import{HttpApiBuilder as FA}from"effect/unstable/httpapi";var al=FA.group(j,"server.provider",e=>Ni.gen(function*(){return e.handle("provider.list",Ni.fn(function*(){let t=yield*Nn.Service;return yield*Y(t.provider.available())})).handle("provider.get",Ni.fn(function*(t){let r=yield*(yield*Nn.Service).provider.get(t.params.providerID);return r?yield*Y(Ni.succeed(r)):yield*new tn({providerID:t.params.providerID,message:`Provider not found: ${t.params.providerID}`})}))}));import{DateTime as pl,Effect as k,Stream as WA}from"effect";import{HttpApiBuilder as BA,HttpApiSchema as Mr}from"effect/unstable/httpapi";var GA=50,_A=50,cl=BA.group(j,"server.session",e=>k.gen(function*(){let t=yield*Dt.Service;return e.handle("session.list",k.fn(function*(o){let r=o.query.cursor!==void 0?yield*br.parse(o.query.cursor).pipe(k.mapError(()=>new Ot({message:"Invalid cursor"}))):o.query,s=yield*t.list({...r,workspaceID:r.workspace,limit:o.query.limit??GA}),i=s[0],c=s.at(-1);return{data:s,cursor:{previous:i?br.make({...r,anchor:{id:i.id,time:pl.toEpochMillis(i.time.created),direction:"previous"}}):void 0,next:c?br.make({...r,anchor:{id:c.id,time:pl.toEpochMillis(c.time.created),direction:"next"}}):void 0}}})).handle("session.create",k.fn(function*(o){return{data:yield*t.create({id:o.payload.id,agent:o.payload.agent,model:o.payload.model,location:o.payload.location??{directory:ke.make(process.cwd())}})}})).handle("session.active",k.fn(function*(){return{data:Object.fromEntries(Array.from(yield*t.active,o=>[o,{type:"running"}]))}})).handle("session.get",k.fn(function*(o){return{data:yield*t.get(o.params.sessionID).pipe(k.catchTag("Session.NotFoundError",r=>new x({sessionID:r.sessionID,message:`Session not found: ${r.sessionID}`})))}})).handle("session.switchAgent",k.fn(function*(o){return yield*t.switchAgent({sessionID:o.params.sessionID,agent:o.payload.agent}).pipe(k.catchTag("Session.NotFoundError",r=>k.fail(new x({sessionID:r.sessionID,message:`Session not found: ${r.sessionID}`})))),Mr.NoContent.make()})).handle("session.switchModel",k.fn(function*(o){return yield*t.switchModel({sessionID:o.params.sessionID,model:o.payload.model}).pipe(k.catchTag("Session.NotFoundError",r=>k.fail(new x({sessionID:r.sessionID,message:`Session not found: ${r.sessionID}`})))),Mr.NoContent.make()})).handle("session.prompt",k.fn(function*(o){return{data:yield*t.prompt({sessionID:o.params.sessionID,id:o.payload.id,prompt:o.payload.prompt,delivery:o.payload.delivery,resume:o.payload.resume}).pipe(k.catchTag("Session.NotFoundError",r=>k.fail(new x({sessionID:r.sessionID,message:`Session not found: ${r.sessionID}`}))),k.catchTag("Session.PromptConflictError",r=>k.fail(new en({message:`Prompt message ID conflicts with an existing durable record: ${r.messageID}`,resource:r.messageID}))))}})).handle("session.compact",k.fn(function*(o){return yield*t.compact({sessionID:o.params.sessionID}).pipe(k.catchTag("Session.NotFoundError",r=>k.fail(new x({sessionID:r.sessionID,message:`Session not found: ${r.sessionID}`}))),k.catchTag("Session.OperationUnavailableError",r=>k.fail(new lt({message:`Session ${r.operation} is not available yet`,service:`session.${r.operation}`})))),Mr.NoContent.make()})).handle("session.wait",k.fn(function*(o){return yield*t.wait(o.params.sessionID).pipe(k.catchTag("Session.NotFoundError",r=>k.fail(new x({sessionID:r.sessionID,message:`Session not found: ${r.sessionID}`}))),k.catchTag("Session.OperationUnavailableError",r=>k.fail(new lt({message:`Session ${r.operation} is not available yet`,service:`session.${r.operation}`})))),Mr.NoContent.make()})).handle("session.revert.stage",k.fn(function*(o){return{data:yield*t.revert.stage({...o.params,...o.payload}).pipe(k.catchTag("Session.NotFoundError",r=>new x({sessionID:r.sessionID,message:`Session not found: ${r.sessionID}`})),k.catchTag("Session.MessageNotFoundError",r=>new Oo({sessionID:r.sessionID,messageID:r.messageID,message:`Message not found: ${r.messageID}`})),k.catchTag("Snapshot.Error",r=>{let s=`err_${crypto.randomUUID().slice(0,8)}`;return k.logError("failed to stage session revert",{cause:r}).pipe(k.andThen(k.fail(new nt({message:"Unexpected server error. Check server logs for details.",ref:s}))))}))}})).handle("session.revert.clear",k.fn(function*(o){return yield*t.revert.clear(o.params.sessionID).pipe(k.catchTag("Session.NotFoundError",r=>new x({sessionID:r.sessionID,message:`Session not found: ${r.sessionID}`})),k.catchTag("Snapshot.Error",r=>{let s=`err_${crypto.randomUUID().slice(0,8)}`;return k.logError("failed to clear session revert",{cause:r}).pipe(k.andThen(k.fail(new nt({message:"Unexpected server error. Check server logs for details.",ref:s}))))})),Mr.NoContent.make()})).handle("session.revert.commit",k.fn(function*(o){return yield*t.revert.commit(o.params.sessionID).pipe(k.catchTag("Session.NotFoundError",r=>new x({sessionID:r.sessionID,message:`Session not found: ${r.sessionID}`}))),Mr.NoContent.make()})).handle("session.context",k.fn(function*(o){return{data:yield*t.context(o.params.sessionID).pipe(k.catchTag("Session.NotFoundError",r=>k.fail(new x({sessionID:r.sessionID,message:`Session not found: ${r.sessionID}`}))),k.catchTag("Session.MessageDecodeError",r=>{let s=`err_${crypto.randomUUID().slice(0,8)}`;return k.logError("failed to decode session message").pipe(k.annotateLogs({ref:s,sessionID:r.sessionID,messageID:r.messageID}),k.andThen(k.fail(new nt({message:"Unexpected server error. Check server logs for details.",ref:s}))))}))}})).handle("session.history",k.fn(function*(o){return yield*t.history({sessionID:o.params.sessionID,after:o.query.after,limit:o.query.limit??_A}).pipe(k.map(r=>({data:r.events,hasMore:r.hasMore})),k.catchTag("Session.NotFoundError",r=>new x({sessionID:r.sessionID,message:`Session not found: ${r.sessionID}`})))})).handle("session.events",k.fn(o=>k.succeed(t.events({sessionID:o.params.sessionID,after:o.query.after}).pipe(WA.orDie)))).handle("session.interrupt",k.fn(function*(o){return yield*t.interrupt(o.params.sessionID),Mr.NoContent.make()})).handle("session.message",k.fn(function*(o){let r=yield*t.message(o.params);return r?{data:r}:yield*new Oo({sessionID:o.params.sessionID,messageID:o.params.messageID,message:`Message not found: ${o.params.messageID}`})}))}));import{Effect as io}from"effect";import{HttpApiBuilder as $A,HttpApiSchema as dl}from"effect/unstable/httpapi";function rp(e){return new lr({requestID:e,message:`Permission request not found: ${e}`})}n(rp,"missingRequest");var ml=$A.group(j,"server.permission",e=>io.gen(function*(){return e.handle("permission.request.list",io.fn(function*(){return yield*Y((yield*Ur.Service).list())})).handle("session.permission.create",io.fn(function*(t){return{data:yield*(yield*Ur.Service).ask({id:t.payload.id,sessionID:t.params.sessionID,action:t.payload.action,resources:t.payload.resources,save:t.payload.save,metadata:t.payload.metadata,source:t.payload.source,agent:t.payload.agent}).pipe(io.catchTag("Session.NotFoundError",r=>new x({sessionID:r.sessionID,message:`Session not found: ${r.sessionID}`})))}})).handle("session.permission.list",io.fn(function*(t){return{data:yield*(yield*Ur.Service).forSession(t.params.sessionID)}})).handle("session.permission.get",io.fn(function*(t){let o=yield*(yield*Ur.Service).get(t.params.requestID);return!o||o.sessionID!==t.params.sessionID?yield*rp(t.params.requestID):{data:o}})).handle("session.permission.reply",io.fn(function*(t){let o=yield*Ur.Service,r=yield*o.get(t.params.requestID);return!r||r.sessionID!==t.params.sessionID?yield*rp(t.params.requestID):(yield*o.reply({requestID:t.params.requestID,reply:t.payload.reply,message:t.payload.message}).pipe(io.catchTag("PermissionV2.NotFoundError",()=>rp(t.params.requestID))),dl.NoContent.make())})).handle("permission.saved.list",io.fn(function*(t){let o=yield*ie.Service;return{data:yield*(yield*Fn.Service).list({projectID:t.query.projectID??o.project.id})}})).handle("permission.saved.remove",io.fn(function*(t){return yield*(yield*Fn.Service).remove(t.params.id),dl.NoContent.make()}))}));import{Effect as Ui}from"effect";import{HttpServerResponse as VA}from"effect/unstable/http";import{HttpApiBuilder as QA}from"effect/unstable/httpapi";var ul=QA.group(j,"server.fs",e=>Ui.gen(function*(){return e.handleRaw("fs.read",t=>Ui.gen(function*(){let o=yield*(yield*wo.Service).read({path:Et.make(decodeURIComponent(new URL(t.request.url,"http://localhost").pathname.slice(13)))});return VA.uint8Array(o.content,{contentType:o.mime})})).handle("fs.list",t=>Y(Ui.gen(function*(){return yield*(yield*wo.Service).list(t.query)}))).handle("fs.find",t=>Y(Ui.gen(function*(){return yield*(yield*wo.Service).find(t.query)})))}));import{HttpApiBuilder as zA}from"effect/unstable/httpapi";var ll=zA.group(j,"server.command",e=>e.handle("command.list",()=>Y(wp.Service.use(t=>t.list()))));import{HttpApiBuilder as YA}from"effect/unstable/httpapi";var fl=YA.group(j,"server.skill",e=>e.handle("skill.list",()=>Y(Us.Service.use(t=>t.list()))));import{Effect as np,Schema as KA,Stream as vo}from"effect";import{HttpServerResponse as JA}from"effect/unstable/http";import{HttpApiBuilder as XA}from"effect/unstable/httpapi";import*as yl from"effect/unstable/encoding/Sse";var ZA=256;function eE(e){return{_tag:"Event",event:"message",id:void 0,data:JSON.stringify(KA.encodeUnknownSync(Um)(e))}}n(eE,"eventData");var gl=XA.group(j,"server.event",e=>np.gen(function*(){let t=yield*le.Service;return e.handleRaw("event.subscribe",()=>np.gen(function*(){let o={id:le.ID.create(),type:"server.connected",data:{}},r=vo.unwrap(np.gen(function*(){let i=yield*le.allBounded(t,ZA);return vo.make(o).pipe(vo.concat(i))})).pipe(vo.map(eE),vo.pipeThroughChannel(yl.encode())),s=vo.tick("15 seconds").pipe(vo.map(()=>`: heartbeat
16
+
17
+ `));return JA.stream(r.pipe(vo.merge(s,{haltStrategy:"left"}),vo.encodeText),{contentType:"text/event-stream",headers:{"Cache-Control":"no-cache, no-transform","X-Accel-Buffering":"no","X-Content-Type-Options":"nosniff"}})}))}));import{Effect as tE}from"effect";import{HttpApiBuilder as oE}from"effect/unstable/httpapi";var hl=oE.group(j,"server.agent",e=>e.handle("agent.list",()=>tE.gen(function*(){return yield*Y(gp.Service.use(t=>t.all()))})));import{Effect as rE}from"effect";import{HttpApiBuilder as nE}from"effect/unstable/httpapi";var Sl=nE.group(j,"server.health",e=>e.handle("health.get",()=>rE.succeed({healthy:!0})));import{Effect as B,Queue as Pn}from"effect";import{HttpServerRequest as sE,HttpServerResponse as ji}from"effect/unstable/http";import{HttpApiBuilder as iE,HttpApiSchema as aE}from"effect/unstable/httpapi";import*as Ds from"effect/unstable/socket/Socket";var vl=B.gen(function*(){let e=yield*ie.Service;return{directory:e.directory,workspaceID:e.workspaceID}}),Il=iE.group(j,"server.pty",e=>B.gen(function*(){let t=yield*Rt.Service,o=yield*dr,r=yield*Kt.Service;return e.handle("pty.list",B.fn(function*(){return yield*Y((yield*ge.Service).list())})).handle("pty.create",B.fn(function*(s){let i=yield*ge.Service,c=yield*ie.Service,h=s.payload.cwd||c.directory;return yield*Y(i.create({...s.payload,args:s.payload.args?[...s.payload.args]:void 0,cwd:h,env:{...s.payload.env,...yield*r.get({directory:c.directory,cwd:h})}}))})).handle("pty.get",B.fn(function*(s){let i=yield*ge.Service;return yield*Y(i.get(s.params.ptyID).pipe(B.catchTag("Pty.NotFoundError",()=>new ft({ptyID:s.params.ptyID,message:`PTY session not found: ${s.params.ptyID}`}))))})).handle("pty.update",B.fn(function*(s){let i=yield*ge.Service;return yield*Y(i.update(s.params.ptyID,{...s.payload,size:s.payload.size?{...s.payload.size}:void 0}).pipe(B.catchTag("Pty.NotFoundError",()=>new ft({ptyID:s.params.ptyID,message:`PTY session not found: ${s.params.ptyID}`}))))})).handle("pty.remove",B.fn(function*(s){return yield*(yield*ge.Service).remove(s.params.ptyID).pipe(B.catchTag("Pty.NotFoundError",()=>new ft({ptyID:s.params.ptyID,message:`PTY session not found: ${s.params.ptyID}`}))),aE.NoContent.make()})).handle("pty.connectToken",B.fn(function*(s){let i=yield*sE.HttpServerRequest;return i.headers[_c]!==$c||!Jn(i.headers.origin,i.headers.host,o)?yield*new yr({message:"Invalid PTY connect token request"}):(yield*(yield*ge.Service).get(s.params.ptyID).pipe(B.catchTag("Pty.NotFoundError",()=>new ft({ptyID:s.params.ptyID,message:`PTY session not found: ${s.params.ptyID}`}))),yield*Y(t.issue({ptyID:s.params.ptyID,...yield*vl})))})).handleRaw("pty.connect",B.fn("PtyHandler.connect")(function*(s){let i=yield*ge.Service;if(!(yield*i.get(s.params.ptyID).pipe(B.as(!0),B.catchTag("Pty.NotFoundError",()=>B.succeed(!1)))))return ji.empty({status:404});let h=new URL(s.request.url,"http://localhost"),y=h.searchParams.get(ai);if(y&&!(Jn(s.request.headers.origin,s.request.headers.host,o)?yield*t.consume({ticket:y,ptyID:s.params.ptyID,...yield*vl}):!1))return ji.empty({status:403});let u=h.searchParams.get("cursor"),a=u===null?void 0:Number(u),l=a!==void 0&&Number.isSafeInteger(a)&&a>=-1?a:void 0,A=yield*B.orDie(s.request.upgrade),E=yield*A.writer,f=n(O=>A.runRaw(()=>B.void,{onOpen:E(O).pipe(B.catch(()=>B.void))}).pipe(B.timeout("1 second"),B.catchReason("SocketError","SocketCloseError",()=>B.void),B.catch(()=>B.void)),"closeAccepted"),v=yield*Pn.unbounded(),D=yield*i.attach(s.params.ptyID,{cursor:l,onData:n(O=>Pn.offerUnsafe(v,O),"onData"),onEnd:n(()=>Pn.offerUnsafe(v,new Ds.CloseEvent(1e3)),"onEnd")}).pipe(B.catchTags({"Pty.NotFoundError":n(()=>f(new Ds.CloseEvent(4404,"session not found")).pipe(B.as(void 0)),"Pty.NotFoundError"),"Pty.ExitedError":n(()=>f(new Ds.CloseEvent(4404,"session exited")).pipe(B.as(void 0)),"Pty.ExitedError")}));if(!D)return ji.empty();for(let O of Ft.chunks(D.replay))Pn.offerUnsafe(v,O);Pn.offerUnsafe(v,Ft.metaFrame(D.cursor)),D.activate();let C=B.gen(function*(){for(;;){let O=yield*Pn.take(v);if(yield*E(O),O instanceof Ds.CloseEvent)return}});return yield*B.race(C,A.runRaw(O=>{let G=Ft.decodeInput(O);G!==void 0&&D.write(G)})).pipe(B.catchReason("SocketError","SocketCloseError",()=>B.void),B.ensuring(B.sync(()=>D.detach())),B.orDie),ji.empty()}))}));import{Effect as or}from"effect";import{HttpApiBuilder as pE,HttpApiSchema as Al}from"effect/unstable/httpapi";function sp(e){return new fr({requestID:e,message:`Question request not found: ${e}`})}n(sp,"missingRequest");var El=pE.group(j,"server.question",e=>or.gen(function*(){let t=or.fnUntraced(function*(o,r,s){let i=yield*Ws.Service,c=(yield*i.list()).find(h=>h.id===r);return!c||c.sessionID!==o?yield*sp(r):yield*s(i)});return e.handle("question.request.list",or.fn(function*(){return yield*Y((yield*Ws.Service).list())})).handle("session.question.list",or.fn(function*(o){return{data:(yield*(yield*Ws.Service).list()).filter(s=>s.sessionID===o.params.sessionID)}})).handle("session.question.reply",or.fn(function*(o){return yield*t(o.params.sessionID,o.params.requestID,r=>r.reply({requestID:o.params.requestID,answers:o.payload.answers}).pipe(or.catchTag("QuestionV2.NotFoundError",()=>sp(o.params.requestID)))),Al.NoContent.make()})).handle("session.question.reject",or.fn(function*(o){return yield*t(o.params.sessionID,o.params.requestID,r=>r.reject(o.params.requestID).pipe(or.catchTag("QuestionV2.NotFoundError",()=>sp(o.params.requestID)))),Al.NoContent.make()}))}));import{HttpApiBuilder as cE}from"effect/unstable/httpapi";var Dl=cE.group(j,"server.reference",e=>e.handle("reference.list",()=>Y(Op.Service.use(t=>t.list()))));import{Effect as dE}from"effect";import{HttpApiBuilder as mE}from"effect/unstable/httpapi";var kl=mE.group(j,"server.location",e=>e.handle("location.get",dE.fn(function*(){let t=yield*ie.Service;return new ie.Info({directory:t.directory,workspaceID:t.workspaceID,project:t.project})})));import{Effect as ao}from"effect";import{HttpApiBuilder as uE,HttpApiSchema as ip}from"effect/unstable/httpapi";var wl=n(e=>e.pipe(ao.mapError(()=>new be({message:"Authentication failed",kind:"integration_authorization"}))),"authorize"),Rl=uE.group(j,"server.integration",e=>ao.gen(function*(){return e.handle("integration.list",ao.fn(function*(){let t=yield*Ge.Service;return yield*Y(t.list())})).handle("integration.get",ao.fn(function*(t){let o=yield*Ge.Service;return yield*Y(o.get(t.params.integrationID))})).handle("integration.connect.key",ao.fn(function*(t){let o=yield*Ge.Service;return yield*wl(o.connection.key({integrationID:t.params.integrationID,key:t.payload.key,label:t.payload.label})),ip.NoContent.make()})).handle("integration.connect.oauth",ao.fn(function*(t){let o=yield*Ge.Service;return yield*Y(wl(o.connection.oauth({integrationID:t.params.integrationID,methodID:t.payload.methodID,inputs:t.payload.inputs,label:t.payload.label})))})).handle("integration.attempt.status",ao.fn(function*(t){let o=yield*Ge.Service;return yield*Y(o.attempt.status(t.params.attemptID))})).handle("integration.attempt.complete",ao.fn(function*(t){return yield*(yield*Ge.Service).attempt.complete({attemptID:t.params.attemptID,code:t.payload.code}).pipe(ao.mapError(r=>new be({message:r._tag==="Integration.CodeRequired"?"Authorization code is required":"Authentication failed",kind:r._tag==="Integration.CodeRequired"?"integration_code_required":"integration_authorization"}))),ip.NoContent.make()})).handle("integration.attempt.cancel",ao.fn(function*(t){return yield*(yield*Ge.Service).attempt.cancel(t.params.attemptID),ip.NoContent.make()}))}));import{Effect as bl}from"effect";import{HttpApiBuilder as lE,HttpApiSchema as Cl}from"effect/unstable/httpapi";var Hl=lE.group(j,"server.credential",e=>e.handle("credential.update",bl.fn(function*(t){return yield*(yield*Ge.Service).connection.update(t.params.credentialID,{label:t.payload.label}),Cl.NoContent.make()})).handle("credential.remove",bl.fn(function*(t){return yield*(yield*Ge.Service).connection.remove(t.params.credentialID),Cl.NoContent.make()})));import{Effect as ks}from"effect";import{HttpApiBuilder as fE,HttpApiSchema as xl}from"effect/unstable/httpapi";var Pl=fE.group(j,"server.projectCopy",e=>ks.succeed(e.handle("projectCopy.create",t=>ks.gen(function*(){let o=yield*Tt.Service,r=yield*ie.Service;return yield*ap(o.create({...t.payload,projectID:t.params.projectID,sourceDirectory:r.project.directory}))})).handle("projectCopy.remove",t=>Tt.Service.use(o=>ap(o.remove({...t.payload,projectID:t.params.projectID})).pipe(ks.as(xl.NoContent.make())))).handle("projectCopy.refresh",t=>Tt.Service.use(o=>ap(o.refresh({projectID:t.params.projectID})).pipe(ks.as(xl.NoContent.make()))))));function ap(e){return e.pipe(ks.mapError(t=>new xr({name:"ProjectCopyError",data:{message:yE(t),forceRequired:t instanceof Lr.WorktreeError?t.forceRequired:void 0}})))}n(ap,"badRequest");function yE(e){return e instanceof Tt.SourceDirectoryNotFoundError?`Project copy source not found: ${e.directory}`:e instanceof Tt.DestinationExistsError?`Project copy destination already exists: ${e.directory}`:e instanceof Tt.DirectoryUnavailableError?`Project copy directory unavailable: ${e.directory}`:e instanceof Tt.InvalidDirectoryError?`Invalid project copy directory: ${e.directory}`:e instanceof Tt.StrategyUnavailableError?`Project copy strategy unavailable: ${e.strategy}`:e.message}n(yE,"message");var ql=gE.mergeAll(Sl,kl,hl,cl,nl,il,al,Rl,Hl,ml,ul,ll,fl,gl,Il,El,Dl,Pl);import{Effect as Fi}from"effect";import{HttpApiMiddleware as hE}from"effect/unstable/httpapi";var pp=1024;function SE(e){return e.length<=pp?e:e.slice(0,pp)+`... (${e.length-pp} more chars)`}n(SE,"truncateReason");var Ml=hE.layerSchemaErrorTransform(Rr,e=>{let t=SE(e.cause.message);return Fi.logWarning("schema rejection").pipe(Fi.annotateLogs({kind:e.kind,reason:t}),Fi.andThen(Fi.fail(new be({message:t,kind:e.kind}))))});import{Cause as Tl,Effect as Pt}from"effect";import{HttpApiBuilder as vE}from"effect/unstable/httpapi";var Ll=vE.group(W,"workspace",e=>Pt.gen(function*(){let t=yield*fe.Service,o=Pt.fn("WorkspaceHttpApi.adapters")(function*(){let u=yield*ae;return yield*Pt.sync(()=>gc(u.project.id))}),r=Pt.fn("WorkspaceHttpApi.list")(function*(){return yield*t.list((yield*ae).project)}),s=Pt.fn("WorkspaceHttpApi.create")(function*(u){let a=yield*ae;return yield*t.create({...u.payload,extra:u.payload.extra??null,projectID:a.project.id}).pipe(Pt.catchCause(l=>{let A=l.reasons.find(Tl.isDieReason),E=l.reasons.find(Tl.isFailReason),f=A?.defect??E?.error,v=f instanceof Error?f.message:"Workspace creation failed";return Pt.fail(new hs({name:"WorkspaceCreateError",data:{message:v}}))}))}),i=Pt.fn("WorkspaceHttpApi.syncList")(function*(){yield*t.syncList((yield*ae).project)}),c=Pt.fn("WorkspaceHttpApi.status")(function*(){let u=new Set((yield*t.list((yield*ae).project)).map(a=>a.id));return(yield*t.status()).filter(a=>u.has(a.workspaceID))}),h=Pt.fn("WorkspaceHttpApi.remove")(function*(u){return yield*t.remove(u.params.id)}),y=Pt.fn("WorkspaceHttpApi.warp")(function*(u){yield*t.sessionWarp({workspaceID:u.payload.id,sessionID:u.payload.sessionID,copyChanges:u.payload.copyChanges}).pipe(Pt.mapError(a=>a instanceof fe.WorkspaceNotFoundError?pi(a.message):a instanceof mt.PatchApplyError?new yo({name:"VcsApplyError",data:{message:a.message,reason:a.reason}}):new gs({name:"WorkspaceWarpError",data:{message:a.message}})))});return e.handle("adapters",o).handle("list",r).handle("create",s).handle("syncList",i).handle("status",c).handle("remove",h).handle("warp",y)}));import{deflateSync as IE,gzipSync as AE}from"node:zlib";import{Effect as EE}from"effect";import{HttpBody as DE,HttpRouter as kE,HttpServerRequest as wE,HttpServerResponse as Ol}from"effect/unstable/http";var RE=/^\s*(?:text\/(?!event-stream(?:[;\s]|$))[^;\s]+|application\/(?:javascript|json|xml|xml-dtd|ecmascript|dart|postscript|rtf|tar|toml|vnd\.dart|vnd\.ms-fontobject|vnd\.ms-opentype|wasm|x-httpd-php|x-javascript|x-ns-proxy-autoconfig|x-sh|x-tar|x-www-form-urlencoded)|font\/(?:otf|ttf)|image\/(?:bmp|vnd\.adobe\.photoshop|vnd\.microsoft\.icon|vnd\.ms-dds|x-icon|x-ms-bmp)|message\/rfc822|model\/gltf-binary|x-shader\/x-fragment|x-shader\/x-vertex|[^;\s]+?\+(?:json|text|xml|yaml))(?:[;\s]|$)/i,bE=/(?:^|,)\s*?no-transform\s*?(?:,|$)/i,CE=new Set(["/event","/global/event"]),HE=/^\/session\/[^/]+\/(?:message|prompt_async)$/,xE=1024;function PE(e){if(!e)return;let t=e.toLowerCase();if(t.includes("gzip"))return"gzip";if(t.includes("deflate"))return"deflate"}n(PE,"pickEncoding");function qE(e){let t=e.indexOf("?");return t===-1?e:e.slice(0,t)}n(qE,"pathOf");var Nl=kE.middleware()(e=>EE.gen(function*(){let t=yield*e,o=yield*wE.HttpServerRequest;if(o.method==="HEAD"||t.headers["content-encoding"]||t.headers["transfer-encoding"])return t;let r=t.body;if(r._tag!=="Uint8Array"||r.body.byteLength<xE)return t;let s=t.headers["cache-control"];if(s&&bE.test(s))return t;let i=qE(o.url);if(CE.has(i)||o.method==="POST"&&HE.test(i))return t;let c=r.contentType;if(!RE.test(c))return t;let h=PE(o.headers["accept-encoding"]);if(!h)return t;let y=h==="gzip"?AE(r.body):IE(r.body);return Ol.setHeader(Ol.setBody(t,DE.uint8Array(y,c)),"content-encoding",h)})).layer;import{Effect as ME}from"effect";import{HttpRouter as TE,HttpServerResponse as Ul}from"effect/unstable/http";var jl=TE.middleware(e=>ME.gen(function*(){let t=yield*e,o=t.headers["access-control-allow-origin"];if(!o||o==="*")return t;let r=t.headers.vary;if(!r)return Ul.setHeader(t,"vary","Origin");let s=r.split(",").map(i=>i.trim().toLowerCase());return s.includes("origin")||s.includes("*")?t:Ul.setHeader(t,"vary",`${r}, Origin`)}),{global:!0});import{Cause as Fl,Effect as ws}from"effect";import{HttpRouter as LE,HttpServerError as OE,HttpServerRespondable as NE,HttpServerResponse as cp}from"effect/unstable/http";var Wl=LE.middleware()(e=>e.pipe(ws.catchCause(t=>{let o=t.reasons.filter(Fl.isDieReason).find(i=>!(cp.isHttpServerResponse(i.defect)||OE.isHttpServerError(i.defect)||NE.isRespondable(i.defect)));if(!o)return ws.failCause(t);let r=o.defect;if(Fr.JsonError.isInstance(r)||Fr.InvalidError.isInstance(r)||Fr.FrontmatterError.isInstance(r)||Fr.DirectoryTypoError.isInstance(r)||Fr.RemoteAuthError.isInstance(r))return ws.succeed(cp.jsonUnsafe(r.toObject(),{status:400}));let s=`err_${crypto.randomUUID().slice(0,8)}`;return ws.logError("failed",{ref:s,error:r,cause:Fl.pretty(t)}).pipe(ws.as(cp.jsonUnsafe(new Os.Unknown({message:"Unexpected server error. Check server logs for details.",ref:s}).toObject(),{status:500})))}))).layer;import{Effect as Bl}from"effect";import{HttpRouter as UE,HttpServerRequest as jE,HttpServerResponse as FE}from"effect/unstable/http";var WE=new Set(["GET","HEAD","OPTIONS"]),Gl=UE.middleware()(Bl.gen(function*(){let{db:e}=yield*Eo.Service;return t=>Bl.gen(function*(){let o=yield*jE.HttpServerRequest;if(!Ln.OPENCODE_WORKSPACE_ID||WE.has(o.method))return yield*t;let r=yield*ha(e),s=yield*t,i=cd(r,yield*ha(e));return Object.keys(i).length===0?s:FE.setHeader(s,ga,JSON.stringify(i))})})).layer;var zE=BE.makeUnsafe(new Map),YE=n(e=>Wi.middleware($E.cors({allowedOrigins:n(t=>sa(t,e),"allowedOrigins"),maxAge:86400}),{global:!0}),"cors"),Vl=rd.layer.pipe(X.provide(Ne.Config.layer)),dp=nd.pipe(X.provide(Ne.Config.layer)),KE=sd.pipe(X.provide(Ne.Config.layer)),JE=da.pipe(X.provide(Ne.Config.layer)),mp=Pd.pipe(X.provide($l.layerWebSocketConstructorGlobal)),XE=Rs.layer(So).pipe(X.provide([ku,wu,qu]),X.provide(Wa),X.provide(dp)),ZE=Rs.layer(un).pipe(X.provide(yu),X.provide([dp,mp,mi])),eD=Rs.layer(Sn).pipe(X.provide(zu),X.provide([KE,mp,mi])),tD=Rs.layer(W).pipe(X.provide([Du,vu,Cu,xu,Mu,Tu,Ou,Uu,Qu,Yu,Lu,Wu,tl,ol,rl,Ll])),oD=tD.pipe(X.provide([dp,mp,mi,Wa])),rD=Rs.layer(j).pipe(X.provide(ql),X.provide(_n.layer),X.provide([JE,Ml])),nD=Kn(()=>QE.jsonUnsafe(GE.fromApi(Hi))),sD=Wi.use(e=>e.add("GET","/doc",()=>_l.succeed(nD()))).pipe(X.provide(Vl)),iD=Wi.use(e=>_l.gen(function*(){let t=yield*po.Service,o=yield*_E.HttpClient,r=yield*Bn.Service;yield*e.add("*","/*",s=>Hc(s,{fs:t,client:o,disableEmbeddedWebUi:r.disableEmbeddedWebUi}))})).pipe(X.provide(Vl)),aD=xs.group([Fp.node,po.node,Eo.node,_t.node,Bs.node,kt.node,zp.node,Yp.node,Ls.node,Jp.node,Qs.node,Qr.node,js.node,Me.node,rt.node,zt.node,Br.node,Zp.node,Vt.node,pr.node,Fn.node,Gr.node,z.node,Mp.node,Po.node,$s.node,Bn.node,$t.node,zs.node,nc.node,Ks.node,$r.node,_r.node,Qt.node,ic.node,Ys.node,qo.node,qe.node,oc.node,Mo.node,ac.node,Js.node,Vr.node,dt.node,mt.node,fe.node,mo.node,Gn.node,lc.node,ei.node,wt.node,Ip,le.node,Be.node,Tt.node,Rt.node]);function Ql(e){let t=_p();return X.mergeAll(XE,ZE,eD,oD,rD,sD,iD).pipe(X.provide([Wl,Nl,jl,Gl,YE(e),Zs.build(Lt.node,[[_e.node,t]]),VE.layerServices]),X.provide(X.succeed(dr)(e)),X.provide(su),X.provide(nu),X.provide(Kt.layer),X.provide(Zs.build(Dt.node,[[_e.node,t],[Nr.node,Ec]])),X.provide(t),X.provide(Zs.build(aD)),X.provideMerge(jp))}n(Ql,"createRoutes");var zl=Ql(),pD=Kn(()=>Wi.toWebHandler(zl,{disableLogger:!0,memoMap:Up,middleware:Pi}));globalThis.AI_SDK_LOG_WARNINGS=!1;var Cs=class extends Bi.Service()("@opencode/ListenerServer"){static{n(this,"ListenerServerService")}},fD=Kn(()=>{let e=rr.webHandler().handler,t={fetch:n(o=>e(o,rr.context),"fetch"),request(o,r){return t.fetch(o instanceof Request?o:new Request(new URL(o,"http://localhost"),r))}};return{app:t}});async function yD(){return uD.fromApi(Hi)}n(yD,"openapi");var Gi;async function gD(e){let t=await se.runPromise(hD(e));return{hostname:t.hostname,port:t.port,url:t.url,stop:n(o=>se.runPromiseExit(t.stop(o)).then(()=>{}),"stop")}}n(gD,"listen");var hD=se.fn("Server.listen")(function*(e){let t=yield*vD(e),o=yield*ID(t),r=AD(e.hostname,o.port),s=yield*ED(e,o.port,t.scope);return Gi=r,{hostname:e.hostname,port:o.port,url:r,stop:yield*DD(t,s,r)}});function SD(e,t){return dD.serve(rr.createRoutes(e),{middleware:Pi,disableLogger:!0,disableListenLog:!0}).pipe(Tr.provideMerge($p.build(Qe.node)),Tr.provideMerge(wD({port:t,hostname:e.hostname})),Tr.provide(Yl.layer(Yl.fromEnv())))}n(SD,"listenerLayer");function vD(e){return e.port!==0?up(e,e.port):up(e,4096).pipe(se.catch(()=>up(e,0)))}n(vD,"startWithPortFallback");function up(e,t){let o=bs.makeUnsafe();return Tr.buildWithMemoMap(SD(e,t),Tr.makeMemoMapUnsafe(),o).pipe(se.provide(rr.context),se.onError(()=>bs.close(o,lp.void).pipe(se.ignore)),se.map(r=>({scope:o,server:Bi.get(r,mD.HttpServer),http:Bi.get(r,Cs),websockets:Bi.get(r,Qe.Service)})))}n(up,"startListener");function ID(e){return se.gen(function*(){return e.server.address._tag==="TcpAddress"?e.server.address:(yield*bs.close(e.scope,lp.void).pipe(se.ignore),yield*se.die(new Error(`Unexpected HttpServer address tag: ${e.server.address._tag}`)))})}n(ID,"tcpAddress");function AD(e,t){let o=new URL("http://localhost");return o.hostname=e,o.port=String(t),o}n(AD,"makeURL");function ED(e,t,o){return se.gen(function*(){if(e.mdns&&t&&e.hostname!=="127.0.0.1"&&e.hostname!=="localhost"&&e.hostname!=="::1"){let s=yield*se.cached(se.sync(()=>zr.unpublish()));return yield*se.sync(()=>zr.publish(t,e.mdnsDomain)),yield*bs.addFinalizer(o,s),s}return e.mdns&&(yield*se.logWarning("mDNS enabled but hostname is loopback; skipping mDNS publish")),se.void})}n(ED,"setupMdns");function DD(e,t,o){return se.gen(function*(){let r=yield*se.cached(kD(e).pipe(se.ignore)),s=yield*se.cached(bs.close(e.scope,lp.void).pipe(se.ignore,se.ensuring(se.sync(()=>{Gi===o&&(Gi=void 0)}))));return i=>se.gen(function*(){yield*t,i&&(yield*r),yield*s})})}n(DD,"makeStop");function kD(e){return se.all([e.http.closeAll,e.websockets.closeAll],{concurrency:"unbounded",discard:!0})}n(kD,"forceClose");function wD(e){let t=lD(),o={closeStarted:!1,forceStop:!1},r=t.close.bind(t);return t.close=(s=>{o.closeStarted=!0;let i=r(s);return o.forceStop&&t.closeAllConnections(),i}),Tr.mergeAll(cD.layer(()=>t,{port:e.port,host:e.hostname,gracefulShutdownTimeout:"1 second"}),Tr.succeed(Cs)(Cs.of({closeAll:se.sync(()=>{o.forceStop=!0,o.closeStarted&&t.closeAllConnections()})})))}n(wD,"serverLayer");export{fD as Default,fp as Server,gD as listen,yD as openapi,Gi as url};