alchemylab-opencode 1.0.23 → 1.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/NODE_COMPAT.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # OpenCode Node.js Compatibility
2
2
 
3
- OpenCode serve mode has been patched to run on Node.js 24+ without Bun.
3
+ OpenCode serve mode has been patched to run on Node.js (22.16+ for the bundle, 24+ for the source) without Bun.
4
4
  This document describes what was changed, why, and how to run it.
5
5
 
6
6
  ## Quick Start
7
7
 
8
8
  ```bash
9
- # Requires Node.js 24+
9
+ # Running the source needs Node.js 24+ (the published bundle runs on 22.16+)
10
10
  node --experimental-strip-types --experimental-transform-types \
11
11
  --import ./packages/opencode/src/node-preload.mjs \
12
12
  packages/opencode/src/serve.ts --port 4096
@@ -34,18 +34,19 @@ By default, OpenCode stores data in `~/.local/share/opencode/`. The `--data-dir`
34
34
 
35
35
  Config and bin cache stay global so user preferences and downloaded tools are shared.
36
36
 
37
- ## Why Node.js 24?
37
+ ## Which Node
38
38
 
39
- | Node Version | Status | Issue |
40
- |--------------|--------|-------|
41
- | 22 LTS | ❌ | `tsx` injects esbuild `__name` helper that breaks Effect framework |
42
- | 23 | ❌ | V8 crash in async ESM module evaluation (`AsyncModuleExecutionFulfilled`) |
43
- | 24 LTS | ✅ | Native `--experimental-strip-types` avoids esbuild entirely |
44
- | 25+ | ✅ | Should work (untested) |
39
+ | Node Version | Status | Why |
40
+ |--------------|--------|-----|
41
+ | 20 | no | no `node:sqlite` |
42
+ | 22.0 to 22.15 | no | drizzle's node-sqlite driver calls `StatementSync.setReturnArrays`, added in 22.16 |
43
+ | 22.16+ | yes | the published bundle (`dist/`) runs as is |
44
+ | 23 | no | V8 crash in async ESM evaluation; end of life |
45
+ | 24+ | yes | also runs the TypeScript source directly (Quick Start above) |
45
46
 
46
- Node 24's native TypeScript stripping means no transpiler is needed. The code runs
47
- as-is with types stripped at load time. This avoids the `__name` injection that
48
- `tsx`/`esbuild` add and that Bun provides globally but Node doesn't.
47
+ The published package is an esbuild bundle, so running it needs no TypeScript
48
+ stripping and no `tsx` (whose `__name` helper broke Effect on 22). Running the
49
+ source directly, as in Quick Start, still needs Node 24's `--experimental-strip-types`.
49
50
 
50
51
  ## Architecture
51
52
 
@@ -9,5 +9,5 @@ if (typeof globalThis.Bun === 'undefined') {
9
9
  if (typeof globalThis.__name === 'undefined') { globalThis.__name = (t, n) => { Object.defineProperty(t, 'name', { value: n, configurable: true }); return t; }; }
10
10
  if (typeof globalThis.__export === 'undefined') { globalThis.__export = (t, a) => { for (const k in a) Object.defineProperty(t, k, { get: a[k], enumerable: true }); }; }
11
11
 
12
- import{a as Pt}from"./chunk-LTCXIXYM.js";import{a as tt,c as Te,d as Oe,e as ee}from"./chunk-M4CB72HE.js";import{a as e,c as zt,d as z}from"./chunk-MBZTOEAD.js";import{Effect as wr,Layer as vr,ManagedRuntime as Lr}from"effect";import{EventEmitter as Ht}from"events";var $e=new Ht;var rt=new Set;function Ot(t){return rt.add(t),()=>{rt.delete(t)}}e(Ot,"registerDisposer");async function ot(t){await Promise.allSettled([...rt].map(r=>r(t)))}e(ot,"disposeInstance");function be(t){return t()}e(be,"iife");import{AsyncLocalStorage as Xt}from"async_hooks";var te;(l=>{class t extends Error{constructor(g){super(`No context found for ${g}`);this.name=g}name;static{e(this,"NotFound")}}l.NotFound=t;function r(u){let _=new Xt;return{use(){let g=_.getStore();if(!g)throw new t(u);return g},provide(g,T){return _.run(g,T)}}}l.create=r,e(r,"create")})(te||={});import K from"zod";var A={};zt(A,{Database:()=>_e,NotFoundError:()=>tr});z(A,wo);import{migrate as Dt}from"drizzle-orm/node-sqlite/migrator";import*as wo from"drizzle-orm";function ze(t){let r,l=!1,u=e(()=>{if(l)return r;try{return r=t(),l=!0,r}catch(_){throw _}},"result");return u.reset=()=>{l=!1,r=void 0},u}e(ze,"lazy");import He from"zod";var Xe=class t extends Error{static{e(this,"NamedError")}static create(r,l){let u=He.object({name:He.literal(r),data:l}).meta({ref:r}),_=class extends t{constructor(T,J){super(r,J);this.data=T;this.name=r}data;static{e(this,"result")}static Schema=u;name=r;static isInstance(T){return typeof T=="object"&&"name"in T&&T.name===r}schema(){return u}toObject(){return{name:r,data:this.data}}};return Object.defineProperty(_,"name",{value:r}),_}static Unknown=t.create("UnknownError",He.object({message:He.string()}))};import gt from"zod";import Ce from"path";import{readFileSync as Zt,readdirSync as Qt,existsSync as er}from"fs";import{Config as ge}from"effect";function b(t){let r=process.env[t]?.toLowerCase();return r==="true"||r==="1"}e(b,"truthy");function Kt(t){let r=process.env[t]?.toLowerCase();return r==="false"||r==="0"}e(Kt,"falsy");var H;(f=>{f.OPENCODE_AUTO_SHARE=b("OPENCODE_AUTO_SHARE"),f.OPENCODE_AUTO_HEAP_SNAPSHOT=b("OPENCODE_AUTO_HEAP_SNAPSHOT"),f.OPENCODE_GIT_BASH_PATH=process.env.OPENCODE_GIT_BASH_PATH,f.OPENCODE_CONFIG=process.env.OPENCODE_CONFIG,f.OPENCODE_CONFIG_CONTENT=process.env.OPENCODE_CONFIG_CONTENT,f.OPENCODE_DISABLE_AUTOUPDATE=b("OPENCODE_DISABLE_AUTOUPDATE"),f.OPENCODE_ALWAYS_NOTIFY_UPDATE=b("OPENCODE_ALWAYS_NOTIFY_UPDATE"),f.OPENCODE_DISABLE_PRUNE=b("OPENCODE_DISABLE_PRUNE"),f.OPENCODE_DISABLE_TERMINAL_TITLE=b("OPENCODE_DISABLE_TERMINAL_TITLE"),f.OPENCODE_SHOW_TTFD=b("OPENCODE_SHOW_TTFD"),f.OPENCODE_PERMISSION=process.env.OPENCODE_PERMISSION,f.OPENCODE_DISABLE_DEFAULT_PLUGINS=b("OPENCODE_DISABLE_DEFAULT_PLUGINS"),f.OPENCODE_DISABLE_LSP_DOWNLOAD=b("OPENCODE_DISABLE_LSP_DOWNLOAD"),f.OPENCODE_ENABLE_EXPERIMENTAL_MODELS=b("OPENCODE_ENABLE_EXPERIMENTAL_MODELS"),f.OPENCODE_DISABLE_AUTOCOMPACT=b("OPENCODE_DISABLE_AUTOCOMPACT"),f.OPENCODE_DISABLE_MODELS_FETCH=b("OPENCODE_DISABLE_MODELS_FETCH"),f.OPENCODE_DISABLE_MOUSE=b("OPENCODE_DISABLE_MOUSE"),f.OPENCODE_DISABLE_CLAUDE_CODE=b("OPENCODE_DISABLE_CLAUDE_CODE"),f.OPENCODE_DISABLE_CLAUDE_CODE_PROMPT=f.OPENCODE_DISABLE_CLAUDE_CODE||b("OPENCODE_DISABLE_CLAUDE_CODE_PROMPT"),f.OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=f.OPENCODE_DISABLE_CLAUDE_CODE||b("OPENCODE_DISABLE_CLAUDE_CODE_SKILLS"),f.OPENCODE_DISABLE_EXTERNAL_SKILLS=f.OPENCODE_DISABLE_CLAUDE_CODE_SKILLS||b("OPENCODE_DISABLE_EXTERNAL_SKILLS"),f.OPENCODE_FAKE_VCS=process.env.OPENCODE_FAKE_VCS,f.OPENCODE_SERVER_PASSWORD=process.env.OPENCODE_SERVER_PASSWORD,f.OPENCODE_SERVER_USERNAME=process.env.OPENCODE_SERVER_USERNAME,f.OPENCODE_ENABLE_QUESTION_TOOL=b("OPENCODE_ENABLE_QUESTION_TOOL"),f.OPENCODE_EXPERIMENTAL=b("OPENCODE_EXPERIMENTAL"),f.OPENCODE_EXPERIMENTAL_FILEWATCHER=ge.boolean("OPENCODE_EXPERIMENTAL_FILEWATCHER").pipe(ge.withDefault(!1)),f.OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER=ge.boolean("OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER").pipe(ge.withDefault(!1)),f.OPENCODE_EXPERIMENTAL_ICON_DISCOVERY=f.OPENCODE_EXPERIMENTAL||b("OPENCODE_EXPERIMENTAL_ICON_DISCOVERY");let De=process.env.OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT;f.OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT=De===void 0?process.platform==="win32":b("OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"),f.OPENCODE_ENABLE_EXA=b("OPENCODE_ENABLE_EXA")||f.OPENCODE_EXPERIMENTAL||b("OPENCODE_EXPERIMENTAL_EXA"),f.OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS=Ae("OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS"),f.OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX=Ae("OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX"),f.OPENCODE_EXPERIMENTAL_OXFMT=f.OPENCODE_EXPERIMENTAL||b("OPENCODE_EXPERIMENTAL_OXFMT"),f.OPENCODE_EXPERIMENTAL_LSP_TY=b("OPENCODE_EXPERIMENTAL_LSP_TY"),f.OPENCODE_EXPERIMENTAL_LSP_TOOL=f.OPENCODE_EXPERIMENTAL||b("OPENCODE_EXPERIMENTAL_LSP_TOOL"),f.OPENCODE_DISABLE_FILETIME_CHECK=ge.boolean("OPENCODE_DISABLE_FILETIME_CHECK").pipe(ge.withDefault(!1)),f.OPENCODE_EXPERIMENTAL_PLAN_MODE=f.OPENCODE_EXPERIMENTAL||b("OPENCODE_EXPERIMENTAL_PLAN_MODE"),f.OPENCODE_EXPERIMENTAL_WORKSPACES=f.OPENCODE_EXPERIMENTAL||b("OPENCODE_EXPERIMENTAL_WORKSPACES"),f.OPENCODE_EXPERIMENTAL_MARKDOWN=!Kt("OPENCODE_EXPERIMENTAL_MARKDOWN"),f.OPENCODE_MODELS_URL=process.env.OPENCODE_MODELS_URL,f.OPENCODE_MODELS_PATH=process.env.OPENCODE_MODELS_PATH,f.OPENCODE_DISABLE_EMBEDDED_WEB_UI=b("OPENCODE_DISABLE_EMBEDDED_WEB_UI"),f.OPENCODE_DB=process.env.OPENCODE_DB,f.OPENCODE_DISABLE_CHANNEL_DB=b("OPENCODE_DISABLE_CHANNEL_DB"),f.OPENCODE_SKIP_MIGRATIONS=b("OPENCODE_SKIP_MIGRATIONS"),f.OPENCODE_STRICT_CONFIG_DEPS=b("OPENCODE_STRICT_CONFIG_DEPS");function Ae($t){let yt=process.env[$t];if(!yt)return;let et=Number(yt);return Number.isInteger(et)&&et>0?et:void 0}e(Ae,"number")})(H||={});Object.defineProperty(H,"OPENCODE_DISABLE_PROJECT_CONFIG",{get(){return b("OPENCODE_DISABLE_PROJECT_CONFIG")},enumerable:!0,configurable:!1});Object.defineProperty(H,"OPENCODE_TUI_CONFIG",{get(){return process.env.OPENCODE_TUI_CONFIG},enumerable:!0,configurable:!1});Object.defineProperty(H,"OPENCODE_CONFIG_DIR",{get(){return process.env.OPENCODE_CONFIG_DIR},enumerable:!0,configurable:!1});Object.defineProperty(H,"OPENCODE_PURE",{get(){return b("OPENCODE_PURE")},enumerable:!0,configurable:!1});Object.defineProperty(H,"OPENCODE_PLUGIN_META_FILE",{get(){return process.env.OPENCODE_PLUGIN_META_FILE},enumerable:!0,configurable:!1});Object.defineProperty(H,"OPENCODE_CLIENT",{get(){return process.env.OPENCODE_CLIENT??"cli"},enumerable:!0,configurable:!1});var Qr=typeof OPENCODE_VERSION=="string"?OPENCODE_VERSION:"local",nt=typeof OPENCODE_CHANNEL=="string"?OPENCODE_CHANNEL:"local";import{Effect as q,Fiber as Jt,ScopedCache as ve,ServiceMap as Vt}from"effect";import{ServiceMap as Wt}from"effect";var we=Wt.Reference("~opencode/InstanceRef",{defaultValue:e(()=>{},"defaultValue")});var _t="~opencode/InstanceState",Ke;(N=>(N.bind=e(p=>{try{return Z.bind(p)}catch(S){if(!(S instanceof te.NotFound))throw S}let s=Jt.getCurrent(),y=s?Vt.getReferenceUnsafe(s.services,we):void 0;return y?((...S)=>Z.restore(y,()=>p(...S))):p},"bind"),N.context=q.gen(function*(){return(yield*we)??Z.current}),N.directory=q.map(N.context,p=>p.directory),N.make=e(p=>q.gen(function*(){let s=yield*ve.make({capacity:Number.POSITIVE_INFINITY,lookup:e(()=>q.gen(function*(){return yield*p(yield*N.context)}),"lookup")}),y=Ot(S=>q.runPromise(ve.invalidate(s,S)));return yield*q.addFinalizer(()=>q.sync(y)),{[_t]:_t,cache:s}}),"make"),N.get=e(p=>q.gen(function*(){return yield*ve.get(p.cache,yield*N.directory)}),"get"),N.use=e((p,s)=>q.map((0,N.get)(p),s),"use"),N.useEffect=e((p,s)=>q.flatMap((0,N.get)(p),s),"useEffect"),N.has=e(p=>q.gen(function*(){return yield*ve.has(p.cache,yield*N.directory)}),"has"),N.invalidate=e(p=>q.gen(function*(){return yield*ve.invalidate(p.cache,yield*N.directory)}),"invalidate"),N.withALS=e(p=>q.map(N.context,s=>Z.restore(s,p)),"withALS")))(Ke||={});import{DatabaseSync as Yt}from"node:sqlite";import{drizzle as qt}from"drizzle-orm/node-sqlite";function St(t){let r=new Yt(t);return qt({client:r})}e(St,"init");var tr=Xe.create("NotFoundError",gt.object({message:gt.string()})),it=ee.create({service:"db"}),_e;(N=>{function t(){if(["latest","beta"].includes(nt)||H.OPENCODE_DISABLE_CHANNEL_DB)return Ce.join(Oe.Path.data,"opencode.db");let p=nt.replace(/[^a-zA-Z0-9._-]/g,"-");return Ce.join(Oe.Path.data,`opencode-${p}.db`)}N.getChannelPath=t,e(t,"getChannelPath"),N.Path=be(()=>H.OPENCODE_DB?H.OPENCODE_DB===":memory:"||Ce.isAbsolute(H.OPENCODE_DB)?H.OPENCODE_DB:Ce.join(Oe.Path.data,H.OPENCODE_DB):t());function l(p){let s=/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/.exec(p);return s?Date.UTC(Number(s[1]),Number(s[2])-1,Number(s[3]),Number(s[4]),Number(s[5]),Number(s[6])):0}e(l,"time");function u(p){return Qt(p,{withFileTypes:!0}).filter(S=>S.isDirectory()).map(S=>S.name).map(S=>{let X=Ce.join(p,S,"migration.sql");if(er(X))return{sql:Zt(X,"utf-8"),timestamp:l(S),name:S}}).filter(Boolean).sort((S,X)=>S.timestamp-X.timestamp)}e(u,"migrations"),N.Client=ze(()=>{it.info("opening database",{path:N.Path});let p=St(N.Path);p.run("PRAGMA journal_mode = WAL"),p.run("PRAGMA synchronous = NORMAL"),p.run("PRAGMA busy_timeout = 5000"),p.run("PRAGMA cache_size = -64000"),p.run("PRAGMA foreign_keys = ON"),p.run("PRAGMA wal_checkpoint(PASSIVE)");let s=Ce.join(import.meta.dirname,"../packages/opencode/migration");if(typeof OPENCODE_MIGRATIONS<"u"){let y=OPENCODE_MIGRATIONS;if(y.length>0){if(it.info("applying migrations",{count:y.length,mode:"bundled"}),H.OPENCODE_SKIP_MIGRATIONS)for(let S of y)S.sql="select 1;";Dt(p,y)}}else{let y=u(s);it.info("applying migrations",{count:y.length,mode:"dev"}),!H.OPENCODE_SKIP_MIGRATIONS&&y.length>0&&Dt(p,{migrationsFolder:s})}return p});function g(){(0,N.Client)().$client.close(),N.Client.reset()}N.close=g,e(g,"close");let T=te.create("database");function J(p){try{return p(T.use().tx)}catch(s){if(s instanceof te.NotFound){let y=[],S=T.provide({effects:y,tx:(0,N.Client)()},()=>p((0,N.Client)()));for(let X of y)X();return S}throw s}}N.use=J,e(J,"use");function F(p){let s=Ke.bind(p);try{T.use().effects.push(s)}catch{s()}}N.effect=F,e(F,"effect");function W(p,s){try{return p(T.use().tx)}catch(y){if(y instanceof te.NotFound){let S=[],X=Ke.bind(ne=>T.provide({tx:ne,effects:S},()=>p(ne))),ye=(0,N.Client)().transaction(X,{behavior:s?.behavior});for(let ne of S)ne();return ye}throw y}}N.transaction=W,e(W,"transaction")})(_e||={});import{sqliteTable as rr,text as ue,integer as or}from"drizzle-orm/sqlite-core";import{integer as Ct}from"drizzle-orm/sqlite-core";var Ee={time_created:Ct().notNull().$default(()=>Date.now()),time_updated:Ct().notNull().$onUpdate(()=>Date.now())};var w=rr("project",{id:ue().$type().primaryKey(),worktree:ue().notNull(),vcs:ue(),name:ue(),icon_url:ue(),icon_color:ue(),...Ee,time_initialized:or(),sandboxes:ue({mode:"json"}).notNull().$type(),commands:ue({mode:"json"}).$type()});import{sqliteTable as Le,text as R,integer as Ne,index as Se,primaryKey as nr}from"drizzle-orm/sqlite-core";var he=Le("session",{id:R().$type().primaryKey(),project_id:R().$type().notNull().references(()=>w.id,{onDelete:"cascade"}),workspace_id:R().$type(),parent_id:R().$type(),slug:R().notNull(),directory:R().notNull(),title:R().notNull(),version:R().notNull(),share_url:R(),summary_additions:Ne(),summary_deletions:Ne(),summary_files:Ne(),summary_diffs:R({mode:"json"}).$type(),revert:R({mode:"json"}).$type(),permission:R({mode:"json"}).$type(),...Ee,metadata:R({mode:"json"}).$type(),time_compacting:Ne(),time_archived:Ne()},t=>[Se("session_project_idx").on(t.project_id),Se("session_workspace_idx").on(t.workspace_id),Se("session_parent_idx").on(t.parent_id)]),ir=Le("message",{id:R().$type().primaryKey(),session_id:R().$type().notNull().references(()=>he.id,{onDelete:"cascade"}),...Ee,data:R({mode:"json"}).notNull().$type()},t=>[Se("message_session_time_created_id_idx").on(t.session_id,t.time_created,t.id)]),Go=Le("part",{id:R().$type().primaryKey(),message_id:R().$type().notNull().references(()=>ir.id,{onDelete:"cascade"}),session_id:R().$type().notNull(),...Ee,data:R({mode:"json"}).notNull().$type()},t=>[Se("part_message_id_id_idx").on(t.message_id,t.id),Se("part_session_idx").on(t.session_id)]),$o=Le("todo",{session_id:R().$type().notNull().references(()=>he.id,{onDelete:"cascade"}),content:R().notNull(),status:R().notNull(),priority:R().notNull(),position:Ne().notNull(),...Ee},t=>[nr({columns:[t.session_id,t.position]}),Se("todo_session_idx").on(t.session_id)]),zo=Le("permission",{project_id:R().primaryKey().references(()=>w.id,{onDelete:"cascade"}),...Ee,data:R({mode:"json"}).notNull().$type()});import st from"zod";var ct;(u=>{let t=new Map;function r(_,g){let T={type:_,properties:g};return t.set(_,T),T}u.define=r,e(r,"define");function l(){return st.discriminatedUnion("type",t.entries().map(([_,g])=>st.object({type:st.literal(_),properties:g.properties}).meta({ref:"Event."+g.type})).toArray()).meta({ref:"Event"})}u.payloads=l,e(l,"payloads")})(ct||={});import sr from"which";import cr from"path";function at(t,r){let l=r?.PATH??r?.Path??process.env.PATH??process.env.Path??"",u=l?l+cr.delimiter+Oe.Path.bin:Oe.Path.bin,_=sr.sync(t,{nothrow:!0,path:u,pathExt:r?.PATHEXT??r?.PathExt??process.env.PATHEXT??process.env.PathExt});return typeof _=="string"?_:null}e(at,"which");import{Schema as Nt}from"effect";import ht from"zod";var ar=Nt.String.pipe(Nt.brand("ProjectID")),re=ar.pipe(Pt(t=>({global:t.makeUnsafe("global"),make:e(r=>t.makeUnsafe(r),"make"),zod:ht.string().pipe(ht.custom())})));import{Effect as I,Layer as Ye,Path as hr,Scope as Ir,ServiceMap as xr,Stream as qe}from"effect";import{ChildProcess as Ar,ChildProcessSpawner as Tr}from"effect/unstable/process";import{NodePath as br}from"@effect/platform-node";import{NodeFileSystem as dr}from"@effect/platform-node";import{dirname as We,join as dt,relative as ft,resolve as It}from"path";import{realpathSync as xt}from"fs";import*as Ve from"fs/promises";import{lookup as fr}from"mime-types";import{Effect as M,FileSystem as pr,Layer as At,Schema as Je,ServiceMap as lr}from"effect";var Ie;(p=>{class t extends Je.TaggedErrorClass()("FileSystemError",{method:Je.String,cause:Je.optional(Je.Defect)}){static{e(this,"FileSystemError")}}p.FileSystemError=t;class r extends lr.Service()("@opencode/FileSystem"){static{e(this,"Service")}}p.Service=r,p.layer=At.effect(r,M.gen(function*(){let s=yield*pr.FileSystem,y=M.fn("FileSystem.existsSafe")(function*(c){return yield*s.exists(c).pipe(M.orElseSucceed(()=>!1))}),S=M.fn("FileSystem.isDir")(function*(c){return(yield*s.stat(c).pipe(M.catch(()=>M.void)))?.type==="Directory"}),X=M.fn("FileSystem.isFile")(function*(c){return(yield*s.stat(c).pipe(M.catch(()=>M.void)))?.type==="File"}),ye=M.fn("FileSystem.readDirectoryEntries")(function*(c){return yield*M.tryPromise({try:e(async()=>(await Ve.readdir(c,{withFileTypes:!0})).map(h=>({name:h.name,type:h.isDirectory()?"directory":h.isSymbolicLink()?"symlink":h.isFile()?"file":"other"})),"try"),catch:e(d=>new t({method:"readDirectoryEntries",cause:d}),"catch")})}),ne=M.fn("FileSystem.readJson")(function*(c){let d=yield*s.readFileString(c);return JSON.parse(d)}),fe=M.fn("FileSystem.writeJson")(function*(c,d,h){let v=JSON.stringify(d,null,2),x=`${c}.tmp-${process.pid}-${Math.random().toString(36).slice(2,8)}`;yield*s.writeFileString(x,v),h&&(yield*s.chmod(x,h)),yield*M.tryPromise({try:e(()=>Ve.rename(x,c),"try"),catch:e(k=>new t({method:"writeJson.rename",cause:k}),"catch")})}),o=M.fn("FileSystem.ensureDir")(function*(c){yield*s.makeDirectory(c,{recursive:!0})}),n=M.fn("FileSystem.writeWithDirs")(function*(c,d,h){let v=typeof d=="string"?s.writeFileString(c,d):s.writeFile(c,d);yield*v.pipe(M.catchIf(x=>x.reason._tag==="NotFound",()=>M.gen(function*(){yield*s.makeDirectory(We(c),{recursive:!0}),yield*v}))),h&&(yield*s.chmod(c,h))}),i=M.fn("FileSystem.glob")(function*(c,d){return yield*M.tryPromise({try:e(()=>tt.scan(c,d),"try"),catch:e(h=>new t({method:"glob",cause:h}),"catch")})}),P=M.fn("FileSystem.findUp")(function*(c,d,h){let v=[],x=d;for(;;){let k=dt(x,c);if((yield*s.exists(k))&&v.push(k),h===x)break;let B=We(x);if(B===x)break;x=B}return v}),D=M.fn("FileSystem.up")(function*(c){let d=[],h=c.start;for(;;){for(let x of c.targets){let k=dt(h,x);(yield*s.exists(k))&&d.push(k)}if(c.stop===h)break;let v=We(h);if(v===h)break;h=v}return d}),m=M.fn("FileSystem.globUp")(function*(c,d,h){let v=[],x=d;for(;;){let k=yield*i(c,{cwd:x,absolute:!0,include:"file",dot:!0}).pipe(M.catch(()=>M.succeed([])));if(v.push(...k),h===x)break;let B=We(x);if(B===x)break;x=B}return v});return r.of({...s,existsSafe:y,isDir:S,isFile:X,readDirectoryEntries:ye,readJson:ne,writeJson:fe,ensureDir:o,writeWithDirs:n,findUp:P,up:D,globUp:m,glob:i,globMatch:tt.match})})),p.defaultLayer=p.layer.pipe(At.provide(dr.layer));function _(s){return fr(s)||"application/octet-stream"}p.mimeType=_,e(_,"mimeType");function g(s){if(process.platform!=="win32")return s;let y=It(F(s));try{return xt.native(y)}catch{return y}}p.normalizePath=g,e(g,"normalizePath");function T(s){if(process.platform!=="win32"||s==="*")return s;let y=s.match(/^(.*)[\\/]\*$/);if(!y)return g(s);let S=/^[A-Za-z]:$/.test(y[1])?y[1]+"\\":y[1];return dt(g(S),"*")}p.normalizePathPattern=T,e(T,"normalizePathPattern");function J(s){let y=It(F(s));try{return g(xt(y))}catch(S){if(S?.code==="ENOENT")return g(y);throw S}}p.resolve=J,e(J,"resolve");function F(s){return process.platform!=="win32"?s:s.replace(/^\/([a-zA-Z]):(?:[\\/]|$)/,(y,S)=>`${S.toUpperCase()}:/`).replace(/^\/([a-zA-Z])(?:\/|$)/,(y,S)=>`${S.toUpperCase()}:/`).replace(/^\/cygdrive\/([a-zA-Z])(?:\/|$)/,(y,S)=>`${S.toUpperCase()}:/`).replace(/^\/mnt\/([a-zA-Z])(?:\/|$)/,(y,S)=>`${S.toUpperCase()}:/`)}p.windowsPath=F,e(F,"windowsPath");function W(s,y){let S=ft(s,y),X=ft(y,s);return!S||!S.startsWith("..")||!X||!X.startsWith("..")}p.overlaps=W,e(W,"overlaps");function N(s,y){return!ft(s,y).startsWith("..")}p.contains=N,e(N,"contains")})(Ie||={});import{NodeFileSystem as Er,NodeSink as Tt,NodeStream as pt}from"@effect/platform-node";import*as bt from"@effect/platform-node/NodePath";import*as Y from"effect/Deferred";import*as a from"effect/Effect";import*as wt from"effect/Exit";import*as vt from"effect/FileSystem";import*as Re from"effect/Layer";import*as Lt from"effect/Path";import*as Rt from"effect/PlatformError";import*as V from"effect/Predicate";import*as ce from"effect/Sink";import*as G from"effect/Stream";import*as ae from"effect/unstable/process/ChildProcess";import{ChildProcessSpawner as kt,ExitCode as ur,make as mr,makeHandle as yr,ProcessId as Pr}from"effect/unstable/process/ChildProcessSpawner";import*as Mt from"node:child_process";import{PassThrough as Or}from"node:stream";import _r from"cross-spawn";var me=e(t=>t instanceof globalThis.Error?t:new globalThis.Error(String(t)),"toError"),Sr=e(t=>{switch(t.code){case"ENOENT":return"NotFound";case"EACCES":return"PermissionDenied";case"EEXIST":return"AlreadyExists";case"EISDIR":return"BadResource";case"ENOTDIR":return"BadResource";case"EBUSY":return"Busy";case"ELOOP":return"BadResource";default:return"Unknown"}},"toTag"),jt=e(t=>{let r=[],l=[],u=e(T=>{switch(T._tag){case"StandardCommand":r.push(T);return;case"PipedCommand":u(T.left),l.push(T.options),u(T.right);return}},"walk");if(u(t),r.length===0)throw new Error("flatten produced empty commands array");let[_,...g]=r;return{commands:[_,...g],opts:l}},"flatten"),se=e((t,r,l)=>{let u=jt(l).commands.map(_=>`${_.command} ${_.args.join(" ")}`).join(" | ");return Rt.systemError({_tag:Sr(r),module:"ChildProcess",method:t,pathOrDescriptor:u,syscall:r.syscall,cause:r})},"toPlatformError"),Dr=a.gen(function*(){let t=yield*vt.FileSystem,r=yield*Lt.Path,l=a.fnUntraced(function*(o){if(!V.isUndefined(o.cwd))return yield*t.access(o.cwd),r.resolve(o.cwd)}),u=e(o=>o.extendEnv?{...globalThis.process.env,...o.env}:o.env,"env"),_=e(o=>G.isStream(o)?"pipe":o,"input"),g=e(o=>ce.isSink(o)?"pipe":o,"output"),T=e(o=>{let n={stream:"pipe",encoding:"utf-8",endOnDone:!0};return V.isUndefined(o.stdin)?n:typeof o.stdin=="string"?{...n,stream:o.stdin}:G.isStream(o.stdin)?{...n,stream:o.stdin}:{stream:o.stdin.stream,encoding:o.stdin.encoding??n.encoding,endOnDone:o.stdin.endOnDone??n.endOnDone}},"stdin"),J=e((o,n)=>{let i=o[n];return V.isUndefined(i)?{stream:"pipe"}:typeof i=="string"?{stream:i}:ce.isSink(i)?{stream:i}:{stream:i.stream}},"stdio"),F=e(o=>V.isUndefined(o.additionalFds)?[]:Object.entries(o.additionalFds).flatMap(([n,i])=>{let P=ae.parseFdName(n);return V.isUndefined(P)?[]:[{fd:P,config:i}]}).toSorted((n,i)=>n.fd-i.fd),"fds"),W=e((o,n,i,P)=>{let D=e(d=>process.platform==="win32"&&d==="pipe"?"overlapped":d,"pipe"),m=[D(_(o.stream)),D(g(n.stream)),D(g(i.stream))];if(P.length===0)return m;let c=P.reduce((d,h)=>Math.max(d,h.fd),2);for(let d=3;d<=c;d++)m[d]="ignore";for(let d of P)m[d.fd]=D("pipe");return m},"stdios"),N=a.fnUntraced(function*(o,n,i){if(i.length===0)return{getInputFd:e(()=>ce.drain,"getInputFd"),getOutputFd:e(()=>G.empty,"getOutputFd")};let P=new Map,D=new Map;for(let m of i){let c=n.stdio[m.fd];switch(m.config.type){case"input":{let d=ce.drain;c&&"write"in c&&(d=Tt.fromWritable({evaluate:e(()=>c,"evaluate"),onError:e(h=>se(`fromWritable(fd${m.fd})`,me(h),o),"onError"),endOnDone:!0})),m.config.stream&&(yield*a.forkScoped(G.run(m.config.stream,d))),P.set(m.fd,d);break}case"output":{let d=G.empty;if(c&&"read"in c){let h=new Or;c.on("error",v=>h.destroy(me(v))),c.pipe(h),d=pt.fromReadable({evaluate:e(()=>h,"evaluate"),onError:e(v=>se(`fromReadable(fd${m.fd})`,me(v),o),"onError")})}m.config.sink&&(d=G.transduce(d,m.config.sink)),D.set(m.fd,d);break}}}return{getInputFd:e(m=>P.get(m)??ce.drain,"getInputFd"),getOutputFd:e(m=>D.get(m)??G.empty,"getOutputFd")}}),p=e((o,n,i)=>a.suspend(()=>{let P=ce.drain;return V.isNotNull(n.stdin)&&(P=Tt.fromWritable({evaluate:e(()=>n.stdin,"evaluate"),onError:e(D=>se("fromWritable(stdin)",me(D),o),"onError"),endOnDone:i.endOnDone,encoding:i.encoding})),G.isStream(i.stream)?a.as(a.forkScoped(G.run(i.stream,P)),P):a.succeed(P)}),"setupStdin"),s=e((o,n,i,P)=>{let D=n.stdout?pt.fromReadable({evaluate:e(()=>n.stdout,"evaluate"),onError:e(c=>se("fromReadable(stdout)",me(c),o),"onError")}):G.empty,m=n.stderr?pt.fromReadable({evaluate:e(()=>n.stderr,"evaluate"),onError:e(c=>se("fromReadable(stderr)",me(c),o),"onError")}):G.empty;return ce.isSink(i.stream)&&(D=G.transduce(D,i.stream)),ce.isSink(P.stream)&&(m=G.transduce(m,P.stream)),{stdout:D,stderr:m,all:G.merge(D,m)}},"setupOutput"),y=e((o,n)=>a.callback(i=>{let P=Y.makeUnsafe(),D=_r(o.command,o.args,n),m=!1,c;return D.on("error",d=>{i(a.fail(se("spawn",d,o)))}),D.on("exit",(...d)=>{c=d}),D.on("close",(...d)=>{m||(m=!0,Y.doneUnsafe(P,wt.succeed(c??d)))}),D.on("spawn",()=>{i(a.succeed([D,P]))}),a.sync(()=>{D.kill("SIGTERM")})}),"spawn"),S=e((o,n,i)=>globalThis.process.platform==="win32"?a.callback(P=>{Mt.exec(`taskkill /pid ${n.pid} /T /F`,{windowsHide:!0},D=>{if(D)return P(a.fail(se("kill",me(D),o)));P(a.void)})}):a.try({try:e(()=>{globalThis.process.kill(-n.pid,i)},"try"),catch:e(P=>se("kill",me(P),o),"catch")}),"killGroup"),X=e((o,n,i)=>a.suspend(()=>n.kill(i)?a.void:a.fail(se("kill",new Error("Failed to kill child process"),o))),"killOne"),ye=e((o,n,i)=>P=>{let D=i?.killSignal??"SIGTERM";return V.isUndefined(i?.forceKillAfter)?P(n,o,D):a.timeoutOrElse(P(n,o,D),{duration:i.forceKillAfter,orElse:e(()=>P(n,o,"SIGKILL"),"orElse")})},"timeout"),ne=e((o,n)=>{let i=n??"stdout";switch(i){case"stdout":return o.stdout;case"stderr":return o.stderr;case"all":return o.all;default:{let P=ae.parseFdName(i);return V.isNotUndefined(P)?o.getOutputFd(P):o.stdout}}},"source"),fe=a.fnUntraced(function*(o){switch(o._tag){case"StandardCommand":{let n=T(o.options),i=J(o.options,"stdout"),P=J(o.options,"stderr"),D=F(o.options),m=yield*l(o.options),[c,d]=yield*a.acquireRelease(y(o,{cwd:m,env:u(o.options),stdio:W(n,i,P,D),detached:o.options.detached??process.platform!=="win32",shell:o.options.shell,windowsHide:process.platform==="win32"}),a.fnUntraced(function*([x,k]){let B=yield*Y.isDone(k),Pe=ye(x,o,o.options);if(B){let[le]=yield*Y.await(k);return process.platform==="win32"?yield*a.void:le!==0&&V.isNotNull(le)?yield*a.ignore(Pe(S)):yield*a.void}let pe=e(le=>a.catch(S(o,x,le),()=>X(o,x,le)),"send"),xe=o.options.killSignal??"SIGTERM",De=pe(xe).pipe(a.andThen(Y.await(k)),a.asVoid),Ue=o.options.forceKillAfter?a.timeoutOrElse(De,{duration:o.options.forceKillAfter,orElse:e(()=>pe("SIGKILL").pipe(a.andThen(Y.await(k)),a.asVoid),"orElse")}):De;return yield*a.ignore(Ue)})),h=yield*N(o,c,D),v=s(o,c,i,P);return yr({pid:Pr(c.pid),stdin:yield*p(o,c,n),stdout:v.stdout,stderr:v.stderr,all:v.all,getInputFd:h.getInputFd,getOutputFd:h.getOutputFd,isRunning:a.map(Y.isDone(d),x=>!x),exitCode:a.flatMap(Y.await(d),([x,k])=>V.isNotNull(x)?a.succeed(ur(x)):a.fail(se("exitCode",new Error(`Process interrupted due to receipt of signal: '${k}'`),o))),kill:e(x=>{let k=x?.killSignal??"SIGTERM",B=e(pe=>a.catch(S(o,c,pe),()=>X(o,c,pe)),"send"),Pe=B(k).pipe(a.andThen(Y.await(d)),a.asVoid);return x?.forceKillAfter?a.timeoutOrElse(Pe,{duration:x.forceKillAfter,orElse:e(()=>B("SIGKILL").pipe(a.andThen(Y.await(d)),a.asVoid),"orElse")}):Pe},"kill")})}case"PipedCommand":{let n=jt(o),[i,...P]=n.commands,D=fe(i);for(let m=0;m<P.length;m++){let c=P[m],d=n.opts[m]??{},h=T(c.options),v=G.unwrap(a.map(D,B=>ne(B,d.from))),x=d.to??"stdin";if(x==="stdin"){D=fe(ae.make(c.command,c.args,{...c.options,stdin:{...h,stream:v}}));continue}let k=ae.parseFdName(x);if(V.isUndefined(k)){D=fe(ae.make(c.command,c.args,{...c.options,stdin:{...h,stream:v}}));continue}D=fe(ae.make(c.command,c.args,{...c.options,additionalFds:{...c.options.additionalFds,[ae.fdName(k)]:{type:"input",stream:v}}}))}return yield*D}}});return mr(fe)}),gr=Re.effect(kt,Dr),lt=gr.pipe(Re.provide(Er.layer),Re.provide(bt.layer)),Cr=ze(async()=>{let{makeRuntime:t}=await import("./run-service-IUIOP7ZW.js");return t(kt,lt)}),On=e(async(...t)=>(await Cr()).runPromiseExit(...t),"runPromiseExit");var Et;(o=>{let t=ee.create({service:"project"});o.Info=K.object({id:re.zod,worktree:K.string(),vcs:K.literal("git").optional(),name:K.string().optional(),icon:K.object({url:K.string().optional(),override:K.string().optional(),color:K.string().optional()}).optional(),commands:K.object({start:K.string().optional().describe("Startup script to run when creating a new workspace (worktree)")}).optional(),time:K.object({created:K.number(),updated:K.number(),initialized:K.number().optional()}),sandboxes:K.array(K.string())}).meta({ref:"Project"}),o.Event={Updated:ct.define("project.updated",o.Info)};function u(n){let i=n.icon_url||n.icon_color?{url:n.icon_url??void 0,color:n.icon_color??void 0}:void 0;return{id:n.id,worktree:n.worktree,vcs:n.vcs?o.Info.shape.vcs.parse(n.vcs):void 0,name:n.name??void 0,icon:i,time:{created:n.time_created,updated:n.time_updated,initialized:n.time_initialized??void 0},sandboxes:n.sandboxes,commands:n.commands??void 0}}o.fromRow=u,e(u,"fromRow"),o.UpdateInput=K.object({projectID:re.zod,name:K.string().optional(),icon:o.Info.shape.icon.optional(),commands:o.Info.shape.commands.optional()});class g extends xr.Service()("@opencode/Project"){static{e(this,"Service")}}o.Service=g,o.layer=Ye.effect(g,I.gen(function*(){let n=yield*Ie.Service,i=yield*hr.Path,P=yield*Tr.ChildProcessSpawner,D=I.fnUntraced(function*(E,O){let L=yield*P.spawn(Ar.make("git",E,{cwd:O?.cwd,extendEnv:!0,stdin:"ignore"})),[U,C]=yield*I.all([qe.mkString(qe.decodeText(L.stdout)),qe.mkString(qe.decodeText(L.stderr))],{concurrency:2});return{code:yield*L.exitCode,text:U,stderr:C}},I.scoped,I.catch(()=>I.succeed({code:1,text:"",stderr:""}))),m=e(E=>I.sync(()=>_e.use(E)),"db"),c=e(E=>I.sync(()=>$e.emit("event",{payload:{type:o.Event.Updated.type,properties:E}})),"emitUpdated"),d=o.Info.shape.vcs.parse(H.OPENCODE_FAKE_VCS),h=e((E,O)=>!O||(O=O.replace(/[\r\n]+$/,""),!O)?E:(O=Ie.windowsPath(O),i.isAbsolute(O)?i.normalize(O):i.resolve(E,O)),"resolveGitPath"),v=yield*Ir.Scope,x=I.fnUntraced(function*(E){return yield*n.readFileString(i.join(E,"opencode")).pipe(I.map(O=>O.trim()),I.map(re.make),I.catch(()=>I.succeed(void 0)))}),k=I.fn("Project.fromDirectory")(function*(E){t.info("fromDirectory",{directory:E});let O=yield*I.gen(function*(){let ie=(yield*n.up({targets:[".git"],start:E}).pipe(I.orDie))[0];if(!ie)return{id:re.global,worktree:"/",sandbox:"/",vcs:d};let $=i.dirname(ie),Be=yield*I.sync(()=>at("git")),Q=yield*x(ie);if(!Be)return{id:Q??re.global,worktree:$,sandbox:$,vcs:d};let Ze=yield*D(["rev-parse","--git-common-dir"],{cwd:$});if(Ze.code!==0)return{id:Q??re.global,worktree:$,sandbox:$,vcs:d};let Fe=(()=>{let Ge=h($,Ze.text.trim());return Ge===$?$:i.dirname(Ge)})();if(Q==null&&(Q=yield*x(i.join(Fe,".git"))),!Q){let Ae=(yield*D(["rev-list","--max-parents=0","HEAD"],{cwd:$})).text.split(`
13
- `).filter(Boolean).map(f=>f.trim()).toSorted();Q=Ae[0]?re.make(Ae[0]):void 0,Q&&(yield*n.writeFileString(i.join(Fe,".git","opencode"),Q).pipe(I.ignore))}if(!Q)return{id:re.global,worktree:$,sandbox:$,vcs:"git"};let Qe=yield*D(["rev-parse","--show-toplevel"],{cwd:$});return Qe.code!==0?{id:Q,worktree:$,sandbox:$,vcs:d}:($=h($,Qe.text.trim()),{id:Q,sandbox:$,worktree:Fe,vcs:"git"})}),L=yield*m(j=>j.select().from(w).where((0,A.eq)(w.id,O.id)).get()),U=L?u(L):{id:O.id,worktree:O.worktree,vcs:O.vcs,sandboxes:[],time:{created:Date.now(),updated:Date.now()}};H.OPENCODE_EXPERIMENTAL_ICON_DISCOVERY&&(yield*B(U).pipe(I.ignore,I.forkIn(v)));let C={...U,worktree:O.worktree,vcs:O.vcs,time:{...U.time,updated:Date.now()}};return O.sandbox!==C.worktree&&!C.sandboxes.includes(O.sandbox)&&C.sandboxes.push(O.sandbox),C.sandboxes=yield*I.forEach(C.sandboxes,j=>n.exists(j).pipe(I.orDie,I.map(ie=>ie?j:void 0)),{concurrency:"unbounded"}).pipe(I.map(j=>j.filter(ie=>ie!==void 0))),yield*m(j=>j.insert(w).values({id:C.id,worktree:C.worktree,vcs:C.vcs??null,name:C.name,icon_url:C.icon?.url,icon_color:C.icon?.color,time_created:C.time.created,time_updated:C.time.updated,time_initialized:C.time.initialized,sandboxes:C.sandboxes,commands:C.commands}).onConflictDoUpdate({target:w.id,set:{worktree:C.worktree,vcs:C.vcs??null,name:C.name,icon_url:C.icon?.url,icon_color:C.icon?.color,time_updated:C.time.updated,time_initialized:C.time.initialized,sandboxes:C.sandboxes,commands:C.commands}}).run()),O.id!==re.global&&(yield*m(j=>j.update(he).set({project_id:O.id}).where((0,A.and)((0,A.eq)(he.project_id,re.global),(0,A.eq)(he.directory,O.worktree))).run())),yield*c(C),{project:C,sandbox:O.sandbox}}),B=I.fn("Project.discover")(function*(E){if(E.vcs!=="git"||E.icon?.override||E.icon?.url)return;let L=(yield*n.glob("**/favicon.{ico,png,svg,jpg,jpeg,webp}",{cwd:E.worktree,absolute:!0,include:"file"}).pipe(I.orDie)).sort(($,Be)=>$.length-Be.length)[0];if(!L)return;let U=yield*n.readFile(L).pipe(I.orDie),C=Buffer.from(U).toString("base64"),ie=`data:${Ie.mimeType(L)};base64,${C}`;yield*xe({projectID:E.id,icon:{url:ie}})}),Pe=I.fn("Project.list")(function*(){return yield*m(E=>E.select().from(w).all().map(u))}),pe=I.fn("Project.get")(function*(E){let O=yield*m(L=>L.select().from(w).where((0,A.eq)(w.id,E)).get());return O?u(O):void 0}),xe=I.fn("Project.update")(function*(E){let O=yield*m(U=>U.update(w).set({name:E.name,icon_url:E.icon?.url,icon_color:E.icon?.color,commands:E.commands,time_updated:Date.now()}).where((0,A.eq)(w.id,E.projectID)).returning().get());if(!O)throw new Error(`Project not found: ${E.projectID}`);let L=u(O);return yield*c(L),L}),De=I.fn("Project.initGit")(function*(E){if(E.project.vcs==="git")return E.project;if(!(yield*I.sync(()=>at("git"))))throw new Error("Git is not installed");let O=yield*D(["init","--quiet"],{cwd:E.directory});if(O.code!==0)throw new Error(O.stderr.trim()||O.text.trim()||"Failed to initialize git repository");let{project:L}=yield*k(E.directory);return L}),Ue=I.fn("Project.setInitialized")(function*(E){yield*m(O=>O.update(w).set({time_initialized:Date.now()}).where((0,A.eq)(w.id,E)).run())}),le=I.fn("Project.sandboxes")(function*(E){let O=yield*m(U=>U.select().from(w).where((0,A.eq)(w.id,E)).get());if(!O)return[];let L=u(O);return yield*I.forEach(L.sandboxes,U=>n.isDir(U).pipe(I.orDie,I.map(C=>C?U:void 0)),{concurrency:"unbounded"}).pipe(I.map(U=>U.filter(C=>C!==void 0)))}),ut=I.fn("Project.addSandbox")(function*(E,O){let L=yield*m(j=>j.select().from(w).where((0,A.eq)(w.id,E)).get());if(!L)throw new Error(`Project not found: ${E}`);let U=[...L.sandboxes];U.includes(O)||U.push(O);let C=yield*m(j=>j.update(w).set({sandboxes:U,time_updated:Date.now()}).where((0,A.eq)(w.id,E)).returning().get());if(!C)throw new Error(`Project not found: ${E}`);yield*c(u(C))}),mt=I.fn("Project.removeSandbox")(function*(E,O){let L=yield*m(j=>j.select().from(w).where((0,A.eq)(w.id,E)).get());if(!L)throw new Error(`Project not found: ${E}`);let U=L.sandboxes.filter(j=>j!==O),C=yield*m(j=>j.update(w).set({sandboxes:U,time_updated:Date.now()}).where((0,A.eq)(w.id,E)).returning().get());if(!C)throw new Error(`Project not found: ${E}`);yield*c(u(C))});return g.of({fromDirectory:k,discover:B,list:Pe,get:pe,update:xe,initGit:De,setInitialized:Ue,sandboxes:le,addSandbox:ut,removeSandbox:mt})})),o.defaultLayer=o.layer.pipe(Ye.provide(lt),Ye.provide(Ie.defaultLayer),Ye.provide(br.layer));let{runPromise:F}=Ut(g,o.defaultLayer);function W(n){return F(i=>i.fromDirectory(n))}o.fromDirectory=W,e(W,"fromDirectory");function N(n){return F(i=>i.discover(n))}o.discover=N,e(N,"discover");function p(){return _e.use(n=>n.select().from(w).all().map(i=>u(i)))}o.list=p,e(p,"list");function s(n){let i=_e.use(P=>P.select().from(w).where((0,A.eq)(w.id,n)).get());if(i)return u(i)}o.get=s,e(s,"get");function y(n){_e.use(i=>i.update(w).set({time_initialized:Date.now()}).where((0,A.eq)(w.id,n)).run())}o.setInitialized=y,e(y,"setInitialized");function S(n){return F(i=>i.initGit(n))}o.initGit=S,e(S,"initGit");function X(n){return F(i=>i.update(n))}o.update=X,e(X,"update");function ye(n){return F(i=>i.sandboxes(n))}o.sandboxes=ye,e(ye,"sandboxes");function ne(n,i){return F(P=>P.addSandbox(n,i))}o.addSandbox=ne,e(ne,"addSandbox");function fe(n,i){return F(P=>P.removeSandbox(n,i))}o.removeSandbox=fe,e(fe,"removeSandbox")})(Et||={});var ke;(_=>{let t=ee.create({service:"state"}),r=new Map;function l(g,T,J){return()=>{let F=g(),W=r.get(F);W||(W=new Map,r.set(F,W));let N=W.get(T);if(N)return N.state;let p=T();return W.set(T,{state:p,dispose:J}),p}}_.create=l,e(l,"create");async function u(g){let T=r.get(g);if(!T)return;t.info("waiting for state disposal to complete",{key:g});let J=!1;setTimeout(()=>{J||t.warn("state disposal is taking an unusually long time - if it does not complete in a reasonable time, please report this as a bug",{key:g})},1e4).unref();let F=[];for(let[W,N]of T){if(!N.dispose)continue;let p=typeof W=="function"?W.name:String(W),s=Promise.resolve(N.state).then(y=>N.dispose(y)).catch(y=>{t.error("Error while disposing state:",{error:y,key:g,init:p})});F.push(s)}await Promise.all(F),T.clear(),r.delete(g),J=!0,t.info("state disposal completed",{key:g})}_.dispose=u,e(u,"dispose")})(ke||={});var de=te.create("instance"),oe=new Map,Me={all:void 0};function Bt(t){$e.emit("event",{directory:t,payload:{type:"server.instance.disposed",properties:{directory:t}}})}e(Bt,"emit");function Ft(t){return be(async()=>{let r=t.project&&t.worktree?{directory:t.directory,worktree:t.worktree,project:t.project}:await Et.fromDirectory(t.directory).then(({project:l,sandbox:u})=>({directory:t.directory,worktree:u,project:l}));return await de.provide(r,async()=>{await t.init?.()}),r})}e(Ft,"boot");function Gt(t,r){let l=r.catch(u=>{throw oe.get(t)===l&&oe.delete(t),u});return oe.set(t,l),l}e(Gt,"track");var Z={async provide(t){let r=Te.resolve(t.directory),l=oe.get(r);l||(ee.Default.info("creating instance",{directory:r}),l=Gt(r,Ft({directory:r,init:t.init})));let u=await l;return de.provide(u,async()=>t.fn())},get current(){return de.use()},get directory(){return de.use().directory},get worktree(){return de.use().worktree},get project(){return de.use().project},containsPath(t){return Te.contains(Z.directory,t)?!0:Z.worktree==="/"?!1:Te.contains(Z.worktree,t)},bind(t){let r=de.use();return((...l)=>de.provide(r,()=>t(...l)))},restore(t,r){return de.provide(t,r)},state(t,r){return ke.create(()=>Z.directory,t,r)},async reload(t){let r=Te.resolve(t.directory);ee.Default.info("reloading instance",{directory:r}),await Promise.all([ke.dispose(r),ot(r)]),oe.delete(r);let l=Gt(r,Ft({...t,directory:r}));return Bt(r),await l},async dispose(){let t=Z.directory;ee.Default.info("disposing instance",{directory:t}),await Promise.all([ke.dispose(t),ot(t)]),oe.delete(t),Bt(t)},async disposeAll(){return Me.all||(Me.all=be(async()=>{ee.Default.info("disposing all instances");let t=[...oe.entries()];for(let[r,l]of t){if(oe.get(r)!==l)continue;let u=await l.catch(_=>{ee.Default.warn("instance dispose failed",{key:r,error:_})});if(!u){oe.get(r)===l&&oe.delete(r);continue}oe.get(r)===l&&await de.provide(u,async()=>{await Z.dispose()})}}).finally(()=>{Me.all=void 0})),Me.all}};var Rr=vr.makeMemoMapUnsafe();function je(t){try{let r=Z.current;return wr.provideService(t,we,r)}catch(r){if(!(r instanceof te.NotFound))throw r}return t}e(je,"attach");function Ut(t,r){let l,u=e(()=>l??=Lr.make(r,{memoMap:Rr}),"getRuntime");return{runSync:e(_=>u().runSync(je(t.use(_))),"runSync"),runPromiseExit:e((_,g)=>u().runPromiseExit(je(t.use(_)),g),"runPromiseExit"),runPromise:e((_,g)=>u().runPromise(je(t.use(_)),g),"runPromise"),runFork:e(_=>u().runFork(je(t.use(_))),"runFork"),runCallback:e(_=>u().runCallback(je(t.use(_))),"runCallback")}}e(Ut,"makeRuntime");export{$e as a,be as b,ze as c,Xe as d,H as e,Qr as f,nt as g,Ke as h,tr as i,_e as j,A as k,Ee as l,w as m,he as n,ir as o,Go as p,$o as q,zo as r,ct as s,at as t,re as u,Ie as v,lt as w,On as x,Et as y,Z as z,Rr as A,Ut as B};
12
+ import{a as Pt}from"./chunk-LTCXIXYM.js";import{a as tt,c as Te,d as Oe,e as ee}from"./chunk-M4CB72HE.js";import{a as e,c as zt,d as z}from"./chunk-MBZTOEAD.js";import{Effect as br,Layer as wr,ManagedRuntime as vr}from"effect";import{EventEmitter as Ht}from"events";var $e=new Ht;var rt=new Set;function Ot(t){return rt.add(t),()=>{rt.delete(t)}}e(Ot,"registerDisposer");async function ot(t){await Promise.allSettled([...rt].map(r=>r(t)))}e(ot,"disposeInstance");function be(t){return t()}e(be,"iife");import{AsyncLocalStorage as Xt}from"async_hooks";var te;(l=>{class t extends Error{constructor(g){super(`No context found for ${g}`);this.name=g}name;static{e(this,"NotFound")}}l.NotFound=t;function r(u){let _=new Xt;return{use(){let g=_.getStore();if(!g)throw new t(u);return g},provide(g,T){return _.run(g,T)}}}l.create=r,e(r,"create")})(te||={});import K from"zod";var A={};zt(A,{Database:()=>_e,NotFoundError:()=>tr});z(A,bo);import{migrate as Dt}from"drizzle-orm/node-sqlite/migrator";import*as bo from"drizzle-orm";function ze(t){let r,l=!1,u=e(()=>{if(l)return r;try{return r=t(),l=!0,r}catch(_){throw _}},"result");return u.reset=()=>{l=!1,r=void 0},u}e(ze,"lazy");import He from"zod";var Xe=class t extends Error{static{e(this,"NamedError")}static create(r,l){let u=He.object({name:He.literal(r),data:l}).meta({ref:r}),_=class extends t{constructor(T,J){super(r,J);this.data=T;this.name=r}data;static{e(this,"result")}static Schema=u;name=r;static isInstance(T){return typeof T=="object"&&"name"in T&&T.name===r}schema(){return u}toObject(){return{name:r,data:this.data}}};return Object.defineProperty(_,"name",{value:r}),_}static Unknown=t.create("UnknownError",He.object({message:He.string()}))};import gt from"zod";import Ce from"path";import{readFileSync as Zt,readdirSync as Qt,existsSync as er}from"fs";import{Config as ge}from"effect";function b(t){let r=process.env[t]?.toLowerCase();return r==="true"||r==="1"}e(b,"truthy");function Kt(t){let r=process.env[t]?.toLowerCase();return r==="false"||r==="0"}e(Kt,"falsy");var H;(f=>{f.OPENCODE_AUTO_SHARE=b("OPENCODE_AUTO_SHARE"),f.OPENCODE_AUTO_HEAP_SNAPSHOT=b("OPENCODE_AUTO_HEAP_SNAPSHOT"),f.OPENCODE_GIT_BASH_PATH=process.env.OPENCODE_GIT_BASH_PATH,f.OPENCODE_CONFIG=process.env.OPENCODE_CONFIG,f.OPENCODE_CONFIG_CONTENT=process.env.OPENCODE_CONFIG_CONTENT,f.OPENCODE_DISABLE_AUTOUPDATE=b("OPENCODE_DISABLE_AUTOUPDATE"),f.OPENCODE_ALWAYS_NOTIFY_UPDATE=b("OPENCODE_ALWAYS_NOTIFY_UPDATE"),f.OPENCODE_DISABLE_PRUNE=b("OPENCODE_DISABLE_PRUNE"),f.OPENCODE_DISABLE_TERMINAL_TITLE=b("OPENCODE_DISABLE_TERMINAL_TITLE"),f.OPENCODE_SHOW_TTFD=b("OPENCODE_SHOW_TTFD"),f.OPENCODE_PERMISSION=process.env.OPENCODE_PERMISSION,f.OPENCODE_DISABLE_DEFAULT_PLUGINS=b("OPENCODE_DISABLE_DEFAULT_PLUGINS"),f.OPENCODE_DISABLE_LSP_DOWNLOAD=b("OPENCODE_DISABLE_LSP_DOWNLOAD"),f.OPENCODE_ENABLE_EXPERIMENTAL_MODELS=b("OPENCODE_ENABLE_EXPERIMENTAL_MODELS"),f.OPENCODE_DISABLE_AUTOCOMPACT=b("OPENCODE_DISABLE_AUTOCOMPACT"),f.OPENCODE_DISABLE_MODELS_FETCH=b("OPENCODE_DISABLE_MODELS_FETCH"),f.OPENCODE_DISABLE_MOUSE=b("OPENCODE_DISABLE_MOUSE"),f.OPENCODE_DISABLE_CLAUDE_CODE=b("OPENCODE_DISABLE_CLAUDE_CODE"),f.OPENCODE_DISABLE_CLAUDE_CODE_PROMPT=f.OPENCODE_DISABLE_CLAUDE_CODE||b("OPENCODE_DISABLE_CLAUDE_CODE_PROMPT"),f.OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=f.OPENCODE_DISABLE_CLAUDE_CODE||b("OPENCODE_DISABLE_CLAUDE_CODE_SKILLS"),f.OPENCODE_DISABLE_EXTERNAL_SKILLS=f.OPENCODE_DISABLE_CLAUDE_CODE_SKILLS||b("OPENCODE_DISABLE_EXTERNAL_SKILLS"),f.OPENCODE_FAKE_VCS=process.env.OPENCODE_FAKE_VCS,f.OPENCODE_SERVER_PASSWORD=process.env.OPENCODE_SERVER_PASSWORD,f.OPENCODE_SERVER_USERNAME=process.env.OPENCODE_SERVER_USERNAME,f.OPENCODE_ENABLE_QUESTION_TOOL=b("OPENCODE_ENABLE_QUESTION_TOOL"),f.OPENCODE_EXPERIMENTAL=b("OPENCODE_EXPERIMENTAL"),f.OPENCODE_EXPERIMENTAL_FILEWATCHER=ge.boolean("OPENCODE_EXPERIMENTAL_FILEWATCHER").pipe(ge.withDefault(!1)),f.OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER=ge.boolean("OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER").pipe(ge.withDefault(!1)),f.OPENCODE_EXPERIMENTAL_ICON_DISCOVERY=f.OPENCODE_EXPERIMENTAL||b("OPENCODE_EXPERIMENTAL_ICON_DISCOVERY");let De=process.env.OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT;f.OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT=De===void 0?process.platform==="win32":b("OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"),f.OPENCODE_ENABLE_EXA=b("OPENCODE_ENABLE_EXA")||f.OPENCODE_EXPERIMENTAL||b("OPENCODE_EXPERIMENTAL_EXA"),f.OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS=Ae("OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS"),f.OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX=Ae("OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX"),f.OPENCODE_EXPERIMENTAL_OXFMT=f.OPENCODE_EXPERIMENTAL||b("OPENCODE_EXPERIMENTAL_OXFMT"),f.OPENCODE_EXPERIMENTAL_LSP_TY=b("OPENCODE_EXPERIMENTAL_LSP_TY"),f.OPENCODE_EXPERIMENTAL_LSP_TOOL=f.OPENCODE_EXPERIMENTAL||b("OPENCODE_EXPERIMENTAL_LSP_TOOL"),f.OPENCODE_DISABLE_FILETIME_CHECK=ge.boolean("OPENCODE_DISABLE_FILETIME_CHECK").pipe(ge.withDefault(!1)),f.OPENCODE_EXPERIMENTAL_PLAN_MODE=f.OPENCODE_EXPERIMENTAL||b("OPENCODE_EXPERIMENTAL_PLAN_MODE"),f.OPENCODE_EXPERIMENTAL_WORKSPACES=f.OPENCODE_EXPERIMENTAL||b("OPENCODE_EXPERIMENTAL_WORKSPACES"),f.OPENCODE_EXPERIMENTAL_MARKDOWN=!Kt("OPENCODE_EXPERIMENTAL_MARKDOWN"),f.OPENCODE_MODELS_URL=process.env.OPENCODE_MODELS_URL,f.OPENCODE_MODELS_PATH=process.env.OPENCODE_MODELS_PATH,f.OPENCODE_DISABLE_EMBEDDED_WEB_UI=b("OPENCODE_DISABLE_EMBEDDED_WEB_UI"),f.OPENCODE_DB=process.env.OPENCODE_DB,f.OPENCODE_DISABLE_CHANNEL_DB=b("OPENCODE_DISABLE_CHANNEL_DB"),f.OPENCODE_SKIP_MIGRATIONS=b("OPENCODE_SKIP_MIGRATIONS"),f.OPENCODE_STRICT_CONFIG_DEPS=b("OPENCODE_STRICT_CONFIG_DEPS");function Ae($t){let yt=process.env[$t];if(!yt)return;let et=Number(yt);return Number.isInteger(et)&&et>0?et:void 0}e(Ae,"number")})(H||={});Object.defineProperty(H,"OPENCODE_DISABLE_PROJECT_CONFIG",{get(){return b("OPENCODE_DISABLE_PROJECT_CONFIG")},enumerable:!0,configurable:!1});Object.defineProperty(H,"OPENCODE_TUI_CONFIG",{get(){return process.env.OPENCODE_TUI_CONFIG},enumerable:!0,configurable:!1});Object.defineProperty(H,"OPENCODE_CONFIG_DIR",{get(){return process.env.OPENCODE_CONFIG_DIR},enumerable:!0,configurable:!1});Object.defineProperty(H,"OPENCODE_PURE",{get(){return b("OPENCODE_PURE")},enumerable:!0,configurable:!1});Object.defineProperty(H,"OPENCODE_PLUGIN_META_FILE",{get(){return process.env.OPENCODE_PLUGIN_META_FILE},enumerable:!0,configurable:!1});Object.defineProperty(H,"OPENCODE_CLIENT",{get(){return process.env.OPENCODE_CLIENT??"cli"},enumerable:!0,configurable:!1});var Zr=typeof OPENCODE_VERSION=="string"?OPENCODE_VERSION:"local",nt=typeof OPENCODE_CHANNEL=="string"?OPENCODE_CHANNEL:"local";import{Effect as q,Fiber as Jt,ScopedCache as ve,ServiceMap as Vt}from"effect";import{ServiceMap as Wt}from"effect";var we=Wt.Reference("~opencode/InstanceRef",{defaultValue:e(()=>{},"defaultValue")});var _t="~opencode/InstanceState",Ke;(N=>(N.bind=e(p=>{try{return Z.bind(p)}catch(S){if(!(S instanceof te.NotFound))throw S}let s=Jt.getCurrent(),y=s?Vt.getReferenceUnsafe(s.services,we):void 0;return y?((...S)=>Z.restore(y,()=>p(...S))):p},"bind"),N.context=q.gen(function*(){return(yield*we)??Z.current}),N.directory=q.map(N.context,p=>p.directory),N.make=e(p=>q.gen(function*(){let s=yield*ve.make({capacity:Number.POSITIVE_INFINITY,lookup:e(()=>q.gen(function*(){return yield*p(yield*N.context)}),"lookup")}),y=Ot(S=>q.runPromise(ve.invalidate(s,S)));return yield*q.addFinalizer(()=>q.sync(y)),{[_t]:_t,cache:s}}),"make"),N.get=e(p=>q.gen(function*(){return yield*ve.get(p.cache,yield*N.directory)}),"get"),N.use=e((p,s)=>q.map((0,N.get)(p),s),"use"),N.useEffect=e((p,s)=>q.flatMap((0,N.get)(p),s),"useEffect"),N.has=e(p=>q.gen(function*(){return yield*ve.has(p.cache,yield*N.directory)}),"has"),N.invalidate=e(p=>q.gen(function*(){return yield*ve.invalidate(p.cache,yield*N.directory)}),"invalidate"),N.withALS=e(p=>q.map(N.context,s=>Z.restore(s,p)),"withALS")))(Ke||={});import{DatabaseSync as Yt}from"node:sqlite";import{drizzle as qt}from"drizzle-orm/node-sqlite";function St(t){let r=new Yt(t);return qt({client:r})}e(St,"init");var tr=Xe.create("NotFoundError",gt.object({message:gt.string()})),it=ee.create({service:"db"}),_e;(N=>{function t(){if(["latest","beta"].includes(nt)||H.OPENCODE_DISABLE_CHANNEL_DB)return Ce.join(Oe.Path.data,"opencode.db");let p=nt.replace(/[^a-zA-Z0-9._-]/g,"-");return Ce.join(Oe.Path.data,`opencode-${p}.db`)}N.getChannelPath=t,e(t,"getChannelPath"),N.Path=be(()=>H.OPENCODE_DB?H.OPENCODE_DB===":memory:"||Ce.isAbsolute(H.OPENCODE_DB)?H.OPENCODE_DB:Ce.join(Oe.Path.data,H.OPENCODE_DB):t());function l(p){let s=/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/.exec(p);return s?Date.UTC(Number(s[1]),Number(s[2])-1,Number(s[3]),Number(s[4]),Number(s[5]),Number(s[6])):0}e(l,"time");function u(p){return Qt(p,{withFileTypes:!0}).filter(S=>S.isDirectory()).map(S=>S.name).map(S=>{let X=Ce.join(p,S,"migration.sql");if(er(X))return{sql:Zt(X,"utf-8"),timestamp:l(S),name:S}}).filter(Boolean).sort((S,X)=>S.timestamp-X.timestamp)}e(u,"migrations"),N.Client=ze(()=>{it.info("opening database",{path:N.Path});let p=St(N.Path);p.run("PRAGMA journal_mode = WAL"),p.run("PRAGMA synchronous = NORMAL"),p.run("PRAGMA busy_timeout = 5000"),p.run("PRAGMA cache_size = -64000"),p.run("PRAGMA foreign_keys = ON"),p.run("PRAGMA wal_checkpoint(PASSIVE)");let s=Ce.join(import.meta.dirname,"../packages/opencode/migration");if(typeof OPENCODE_MIGRATIONS<"u"){let y=OPENCODE_MIGRATIONS;if(y.length>0){if(it.info("applying migrations",{count:y.length,mode:"bundled"}),H.OPENCODE_SKIP_MIGRATIONS)for(let S of y)S.sql="select 1;";Dt(p,y)}}else{let y=u(s);it.info("applying migrations",{count:y.length,mode:"dev"}),!H.OPENCODE_SKIP_MIGRATIONS&&y.length>0&&Dt(p,{migrationsFolder:s})}return p});function g(){(0,N.Client)().$client.close(),N.Client.reset()}N.close=g,e(g,"close");let T=te.create("database");function J(p){try{return p(T.use().tx)}catch(s){if(s instanceof te.NotFound){let y=[],S=T.provide({effects:y,tx:(0,N.Client)()},()=>p((0,N.Client)()));for(let X of y)X();return S}throw s}}N.use=J,e(J,"use");function F(p){let s=Ke.bind(p);try{T.use().effects.push(s)}catch{s()}}N.effect=F,e(F,"effect");function W(p,s){try{return p(T.use().tx)}catch(y){if(y instanceof te.NotFound){let S=[],X=Ke.bind(ne=>T.provide({tx:ne,effects:S},()=>p(ne))),ye=(0,N.Client)().transaction(X,{behavior:s?.behavior});for(let ne of S)ne();return ye}throw y}}N.transaction=W,e(W,"transaction")})(_e||={});import{sqliteTable as rr,text as ue,integer as or}from"drizzle-orm/sqlite-core";import{integer as Ct}from"drizzle-orm/sqlite-core";var Ee={time_created:Ct().notNull().$default(()=>Date.now()),time_updated:Ct().notNull().$onUpdate(()=>Date.now())};var w=rr("project",{id:ue().$type().primaryKey(),worktree:ue().notNull(),vcs:ue(),name:ue(),icon_url:ue(),icon_color:ue(),...Ee,time_initialized:or(),sandboxes:ue({mode:"json"}).notNull().$type(),commands:ue({mode:"json"}).$type()});import{sqliteTable as Le,text as R,integer as Ne,index as Se,primaryKey as nr}from"drizzle-orm/sqlite-core";var he=Le("session",{id:R().$type().primaryKey(),project_id:R().$type().notNull().references(()=>w.id,{onDelete:"cascade"}),workspace_id:R().$type(),parent_id:R().$type(),slug:R().notNull(),directory:R().notNull(),title:R().notNull(),version:R().notNull(),share_url:R(),summary_additions:Ne(),summary_deletions:Ne(),summary_files:Ne(),summary_diffs:R({mode:"json"}).$type(),revert:R({mode:"json"}).$type(),permission:R({mode:"json"}).$type(),...Ee,metadata:R({mode:"json"}).$type(),time_compacting:Ne(),time_archived:Ne()},t=>[Se("session_project_idx").on(t.project_id),Se("session_workspace_idx").on(t.workspace_id),Se("session_parent_idx").on(t.parent_id)]),ir=Le("message",{id:R().$type().primaryKey(),session_id:R().$type().notNull().references(()=>he.id,{onDelete:"cascade"}),...Ee,data:R({mode:"json"}).notNull().$type()},t=>[Se("message_session_time_created_id_idx").on(t.session_id,t.time_created,t.id)]),Fo=Le("part",{id:R().$type().primaryKey(),message_id:R().$type().notNull().references(()=>ir.id,{onDelete:"cascade"}),session_id:R().$type().notNull(),...Ee,data:R({mode:"json"}).notNull().$type()},t=>[Se("part_message_id_id_idx").on(t.message_id,t.id),Se("part_session_idx").on(t.session_id)]),Go=Le("todo",{session_id:R().$type().notNull().references(()=>he.id,{onDelete:"cascade"}),content:R().notNull(),status:R().notNull(),priority:R().notNull(),position:Ne().notNull(),...Ee},t=>[nr({columns:[t.session_id,t.position]}),Se("todo_session_idx").on(t.session_id)]),$o=Le("permission",{project_id:R().primaryKey().references(()=>w.id,{onDelete:"cascade"}),...Ee,data:R({mode:"json"}).notNull().$type()});import st from"zod";var ct;(u=>{let t=new Map;function r(_,g){let T={type:_,properties:g};return t.set(_,T),T}u.define=r,e(r,"define");function l(){return st.discriminatedUnion("type",t.entries().map(([_,g])=>st.object({type:st.literal(_),properties:g.properties}).meta({ref:"Event."+g.type})).toArray()).meta({ref:"Event"})}u.payloads=l,e(l,"payloads")})(ct||={});import sr from"which";import cr from"path";function at(t,r){let l=r?.PATH??r?.Path??process.env.PATH??process.env.Path??"",u=l?l+cr.delimiter+Oe.Path.bin:Oe.Path.bin,_=sr.sync(t,{nothrow:!0,path:u,pathExt:r?.PATHEXT??r?.PathExt??process.env.PATHEXT??process.env.PathExt});return typeof _=="string"?_:null}e(at,"which");import{Schema as Nt}from"effect";import ht from"zod";var ar=Nt.String.pipe(Nt.brand("ProjectID")),re=ar.pipe(Pt(t=>({global:t.makeUnsafe("global"),make:e(r=>t.makeUnsafe(r),"make"),zod:ht.string().pipe(ht.custom())})));import{Effect as I,Layer as Ye,Path as Nr,Scope as hr,ServiceMap as Ir,Stream as qe}from"effect";import{ChildProcess as xr,ChildProcessSpawner as Ar}from"effect/unstable/process";import{NodePath as Tr}from"@effect/platform-node";import{NodeFileSystem as dr}from"@effect/platform-node";import{dirname as We,join as dt,relative as ft,resolve as It}from"path";import{realpathSync as xt}from"fs";import*as Ve from"fs/promises";import{lookup as fr}from"mime-types";import{Effect as M,FileSystem as pr,Layer as At,Schema as Je,ServiceMap as lr}from"effect";var Ie;(p=>{class t extends Je.TaggedErrorClass()("FileSystemError",{method:Je.String,cause:Je.optional(Je.Defect)}){static{e(this,"FileSystemError")}}p.FileSystemError=t;class r extends lr.Service()("@opencode/FileSystem"){static{e(this,"Service")}}p.Service=r,p.layer=At.effect(r,M.gen(function*(){let s=yield*pr.FileSystem,y=M.fn("FileSystem.existsSafe")(function*(c){return yield*s.exists(c).pipe(M.orElseSucceed(()=>!1))}),S=M.fn("FileSystem.isDir")(function*(c){return(yield*s.stat(c).pipe(M.catch(()=>M.void)))?.type==="Directory"}),X=M.fn("FileSystem.isFile")(function*(c){return(yield*s.stat(c).pipe(M.catch(()=>M.void)))?.type==="File"}),ye=M.fn("FileSystem.readDirectoryEntries")(function*(c){return yield*M.tryPromise({try:e(async()=>(await Ve.readdir(c,{withFileTypes:!0})).map(h=>({name:h.name,type:h.isDirectory()?"directory":h.isSymbolicLink()?"symlink":h.isFile()?"file":"other"})),"try"),catch:e(d=>new t({method:"readDirectoryEntries",cause:d}),"catch")})}),ne=M.fn("FileSystem.readJson")(function*(c){let d=yield*s.readFileString(c);return JSON.parse(d)}),fe=M.fn("FileSystem.writeJson")(function*(c,d,h){let v=JSON.stringify(d,null,2),x=`${c}.tmp-${process.pid}-${Math.random().toString(36).slice(2,8)}`;yield*s.writeFileString(x,v),h&&(yield*s.chmod(x,h)),yield*M.tryPromise({try:e(()=>Ve.rename(x,c),"try"),catch:e(k=>new t({method:"writeJson.rename",cause:k}),"catch")})}),o=M.fn("FileSystem.ensureDir")(function*(c){yield*s.makeDirectory(c,{recursive:!0})}),n=M.fn("FileSystem.writeWithDirs")(function*(c,d,h){let v=typeof d=="string"?s.writeFileString(c,d):s.writeFile(c,d);yield*v.pipe(M.catchIf(x=>x.reason._tag==="NotFound",()=>M.gen(function*(){yield*s.makeDirectory(We(c),{recursive:!0}),yield*v}))),h&&(yield*s.chmod(c,h))}),i=M.fn("FileSystem.glob")(function*(c,d){return yield*M.tryPromise({try:e(()=>tt.scan(c,d),"try"),catch:e(h=>new t({method:"glob",cause:h}),"catch")})}),P=M.fn("FileSystem.findUp")(function*(c,d,h){let v=[],x=d;for(;;){let k=dt(x,c);if((yield*s.exists(k))&&v.push(k),h===x)break;let B=We(x);if(B===x)break;x=B}return v}),D=M.fn("FileSystem.up")(function*(c){let d=[],h=c.start;for(;;){for(let x of c.targets){let k=dt(h,x);(yield*s.exists(k))&&d.push(k)}if(c.stop===h)break;let v=We(h);if(v===h)break;h=v}return d}),m=M.fn("FileSystem.globUp")(function*(c,d,h){let v=[],x=d;for(;;){let k=yield*i(c,{cwd:x,absolute:!0,include:"file",dot:!0}).pipe(M.catch(()=>M.succeed([])));if(v.push(...k),h===x)break;let B=We(x);if(B===x)break;x=B}return v});return r.of({...s,existsSafe:y,isDir:S,isFile:X,readDirectoryEntries:ye,readJson:ne,writeJson:fe,ensureDir:o,writeWithDirs:n,findUp:P,up:D,globUp:m,glob:i,globMatch:tt.match})})),p.defaultLayer=p.layer.pipe(At.provide(dr.layer));function _(s){return fr(s)||"application/octet-stream"}p.mimeType=_,e(_,"mimeType");function g(s){if(process.platform!=="win32")return s;let y=It(F(s));try{return xt.native(y)}catch{return y}}p.normalizePath=g,e(g,"normalizePath");function T(s){if(process.platform!=="win32"||s==="*")return s;let y=s.match(/^(.*)[\\/]\*$/);if(!y)return g(s);let S=/^[A-Za-z]:$/.test(y[1])?y[1]+"\\":y[1];return dt(g(S),"*")}p.normalizePathPattern=T,e(T,"normalizePathPattern");function J(s){let y=It(F(s));try{return g(xt(y))}catch(S){if(S?.code==="ENOENT")return g(y);throw S}}p.resolve=J,e(J,"resolve");function F(s){return process.platform!=="win32"?s:s.replace(/^\/([a-zA-Z]):(?:[\\/]|$)/,(y,S)=>`${S.toUpperCase()}:/`).replace(/^\/([a-zA-Z])(?:\/|$)/,(y,S)=>`${S.toUpperCase()}:/`).replace(/^\/cygdrive\/([a-zA-Z])(?:\/|$)/,(y,S)=>`${S.toUpperCase()}:/`).replace(/^\/mnt\/([a-zA-Z])(?:\/|$)/,(y,S)=>`${S.toUpperCase()}:/`)}p.windowsPath=F,e(F,"windowsPath");function W(s,y){let S=ft(s,y),X=ft(y,s);return!S||!S.startsWith("..")||!X||!X.startsWith("..")}p.overlaps=W,e(W,"overlaps");function N(s,y){return!ft(s,y).startsWith("..")}p.contains=N,e(N,"contains")})(Ie||={});import{NodeFileSystem as Er,NodeSink as Tt,NodeStream as pt}from"@effect/platform-node";import*as bt from"@effect/platform-node/NodePath";import*as Y from"effect/Deferred";import*as a from"effect/Effect";import*as wt from"effect/Exit";import*as vt from"effect/FileSystem";import*as Re from"effect/Layer";import*as Lt from"effect/Path";import*as Rt from"effect/PlatformError";import*as V from"effect/Predicate";import*as ce from"effect/Sink";import*as G from"effect/Stream";import*as ae from"effect/unstable/process/ChildProcess";import{ChildProcessSpawner as kt,ExitCode as ur,make as mr,makeHandle as yr,ProcessId as Pr}from"effect/unstable/process/ChildProcessSpawner";import*as Mt from"node:child_process";import{PassThrough as Or}from"node:stream";import _r from"cross-spawn";var me=e(t=>t instanceof globalThis.Error?t:new globalThis.Error(String(t)),"toError"),Sr=e(t=>{switch(t.code){case"ENOENT":return"NotFound";case"EACCES":return"PermissionDenied";case"EEXIST":return"AlreadyExists";case"EISDIR":return"BadResource";case"ENOTDIR":return"BadResource";case"EBUSY":return"Busy";case"ELOOP":return"BadResource";default:return"Unknown"}},"toTag"),jt=e(t=>{let r=[],l=[],u=e(T=>{switch(T._tag){case"StandardCommand":r.push(T);return;case"PipedCommand":u(T.left),l.push(T.options),u(T.right);return}},"walk");if(u(t),r.length===0)throw new Error("flatten produced empty commands array");let[_,...g]=r;return{commands:[_,...g],opts:l}},"flatten"),se=e((t,r,l)=>{let u=jt(l).commands.map(_=>`${_.command} ${_.args.join(" ")}`).join(" | ");return Rt.systemError({_tag:Sr(r),module:"ChildProcess",method:t,pathOrDescriptor:u,syscall:r.syscall,cause:r})},"toPlatformError"),Dr=a.gen(function*(){let t=yield*vt.FileSystem,r=yield*Lt.Path,l=a.fnUntraced(function*(o){if(!V.isUndefined(o.cwd))return yield*t.access(o.cwd),r.resolve(o.cwd)}),u=e(o=>o.extendEnv?{...globalThis.process.env,...o.env}:o.env,"env"),_=e(o=>G.isStream(o)?"pipe":o,"input"),g=e(o=>ce.isSink(o)?"pipe":o,"output"),T=e(o=>{let n={stream:"pipe",encoding:"utf-8",endOnDone:!0};return V.isUndefined(o.stdin)?n:typeof o.stdin=="string"?{...n,stream:o.stdin}:G.isStream(o.stdin)?{...n,stream:o.stdin}:{stream:o.stdin.stream,encoding:o.stdin.encoding??n.encoding,endOnDone:o.stdin.endOnDone??n.endOnDone}},"stdin"),J=e((o,n)=>{let i=o[n];return V.isUndefined(i)?{stream:"pipe"}:typeof i=="string"?{stream:i}:ce.isSink(i)?{stream:i}:{stream:i.stream}},"stdio"),F=e(o=>V.isUndefined(o.additionalFds)?[]:Object.entries(o.additionalFds).flatMap(([n,i])=>{let P=ae.parseFdName(n);return V.isUndefined(P)?[]:[{fd:P,config:i}]}).toSorted((n,i)=>n.fd-i.fd),"fds"),W=e((o,n,i,P)=>{let D=e(d=>process.platform==="win32"&&d==="pipe"?"overlapped":d,"pipe"),m=[D(_(o.stream)),D(g(n.stream)),D(g(i.stream))];if(P.length===0)return m;let c=P.reduce((d,h)=>Math.max(d,h.fd),2);for(let d=3;d<=c;d++)m[d]="ignore";for(let d of P)m[d.fd]=D("pipe");return m},"stdios"),N=a.fnUntraced(function*(o,n,i){if(i.length===0)return{getInputFd:e(()=>ce.drain,"getInputFd"),getOutputFd:e(()=>G.empty,"getOutputFd")};let P=new Map,D=new Map;for(let m of i){let c=n.stdio[m.fd];switch(m.config.type){case"input":{let d=ce.drain;c&&"write"in c&&(d=Tt.fromWritable({evaluate:e(()=>c,"evaluate"),onError:e(h=>se(`fromWritable(fd${m.fd})`,me(h),o),"onError"),endOnDone:!0})),m.config.stream&&(yield*a.forkScoped(G.run(m.config.stream,d))),P.set(m.fd,d);break}case"output":{let d=G.empty;if(c&&"read"in c){let h=new Or;c.on("error",v=>h.destroy(me(v))),c.pipe(h),d=pt.fromReadable({evaluate:e(()=>h,"evaluate"),onError:e(v=>se(`fromReadable(fd${m.fd})`,me(v),o),"onError")})}m.config.sink&&(d=G.transduce(d,m.config.sink)),D.set(m.fd,d);break}}}return{getInputFd:e(m=>P.get(m)??ce.drain,"getInputFd"),getOutputFd:e(m=>D.get(m)??G.empty,"getOutputFd")}}),p=e((o,n,i)=>a.suspend(()=>{let P=ce.drain;return V.isNotNull(n.stdin)&&(P=Tt.fromWritable({evaluate:e(()=>n.stdin,"evaluate"),onError:e(D=>se("fromWritable(stdin)",me(D),o),"onError"),endOnDone:i.endOnDone,encoding:i.encoding})),G.isStream(i.stream)?a.as(a.forkScoped(G.run(i.stream,P)),P):a.succeed(P)}),"setupStdin"),s=e((o,n,i,P)=>{let D=n.stdout?pt.fromReadable({evaluate:e(()=>n.stdout,"evaluate"),onError:e(c=>se("fromReadable(stdout)",me(c),o),"onError")}):G.empty,m=n.stderr?pt.fromReadable({evaluate:e(()=>n.stderr,"evaluate"),onError:e(c=>se("fromReadable(stderr)",me(c),o),"onError")}):G.empty;return ce.isSink(i.stream)&&(D=G.transduce(D,i.stream)),ce.isSink(P.stream)&&(m=G.transduce(m,P.stream)),{stdout:D,stderr:m,all:G.merge(D,m)}},"setupOutput"),y=e((o,n)=>a.callback(i=>{let P=Y.makeUnsafe(),D=_r(o.command,o.args,n),m=!1,c;return D.on("error",d=>{i(a.fail(se("spawn",d,o)))}),D.on("exit",(...d)=>{c=d}),D.on("close",(...d)=>{m||(m=!0,Y.doneUnsafe(P,wt.succeed(c??d)))}),D.on("spawn",()=>{i(a.succeed([D,P]))}),a.sync(()=>{D.kill("SIGTERM")})}),"spawn"),S=e((o,n,i)=>globalThis.process.platform==="win32"?a.callback(P=>{Mt.exec(`taskkill /pid ${n.pid} /T /F`,{windowsHide:!0},D=>{if(D)return P(a.fail(se("kill",me(D),o)));P(a.void)})}):a.try({try:e(()=>{globalThis.process.kill(-n.pid,i)},"try"),catch:e(P=>se("kill",me(P),o),"catch")}),"killGroup"),X=e((o,n,i)=>a.suspend(()=>n.kill(i)?a.void:a.fail(se("kill",new Error("Failed to kill child process"),o))),"killOne"),ye=e((o,n,i)=>P=>{let D=i?.killSignal??"SIGTERM";return V.isUndefined(i?.forceKillAfter)?P(n,o,D):a.timeoutOrElse(P(n,o,D),{duration:i.forceKillAfter,orElse:e(()=>P(n,o,"SIGKILL"),"orElse")})},"timeout"),ne=e((o,n)=>{let i=n??"stdout";switch(i){case"stdout":return o.stdout;case"stderr":return o.stderr;case"all":return o.all;default:{let P=ae.parseFdName(i);return V.isNotUndefined(P)?o.getOutputFd(P):o.stdout}}},"source"),fe=a.fnUntraced(function*(o){switch(o._tag){case"StandardCommand":{let n=T(o.options),i=J(o.options,"stdout"),P=J(o.options,"stderr"),D=F(o.options),m=yield*l(o.options),[c,d]=yield*a.acquireRelease(y(o,{cwd:m,env:u(o.options),stdio:W(n,i,P,D),detached:o.options.detached??process.platform!=="win32",shell:o.options.shell,windowsHide:process.platform==="win32"}),a.fnUntraced(function*([x,k]){let B=yield*Y.isDone(k),Pe=ye(x,o,o.options);if(B){let[le]=yield*Y.await(k);return process.platform==="win32"?yield*a.void:le!==0&&V.isNotNull(le)?yield*a.ignore(Pe(S)):yield*a.void}let pe=e(le=>a.catch(S(o,x,le),()=>X(o,x,le)),"send"),xe=o.options.killSignal??"SIGTERM",De=pe(xe).pipe(a.andThen(Y.await(k)),a.asVoid),Ue=o.options.forceKillAfter?a.timeoutOrElse(De,{duration:o.options.forceKillAfter,orElse:e(()=>pe("SIGKILL").pipe(a.andThen(Y.await(k)),a.asVoid),"orElse")}):De;return yield*a.ignore(Ue)})),h=yield*N(o,c,D),v=s(o,c,i,P);return yr({pid:Pr(c.pid),stdin:yield*p(o,c,n),stdout:v.stdout,stderr:v.stderr,all:v.all,getInputFd:h.getInputFd,getOutputFd:h.getOutputFd,isRunning:a.map(Y.isDone(d),x=>!x),exitCode:a.flatMap(Y.await(d),([x,k])=>V.isNotNull(x)?a.succeed(ur(x)):a.fail(se("exitCode",new Error(`Process interrupted due to receipt of signal: '${k}'`),o))),kill:e(x=>{let k=x?.killSignal??"SIGTERM",B=e(pe=>a.catch(S(o,c,pe),()=>X(o,c,pe)),"send"),Pe=B(k).pipe(a.andThen(Y.await(d)),a.asVoid);return x?.forceKillAfter?a.timeoutOrElse(Pe,{duration:x.forceKillAfter,orElse:e(()=>B("SIGKILL").pipe(a.andThen(Y.await(d)),a.asVoid),"orElse")}):Pe},"kill")})}case"PipedCommand":{let n=jt(o),[i,...P]=n.commands,D=fe(i);for(let m=0;m<P.length;m++){let c=P[m],d=n.opts[m]??{},h=T(c.options),v=G.unwrap(a.map(D,B=>ne(B,d.from))),x=d.to??"stdin";if(x==="stdin"){D=fe(ae.make(c.command,c.args,{...c.options,stdin:{...h,stream:v}}));continue}let k=ae.parseFdName(x);if(V.isUndefined(k)){D=fe(ae.make(c.command,c.args,{...c.options,stdin:{...h,stream:v}}));continue}D=fe(ae.make(c.command,c.args,{...c.options,additionalFds:{...c.options.additionalFds,[ae.fdName(k)]:{type:"input",stream:v}}}))}return yield*D}}});return mr(fe)}),gr=Re.effect(kt,Dr),lt=gr.pipe(Re.provide(Er.layer),Re.provide(bt.layer)),Pn=ze(async()=>{let{makeRuntime:t}=await import("./run-service-6DJSRAIA.js");return t(kt,lt)});var Et;(o=>{let t=ee.create({service:"project"});o.Info=K.object({id:re.zod,worktree:K.string(),vcs:K.literal("git").optional(),name:K.string().optional(),icon:K.object({url:K.string().optional(),override:K.string().optional(),color:K.string().optional()}).optional(),commands:K.object({start:K.string().optional().describe("Startup script to run when creating a new workspace (worktree)")}).optional(),time:K.object({created:K.number(),updated:K.number(),initialized:K.number().optional()}),sandboxes:K.array(K.string())}).meta({ref:"Project"}),o.Event={Updated:ct.define("project.updated",o.Info)};function u(n){let i=n.icon_url||n.icon_color?{url:n.icon_url??void 0,color:n.icon_color??void 0}:void 0;return{id:n.id,worktree:n.worktree,vcs:n.vcs?o.Info.shape.vcs.parse(n.vcs):void 0,name:n.name??void 0,icon:i,time:{created:n.time_created,updated:n.time_updated,initialized:n.time_initialized??void 0},sandboxes:n.sandboxes,commands:n.commands??void 0}}o.fromRow=u,e(u,"fromRow"),o.UpdateInput=K.object({projectID:re.zod,name:K.string().optional(),icon:o.Info.shape.icon.optional(),commands:o.Info.shape.commands.optional()});class g extends Ir.Service()("@opencode/Project"){static{e(this,"Service")}}o.Service=g,o.layer=Ye.effect(g,I.gen(function*(){let n=yield*Ie.Service,i=yield*Nr.Path,P=yield*Ar.ChildProcessSpawner,D=I.fnUntraced(function*(E,O){let L=yield*P.spawn(xr.make("git",E,{cwd:O?.cwd,extendEnv:!0,stdin:"ignore"})),[U,C]=yield*I.all([qe.mkString(qe.decodeText(L.stdout)),qe.mkString(qe.decodeText(L.stderr))],{concurrency:2});return{code:yield*L.exitCode,text:U,stderr:C}},I.scoped,I.catch(()=>I.succeed({code:1,text:"",stderr:""}))),m=e(E=>I.sync(()=>_e.use(E)),"db"),c=e(E=>I.sync(()=>$e.emit("event",{payload:{type:o.Event.Updated.type,properties:E}})),"emitUpdated"),d=o.Info.shape.vcs.parse(H.OPENCODE_FAKE_VCS),h=e((E,O)=>!O||(O=O.replace(/[\r\n]+$/,""),!O)?E:(O=Ie.windowsPath(O),i.isAbsolute(O)?i.normalize(O):i.resolve(E,O)),"resolveGitPath"),v=yield*hr.Scope,x=I.fnUntraced(function*(E){return yield*n.readFileString(i.join(E,"opencode")).pipe(I.map(O=>O.trim()),I.map(re.make),I.catch(()=>I.succeed(void 0)))}),k=I.fn("Project.fromDirectory")(function*(E){t.info("fromDirectory",{directory:E});let O=yield*I.gen(function*(){let ie=(yield*n.up({targets:[".git"],start:E}).pipe(I.orDie))[0];if(!ie)return{id:re.global,worktree:"/",sandbox:"/",vcs:d};let $=i.dirname(ie),Be=yield*I.sync(()=>at("git")),Q=yield*x(ie);if(!Be)return{id:Q??re.global,worktree:$,sandbox:$,vcs:d};let Ze=yield*D(["rev-parse","--git-common-dir"],{cwd:$});if(Ze.code!==0)return{id:Q??re.global,worktree:$,sandbox:$,vcs:d};let Fe=(()=>{let Ge=h($,Ze.text.trim());return Ge===$?$:i.dirname(Ge)})();if(Q==null&&(Q=yield*x(i.join(Fe,".git"))),!Q){let Ae=(yield*D(["rev-list","--max-parents=0","HEAD"],{cwd:$})).text.split(`
13
+ `).filter(Boolean).map(f=>f.trim()).toSorted();Q=Ae[0]?re.make(Ae[0]):void 0,Q&&(yield*n.writeFileString(i.join(Fe,".git","opencode"),Q).pipe(I.ignore))}if(!Q)return{id:re.global,worktree:$,sandbox:$,vcs:"git"};let Qe=yield*D(["rev-parse","--show-toplevel"],{cwd:$});return Qe.code!==0?{id:Q,worktree:$,sandbox:$,vcs:d}:($=h($,Qe.text.trim()),{id:Q,sandbox:$,worktree:Fe,vcs:"git"})}),L=yield*m(j=>j.select().from(w).where((0,A.eq)(w.id,O.id)).get()),U=L?u(L):{id:O.id,worktree:O.worktree,vcs:O.vcs,sandboxes:[],time:{created:Date.now(),updated:Date.now()}};H.OPENCODE_EXPERIMENTAL_ICON_DISCOVERY&&(yield*B(U).pipe(I.ignore,I.forkIn(v)));let C={...U,worktree:O.worktree,vcs:O.vcs,time:{...U.time,updated:Date.now()}};return O.sandbox!==C.worktree&&!C.sandboxes.includes(O.sandbox)&&C.sandboxes.push(O.sandbox),C.sandboxes=yield*I.forEach(C.sandboxes,j=>n.exists(j).pipe(I.orDie,I.map(ie=>ie?j:void 0)),{concurrency:"unbounded"}).pipe(I.map(j=>j.filter(ie=>ie!==void 0))),yield*m(j=>j.insert(w).values({id:C.id,worktree:C.worktree,vcs:C.vcs??null,name:C.name,icon_url:C.icon?.url,icon_color:C.icon?.color,time_created:C.time.created,time_updated:C.time.updated,time_initialized:C.time.initialized,sandboxes:C.sandboxes,commands:C.commands}).onConflictDoUpdate({target:w.id,set:{worktree:C.worktree,vcs:C.vcs??null,name:C.name,icon_url:C.icon?.url,icon_color:C.icon?.color,time_updated:C.time.updated,time_initialized:C.time.initialized,sandboxes:C.sandboxes,commands:C.commands}}).run()),O.id!==re.global&&(yield*m(j=>j.update(he).set({project_id:O.id}).where((0,A.and)((0,A.eq)(he.project_id,re.global),(0,A.eq)(he.directory,O.worktree))).run())),yield*c(C),{project:C,sandbox:O.sandbox}}),B=I.fn("Project.discover")(function*(E){if(E.vcs!=="git"||E.icon?.override||E.icon?.url)return;let L=(yield*n.glob("**/favicon.{ico,png,svg,jpg,jpeg,webp}",{cwd:E.worktree,absolute:!0,include:"file"}).pipe(I.orDie)).sort(($,Be)=>$.length-Be.length)[0];if(!L)return;let U=yield*n.readFile(L).pipe(I.orDie),C=Buffer.from(U).toString("base64"),ie=`data:${Ie.mimeType(L)};base64,${C}`;yield*xe({projectID:E.id,icon:{url:ie}})}),Pe=I.fn("Project.list")(function*(){return yield*m(E=>E.select().from(w).all().map(u))}),pe=I.fn("Project.get")(function*(E){let O=yield*m(L=>L.select().from(w).where((0,A.eq)(w.id,E)).get());return O?u(O):void 0}),xe=I.fn("Project.update")(function*(E){let O=yield*m(U=>U.update(w).set({name:E.name,icon_url:E.icon?.url,icon_color:E.icon?.color,commands:E.commands,time_updated:Date.now()}).where((0,A.eq)(w.id,E.projectID)).returning().get());if(!O)throw new Error(`Project not found: ${E.projectID}`);let L=u(O);return yield*c(L),L}),De=I.fn("Project.initGit")(function*(E){if(E.project.vcs==="git")return E.project;if(!(yield*I.sync(()=>at("git"))))throw new Error("Git is not installed");let O=yield*D(["init","--quiet"],{cwd:E.directory});if(O.code!==0)throw new Error(O.stderr.trim()||O.text.trim()||"Failed to initialize git repository");let{project:L}=yield*k(E.directory);return L}),Ue=I.fn("Project.setInitialized")(function*(E){yield*m(O=>O.update(w).set({time_initialized:Date.now()}).where((0,A.eq)(w.id,E)).run())}),le=I.fn("Project.sandboxes")(function*(E){let O=yield*m(U=>U.select().from(w).where((0,A.eq)(w.id,E)).get());if(!O)return[];let L=u(O);return yield*I.forEach(L.sandboxes,U=>n.isDir(U).pipe(I.orDie,I.map(C=>C?U:void 0)),{concurrency:"unbounded"}).pipe(I.map(U=>U.filter(C=>C!==void 0)))}),ut=I.fn("Project.addSandbox")(function*(E,O){let L=yield*m(j=>j.select().from(w).where((0,A.eq)(w.id,E)).get());if(!L)throw new Error(`Project not found: ${E}`);let U=[...L.sandboxes];U.includes(O)||U.push(O);let C=yield*m(j=>j.update(w).set({sandboxes:U,time_updated:Date.now()}).where((0,A.eq)(w.id,E)).returning().get());if(!C)throw new Error(`Project not found: ${E}`);yield*c(u(C))}),mt=I.fn("Project.removeSandbox")(function*(E,O){let L=yield*m(j=>j.select().from(w).where((0,A.eq)(w.id,E)).get());if(!L)throw new Error(`Project not found: ${E}`);let U=L.sandboxes.filter(j=>j!==O),C=yield*m(j=>j.update(w).set({sandboxes:U,time_updated:Date.now()}).where((0,A.eq)(w.id,E)).returning().get());if(!C)throw new Error(`Project not found: ${E}`);yield*c(u(C))});return g.of({fromDirectory:k,discover:B,list:Pe,get:pe,update:xe,initGit:De,setInitialized:Ue,sandboxes:le,addSandbox:ut,removeSandbox:mt})})),o.defaultLayer=o.layer.pipe(Ye.provide(lt),Ye.provide(Ie.defaultLayer),Ye.provide(Tr.layer));let{runPromise:F}=Ut(g,o.defaultLayer);function W(n){return F(i=>i.fromDirectory(n))}o.fromDirectory=W,e(W,"fromDirectory");function N(n){return F(i=>i.discover(n))}o.discover=N,e(N,"discover");function p(){return _e.use(n=>n.select().from(w).all().map(i=>u(i)))}o.list=p,e(p,"list");function s(n){let i=_e.use(P=>P.select().from(w).where((0,A.eq)(w.id,n)).get());if(i)return u(i)}o.get=s,e(s,"get");function y(n){_e.use(i=>i.update(w).set({time_initialized:Date.now()}).where((0,A.eq)(w.id,n)).run())}o.setInitialized=y,e(y,"setInitialized");function S(n){return F(i=>i.initGit(n))}o.initGit=S,e(S,"initGit");function X(n){return F(i=>i.update(n))}o.update=X,e(X,"update");function ye(n){return F(i=>i.sandboxes(n))}o.sandboxes=ye,e(ye,"sandboxes");function ne(n,i){return F(P=>P.addSandbox(n,i))}o.addSandbox=ne,e(ne,"addSandbox");function fe(n,i){return F(P=>P.removeSandbox(n,i))}o.removeSandbox=fe,e(fe,"removeSandbox")})(Et||={});var ke;(_=>{let t=ee.create({service:"state"}),r=new Map;function l(g,T,J){return()=>{let F=g(),W=r.get(F);W||(W=new Map,r.set(F,W));let N=W.get(T);if(N)return N.state;let p=T();return W.set(T,{state:p,dispose:J}),p}}_.create=l,e(l,"create");async function u(g){let T=r.get(g);if(!T)return;t.info("waiting for state disposal to complete",{key:g});let J=!1;setTimeout(()=>{J||t.warn("state disposal is taking an unusually long time - if it does not complete in a reasonable time, please report this as a bug",{key:g})},1e4).unref();let F=[];for(let[W,N]of T){if(!N.dispose)continue;let p=typeof W=="function"?W.name:String(W),s=Promise.resolve(N.state).then(y=>N.dispose(y)).catch(y=>{t.error("Error while disposing state:",{error:y,key:g,init:p})});F.push(s)}await Promise.all(F),T.clear(),r.delete(g),J=!0,t.info("state disposal completed",{key:g})}_.dispose=u,e(u,"dispose")})(ke||={});var de=te.create("instance"),oe=new Map,Me={all:void 0};function Bt(t){$e.emit("event",{directory:t,payload:{type:"server.instance.disposed",properties:{directory:t}}})}e(Bt,"emit");function Ft(t){return be(async()=>{let r=t.project&&t.worktree?{directory:t.directory,worktree:t.worktree,project:t.project}:await Et.fromDirectory(t.directory).then(({project:l,sandbox:u})=>({directory:t.directory,worktree:u,project:l}));return await de.provide(r,async()=>{await t.init?.()}),r})}e(Ft,"boot");function Gt(t,r){let l=r.catch(u=>{throw oe.get(t)===l&&oe.delete(t),u});return oe.set(t,l),l}e(Gt,"track");var Z={async provide(t){let r=Te.resolve(t.directory),l=oe.get(r);l||(ee.Default.info("creating instance",{directory:r}),l=Gt(r,Ft({directory:r,init:t.init})));let u=await l;return de.provide(u,async()=>t.fn())},get current(){return de.use()},get directory(){return de.use().directory},get worktree(){return de.use().worktree},get project(){return de.use().project},containsPath(t){return Te.contains(Z.directory,t)?!0:Z.worktree==="/"?!1:Te.contains(Z.worktree,t)},bind(t){let r=de.use();return((...l)=>de.provide(r,()=>t(...l)))},restore(t,r){return de.provide(t,r)},state(t,r){return ke.create(()=>Z.directory,t,r)},async reload(t){let r=Te.resolve(t.directory);ee.Default.info("reloading instance",{directory:r}),await Promise.all([ke.dispose(r),ot(r)]),oe.delete(r);let l=Gt(r,Ft({...t,directory:r}));return Bt(r),await l},async dispose(){let t=Z.directory;ee.Default.info("disposing instance",{directory:t}),await Promise.all([ke.dispose(t),ot(t)]),oe.delete(t),Bt(t)},async disposeAll(){return Me.all||(Me.all=be(async()=>{ee.Default.info("disposing all instances");let t=[...oe.entries()];for(let[r,l]of t){if(oe.get(r)!==l)continue;let u=await l.catch(_=>{ee.Default.warn("instance dispose failed",{key:r,error:_})});if(!u){oe.get(r)===l&&oe.delete(r);continue}oe.get(r)===l&&await de.provide(u,async()=>{await Z.dispose()})}}).finally(()=>{Me.all=void 0})),Me.all}};var Lr=wr.makeMemoMapUnsafe();function je(t){try{let r=Z.current;return br.provideService(t,we,r)}catch(r){if(!(r instanceof te.NotFound))throw r}return t}e(je,"attach");function Ut(t,r){let l,u=e(()=>l??=vr.make(r,{memoMap:Lr}),"getRuntime");return{runSync:e(_=>u().runSync(je(t.use(_))),"runSync"),runPromiseExit:e((_,g)=>u().runPromiseExit(je(t.use(_)),g),"runPromiseExit"),runPromise:e((_,g)=>u().runPromise(je(t.use(_)),g),"runPromise"),runFork:e(_=>u().runFork(je(t.use(_))),"runFork"),runCallback:e(_=>u().runCallback(je(t.use(_))),"runCallback")}}e(Ut,"makeRuntime");export{$e as a,be as b,ze as c,Xe as d,H as e,Zr as f,nt as g,Ke as h,tr as i,_e as j,A as k,Ee as l,w as m,he as n,ir as o,Fo as p,Go as q,$o as r,ct as s,at as t,re as u,Ie as v,lt as w,Et as x,Z as y,Lr as z,Ut as A};
@@ -0,0 +1,12 @@
1
+ // Built by esbuild from opencode-server source
2
+ if (typeof globalThis.Bun === 'undefined') {
3
+ globalThis.Bun = {
4
+ version: '0.0.0-node-compat',
5
+ stdin: { async text() { const chunks = []; for await (const c of process.stdin) chunks.push(c); return Buffer.concat(chunks).toString(); } },
6
+ which(cmd) { try { return require('child_process').execFileSync('which', [cmd], { encoding: 'utf8' }).trim(); } catch { return null; } },
7
+ };
8
+ }
9
+ if (typeof globalThis.__name === 'undefined') { globalThis.__name = (t, n) => { Object.defineProperty(t, 'name', { value: n, configurable: true }); return t; }; }
10
+ if (typeof globalThis.__export === 'undefined') { globalThis.__export = (t, a) => { for (const k in a) Object.defineProperty(t, k, { get: a[k], enumerable: true }); }; }
11
+
12
+ import{Q as D,R as N,c as z,d as V,h as w,k as A,q,t as C}from"./chunk-XJGIPERR.js";import{A as J,h as S,j as O,k as b,l as B,n as F}from"./chunk-26PYOYAY.js";import{e as K}from"./chunk-M4CB72HE.js";import{a as c}from"./chunk-MBZTOEAD.js";import{Effect as t,Exit as de,Layer as u,Option as j,Schema as k,Scope as G,ServiceMap as pe,Stream as fe}from"effect";import{FetchHttpClient as le,HttpClient as Q,HttpClientRequest as p,HttpClientResponse as ue}from"effect/unstable/http";import{sqliteTable as ce,text as I}from"drizzle-orm/sqlite-core";var l=ce("session_share",{session_id:I().primaryKey().references(()=>F.id,{onDelete:"cascade"}),id:I().notNull(),secret:I().notNull(),url:I().notNull(),...B});var ye;(x=>{let f=K.create({service:"share-next"}),y=process.env.OPENCODE_DISABLE_SHARE==="true"||process.env.OPENCODE_DISABLE_SHARE==="1",W=k.Struct({id:k.String,url:k.String,secret:k.String});class _ extends pe.Service()("@opencode/ShareNext"){static{c(this,"Service")}}x.Service=_;let $=c(i=>t.sync(()=>O.use(i)),"db");function U(i){return{create:`/api/${i}`,sync:c(d=>`/api/${i}/${d}/sync`,"sync"),remove:c(d=>`/api/${i}/${d}`,"remove"),data:c(d=>`/api/${i}/${d}/data`,"data")}}c(U,"api");let X=U("share"),Y=U("shares");function R(i){switch(i.type){case"session":return"session";case"message":return`message/${i.data.id}`;case"part":return`part/${i.data.messageID}/${i.data.id}`;case"session_diff":return"session_diff";case"model":return"model"}}c(R,"key"),x.layer=u.effect(_,t.gen(function*(){let i=yield*A.Service,d=yield*w.Service,te=yield*N.Service,H=yield*Q.HttpClient,L=Q.filterStatusOk(H),P=yield*C.Service,M=yield*D.Service;function m(e,s){return t.gen(function*(){if(y)return;let n=yield*S.get(E),r=n.queue.get(e);if(r){for(let a of s)r.data.set(R(a),a);return}let o=new Map(s.map(a=>[R(a),a]));n.queue.set(e,{data:o}),yield*re(e).pipe(t.delay(1e3),t.catchCause(a=>t.sync(()=>{f.error("share flush failed",{sessionID:e,cause:a})})),t.forkIn(n.scope))})}c(m,"sync");let E=yield*S.make(t.fn("ShareNext.state")(function*(e){let s={queue:new Map,scope:yield*G.make()};if(yield*t.addFinalizer(()=>G.close(s.scope,de.void).pipe(t.andThen(t.sync(()=>{s.queue.clear()})))),y)return s;let n=c((r,o)=>d.subscribe(r).pipe(fe.runForEach(a=>o(a).pipe(t.catchCause(v=>t.sync(()=>{f.error("share subscriber failed",{type:r.type,cause:v})})))),t.forkScoped),"watch");return yield*n(D.Event.Updated,r=>t.gen(function*(){let o=yield*M.get(r.properties.sessionID);yield*m(o.id,[{type:"session",data:o}])})),yield*n(q.Event.Updated,r=>t.gen(function*(){let o=r.properties.info;if(yield*m(o.sessionID,[{type:"message",data:o}]),o.role!=="user")return;let a=yield*P.getModel(o.model.providerID,o.model.modelID);yield*m(o.sessionID,[{type:"model",data:[a]}])})),yield*n(q.Event.PartUpdated,r=>m(r.properties.part.sessionID,[{type:"part",data:r.properties.part}])),yield*n(D.Event.Diff,r=>m(r.properties.sessionID,[{type:"session_diff",data:r.properties.diff}])),s})),h=t.fn("ShareNext.request")(function*(){let e={},s=yield*i.active();if(j.isNone(s)||!s.value.active_org_id){let r=(yield*te.get()).enterprise?.url??"https://opncd.ai";return{headers:e,api:X,baseUrl:r}}let n=yield*i.token(s.value.id);if(j.isNone(n))throw new Error("No active account token available for sharing");return e.authorization=`Bearer ${n.value}`,e["x-org-id"]=s.value.active_org_id,{headers:e,api:Y,baseUrl:s.value.url}}),T=t.fnUntraced(function*(e){let s=yield*$(n=>n.select().from(l).where((0,b.eq)(l.session_id,e)).get());if(s)return{id:s.id,secret:s.secret,url:s.url}}),re=t.fn("ShareNext.flush")(function*(e){if(y)return;let s=yield*S.get(E),n=s.queue.get(e);if(!n)return;s.queue.delete(e);let r=yield*T(e);if(!r)return;let o=yield*h(),a=yield*p.post(`${o.baseUrl}${o.api.sync(r.id)}`).pipe(p.setHeaders(o.headers),p.bodyJson({secret:r.secret,data:Array.from(n.data.values())}),t.flatMap(v=>H.execute(v)));a.status>=400&&f.warn("failed to sync share",{sessionID:e,shareID:r.id,status:a.status})}),se=t.fn("ShareNext.full")(function*(e){f.info("full sync",{sessionID:e});let s=yield*M.get(e),n=yield*M.diff(e),r=yield*t.sync(()=>Array.from(q.stream(e))),o=yield*t.forEach(Array.from(new Map(r.filter(a=>a.info.role==="user").map(a=>a.info.model).map(a=>[`${a.providerID}/${a.modelID}`,a])).values()),a=>P.getModel(z.make(a.providerID),V.make(a.modelID)),{concurrency:8});yield*m(e,[{type:"session",data:s},...r.map(a=>({type:"message",data:a.info})),...r.flatMap(a=>a.parts.map(v=>({type:"part",data:v}))),{type:"session_diff",data:n},{type:"model",data:o}])}),ne=t.fn("ShareNext.init")(function*(){y||(yield*S.get(E))}),ae=t.fn("ShareNext.url")(function*(){return(yield*h()).baseUrl}),ie=t.fn("ShareNext.create")(function*(e){if(y)return{id:"",url:"",secret:""};f.info("creating share",{sessionID:e});let s=yield*h(),n=yield*p.post(`${s.baseUrl}${s.api.create}`).pipe(p.setHeaders(s.headers),p.bodyJson({sessionID:e}),t.flatMap(o=>L.execute(o)),t.flatMap(ue.schemaBodyJson(W)));yield*$(o=>o.insert(l).values({session_id:e,id:n.id,secret:n.secret,url:n.url}).onConflictDoUpdate({target:l.session_id,set:{id:n.id,secret:n.secret,url:n.url}}).run());let r=yield*S.get(E);return yield*se(e).pipe(t.catchCause(o=>t.sync(()=>{f.error("share full sync failed",{sessionID:e,cause:o})})),t.forkIn(r.scope)),n}),oe=t.fn("ShareNext.remove")(function*(e){if(y)return;f.info("removing share",{sessionID:e});let s=yield*T(e);if(!s)return;let n=yield*h();yield*p.delete(`${n.baseUrl}${n.api.remove(s.id)}`).pipe(p.setHeaders(n.headers),p.bodyJson({secret:s.secret}),t.flatMap(r=>L.execute(r))),yield*$(r=>r.delete(l).where((0,b.eq)(l.session_id,e)).run())});return _.of({init:ne,url:ae,request:h,create:ie,remove:oe})})),x.defaultLayer=x.layer.pipe(u.provide(w.layer),u.provide(A.defaultLayer),u.provide(N.defaultLayer),u.provide(le.layer),u.provide(C.defaultLayer),u.provide(D.defaultLayer));let{runPromise:g}=J(_,x.defaultLayer);async function me(){return g(i=>i.init())}x.init=me,c(me,"init");async function Se(){return g(i=>i.url())}x.url=Se,c(Se,"url");async function ge(){return g(i=>i.request())}x.request=ge,c(ge,"request");async function he(i){return g(d=>d.create(i))}x.create=he,c(he,"create");async function ve(i){return g(d=>d.remove(i))}x.remove=ve,c(ve,"remove")})(ye||={});export{ye as a};