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.
- package/NODE_COMPAT.md +23 -174
- package/dist/20260127222353_familiar_lady_ursula-KV747FJX.js +14 -0
- package/dist/{chunk-LTCXIXYM.js → 20260211171708_add_project_commands-GDOHPDPF.js} +3 -1
- package/dist/20260213144116_wakeful_the_professor-ZVDD54AK.js +14 -0
- package/dist/20260225215848_workspace-ZMSOZSPA.js +14 -0
- package/dist/20260227213759_add_session_workspace_id-ROENWPKA.js +14 -0
- package/dist/20260228203230_blue_harpoon-IW3Z4TQZ.js +14 -0
- package/dist/20260303231226_add_workspace_fields-OUVZMNAG.js +14 -0
- package/dist/20260309230000_move_org_to_state-NOXAPU5V.js +14 -0
- package/dist/20260312043431_session_message_cursor-DJ4T3T4R.js +14 -0
- package/dist/20260323234822_events-72GIKJ2A.js +14 -0
- package/dist/20260410174513_workspace-name-JXSWFBJN.js +14 -0
- package/dist/20260413175956_chief_energizer-4HEWZ6U3.js +14 -0
- package/dist/20260423070820_add_icon_url_override-X5SHFGTI.js +14 -0
- package/dist/20260427172553_slow_nightmare-PS5T2AH2.js +14 -0
- package/dist/{chunk-PWFRMDDF.js → 20260428004200_add_session_path-LGW75WYA.js} +3 -0
- package/dist/{valibot--1zFm7rT-FSYJNYJ6.js → 20260501142318_next_venus-J3TLVXZ6.js} +3 -1
- package/dist/20260504145000_add_sync_owner-3R52GB4C.js +14 -0
- package/dist/20260507164347_add_workspace_time-JHDRCZAR.js +14 -0
- package/dist/20260510033149_session_usage-UGBVOXZB.js +53 -0
- package/dist/20260511000411_data_migration_state-FB4LBFSE.js +14 -0
- package/dist/20260511173437_session-metadata-T2XHGWHS.js +14 -0
- package/dist/20260601010001_normalize_storage_paths-5MAY5GT3.js +14 -0
- package/dist/{chunk-YRY5Y3QL.js → 20260601202201_amazing_prowler-PET224YG.js} +3 -1
- package/dist/20260602002951_lowly_union_jack-PG6XDMGL.js +14 -0
- package/dist/20260602182828_add_project_directories-ZCH2ACGG.js +14 -0
- package/dist/20260603001617_session_message_projection_indexes-XVLJTUF2.js +14 -0
- package/dist/20260603040000_session_message_projection_order-XG6RACZQ.js +14 -0
- package/dist/20260603141458_session_input_inbox-K2VQ7V6E.js +14 -0
- package/dist/20260603160727_jittery_ezekiel_stane-WKJLRDO7.js +14 -0
- package/dist/20260604172448_event_sourced_session_input-NTXOECR7.js +14 -0
- package/dist/20260605003541_add_session_context_snapshot-DXMQEXMT.js +14 -0
- package/dist/{zod-Bwrt9trS-HVDOFWRP.js → 20260605042240_add_context_epoch_agent-W6IQYZXE.js} +3 -1
- package/dist/20260611035744_credential-XTMSYTJD.js +14 -0
- package/dist/20260611192811_lush_chimera-XPLIQMJD.js +14 -0
- package/dist/20260612174303_project_dir_strategy-FR2NGQKK.js +14 -0
- package/dist/20260622142730_simplify_session_context_epoch-NTQZR3RE.js +14 -0
- package/dist/20260622170816_reset_v2_session_state-5JPHJTZG.js +14 -0
- package/dist/20260622202450_simplify_session_input-2EXF2HMV.js +14 -0
- package/dist/app-runtime-6NGO2HRS.js +14 -0
- package/dist/chunk-4K2RXRZL.js +14 -0
- package/dist/chunk-BM2C7NHL.js +41 -0
- package/dist/chunk-E47SMIVL.js +186 -0
- package/dist/chunk-OMDJ6ZZ2.js +684 -0
- package/dist/chunk-PLQOF3WF.js +393 -0
- package/dist/chunk-QRABYJKL.js +14 -0
- package/dist/chunk-RHIWAYN5.js +14 -0
- package/dist/{arktype-aI7TBD0R-TFNARRIP.js → chunk-VURLSDCB.js} +3 -1
- package/dist/chunk-Z5TLIUAI.js +28 -0
- package/dist/chunk-ZMHNE2MU.js +865 -0
- package/dist/chunk-ZWLTE2TM.js +1455 -0
- package/dist/code-mode-YFX4N2VN.js +40 -0
- package/dist/copilot-provider-TX4YFKJZ.js +14 -0
- package/dist/photon-VQS5F5BI.js +14 -0
- package/dist/pty.node-Y3N2XKYG.js +14 -0
- package/dist/run.js +3 -1
- package/dist/serve.js +3 -1
- package/dist/server-TI57TGPO.js +17 -0
- package/dist/session-6RNXZNG6.js +14 -0
- package/dist/{chunk-2ANK3QEN.js → worktree-3RZQEGVC.js} +3 -1
- package/package.json +83 -50
- package/patches/@ai-sdk%2Famazon-bedrock@4.0.166.patch +164 -0
- package/patches/@ai-sdk%2Fanthropic@3.0.111.patch +528 -0
- package/patches/@ai-sdk%2Fgoogle@3.0.73.patch +69 -0
- package/patches/@ai-sdk%2Fgroq@3.0.31.patch +79 -0
- package/patches/@ai-sdk%2Fmistral@3.0.51.patch +714 -0
- package/patches/@ai-sdk%2Fopenai-compatible@2.0.41.patch +39 -0
- package/patches/@ai-sdk%2Fopenai@3.0.88.patch +280 -0
- package/patches/@ai-sdk%2Fxai@3.0.139.patch +296 -0
- package/patches/@modelcontextprotocol%2Fsdk@1.29.0.patch +647 -0
- package/patches/@npmcli%2Fagent@4.0.2.patch +13 -0
- package/patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch +285 -0
- package/patches/effect@4.0.0-beta.83.patch +57 -0
- package/patches/gcp-metadata@8.1.2.patch +14 -0
- package/patches/pacote@21.5.0.patch +18 -0
- package/postinstall.cjs +146 -0
- package/dist/chunk-5P5WLADX.js +0 -18
- package/dist/chunk-7KKA6WBY.js +0 -12
- package/dist/chunk-A7EXZZPC.js +0 -12
- package/dist/chunk-CZVKIDQZ.js +0 -12
- package/dist/chunk-FXLFZ5DL.js +0 -12
- package/dist/chunk-G752V4OP.js +0 -2187
- package/dist/chunk-GBXMNWYD.js +0 -18
- package/dist/chunk-IR6PDN4W.js +0 -13
- package/dist/chunk-M4CB72HE.js +0 -13
- package/dist/chunk-MBZTOEAD.js +0 -12
- package/dist/default-u_dwuiYb-652AQZKX.js +0 -12
- package/dist/effect-QlVUlMFu-JVYEXAZL.js +0 -12
- package/dist/log-MVJ7H4K5.js +0 -12
- package/dist/pty.node-X2EITEZ4.js +0 -12
- package/dist/registry-ISXIFNPG.js +0 -12
- package/dist/run-AUCA7EKA.js +0 -20
- package/dist/run-service-MT3LOWLS.js +0 -12
- package/dist/schema-YWIVP7UR.js +0 -12
- package/dist/server-PIYRZLBG.js +0 -12
- package/dist/session-ACBIJ2VE.js +0 -12
- package/dist/share-next-MPGA7EO4.js +0 -12
- package/dist/sury-CWZTCd75-3YHH6KVI.js +0 -12
- package/dist/typebox-Dei93FPO-GLI7OCTY.js +0 -12
- package/dist/valibot-D_HTw1Gn-E5NKVIOV.js +0 -12
- package/dist/worktree-E4DGSBLJ.js +0 -12
- package/dist/zod-DSgpEGAE-DSH6V7MG.js +0 -12
- package/packages/opencode/migration/20260127222353_familiar_lady_ursula/migration.sql +0 -90
- package/packages/opencode/migration/20260127222353_familiar_lady_ursula/snapshot.json +0 -796
- package/packages/opencode/migration/20260211171708_add_project_commands/migration.sql +0 -1
- package/packages/opencode/migration/20260211171708_add_project_commands/snapshot.json +0 -806
- package/packages/opencode/migration/20260213144116_wakeful_the_professor/migration.sql +0 -11
- package/packages/opencode/migration/20260213144116_wakeful_the_professor/snapshot.json +0 -897
- package/packages/opencode/migration/20260225215848_workspace/migration.sql +0 -7
- package/packages/opencode/migration/20260225215848_workspace/snapshot.json +0 -959
- package/packages/opencode/migration/20260227213759_add_session_workspace_id/migration.sql +0 -2
- package/packages/opencode/migration/20260227213759_add_session_workspace_id/snapshot.json +0 -983
- package/packages/opencode/migration/20260228203230_blue_harpoon/migration.sql +0 -17
- package/packages/opencode/migration/20260228203230_blue_harpoon/snapshot.json +0 -1102
- package/packages/opencode/migration/20260303231226_add_workspace_fields/migration.sql +0 -5
- package/packages/opencode/migration/20260303231226_add_workspace_fields/snapshot.json +0 -1013
- package/packages/opencode/migration/20260309230000_move_org_to_state/migration.sql +0 -3
- package/packages/opencode/migration/20260309230000_move_org_to_state/snapshot.json +0 -1156
- package/packages/opencode/migration/20260312043431_session_message_cursor/migration.sql +0 -4
- package/packages/opencode/migration/20260312043431_session_message_cursor/snapshot.json +0 -1168
- package/packages/opencode/migration/20260323234822_events/migration.sql +0 -13
- package/packages/opencode/migration/20260323234822_events/snapshot.json +0 -1271
- package/packages/opencode/migration/20260409000000_add_session_metadata/migration.sql +0 -1
|
@@ -0,0 +1,14 @@
|
|
|
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{Ja as me,K as fe,L as T,Ma as F,Na as ye,Oa as ue,Pa as ge,Qa as ne,b as Q,c as V,e as M,f as D,g,i as re,r as ce,s as de,yb as N}from"./chunk-BM2C7NHL.js";import{a as o,d as U}from"./chunk-RHIWAYN5.js";var G={};U(G,{Error:()=>W,InvalidPatternError:()=>J,Ripgrep:()=>G,Service:()=>z,node:()=>Oe});import{Context as Me,Effect as f,Fiber as De,Layer as Te,Schema as h,Stream as $}from"effect";import{ChildProcess as Le}from"effect/unstable/process";var j={};U(j,{Entry:()=>x,Event:()=>we,FileSystem:()=>j,FindInput:()=>X,Match:()=>L,Submatch:()=>Y});import{Schema as P}from"effect";var he=ce({type:"file.edited",schema:{file:P.String}}),we={Edited:he,Definitions:de(he)},x=P.Struct({path:g,type:P.Literals(["file","directory"])}).annotate({identifier:"FileSystem.Entry"}),Y=P.Struct({text:P.String,start:D,end:D}).annotate({identifier:"FileSystem.Submatch"}),L=P.Struct({entry:x,line:M,offset:D,text:P.String,submatches:P.Array(Y)}).annotate({identifier:"FileSystem.Match"}),X=class extends P.Class("FileSystem.FindInput")({query:P.String,type:P.Literals(["file","directory"]).pipe(re),limit:M.pipe(re)}){static{o(this,"FindInput")}};import oe from"path";import{Context as Pe,Effect as b,Layer as ke,Stream as Z}from"effect";import{HttpClient as xe,HttpClientRequest as Re}from"effect/unstable/http";import{ChildProcess as Ae}from"effect/unstable/process";import{ChildProcessSpawner as Ce}from"effect/unstable/process/ChildProcessSpawner";import Fe from"which";import Ie from"path";function K(l,s){let i=s?.PATH??s?.Path??process.env.PATH??process.env.Path??"",r=i?i+Ie.delimiter+T.Path.bin:T.Path.bin,n=Fe.sync(l,{nothrow:!0,path:r,pathExt:s?.PATHEXT??s?.PathExt??process.env.PATHEXT??process.env.PathExt});return typeof n=="string"?n:null}o(K,"which");var ee;(t=>{let l="15.1.0",s={"arm64-darwin":{platform:"aarch64-apple-darwin",extension:"tar.gz"},"arm64-linux":{platform:"aarch64-unknown-linux-gnu",extension:"tar.gz"},"x64-darwin":{platform:"x86_64-apple-darwin",extension:"tar.gz"},"x64-linux":{platform:"x86_64-unknown-linux-musl",extension:"tar.gz"},"arm64-win32":{platform:"aarch64-pc-windows-msvc",extension:"zip"},"ia32-win32":{platform:"i686-pc-windows-msvc",extension:"zip"},"x64-win32":{platform:"x86_64-pc-windows-msvc",extension:"zip"}};class i extends Pe.Service()("@opencode/RipgrepBinary"){static{o(this,"Service")}}t.Service=i;let r=ke.effect(i,b.gen(function*(){let e=yield*F.Service,a=xe.filterStatusOk(yield*xe.HttpClient),y=yield*Ce,c=b.fnUntraced(function*(d,v){let u=yield*y.spawn(Ae.make(d,v,{extendEnv:!0,stdin:"ignore"})),[k,A,w]=yield*b.all([Z.mkString(Z.decodeText(u.stdout)),Z.mkString(Z.decodeText(u.stderr)),u.exitCode],{concurrency:"unbounded"});return{stdout:k,stderr:A,code:w}},b.scoped),S=b.fnUntraced(function*(d,v,u){let k=yield*e.makeTempDirectoryScoped({directory:T.Path.bin,prefix:"ripgrep-"});if(v.extension==="zip"){let w=(yield*b.sync(()=>K("powershell.exe")??K("pwsh.exe")))??"powershell.exe",C=yield*c(w,["-NoProfile","-NonInteractive","-Command",`$global:ProgressPreference = 'SilentlyContinue'; Expand-Archive -LiteralPath '${d.replaceAll("'","''")}' -DestinationPath '${k.replaceAll("'","''")}' -Force`]);if(C.code!==0)throw new Error(C.stderr.trim()||C.stdout.trim()||`ripgrep extraction failed with code ${C.code}`)}if(v.extension==="tar.gz"){let w=yield*c("tar",["-xzf",d,"-C",k]);if(w.code!==0)throw new Error(w.stderr.trim()||w.stdout.trim()||`ripgrep extraction failed with code ${w.code}`)}let A=oe.join(k,`ripgrep-${l}-${v.platform}`,process.platform==="win32"?"rg.exe":"rg");if(!(yield*e.isFile(A)))throw new Error(`ripgrep archive did not contain executable: ${A}`);yield*e.copyFile(A,u),process.platform!=="win32"&&(yield*e.chmod(u,493))},b.scoped);return i.of({filepath:yield*b.cached(b.gen(function*(){let d=yield*b.sync(()=>K(process.platform==="win32"?"rg.exe":"rg"));if(d&&(yield*e.isFile(d).pipe(b.orDie)))return d;let v=oe.join(T.Path.bin,`rg${process.platform==="win32"?".exe":""}`);if(yield*e.isFile(v).pipe(b.orDie))return v;let u=`${process.arch}-${process.platform}`,k=s[u];if(!k)throw new Error(`unsupported platform for ripgrep: ${u}`);let A=`ripgrep-${l}-${k.platform}.${k.extension}`,w=`https://github.com/BurntSushi/ripgrep/releases/download/${l}/${A}`,C=oe.join(T.Path.bin,A);yield*b.logInfo("downloading ripgrep",{url:w}),yield*e.ensureDir(T.Path.bin).pipe(b.orDie);let pe=yield*Re.get(w).pipe(a.execute,b.flatMap(q=>q.arrayBuffer),b.mapError(q=>q instanceof Error?q:new Error(String(q))));if(pe.byteLength===0)throw new Error(`failed to download ripgrep from ${w}`);return yield*e.writeWithDirs(C,new Uint8Array(pe)),yield*S(C,k,v),yield*e.remove(C,{force:!0}).pipe(b.ignore),v}))})}));t.node=Q({service:i,layer:r,deps:[F.node,me,ye.node]})})(ee||={});var $e=8*1024,be=64*1024,Ne=100,_e=h.Struct({type:h.Literal("match"),data:h.Struct({path:h.Struct({text:h.String}),lines:h.Struct({text:h.String}),line_number:M,absolute_offset:D,submatches:h.Array(h.Struct({match:h.Struct({text:h.String}),start:D,end:D}))})}),W=class extends h.TaggedErrorClass()("Ripgrep.Error",{message:h.String,cause:h.optional(h.Defect())}){static{o(this,"Error")}},J=class extends h.TaggedErrorClass()("Ripgrep.InvalidPatternError",{pattern:h.String,message:h.String}){static{o(this,"InvalidPatternError")}},z=class extends Me.Service()("@opencode/v2/Ripgrep"){static{o(this,"Service")}},_=o((l,s)=>new W({message:l,cause:s}),"failure"),ze=o(l=>l.includes("regex parse error")||l.includes("error parsing regex"),"isInvalidPattern"),Ge=Te.effect(z,f.gen(function*(){let l=yield*ne.Service,s=yield*ee.Service,i=o(r=>{let n=f.scoped(f.gen(function*(){let e=yield*l.spawn(Le.make(yield*s.filepath,r.args,{cwd:r.cwd,extendEnv:!0,stdin:"ignore"})),a=yield*ge(e.stderr,$e).pipe(f.map(u=>u.buffer.toString("utf8")),f.forkScoped),y=0,c=yield*$.decodeText(e.stdout).pipe($.splitLines,$.filter(u=>u.length>0),$.mapEffect(r.parse),$.filter(u=>u!==void 0),$.tap(u=>!r.onItem||y++>=r.limit?f.void:r.onItem(u)),$.take(r.limit+1),$.runCollect,f.map(u=>[...u])),S=c.length>r.limit;if(S)return{items:c.slice(0,r.limit),truncated:S,partial:!1};let d=yield*e.exitCode,v=yield*De.join(a);return r.pattern&&d===2&&ze(v)?yield*new J({pattern:r.pattern,message:v.trim()}):d!==0&&d!==1&&d!==2?yield*_(v.trim()||`ripgrep failed with code ${d}`):{items:d===1?[]:c,truncated:!1,partial:d===2}}));return(r.signal?n.pipe(f.raceFirst(ue(r.signal))):n).pipe(f.mapError(e=>e instanceof W||e instanceof J?e:_("ripgrep execution failed",e)))},"run");return z.of({glob:o(r=>i({cwd:r.cwd,limit:r.limit,signal:r.signal,args:["--no-config","--files",...r.hidden?["--hidden"]:[],...r.follow?["--follow"]:[],`--glob=${r.pattern}`,"--glob=!**/.git/**","."],parse:o(n=>f.succeed(n.replace(/^(?:\.[\\/])+/u,"").replace(/^[\\/]+/u,"").replaceAll("\\","/")),"parse")}).pipe(f.map(n=>n.items.map(t=>x.make({path:g.make(t),type:"file"}))),f.catchTag("Ripgrep.InvalidPatternError",n=>f.fail(_(n.message,n)))),"glob"),find:o(r=>i({cwd:r.cwd,limit:r.limit,signal:r.signal,args:["--no-config","--files",...r.hidden?["--hidden"]:[],...r.follow?["--follow"]:[],...r.pattern==="*"?[]:[`--glob=${r.pattern}`],"--glob=!**/.git/**","."],parse:o(n=>{let t=n.replace(/^(?:\.[\\/])+/u,"").replace(/^[\\/]+/u,"").replaceAll("\\","/");return f.succeed(x.make({path:g.make(t),type:"file"}))},"parse"),onItem:r.onEntry}).pipe(f.map(n=>n.items),f.catchTag("Ripgrep.InvalidPatternError",n=>f.fail(_(n.message,n)))),"find"),grep:o(r=>i({...r,args:["--no-config","--json","--hidden","--no-messages",...r.include?[`--glob=${r.include}`]:[],"--glob=!**/.git/**","--",r.pattern,r.file??"."],parse:o(n=>(Buffer.byteLength(n,"utf8")>be?f.fail(_(`Ripgrep JSON record exceeded ${be} bytes`)):f.try({try:o(()=>JSON.parse(n),"try"),catch:o(t=>_("Invalid ripgrep JSON output",t),"catch")})).pipe(f.flatMap(t=>!t||typeof t!="object"||!("type"in t)||t.type!=="match"?f.succeed(void 0):h.decodeUnknownEffect(_e)(t).pipe(f.map(e=>({...e.data,path:{text:e.data.path.text.replace(/^\.[\\/]/,"")},submatches:e.data.submatches.slice(0,Ne)})),f.mapError(e=>_("Invalid ripgrep match output",e))))),"parse")}).pipe(f.map(n=>n.items.map(t=>{let e=t.path.text.replace(/^(?:\.[\\/])+/u,"").replace(/^[\\/]+/u,"").replaceAll("\\","/");return L.make({entry:x.make({path:g.make(e),type:"file"}),line:t.line_number,offset:t.absolute_offset,text:t.lines.text.length>2e3?t.lines.text.slice(0,2e3).replace(/[\uD800-\uDBFF]$/,"")+"...":t.lines.text,submatches:t.submatches.map(a=>({text:a.match.text,start:a.start,end:a.end}))})}))),"grep")})})),Oe=Q({service:z,layer:Ge,deps:[ee.node,ne.node]});var se={};U(se,{Content:()=>Ye,Entry:()=>x,Event:()=>Ze,FileSystem:()=>se,FindInput:()=>X,GlobInput:()=>ae,GrepInput:()=>le,ListInput:()=>Ke,Match:()=>L,ReadInput:()=>Ve,Service:()=>H,Submatch:()=>Y,node:()=>tt});import te from"path";import{Context as Je,Effect as E,Layer as Qe,Schema as m}from"effect";var B={};U(B,{FileSystemSearch:()=>B,Service:()=>R,fffLayer:()=>Ee,locationLayer:()=>je,node:()=>We,ripgrepLayer:()=>Se});import I from"path";import{Context as qe,Effect as p,Layer as ie,Scope as Ue}from"effect";var O={};U(O,{Fff:()=>O,available:()=>Be,create:()=>He});function Be(){return!1}o(Be,"available");function He(l){return{ok:!1,error:"fff unavailable on node runtime"}}o(He,"create");import Xe from"fuzzysort";var R=class extends qe.Service()("@opencode/v2/FileSystem/Search"){static{o(this,"Service")}},Se=ie.effect(R,p.gen(function*(){let l=yield*F.Service,s=yield*N.Service,i=yield*G.Service,r=yield*Ue.Scope,n={files:[],directories:[]},t=new Set;return yield*i.find({cwd:s.directory,pattern:"*",limit:s.vcs?Number.MAX_SAFE_INTEGER:1e5,onEntry:o(e=>p.sync(()=>{n.files.push(e.path);let a=e.path.split("/");a.slice(0,-1).forEach((y,c)=>t.add(a.slice(0,c+1).join("/")+I.sep)),n.directories=Array.from(t)}),"onEntry")}).pipe(p.orDie,p.asVoid,p.forkIn(r)),R.of({glob:o(e=>p.gen(function*(){let a=I.resolve(s.directory,e.path??"."),c=(yield*l.stat(a).pipe(p.orDie)).type==="File"?I.dirname(a):a;return yield*i.glob({cwd:c,pattern:e.pattern,limit:e.limit??Number.MAX_SAFE_INTEGER}).pipe(p.map(S=>S.map(d=>x.make({...d,path:g.make(I.relative(s.directory,I.resolve(c,d.path)))}))),p.orDie)}),"glob"),grep:o(e=>p.gen(function*(){let a=I.resolve(s.directory,e.path??"."),y=yield*l.stat(a).pipe(p.orDie),c=y.type==="File"?I.dirname(a):a;return yield*i.grep({cwd:c,pattern:e.pattern,file:y.type==="File"?I.basename(a):void 0,include:e.include,limit:e.limit??Number.MAX_SAFE_INTEGER}).pipe(p.map(S=>S.map(d=>L.make({...d,entry:x.make({...d.entry,path:g.make(I.relative(s.directory,I.resolve(c,d.entry.path)))})}))),p.orDie)}),"grep"),find:o(e=>p.gen(function*(){let a=e.type==="file"?n.files:e.type==="directory"?n.directories:[...n.files,...n.directories];return Xe.go(e.query,a,{limit:e.limit??50}).map(y=>{let c=y.target,S=c.endsWith(I.sep)?"directory":"file";return x.make({path:g.make(c),type:S})})}),"find")})})),Ee=ie.effect(R,p.gen(function*(){let l=yield*N.Service,s=yield*p.try({try:o(()=>O.create({basePath:l.directory,aiMode:!0,disableMmapCache:!0,disableContentIndexing:!0}),"try"),catch:o(i=>i,"catch")}).pipe(p.catch(i=>p.logWarning("failed to initialize fff",{error:i}).pipe(p.as(void 0))));return s?.ok?(yield*p.addFinalizer(()=>p.sync(()=>s.value.destroy()).pipe(p.ignore)),R.of({glob:o(i=>p.sync(()=>{let r=i.path?.replaceAll("\\","/").replace(/\/$/,""),n=s.value.glob(r?`${r}/${i.pattern}`:i.pattern,{pageIndex:0,pageSize:i.limit});if(!n.ok)throw n.error;return n.value.items.map(t=>x.make({path:g.make(t.relativePath.replaceAll("\\","/")),type:"file"}))}),"glob"),grep:o(i=>p.sync(()=>{let r=i.path?.replaceAll("\\","/").replace(/\/$/,""),n=s.value.grep([r?`${r}/**`:void 0,i.include,i.pattern].filter(t=>t!==void 0).join(" "),{mode:"regex",pageSize:i.limit,timeBudgetMs:1500});if(!n.ok)throw n.error;return n.value.items.map(t=>{let e=Buffer.from(t.lineContent);return L.make({entry:x.make({path:g.make(t.relativePath.replaceAll("\\","/")),type:"file"}),line:t.lineNumber,offset:t.byteOffset,text:t.lineContent.length>2e3?t.lineContent.slice(0,2e3)+"...":t.lineContent,submatches:t.matchRanges.map(([a,y])=>({text:e.subarray(a,y).toString("utf8"),start:a,end:y}))})})}),"grep"),find:o(i=>p.sync(()=>{let r={pageIndex:0,pageSize:i.limit??50};return(()=>{if(i.type==="file"){let e=s.value.fileSearch(i.query.trim(),r);if(!e.ok)throw e.error;return e.value.items.map((a,y)=>({path:a.relativePath,type:"file",score:e.value.scores[y]?.total??0}))}if(i.type==="directory"){let e=s.value.directorySearch(i.query.trim(),r);if(!e.ok)throw e.error;return e.value.items.map((a,y)=>({path:a.relativePath,type:"directory",score:e.value.scores[y]?.total??0}))}let t=s.value.mixedSearch(i.query.trim(),r);if(!t.ok)throw t.error;return t.value.items.map((e,a)=>({path:e.item.relativePath,type:e.type,score:t.value.scores[a]?.total??0}))})().sort((t,e)=>e.score-t.score||t.path.length-e.path.length).map(t=>{let e=t.path.replaceAll("\\","/").replace(/\/$/,"");return x.make({path:g.make(e+(t.type==="directory"?I.sep:"")),type:t.type})})}),"find")})):(s&&(yield*p.logWarning("failed to initialize fff",{error:s.error})),R.of({find:o(()=>p.succeed([]),"find"),glob:o(()=>p.succeed([]),"glob"),grep:o(()=>p.succeed([]),"grep")}))})),ve=ie.unwrap(p.sync(()=>fe.OPENCODE_DISABLE_FFF||!O.available()?Se:Ee)),je=ve,We=V({service:R,layer:ve,deps:[F.node,N.node,G.node]});var Ve=m.Struct({path:g}),Ye=m.Struct({uri:m.String,name:m.String.pipe(m.optional),content:m.String,encoding:m.Literals(["utf8","base64"]),mime:m.String}).annotate({identifier:"FileSystem.Content"}),Ke=m.Struct({path:g.pipe(m.optional)});var ae=class extends m.Class("FileSystem.GlobInput")({pattern:m.String,path:g.pipe(m.optional),limit:M.pipe(m.optional)}){static{o(this,"GlobInput")}},le=class extends m.Class("FileSystem.GrepInput")({pattern:m.String,path:g.pipe(m.optional),include:m.String.pipe(m.optional),limit:M.pipe(m.optional)}){static{o(this,"GrepInput")}},Ze=j.Event,H=class extends Je.Service()("@opencode/v2/FileSystem"){static{o(this,"Service")}},et=Qe.effect(H,E.gen(function*(){let l=yield*F.Service,s=yield*N.Service,i=yield*B.Service,r=yield*l.realPath(s.directory).pipe(E.orDie),n=E.fnUntraced(function*(t){let e=te.resolve(s.directory,t??".");if(!F.contains(s.directory,e))return yield*E.die(new Error("Path escapes the location"));let a=yield*l.realPath(e).pipe(E.orDie);return F.contains(r,a)?{absolute:e,real:a,directory:s.directory,root:r}:yield*E.die(new Error("Path escapes the location"))});return H.of({find:i.find,glob:i.glob,grep:i.grep,read:E.fn("FileSystem.read")(function*(t){let e=yield*n(t.path);return(yield*l.stat(e.real).pipe(E.orDie)).type!=="File"?yield*E.die(new Error("Path is not a file")):{content:yield*l.readFile(e.real).pipe(E.orDie),mime:F.mimeType(e.real)}}),list:E.fn("FileSystem.list")(function*(t={}){let e=yield*n(t.path);return(yield*l.stat(e.real).pipe(E.orDie)).type!=="Directory"?yield*E.die(new Error("Path is not a directory")):yield*l.readDirectoryEntries(e.real).pipe(E.orDie,E.map(y=>y.flatMap(c=>{if(c.type!=="file"&&c.type!=="directory")return[];let S=te.join(e.absolute,c.name),d=te.relative(e.directory,S);return[x.make({path:g.make(d+(c.type==="directory"?te.sep:"")),type:c.type})]}).sort((c,S)=>c.type===S.type?c.path.localeCompare(S.path):c.type==="directory"?-1:1)))})})})),tt=V({service:H,layer:et,deps:[F.node,N.node,B.node]});export{j as a,K as b,G as c,B as d,se as e};
|
|
@@ -0,0 +1,14 @@
|
|
|
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
|
+
var n=Object.create;var j=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,r=Object.prototype.hasOwnProperty;var l=(b,a)=>(a=Symbol[b])?a:Symbol.for("Symbol."+b),m=b=>{throw TypeError(b)};var t=(b,a)=>j(b,"name",{value:a,configurable:!0}),u=(b=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(b,{get:(a,c)=>(typeof require<"u"?require:a)[c]}):b)(function(b){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+b+'" is not supported')});var v=(b,a)=>()=>(a||b((a={exports:{}}).exports,a),a.exports),w=(b,a)=>{for(var c in a)j(b,c,{get:a[c],enumerable:!0})},s=(b,a,c,d)=>{if(a&&typeof a=="object"||typeof a=="function")for(let e of p(a))!r.call(b,e)&&e!==c&&j(b,e,{get:()=>a[e],enumerable:!(d=o(a,e))||d.enumerable});return b};var x=(b,a,c)=>(c=b!=null?n(q(b)):{},s(a||!b||!b.__esModule?j(c,"default",{value:b,enumerable:!0}):c,b));var y=(b,a,c)=>{if(a!=null){typeof a!="object"&&typeof a!="function"&&m("Object expected");var d,e;c&&(d=a[l("asyncDispose")]),d===void 0&&(d=a[l("dispose")],c&&(e=d)),typeof d!="function"&&m("Object not disposable"),e&&(d=function(){try{e.call(this)}catch(g){return Promise.reject(g)}}),b.push([c,d,a])}else c&&b.push([c]);return a},z=(b,a,c)=>{var d=typeof SuppressedError=="function"?SuppressedError:function(f,k,h,i){return i=Error(h),i.name="SuppressedError",i.error=f,i.suppressed=k,i},e=f=>a=c?new d(f,a,"An error was suppressed during disposal"):(c=!0,f),g=f=>{for(;f=b.pop();)try{var k=f[1]&&f[1].call(f[2]);if(f[0])return Promise.resolve(k).then(g,h=>(e(h),g()))}catch(h){e(h)}if(c)throw a};return g()};export{t as a,u as b,v as c,w as d,x as e,y as f,z as g};
|
|
@@ -8,5 +8,7 @@ if (typeof globalThis.Bun === 'undefined') {
|
|
|
8
8
|
}
|
|
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
|
+
import { createRequire as __alchemyCreateRequire } from 'node:module';
|
|
12
|
+
const require = __alchemyCreateRequire(import.meta.url);
|
|
11
13
|
|
|
12
|
-
import{
|
|
14
|
+
import{createRequire as e}from"node:module";var r=e(import.meta.url).resolve("@silvia-odwyer/photon-node/photon_rs_bg.wasm");export{r as a};
|
|
@@ -0,0 +1,28 @@
|
|
|
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{C as ir,Da as wt,Ea as cr,Sa as Pt,Ua as _t,Wa as Mt,Xa as Tt,Ya as jt,aa as ar,h as bt,k as ot,l as or,m as sr,n as Je,o as kt,p as me,q as Et,r as z,u as st,v as A,va as U,w as se,x as Z}from"./chunk-OMDJ6ZZ2.js";import{Bb as nr,E as Dt,F as St,H as Yt,L as Fe,M as Zt,Ma as Ne,P as oe,Qa as vt,T as Xt,U as er,a as de,b as Qt,f as he,i as V,j as It,m as Kt,mb as rr,ub as Oe,xb as xt,ya as tr}from"./chunk-BM2C7NHL.js";import{a as i,d as ye}from"./chunk-RHIWAYN5.js";var zt={};ye(zt,{ArchivedTimestamp:()=>qt,BusyError:()=>Jt,ChildrenInput:()=>yo,CreateInput:()=>po,Event:()=>ko,ForkInput:()=>mo,GetInput:()=>go,GlobalInfo:()=>uo,Info:()=>Lr,MessagesInput:()=>bo,Metadata:()=>pt,ProjectInfo:()=>Jr,RemoveInput:()=>ho,Service:()=>Re,Session:()=>zt,SetArchivedInput:()=>Do,SetMetadataInput:()=>So,SetPermissionInput:()=>vo,SetRevertInput:()=>xo,SetTitleInput:()=>Io,fromRow:()=>Xe,getUsage:()=>wo,isDefaultTitle:()=>so,node:()=>jo,plan:()=>Eo,toRow:()=>io,use:()=>Po});import Ye from"path";var Be={};ye(Be,{BackgroundJob:()=>Be,Service:()=>De,node:()=>rn});var Se={};ye(Se,{BackgroundJob:()=>Se,Service:()=>De,make:()=>ur,node:()=>Zr});import{Cause as lr,Clock as Ct,Context as Hr,Deferred as X,Effect as N,Exit as Ie,Layer as Qr,Scope as it,SynchronizedRef as fe}from"effect";var qe={};ye(qe,{Identifier:()=>qe,ascending:()=>qr,create:()=>fr,descending:()=>zr,timestamp:()=>Gr});var Rt={job:"job",event:"evt",session:"ses",message:"msg",permission:"per",question:"que",part:"prt",pty:"pty",tool:"tool",workspace:"wrk"};function qr(e,t){return dr(e,"ascending",t)}i(qr,"ascending");function zr(e,t){return dr(e,"descending",t)}i(zr,"descending");function dr(e,t,r){if(!r)return fr(Rt[e],t);if(!r.startsWith(Rt[e]))throw new Error(`ID ${r} does not start with ${Rt[e]}`);return r}i(dr,"generateID");function fr(e,t,r){return e+"_"+Kt(t==="descending",r)}i(fr,"create");function Gr(e){let t=e.split("_")[0],r=e.slice(t.length+1,t.length+13),o=BigInt("0x"+r);return Number(o/BigInt(4096))}i(Gr,"timestamp");var De=class extends Hr.Service()("@opencode/BackgroundJob"){static{i(this,"Service")}};function Y(e){return{...e.info,...e.info.metadata?{metadata:{...e.info.metadata}}:{}}}i(Y,"snapshot");function Kr(e){return e instanceof Error?e.message:String(e)}i(Kr,"errorText");var ur=N.gen(function*(){let e={jobs:yield*fe.make(new Map),scope:yield*it.Scope},t=N.fn("BackgroundJob.settle")(function*(u,f,a,c){let x=yield*Ct.currentTimeMillis,m=yield*fe.modify(e.jobs,F=>{let d=F.get(u);if(!d)return[{},F];if(d.token!==f)return[{},F];if(d.info.status!=="running")return[{info:Y(d)},F];let O=d.pending-1,G=Ie.isSuccess(c)&&(!d.output||a>d.output.sequence)?{sequence:a,text:c.value}:d.output;if(Ie.isSuccess(c)&&O>0)return[{},new Map(F).set(u,{...d,pending:O,output:G})];let te=Ie.isSuccess(c)?"completed":lr.hasInterruptsOnly(c.cause)?"cancelled":"error",re={...d,onPromote:void 0,pending:0,output:G,info:{...d.info,status:te,completed_at:x,...G?{output:G.text}:{},...Ie.isFailure(c)?{error:Kr(lr.squash(c.cause))}:{}}};return[{info:Y(re),done:d.done,scope:d.scope},new Map(F).set(u,re)]});return m.info&&m.done&&(yield*X.succeed(m.done,m.info).pipe(N.ignore)),m.scope&&(yield*it.close(m.scope,Ie.void).pipe(N.forkIn(e.scope,{startImmediately:!0}))),m.info}),r=N.fn("BackgroundJob.fork")(function*(u,f,a,c,x){return yield*x.pipe(N.matchCauseEffect({onSuccess:i(m=>t(f,a,c,Ie.succeed(m)),"onSuccess"),onFailure:i(m=>t(f,a,c,Ie.failCause(m)),"onFailure")}),N.asVoid,N.forkIn(u,{startImmediately:!0}))}),o=N.fn("BackgroundJob.list")(function*(){return Array.from((yield*fe.get(e.jobs)).values()).map(Y).toSorted((u,f)=>u.started_at-f.started_at)}),h=N.fn("BackgroundJob.get")(function*(u){let f=(yield*fe.get(e.jobs)).get(u);if(f)return Y(f)}),I=N.fn("BackgroundJob.start")(function*(u){return yield*N.uninterruptibleMask(f=>N.gen(function*(){let a=u.id??qe.ascending("job"),c=yield*Ct.currentTimeMillis,x=yield*X.make(),m=yield*X.make(),F=yield*X.make(),d=yield*fe.modifyEffect(e.jobs,N.fnUntraced(function*(O){let G=O.get(a);if(G?.info.status==="running")return[{info:Y(G)},O];let te=yield*it.fork(e.scope,"parallel"),re={},ie={info:{id:a,type:u.type,title:u.title,status:"running",started_at:c,metadata:u.metadata},done:x,scope:te,token:re,pending:1,next:1,tail:F,promoted:m,onPromote:u.onPromote};return[{info:Y(ie),scope:te,token:re},new Map(O).set(a,ie)]}));return"scope"in d&&(yield*r(d.scope,a,d.token,0,f(u.run).pipe(N.ensuring(X.succeed(F,void 0))))),d.info}))}),p=N.fn("BackgroundJob.extend")(function*(u){return yield*N.uninterruptibleMask(f=>N.gen(function*(){let a=yield*X.make(),c=yield*fe.modify(e.jobs,x=>{let m=x.get(u.id);return!m||m.info.status!=="running"?[{extended:!1},x]:[{extended:!0,previous:m.tail,scope:m.scope,tail:a,token:m.token,sequence:m.next},new Map(x).set(u.id,{...m,pending:m.pending+1,next:m.next+1,tail:a})]});return c.extended?(yield*r(c.scope,u.id,c.token,c.sequence,X.await(c.previous).pipe(N.andThen(f(u.run)),N.ensuring(X.succeed(c.tail,void 0)))),!0):!1}))}),s=N.fn("BackgroundJob.wait")(function*(u){let f=(yield*fe.get(e.jobs)).get(u.id);if(!f)return{timedOut:!1};if(f.info.status!=="running")return{info:Y(f),timedOut:!1};if(u.timeout===void 0)return{info:yield*X.await(f.done),timedOut:!1};if(u.timeout<=0)return{info:Y(f),timedOut:!0};let a=yield*X.await(f.done).pipe(N.timeoutOption(u.timeout));return a._tag==="Some"?{info:a.value,timedOut:!1}:{info:Y(f),timedOut:!0}}),b=N.fn("BackgroundJob.waitForPromotion")(function*(u){let f=(yield*fe.get(e.jobs)).get(u);return!f||f.info.status!=="running"?yield*N.never:f.info.metadata?.background===!0?Y(f):yield*X.await(f.promoted)}),P=N.fn("BackgroundJob.promote")(function*(u){let f=yield*fe.modifyEffect(e.jobs,N.fnUntraced(function*(a){let c=a.get(u);if(!c||c.info.status!=="running")return[{},a];if(c.info.metadata?.background===!0)return[{info:Y(c)},a];let x={...c,onPromote:void 0,info:{...c.info,metadata:{...c.info.metadata,background:!0}}};return[{info:Y(x),onPromote:c.onPromote,promoted:c.promoted},new Map(a).set(u,x)]}));return f.info&&f.promoted&&(yield*X.succeed(f.promoted,f.info).pipe(N.ignore)),f.onPromote&&(yield*f.onPromote.pipe(N.ignore)),f.info}),T=N.fn("BackgroundJob.cancel")(function*(u){let f=yield*Ct.currentTimeMillis,a=yield*fe.modify(e.jobs,c=>{let x=c.get(u);if(!x)return[{},c];if(x.info.status!=="running")return[{info:Y(x)},c];let m={...x,onPromote:void 0,pending:0,info:{...x.info,status:"cancelled",completed_at:f}};return[{info:Y(m),done:x.done,scope:x.scope},new Map(c).set(u,m)]});return a.info&&a.done&&(yield*X.succeed(a.done,a.info).pipe(N.ignore)),a.scope&&(yield*it.close(a.scope,Ie.void)),a.info});return De.of({list:o,get:h,start:I,extend:p,wait:s,waitForPromotion:b,promote:P,cancel:T})}),Yr=Qr.effect(De,ur),Zr=Qt({service:De,layer:Yr,deps:[]});import{Effect as Xr,Layer as en}from"effect";var tn=en.effect(Se.Service,Xr.gen(function*(){let e=yield*U.make(()=>Se.make);return Se.Service.of({list:i(()=>U.useEffect(e,t=>t.list()),"list"),get:i(t=>U.useEffect(e,r=>r.get(t)),"get"),start:i(t=>U.useEffect(e,r=>r.start(t)),"start"),extend:i(t=>U.useEffect(e,r=>r.extend(t)),"extend"),wait:i(t=>U.useEffect(e,r=>r.wait(t)),"wait"),waitForPromotion:i(t=>U.useEffect(e,r=>r.waitForPromotion(t)),"waitForPromotion"),promote:i(t=>U.useEffect(e,r=>r.promote(t)),"promote"),cancel:i(t=>U.useEffect(e,r=>r.cancel(t)),"cancel")})})),rn=de.make({service:Se.Service,layer:tn,deps:[]});import{Decimal as je}from"decimal.js";var Ft={};ye(Ft,{NotFoundError:()=>le,Service:()=>Ue,Storage:()=>Ft,node:()=>Dn});import H from"path";import{Effect as R,Exit as nn,Layer as on,Option as at,RcMap as pr,Schema as L,Context as sn,TxReentrantLock as ze}from"effect";var le=class e extends L.TaggedErrorClass()("NotFoundError",{message:L.String}){static{i(this,"NotFoundError")}static isInstance(t){return t instanceof e}},an=L.Struct({path:L.optional(L.Struct({root:L.optional(L.String)}))}),cn=L.Struct({id:L.String}),dn=L.Struct({id:L.String}),fn=L.Struct({additions:he,deletions:he}),ln=L.Struct({id:L.String,projectID:L.String,summary:L.Struct({diffs:L.Array(fn)})}),un=L.decodeUnknownOption(an),pn=L.decodeUnknownOption(cn),mn=L.decodeUnknownOption(dn),gn=L.decodeUnknownOption(ln),Ue=class extends sn.Service()("@opencode/Storage"){static{i(this,"Service")}};function yn(e,t){return H.join(e,...t)+".json"}i(yn,"file");function At(e){return!e||typeof e!="object"?!1:"code"in e&&e.code==="ENOENT"?!0:"reason"in e&&e.reason&&typeof e.reason=="object"&&"_tag"in e.reason?e.reason._tag==="NotFound":!1}i(At,"missing");function hn(e){let t=Number.parseInt(e,10);return Number.isNaN(t)?0:t}i(hn,"parseMigration");var mr=[R.fn("Storage.migration.1")(function*(e,t,r){let o=H.resolve(e,"../project");if(!(yield*t.isDir(o)))return;let h=yield*t.glob("*",{cwd:o,include:"all"});for(let I of h){let p=H.join(o,I);if(!(yield*t.isDir(p)))continue;yield*R.logInfo(`migrating project ${I}`);let s=I,b="/";if(s!=="global"){for(let u of yield*t.glob("storage/session/message/*/*.json",{cwd:p,absolute:!0})){let f=un(yield*t.readJson(u),{onExcessProperty:"preserve"}),a=at.isSome(f)?f.value.path?.root:void 0;if(a){b=a;break}}if(!b||!(yield*t.isDir(b)))continue;let P=yield*r.run(["rev-list","--max-parents=0","--all"],{cwd:b}),[T]=P.text().split(`
|
|
15
|
+
`).filter(Boolean).map(u=>u.trim()).toSorted();if(!T)continue;s=T,yield*t.writeWithDirs(H.join(e,"project",s+".json"),JSON.stringify({id:T,vcs:"git",worktree:b,time:{created:Date.now(),initialized:Date.now()}},null,2)),yield*R.logInfo(`migrating sessions for project ${s}`);for(let u of yield*t.glob("storage/session/info/*.json",{cwd:p,absolute:!0})){let f=H.join(e,"session",s,H.basename(u));yield*R.logInfo("copying",{sessionFile:u,dest:f});let a=yield*t.readJson(u),c=pn(a,{onExcessProperty:"preserve"});if(yield*t.writeWithDirs(f,JSON.stringify(a,null,2)),!at.isNone(c)){yield*R.logInfo(`migrating messages for session ${c.value.id}`);for(let x of yield*t.glob(`storage/session/message/${c.value.id}/*.json`,{cwd:p,absolute:!0})){let m=H.join(e,"message",c.value.id,H.basename(x));yield*R.logInfo("copying",{msgFile:x,dest:m});let F=yield*t.readJson(x),d=mn(F,{onExcessProperty:"preserve"});if(yield*t.writeWithDirs(m,JSON.stringify(F,null,2)),!at.isNone(d)){yield*R.logInfo(`migrating parts for message ${d.value.id}`);for(let O of yield*t.glob(`storage/session/part/${c.value.id}/${d.value.id}/*.json`,{cwd:p,absolute:!0})){let G=H.join(e,"part",d.value.id,H.basename(O)),te=yield*t.readJson(O);yield*R.logInfo("copying",{partFile:O,dest:G}),yield*t.writeWithDirs(G,JSON.stringify(te,null,2))}}}}}}}}),R.fn("Storage.migration.2")(function*(e,t){for(let r of yield*t.glob("session/*/*.json",{cwd:e,absolute:!0})){let o=yield*t.readJson(r),h=gn(o,{onExcessProperty:"preserve"});if(at.isNone(h))continue;let I=h.value.summary.diffs;yield*t.writeWithDirs(H.join(e,"session_diff",h.value.id+".json"),JSON.stringify(I,null,2)),yield*t.writeWithDirs(H.join(e,"session",h.value.projectID,h.value.id+".json"),JSON.stringify({...o,summary:{additions:I.reduce((p,s)=>p+s.additions,0),deletions:I.reduce((p,s)=>p+s.deletions,0)}},null,2))}})],In=on.effect(Ue,R.gen(function*(){let e=yield*Ne.Service,t=yield*Tt.Service,r=yield*pr.make({lookup:i(()=>ze.make(),"lookup"),idleTimeToLive:0}),o=yield*R.cached(R.gen(function*(){let a=H.join(Fe.Path.data,"storage"),c=H.join(a,"migration"),x=yield*e.readFileString(c).pipe(R.map(hn),R.catchIf(At,()=>R.succeed(0)),R.orElseSucceed(()=>0));for(let m=x;m<mr.length;m++){yield*R.logInfo("running migration",{index:m});let F=mr[m],d=yield*R.exit(F(a,e,t));if(nn.isFailure(d)){yield*R.logError("failed to run migration",{index:m,cause:d.cause});break}yield*e.writeWithDirs(c,String(m+1))}return{dir:a}})),h=i(a=>R.fail(new le({message:`Resource not found: ${a}`})),"fail"),I=i((a,c)=>c.pipe(R.catchIf(At,()=>h(a))),"wrap"),p=R.fnUntraced(function*(a,c){yield*e.writeWithDirs(a,JSON.stringify(c,null,2))}),s=i((a,c)=>R.scoped(R.gen(function*(){let x=yn((yield*o).dir,a);return yield*c(x,yield*pr.get(r,x))})),"withResolved"),b=R.fn("Storage.remove")(function*(a){yield*s(a,(c,x)=>ze.withWriteLock(x,e.remove(c).pipe(R.catchIf(At,()=>R.void))))}),P=i(a=>R.gen(function*(){return yield*s(a,(x,m)=>ze.withReadLock(m,I(x,e.readJson(x))))}),"read"),T=i((a,c)=>R.gen(function*(){return yield*s(a,(m,F)=>ze.withWriteLock(F,R.gen(function*(){let d=yield*I(m,e.readJson(m));return c(d),yield*p(m,d),d})))}),"update"),u=i((a,c)=>R.gen(function*(){yield*s(a,(x,m)=>ze.withWriteLock(m,p(x,c)))}),"write"),f=R.fn("Storage.list")(function*(a){let c=(yield*o).dir,x=H.join(c,...a);return(yield*e.glob("**/*",{cwd:x,include:"file"}).pipe(R.catch(()=>R.succeed([])))).map(F=>[...a,...F.slice(0,-5).split(H.sep)]).toSorted((F,d)=>F.join("/").localeCompare(d.join("/")))});return Ue.of({remove:b,read:P,update:T,write:u,list:f})})),Dn=de.make({service:Ue,layer:In,deps:[Ne.node,Tt.node]});import{eq as ce}from"drizzle-orm";import{and as Ze}from"drizzle-orm";import{gte as Or}from"drizzle-orm";import{isNull as ut}from"drizzle-orm";import{desc as Vt}from"drizzle-orm";import{like as Lt}from"drizzle-orm";import{sql as eo}from"drizzle-orm";import{inArray as to}from"drizzle-orm";import{lt as ro}from"drizzle-orm";import{or as Ar}from"drizzle-orm";var be={};ye(be,{Event:()=>jn,MessageV2:()=>be,SYNTHETIC_ATTACHMENT_PROMPT:()=>xr,cursor:()=>$t,filterCompacted:()=>Mr,filterCompactedEffect:()=>Bn,fromError:()=>$n,get:()=>On,isMedia:()=>He,latest:()=>Un,node:()=>Wn,page:()=>wr,parts:()=>_r,stream:()=>Pr,toModelMessages:()=>Nn,toModelMessagesEffect:()=>Er});import{Schema as $e}from"effect";var Q=ar.ID,ve=$e.String.check($e.isStartsWith("msg")).pipe($e.brand("MessageID"),It(e=>({ascending:i(t=>e.make(_t.ascending("message",t)),"ascending")}))),ct=$e.String.check($e.isStartsWith("prt")).pipe($e.brand("PartID"),It(e=>({ascending:i(t=>e.make(_t.ascending("part",t)),"ascending")})));import{APICallError as En,convertToModelMessages as wn,LoadAPIKeyError as Pn}from"ai";import{and as Wt}from"drizzle-orm";import{desc as Dr}from"drizzle-orm";import{eq as _e}from"drizzle-orm";import{inArray as _n}from"drizzle-orm";import{lt as Sr}from"drizzle-orm";import{or as Mn}from"drizzle-orm";var xe={};ye(xe,{HeaderTimeoutError:()=>Nt,ProviderError:()=>xe,RESPONSE_FAILED_CODE:()=>Ir,RESPONSE_INCOMPLETE_CODE:()=>hr,ResponseStreamError:()=>Ot,parseAPICallError:()=>bn,parseStreamError:()=>xn,quotaExhaustion:()=>Ut,statedRetryDelayMs:()=>Bt});import{STATUS_CODES as gr}from"http";function We(e){return e()}i(We,"iife");var Nt=class extends Error{constructor(r){super(`Provider response headers timed out after ${r}ms`);this.ms=r}ms;static{i(this,"HeaderTimeoutError")}name="ProviderHeaderTimeoutError"},Ot=class extends Error{static{i(this,"ResponseStreamError")}name="ProviderResponseStreamError";constructor(t,r){super(t,r)}},hr="response_incomplete",Ir="response_failed";function Sn(e){let t=e.statusCode;return t&&t===404||e.isRetryable}i(Sn,"isOpenAiErrorRetryable");function vn(e,t){return We(()=>{let r=t.message;if(r===""){if(t.responseBody)return t.responseBody;if(t.statusCode){let o=gr[t.statusCode];if(o)return o}return"Unknown error"}if(!t.responseBody||t.statusCode&&r!==gr[t.statusCode])return r;try{let o=JSON.parse(t.responseBody),h=o.message||o.error||o.error?.message;if(h&&typeof h=="string")return`${r}: ${h}`}catch{}return/^\s*<!doctype|^\s*<html/i.test(t.responseBody)?t.statusCode===401?"Unauthorized: request was blocked by a gateway or proxy. Your authentication token may be missing or expired \u2014 try running `opencode auth login <your provider URL>` to re-authenticate.":t.statusCode===403?"Forbidden: request was blocked by a gateway or proxy. You may not have permission to access this resource \u2014 check your account and provider settings.":r:`${r}: ${t.responseBody}`}).trim()}i(vn,"message");function Ge(e){if(typeof e=="string")try{let t=JSON.parse(e);return t&&typeof t=="object"?t:void 0}catch{return}if(typeof e=="object"&&e!==null)return e}i(Ge,"json");var yr=new Set(["usage_limit_reached","insufficient_quota","billing_hard_limit_reached","quota_exceeded"]);function Bt(e){let t=Ge(e),r=t&&typeof t.error=="object"?t.error:void 0,o=Array.isArray(r?.details)?r.details:[];for(let h of o){if(!h||typeof h!="object")continue;let I=h;if(typeof I["@type"]!="string"||!I["@type"].endsWith("google.rpc.RetryInfo"))continue;let p=typeof I.retryDelay=="string"?/^(\d+(?:\.\d+)?)s$/.exec(I.retryDelay):null;if(p)return Math.ceil(Number.parseFloat(p[1])*1e3)}}i(Bt,"statedRetryDelayMs");function Ut(e){let t=Bt(e.body);if(t!==void 0&&t<=6e5)return;let r=Ge(e.body),o=We(()=>{if(!r)return;let c=r.error;return c&&typeof c=="object"?c:r}),h=typeof o?.type=="string"?o.type:"",I=typeof o?.code=="string"?o.code:"",p=typeof o?.message=="string"?o.message:e.message??"",s=typeof o?.resets_at=="number"?o.resets_at:void 0,b=typeof o?.resets_in_seconds=="number"?o.resets_in_seconds:void 0,P=typeof o?.plan_type=="string"?o.plan_type:void 0,T=yr.has(h)||yr.has(I),u=e.statusCode===429||e.statusCode===402,f=/usage limit|quota/i.test(p),a=(b??0)>600||s!==void 0&&s*1e3-Date.now()>6e5;if(T||u&&(f||a))return{message:p||"Provider usage limit reached",planType:P,resetsAt:s??(b!==void 0?Math.round(Date.now()/1e3)+b:void 0)??(t!==void 0?Math.round((Date.now()+t)/1e3):void 0)}}i(Ut,"quotaExhaustion");function xn(e){let t=Ge(e),r=typeof t?.message=="string"?Ge(t.message)??t:t;if(!r)return;let o=JSON.stringify(r);if(r.type!=="error")return;switch(r?.error?.code){case"context_length_exceeded":return{type:"context_overflow",message:"Input exceeds context window of this model",responseBody:o};case"insufficient_quota":return{type:"quota",message:"Quota exceeded. Check your plan and billing details.",responseBody:o};case"usage_not_included":return{type:"api_error",message:"To use Codex with your ChatGPT plan, upgrade to Plus: https://chatgpt.com/explore/plus.",isRetryable:!1,responseBody:o};case"invalid_prompt":return{type:"api_error",message:typeof r?.error?.message=="string"?r?.error?.message:"Invalid prompt.",isRetryable:!1,responseBody:o};case"server_is_overloaded":case"server_error":return{type:"api_error",message:typeof r?.error?.message=="string"?r?.error?.message:"Server error.",isRetryable:!0,responseBody:o};case hr:return{type:"unknown",message:typeof r?.error?.message=="string"?r?.error?.message:"The response failed.",responseBody:o}}let h=Ut({body:r});if(h)return{type:"quota",message:h.message,planType:h.planType,resetsAt:h.resetsAt,responseBody:o};if(r?.error?.type===Ir){let I=typeof r.error.code=="string"?r.error.code:"";return{type:"api_error",message:typeof r.error.message=="string"&&r.error.message?r.error.message:"The response failed.",isRetryable:!/invalid|policy/i.test(I),responseBody:o}}return{type:"api_error",message:typeof r?.error?.message=="string"?r.error.message:"Server error.",isRetryable:!0,responseBody:o}}i(xn,"parseStreamError");function bn(e){let t=vn(e.providerID,e.error),r=Ge(e.error.responseBody);if(tr(t)||e.error.statusCode===413||r?.error?.code==="context_length_exceeded")return{type:"context_overflow",message:t,responseBody:e.error.responseBody};let o=Ut({statusCode:e.error.statusCode,body:r,message:t});if(o)return{type:"quota",message:o.message,statusCode:e.error.statusCode,planType:o.planType,resetsAt:o.resetsAt,responseBody:e.error.responseBody};let h=e.error.url?{url:e.error.url}:void 0;return{type:"api_error",message:t,statusCode:e.error.statusCode,isRetryable:e.providerID.startsWith("openai")?Sn(e.error):e.error.isRetryable,responseHeaders:We(()=>{let I=Bt(e.error.responseBody),p=e.error.responseHeaders;return I===void 0||p?.["retry-after"]||p?.["retry-after-ms"]?p:{...p??{},"retry-after-ms":String(I)}}),responseBody:e.error.responseBody,metadata:h}}i(bn,"parseAPICallError");var Pe=i((e,t)=>t.every((r,o)=>e[o]===r),"startsWith");function kn(e){return e==="application/pdf"}i(kn,"isPdfAttachment");function He(e){return e.startsWith("image/")||kn(e)}i(He,"isMedia");function fs(e){return e.startsWith("image/")&&e!=="image/svg+xml"&&e!=="image/vnd.fastbidsheet"}i(fs,"isImageAttachment");function ls(e,t){return Pe(e,[137,80,78,71,13,10,26,10])?"image/png":Pe(e,[255,216,255])?"image/jpeg":Pe(e,[71,73,70,56])?"image/gif":Pe(e,[66,77])?"image/bmp":Pe(e,[37,80,68,70,45])?"application/pdf":Pe(e,[82,73,70,70])&&Pe(e.subarray(8),[87,69,66,80])?"image/webp":t}i(ls,"sniffAttachmentMime");import{Effect as K,Schema as lt}from"effect";var xr="Attached media from tool result:";function Tn(e,t){if(!t||e.length<=t)return e;let r=e.length-t;return`${e.slice(0,t)}
|
|
16
|
+
[Tool output truncated for compaction: omitted ${r} chars]`}i(Tn,"truncateToolOutput");var jn={Updated:z.Event.MessageUpdated,Removed:z.Event.MessageRemoved,PartUpdated:z.Event.PartUpdated,PartDelta:z.Event.PartDelta,PartRemoved:z.Event.PartRemoved},Rn=lt.Struct({id:ve,time:lt.Finite.check(lt.isGreaterThanOrEqualTo(0))}),Cn=lt.decodeUnknownSync(Rn),$t={encode(e){return Buffer.from(JSON.stringify(e)).toString("base64url")},decode(e){return Cn(JSON.parse(Buffer.from(e,"base64url").toString("utf8")))}},br=i(e=>({...e.data,id:e.id,sessionID:e.session_id}),"info"),kr=i(e=>({...e.data,id:e.id,sessionID:e.session_id,messageID:e.message_id}),"part"),An=i(e=>Mn(Sr(se.time_created,e.time),Wt(_e(se.time_created,e.time),Sr(se.id,e.id))),"older");function Fn(e,t){let r=t.map(h=>h.id),o=new Map;return K.gen(function*(){if(r.length>0){let h=yield*e.select().from(Z).where(_n(Z.message_id,r)).orderBy(Z.message_id,Z.id).all().pipe(K.orDie);for(let I of h){let p=kr(I),s=o.get(I.message_id);s?s.push(p):o.set(I.message_id,[p])}}return t.map(h=>({info:br(h),parts:o.get(h.id)??[]}))})}i(Fn,"hydrate");function dt(e){if(!e)return;let{providerExecuted:t,...r}=e;return Object.keys(r).length>0?r:void 0}i(dt,"providerMeta");var Er=K.fnUntraced(function*(e,t,r){let o=[],h=new Set,I=wt.view(e,t),p,s=i(f=>{for(let[a,c]of(f?I?.after.get(f):void 0)?.entries()??[])o.push({id:`${f}-system-${a}`,role:"system",parts:[{type:"text",text:c}]})},"systemAfter"),b=i(f=>{if(t.api.npm==="@ai-sdk/anthropic"||t.api.npm==="@ai-sdk/openai"||t.api.npm==="@ai-sdk/amazon-bedrock/mantle")return!0;if(t.api.npm==="@ai-sdk/amazon-bedrock"){if(!f.mime.startsWith("image/"))return!1;let a=t.api.id.toLowerCase();return a.includes("anthropic.")||a.includes("nova")||a.includes("llama4")||a.includes("llama-4")}if(t.api.npm==="@ai-sdk/xai")return f.mime.startsWith("image/");if(t.api.npm==="@ai-sdk/google-vertex/anthropic")return!0;if(t.api.npm==="@ai-sdk/google"){let a=t.api.id.toLowerCase();return a.includes("gemini-3")&&!a.includes("gemini-2")}return!1},"supportsMediaInToolResult"),P=i(f=>t.api.npm==="@ai-sdk/xai"&&f.mime.startsWith("image/")&&!["image/png","image/jpeg","image/webp"].includes(f.mime),"rejectedByProvider"),T=i(f=>{let a=f.output;if(typeof a=="string")return{type:"text",value:a};if(typeof a=="object"){let c=a,x=(c.attachments??[]).filter(m=>m.url.startsWith("data:")&&m.url.includes(","));return{type:"content",value:[...c.text?[{type:"text",text:c.text}]:[],...x.map(m=>({type:"media",mediaType:m.mime,data:We(()=>{let F=m.url.indexOf(",");return F===-1?m.url:m.url.slice(F+1)})}))]}}return{type:"json",value:a}},"toModelOutput");for(let f of e)if(I&&(s(p),p=f.info.id),f.parts.length!==0&&!I?.drop.has(f.info.id)){if(f.info.role==="user"){let a={id:f.info.id,role:"user",parts:[]};for(let c of f.parts)c.type==="text"&&!c.ignored&&c.text!==""&&a.parts.push({type:"text",text:c.text}),c.type==="file"&&c.mime!=="text/plain"&&c.mime!=="application/x-directory"&&(r?.stripMedia&&He(c.mime)?a.parts.push({type:"text",text:`[Attached ${c.mime}: ${c.filename??"file"}]`}):a.parts.push({type:"file",url:c.url,mediaType:c.mime,filename:c.filename})),c.type==="compaction"&&!I?.skip.has(f.info.id)&&a.parts.push({type:"text",text:"What did we do so far?"}),c.type==="subtask"&&a.parts.push({type:"text",text:"The following tool was executed by the user"});a.parts.length>0&&o.push(a)}if(f.info.role==="assistant"){let a=`${t.providerID}/${t.id}`!=`${f.info.providerID}/${f.info.modelID}`,c=I?.blocks.get(f.info.id);if(c){wt.remember(c),o.push({id:f.info.id,role:"assistant",parts:[{type:"text",text:c.content,providerMetadata:{anthropic:{type:"compaction"}}}]});continue}let x=[];if(f.info.error&&!(Je.isInstance(f.info.error)&&f.parts.some(d=>d.type!=="step-start"&&d.type!=="reasoning")))continue;if(f.info.aside){let d=f.parts.filter(O=>O.type==="text"&&!O.ignored).map(O=>O.text.trim()).filter(Boolean).join(`
|
|
17
|
+
`);d&&o.push({id:f.info.id,role:"user",parts:[{type:"text",text:`[While a tool was running you already answered the user's message above: "${d}". Do not answer it again; carry on with your work.]`}]});continue}let m={id:f.info.id,role:"assistant",parts:[]},F=f.parts.some(d=>d.type!=="reasoning"?!1:d.metadata?.anthropic?.signature!=null);for(let d of f.parts){if(d.type==="text"){let O=d.text===""&&F?" ":d.text;m.parts.push({type:"text",text:O,...a?{}:{providerMetadata:d.metadata}})}if(d.type==="step-start"&&m.parts.push({type:"step-start"}),d.type==="tool"){if(h.add(d.tool),d.state.status==="completed"){let O=d.state.time.compacted?"[Old tool result content cleared]":Tn(d.state.output,r?.toolOutputMaxChars),G=d.state.time.compacted||r?.stripMedia?[]:(d.state.attachments??[]).filter(ne=>!P(ne)),re=G.filter(ne=>He(ne.mime)).filter(ne=>!b(ne));re.length>0&&x.push(...re);let ie=G.filter(ne=>!He(ne.mime)||b(ne)),Ce=ie.length>0?{text:O,attachments:ie}:O;m.parts.push({type:"tool-"+d.tool,state:"output-available",toolCallId:d.callID,input:d.state.input,output:Ce,...d.metadata?.providerExecuted?{providerExecuted:!0}:{},...a?{}:{callProviderMetadata:dt(d.metadata)}})}if(d.state.status==="error"){let O=d.state.metadata?.interrupted===!0?d.state.metadata.output:void 0;typeof O=="string"?m.parts.push({type:"tool-"+d.tool,state:"output-available",toolCallId:d.callID,input:d.state.input,output:O,...d.metadata?.providerExecuted?{providerExecuted:!0}:{},...a?{}:{callProviderMetadata:dt(d.metadata)}}):m.parts.push({type:"tool-"+d.tool,state:"output-error",toolCallId:d.callID,input:d.state.input,errorText:d.state.error,...d.metadata?.providerExecuted?{providerExecuted:!0}:{},...a?{}:{callProviderMetadata:dt(d.metadata)}})}(d.state.status==="pending"||d.state.status==="running")&&m.parts.push({type:"tool-"+d.tool,state:"output-error",toolCallId:d.callID,input:d.state.input,errorText:r?.runningToolNote??"[Tool execution was interrupted]",...d.metadata?.providerExecuted?{providerExecuted:!0}:{},...a?{}:{callProviderMetadata:dt(d.metadata)}})}if(d.type==="reasoning"){if(a){d.text.trim().length>0&&m.parts.push({type:"text",text:d.text});continue}m.parts.push({type:"reasoning",text:d.text,providerMetadata:d.metadata})}}m.parts.length>0&&(o.push(m),x.length>0&&o.push({id:ve.ascending(),role:"user",parts:[{type:"text",text:xr},...x.map(d=>({type:"file",url:d.url,mediaType:d.mime,filename:d.filename}))]}))}}I&&s(p);let u=Object.fromEntries(Array.from(h).map(f=>[f,{toModelOutput:T}]));return yield*K.promise(()=>wn(o.filter(f=>f.parts.some(a=>a.type!=="step-start")),{tools:u}))});function Nn(e,t,r){return K.runPromise(Er(e,t,r))}i(Nn,"toModelMessages");var wr=K.fn("MessageV2.page")(function*(e){let{db:t}=yield*oe.Service,r=e.before?$t.decode(e.before):void 0,o=r?Wt(_e(se.session_id,e.sessionID),An(r)):_e(se.session_id,e.sessionID),h=yield*t.select().from(se).where(o).orderBy(Dr(se.time_created),Dr(se.id)).limit(e.limit+1).all().pipe(K.orDie);if(h.length===0)return(yield*t.select({id:A.id}).from(A).where(_e(A.id,e.sessionID)).get().pipe(K.orDie))?{items:[],more:!1}:yield*new le({message:`Session not found: ${e.sessionID}`});let I=h.length>e.limit,p=I?h.slice(0,e.limit):h,s=yield*Fn(t,p);s.reverse();let b=p.at(-1);return{items:s,more:I,cursor:I&&b?$t.encode({id:b.id,time:b.time_created}):void 0}});function Pr(e){return K.gen(function*(){let r=[],o;for(;;){let h=yield*wr({sessionID:e,limit:50,before:o}).pipe(K.catchIf(le.isInstance,()=>K.succeed({items:[],more:!1,cursor:void 0})));if(h.items.length===0)break;for(let I=h.items.length-1;I>=0;I--){let p=h.items[I];p&&r.push(p)}if(!h.more||!h.cursor)break;o=h.cursor}return r})}i(Pr,"stream");function _r(e){return K.gen(function*(){let{db:t}=yield*oe.Service;return(yield*t.select().from(Z).where(_e(Z.message_id,e)).orderBy(Z.id).all().pipe(K.orDie)).map(kr)})}i(_r,"parts");var On=K.fn("MessageV2.get")(function*(e){let{db:t}=yield*oe.Service,r=yield*t.select().from(se).where(Wt(_e(se.id,e.messageID),_e(se.session_id,e.sessionID))).get().pipe(K.orDie);return r?{info:br(r),parts:yield*_r(e.messageID)}:yield*new le({message:`Message not found: ${e.messageID}`})});function Mr(e){let t=[],r=new Set,o;for(let P of e){if(t.push(P),o){if(P.info.id===o)break;continue}if(P.info.role==="user"&&r.has(P.info.id)){let T=P.parts.find(u=>u.type==="compaction");if(!T)continue;if(!T.tail_start_id||(o=T.tail_start_id,P.info.id===o))break;continue}if(P.info.role==="user"&&r.has(P.info.id)&&P.parts.some(T=>T.type==="compaction"))break;P.info.role==="assistant"&&P.info.summary&&P.info.finish&&!P.info.error&&r.add(P.info.parentID)}t.reverse();let h=t.findLastIndex(P=>P.info.role==="user"&&P.parts.some(T=>T.type==="compaction"&&T.tail_start_id!==void 0)),I=t[h],p=I?.parts.find(P=>P.type==="compaction"&&P.tail_start_id!==void 0),s=I?t.findIndex((P,T)=>T>h&&P.info.role==="assistant"&&P.info.summary&&P.info.parentID===I.info.id):-1,b=p?.tail_start_id?t.findIndex(P=>P.info.id===p.tail_start_id):-1;return b>=0&&b<h&&s>h?[...t.slice(h,s+1),...t.slice(b,h),...t.slice(s+1)]:t}i(Mr,"filterCompacted");var Bn=K.fnUntraced(function*(e){return Mr(yield*Pr(e))});function Un(e){let t,r,o;for(let I of e){let p=I.info;p.role==="user"&&ft(p,t)&&(t=p),p.role==="assistant"&&ft(p,r)&&(r=p),p.role==="assistant"&&p.finish&&ft(p,o)&&(o=p)}let h=e.flatMap(I=>o&&!ft(I.info,o)?[]:I.parts.filter(p=>p.type==="compaction"||p.type==="subtask"));return{user:t,assistant:r,finished:o,tasks:h}}i(Un,"latest");function ft(e,t){return t?e.time.created!==t.time.created?e.time.created>t.time.created:e.id>t.id:!0}i(ft,"isAfter");function $n(e,t){switch(!0){case(e instanceof DOMException&&e.name==="AbortError"):return new Je({message:e.message},{cause:e}).toObject();case or.isInstance(e):return e;case me.isInstance(e):return e.toObject();case Pn.isInstance(e):return new sr({providerID:t.providerID,message:e.message},{cause:e}).toObject();case vr(e)!==void 0:{let o=vr(e);return new me({message:"Connection reset by server",isRetryable:!0,metadata:{code:o.code??"",syscall:o.syscall??"",message:o.message??""}},{cause:e}).toObject()}case(e instanceof TypeError&&e.message==="terminated"):{if(t.aborted)return new Je({message:e.message},{cause:e}).toObject();let o=e.cause;return new me({message:"Connection closed by server",isRetryable:!0,metadata:{code:typeof o?.code=="string"?o.code:"",message:typeof o?.message=="string"?o.message:""}},{cause:e}).toObject()}case(e instanceof Error&&e.code==="ZlibError"):return t.aborted?new Je({message:e.message},{cause:e}).toObject():new me({message:"Response decompression failed",isRetryable:!0,metadata:{code:e.code,message:e.message}},{cause:e}).toObject();case e instanceof xe.HeaderTimeoutError:return new me({message:e.message,isRetryable:!0,metadata:{code:e.name,timeoutMs:String(e.ms)}},{cause:e}).toObject();case e instanceof xe.ResponseStreamError:return new me({message:e.message,isRetryable:!0,metadata:{code:e.name}},{cause:e}).toObject();case En.isInstance(e):let r=xe.parseAPICallError({providerID:t.providerID,error:e});return r.type==="context_overflow"?new Et({message:r.message,responseBody:r.responseBody},{cause:e}).toObject():r.type==="quota"?new kt({providerID:t.providerID,message:r.message,planType:r.planType,resetsAt:r.resetsAt,statusCode:r.statusCode,responseBody:r.responseBody},{cause:e}).toObject():new me({message:r.message,statusCode:r.statusCode,isRetryable:r.isRetryable,responseHeaders:r.responseHeaders,responseBody:r.responseBody,metadata:r.metadata},{cause:e}).toObject();case e instanceof Error:return new ot.Unknown({message:cr(e)},{cause:e}).toObject();default:try{let o=xe.parseStreamError(e);if(o)return o.type==="context_overflow"?new Et({message:o.message,responseBody:o.responseBody},{cause:e}).toObject():o.type==="quota"?new kt({providerID:t.providerID,message:o.message,planType:o.planType,resetsAt:o.resetsAt,responseBody:o.responseBody},{cause:e}).toObject():o.type==="unknown"?new ot.Unknown({message:o.message},{cause:e}).toObject():new me({message:o.message,isRetryable:o.isRetryable,responseBody:o.responseBody},{cause:e}).toObject()}catch{}return new ot.Unknown({message:JSON.stringify(e)},{cause:e}).toObject()}}i($n,"fromError");function vr(e){let t=e;for(let r=0;r<4&&t;r++){if(t?.code==="ECONNRESET")return t;t=t?.cause}}i(vr,"connectionResetError");var Wn=de.group([oe.node]);var Ke={};ye(Ke,{FileDiff:()=>Kn,Patch:()=>Qn,Service:()=>Ve,Snapshot:()=>Ke,node:()=>Xn});import{Cause as Vn,Duration as Tr,Effect as l,Layer as Ln,Schedule as Jn,Schema as Qe,Semaphore as qn,Context as zn}from"effect";import{ChildProcess as jr,ChildProcessSpawner as Rr}from"effect/unstable/process";import{formatPatch as Gn,structuredPatch as Hn}from"diff";import ee from"path";var Qn=Qe.Struct({hash:Qe.String,files:Qe.mutable(Qe.Array(Qe.String))}),Kn=nr,Cr="7.days",Yn=2*1024*1024,Te=["-c","core.longpaths=true","-c","core.symlinks=true"],ke=["-c","core.autocrlf=false",...Te],Me=[...ke,"-c","core.quotepath=false"],Ve=class extends zn.Service()("@opencode/Snapshot"){static{i(this,"Service")}},Zn=Ln.effect(Ve,l.gen(function*(){let e=yield*Ne.Service,t=yield*vt.Service,r=yield*Pt.Service,o=new Map,h=i(p=>{let s=o.get(p);if(s)return s;let b=qn.makeUnsafe(1);return o.set(p,b),b},"lock"),I=yield*U.make(l.fn("Snapshot.state")(function*(p){let s={directory:p.directory,worktree:p.worktree,gitdir:ee.join(Fe.Path.data,"snapshot",p.project.id,Yt.fast(p.worktree)),vcs:p.project.vcs},b=i(y=>["--git-dir",s.gitdir,"--work-tree",s.worktree,...y],"args"),P=i(y=>y.join("\0")+"\0","encodeNulTerminatedPaths"),T=i(y=>P(y.map(k=>`:(top,literal)${k}`)),"encodeTopLevelLiteralPathspecs"),u=l.fnUntraced(function*(y,k){let n=yield*t.run(jr.make("git",y,{cwd:k?.cwd,env:k?.env,extendEnv:!0}),{stdin:k?.stdin});return{code:Rr.ExitCode(n.exitCode),text:n.stdout.toString("utf8"),stderr:n.stderr.toString("utf8")}},l.catch(y=>l.succeed({code:Rr.ExitCode(1),text:"",stderr:y instanceof Error?y.message:String(y)}))),f=l.fnUntraced(function*(y){if(!y.length)return new Set;let k=y.map(g=>g.startsWith(":")?`./${g}`:g),n=yield*u([...Me,"--git-dir",ee.join(s.worktree,".git"),"--work-tree",s.worktree,"check-ignore","--no-index","--stdin","-z"],{cwd:s.worktree,stdin:P(k)});return n.code!==0&&n.code!==1?new Set:new Set(n.text.split("\0").filter(Boolean).map(g=>g.startsWith("./:")?g.slice(2):g))}),a=l.fnUntraced(function*(y){y.length&&(yield*u([...ke,...b(["rm","--cached","-f","--ignore-unmatch","--pathspec-from-file=-","--pathspec-file-nul"])],{cwd:s.worktree,stdin:T(y)}))}),c=l.fnUntraced(function*(y){if(!y.length)return;let k=yield*u([...ke,...b(["add","--all","--sparse","--pathspec-from-file=-","--pathspec-file-nul"])],{cwd:s.worktree,stdin:T(y)});k.code!==0&&(yield*l.logWarning("failed to add snapshot files",{exitCode:k.code,stderr:k.stderr}))}),x=i(y=>e.exists(y).pipe(l.orDie),"exists"),m=i(y=>e.readFileString(y).pipe(l.catch(()=>l.succeed(""))),"read"),F=i(y=>e.remove(y).pipe(l.catch(()=>l.void)),"remove"),d=i(y=>h(s.gitdir).withPermits(1)(y),"locked"),O=l.fnUntraced(function*(){return s.vcs!=="git"?!1:(yield*r.get()).snapshot!==!1}),G=l.fnUntraced(function*(){let k=(yield*u(["rev-parse","--path-format=absolute","--git-path","info/exclude"],{cwd:s.worktree})).text.trim();if(k&&(yield*x(k)))return k}),te=l.fnUntraced(function*(y=[]){let k=yield*G(),n=ee.join(s.gitdir,"info","exclude"),g=[k?(yield*m(k)).trimEnd():"",...y.map(E=>`/${E.replaceAll("\\","/")}`)].filter(Boolean).join(`
|
|
18
|
+
`);yield*e.ensureDir(ee.join(s.gitdir,"info")).pipe(l.orDie),yield*e.writeFileString(n,g?`${g}
|
|
19
|
+
`:"").pipe(l.orDie)}),re=l.fnUntraced(function*(){if(s.vcs!=="git")return;let y=yield*u(["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:s.worktree});if(y.code!==0)return;let k=y.text.trim();if(!k||!(yield*x(k)))return;let n=ee.join(k,"objects"),g=(yield*m(ee.join(n,"info","alternates"))).split(`
|
|
20
|
+
`).map(v=>v.trim()).filter(Boolean),E=[];for(let v of[n,...g])(yield*x(v))&&E.push(v);if(!E.length)return;yield*e.ensureDir(ee.join(s.gitdir,"objects","info")).pipe(l.orDie),yield*e.writeFileString(ee.join(s.gitdir,"objects","info","alternates"),E.join(`
|
|
21
|
+
`)+`
|
|
22
|
+
`).pipe(l.orDie);let $=ee.join(k,"index");(yield*x($))&&(yield*e.copyFile($,ee.join(s.gitdir,"index")).pipe(l.catch(()=>l.void)))}),ie=l.fnUntraced(function*(){yield*te();let[y,k]=yield*l.all([u([...Me,...b(["diff-files","--name-only","-z","--","."])],{cwd:s.directory}),u([...Me,...b(["ls-files","--full-name","--others","--exclude-standard","-z","--","."])],{cwd:s.directory})],{concurrency:2});if(y.code!==0||k.code!==0){yield*l.logWarning("failed to list snapshot files",{diffCode:y.code,diffStderr:y.stderr,otherCode:k.code,otherStderr:k.stderr});return}let n=y.text.split("\0").filter(Boolean),g=k.text.split("\0").filter(Boolean),E=Array.from(new Set([...n,...g]));if(!E.length)return;let $=yield*f(E);if($.size>0){let C=Array.from($);yield*l.logInfo("removing gitignored files from snapshot",{count:C.length}),yield*a(C)}let v=E.filter(C=>!$.has(C));if(!v.length)return;let M=new Set((yield*l.all(v.map(C=>e.stat(ee.join(s.worktree,C)).pipe(l.catch(()=>l.void)).pipe(l.map(J=>!J||J.type!=="File"?void 0:(typeof J.size=="bigint"?Number(J.size):J.size)>Yn?C:void 0))),{concurrency:8})).filter(C=>!!C)),_=new Set(g.filter(C=>M.has(C)));yield*te(Array.from(_)),yield*c(v.filter(C=>!_.has(C)))}),Ce=l.fnUntraced(function*(){return yield*d(l.gen(function*(){if(!(yield*O())||!(yield*x(s.gitdir)))return;let y=yield*u(b(["gc",`--prune=${Cr}`]),{cwd:s.directory});if(y.code!==0){yield*l.logWarning("cleanup failed",{exitCode:y.code,stderr:y.stderr});return}yield*l.logInfo("cleanup",{prune:Cr})}))}),ne=l.fnUntraced(function*(){return yield*d(l.gen(function*(){if(!(yield*O()))return;let y=yield*x(s.gitdir);yield*e.ensureDir(s.gitdir).pipe(l.orDie),y||(yield*u(["init"],{env:{GIT_DIR:s.gitdir,GIT_WORK_TREE:s.worktree}}),yield*u(["--git-dir",s.gitdir,"config","core.autocrlf","false"]),yield*u(["--git-dir",s.gitdir,"config","core.longpaths","true"]),yield*u(["--git-dir",s.gitdir,"config","core.symlinks","true"]),yield*u(["--git-dir",s.gitdir,"config","core.fsmonitor","false"]),yield*u(["--git-dir",s.gitdir,"config","feature.manyFiles","true"]),yield*u(["--git-dir",s.gitdir,"config","index.version","4"]),yield*u(["--git-dir",s.gitdir,"config","index.threads","true"]),yield*u(["--git-dir",s.gitdir,"config","core.untrackedCache","true"]),yield*re(),yield*l.logInfo("initialized")),yield*ie();let n=(yield*u(b(["write-tree"]),{cwd:s.directory})).text.trim();return yield*l.logInfo("tracking",{hash:n,cwd:s.directory,git:s.gitdir}),n}))}),mt=l.fnUntraced(function*(y){return yield*d(l.gen(function*(){yield*ie();let k=yield*u([...Me,...b(["diff","--cached","--no-ext-diff","--name-only",y,"--","."])],{cwd:s.directory});if(k.code!==0)return yield*l.logWarning("failed to get diff",{hash:y,exitCode:k.code}),{hash:y,files:[]};let n=k.text.trim().split(`
|
|
23
|
+
`).map(E=>E.trim()).filter(Boolean),g=yield*f(n);return{hash:y,files:n.filter(E=>!g.has(E)).map(E=>ee.join(s.worktree,E).replaceAll("\\","/"))}}))}),et=i(()=>{if(!Xt.allows(s.worktree))return new Error(`snapshot restore refused: ${s.worktree} is the user's project folder. Nothing was written.`)},"assertRestorable"),gt=l.fnUntraced(function*(y){let k=et();return k?(yield*l.logError("refused to restore a snapshot in the user's project folder",{worktree:s.worktree}),yield*l.die(k)):yield*d(l.gen(function*(){yield*l.logInfo("restore",{commit:y});let n=yield*u([...Te,...b(["read-tree",y])],{cwd:s.worktree});if(n.code===0){let g=yield*u([...Te,...b(["checkout-index","-a","-f"])],{cwd:s.worktree});if(g.code===0)return;yield*l.logError("failed to restore snapshot",{snapshot:y,exitCode:g.code,stderr:g.stderr});return}yield*l.logError("failed to restore snapshot",{snapshot:y,exitCode:n.code,stderr:n.stderr})}))}),tt=l.fnUntraced(function*(y){let k=et();return k?yield*l.die(k):yield*d(l.gen(function*(){let n=[],g=new Set;for(let v of y)for(let M of v.files)g.has(M)||(g.add(M),n.push({hash:v.hash,file:M,rel:ee.relative(s.worktree,M).replaceAll("\\","/")}));let E=l.fnUntraced(function*(v){if(yield*l.logInfo("reverting",{file:v.file,hash:v.hash}),(yield*u([...Te,...b(["checkout",v.hash,"--",v.file])],{cwd:s.worktree})).code===0)return;let _=yield*u([...Te,...b(["ls-tree",v.hash,"--",v.rel])],{cwd:s.worktree});if(_.code===0&&_.text.trim()){yield*l.logInfo("file existed in snapshot but checkout failed, keeping",{file:v.file,hash:v.hash});return}yield*l.logInfo("file did not exist in snapshot, deleting",{file:v.file,hash:v.hash}),yield*F(v.file)}),$=i((v,M)=>v===M||v.startsWith(`${M}/`)||M.startsWith(`${v}/`),"clash");for(let v=0;v<n.length;){let M=n[v],_=[M],C=v+1;for(;C<n.length&&_.length<100;){let w=n[C];if(w.hash!==M.hash||_.some(W=>$(W.rel,w.rel)))break;_.push(w),C+=1}if(_.length===1){yield*E(M),v=C;continue}let J=yield*u([...Te,...b(["ls-tree","--name-only",M.hash,"--",..._.map(w=>w.rel)])],{cwd:s.worktree});if(J.code!==0){yield*l.logInfo("batched ls-tree failed, falling back to single-file revert",{hash:M.hash,files:_.length});for(let w of _)yield*E(w);v=C;continue}let ge=new Set(J.text.trim().split(`
|
|
24
|
+
`).map(w=>w.trim()).filter(Boolean)),j=_.filter(w=>ge.has(w.rel));if(j.length&&(yield*l.logInfo("reverting",{hash:M.hash,files:j.length}),(yield*u([...Te,...b(["checkout",M.hash,"--",...j.map(W=>W.file)])],{cwd:s.worktree})).code!==0)){yield*l.logInfo("batched checkout failed, falling back to single-file revert",{hash:M.hash,files:j.length});for(let W of _)yield*E(W);v=C;continue}for(let w of _)ge.has(w.rel)||(yield*l.logInfo("file did not exist in snapshot, deleting",{file:w.file,hash:w.hash}),yield*F(w.file));v=C}}))}),yt=l.fnUntraced(function*(y){return yield*d(l.gen(function*(){yield*ie();let k=yield*u([...Me,...b(["diff","--cached","--no-ext-diff",y,"--","."])],{cwd:s.worktree});return k.code!==0?(yield*l.logWarning("failed to get diff",{hash:y,exitCode:k.code,stderr:k.stderr}),""):k.text.trim()}))}),ht=l.fnUntraced(function*(y,k){return yield*d(l.gen(function*(){let n=l.fnUntraced(function*(j){return j.binary?["",""]:j.status==="added"?["",yield*u([...ke,...b(["show",`${k}:${j.file}`])]).pipe(l.map(w=>w.text))]:j.status==="deleted"?[yield*u([...ke,...b(["show",`${y}:${j.file}`])]).pipe(l.map(w=>w.text)),""]:yield*l.all([u([...ke,...b(["show",`${y}:${j.file}`])]).pipe(l.map(w=>w.text)),u([...ke,...b(["show",`${k}:${j.file}`])]).pipe(l.map(w=>w.text))],{concurrency:2})}),g=l.fnUntraced(function*(j){let w=j.flatMap(q=>q.binary?[]:q.status==="added"?[{file:q.file,side:"after",ref:`${k}:${q.file}`}]:q.status==="deleted"?[{file:q.file,side:"before",ref:`${y}:${q.file}`}]:[{file:q.file,side:"before",ref:`${y}:${q.file}`},{file:q.file,side:"after",ref:`${k}:${q.file}`}]);if(!w.length)return new Map;let W=yield*t.run(jr.make("git",[...ke,...b(["cat-file","--batch"])],{cwd:s.directory,extendEnv:!0}),{stdin:w.map(q=>q.ref).join(`
|
|
25
|
+
`)+`
|
|
26
|
+
`});if(W.exitCode!==0){yield*l.logInfo("git cat-file --batch failed during snapshot diff, falling back to per-file git show",{stderr:W.stderr.toString("utf8"),refs:w.length});return}let B=W.stdout,ae=i((q,we)=>{},"fail"),ue=new Map,Ee=new TextDecoder,pe=0;for(let q of w){let we=pe;for(;we<B.length&&B[we]!==10;)we+=1;if(we>=B.length)return ae("git cat-file --batch returned a truncated header during snapshot diff, falling back to per-file git show");let rt=Ee.decode(B.slice(pe,we));pe=we+1;let nt=ue.get(q.file)??{before:"",after:""};if(rt.endsWith(" missing")){ue.set(q.file,nt);continue}let Gt=rt.match(/^[0-9a-f]+ blob (\d+)$/);if(!Gt)return ae("git cat-file --batch returned an unexpected header during snapshot diff, falling back to per-file git show",{head:rt});let Ae=Number(Gt[1]);if(!Number.isInteger(Ae)||Ae<0||pe+Ae>=B.length||B[pe+Ae]!==10)return ae("git cat-file --batch returned truncated content during snapshot diff, falling back to per-file git show",{head:rt});let Ht=Ee.decode(B.slice(pe,pe+Ae));q.side==="before"&&(nt.before=Ht),q.side==="after"&&(nt.after=Ht),ue.set(q.file,nt),pe+=Ae+1}return pe!==B.length?ae("git cat-file --batch returned trailing data during snapshot diff, falling back to per-file git show"):ue},l.scoped,l.catch(()=>l.succeed(void 0))),E=[],$=new Map,v=yield*u([...Me,...b(["diff","--no-ext-diff","--name-status","--no-renames",y,k,"--","."])],{cwd:s.directory});for(let j of v.text.trim().split(`
|
|
27
|
+
`)){if(!j)continue;let[w,W]=j.split(" ");!w||!W||$.set(W,w.startsWith("A")?"added":w.startsWith("D")?"deleted":"modified")}let _=(yield*u([...Me,...b(["diff","--no-ext-diff","--no-renames","--numstat",y,k,"--","."])],{cwd:s.directory})).text.trim().split(`
|
|
28
|
+
`).filter(Boolean).flatMap(j=>{let[w,W,B]=j.split(" ");if(!B)return[];let ae=w==="-"&&W==="-",ue=ae?0:parseInt(w),Ee=ae?0:parseInt(W);return[{file:B,status:$.get(B)??"modified",binary:ae,additions:Number.isFinite(ue)?ue:0,deletions:Number.isFinite(Ee)?Ee:0}]}),C=yield*f(_.map(j=>j.file));if(C.size>0){let j=_.filter(w=>!C.has(w.file));_.length=0,_.push(...j)}let J=100,ge=i((j,w,W)=>Gn(Hn(j,j,w,W,"","",{context:Number.MAX_SAFE_INTEGER})),"patch");for(let j=0;j<_.length;j+=J){let w=_.slice(j,j+J),W=yield*g(w);for(let B of w){let ae=W?.get(B.file)??{before:"",after:""},[ue,Ee]=B.binary?["",""]:W?[ae.before,ae.after]:yield*n(B);E.push({file:B.file,patch:B.binary?"":ge(B.file,ue,Ee),additions:B.additions,deletions:B.deletions,status:B.status})}}return E}))});return yield*Ce().pipe(l.catchCause(y=>l.logError("cleanup loop failed",{cause:Vn.pretty(y)})),l.repeat(Jn.spaced(Tr.hours(1))),l.delay(Tr.minutes(1)),l.forkScoped),{cleanup:Ce,track:ne,patch:mt,restore:gt,revert:tt,diff:yt,diffFull:ht}}));return Ve.of({init:l.fn("Snapshot.init")(function*(){yield*U.get(I)}),cleanup:l.fn("Snapshot.cleanup")(function*(){return yield*U.useEffect(I,p=>p.cleanup())}),track:l.fn("Snapshot.track")(function*(){return yield*U.useEffect(I,p=>p.track())}),patch:l.fn("Snapshot.patch")(function*(p){return yield*U.useEffect(I,s=>s.patch(p))}),restore:l.fn("Snapshot.restore")(function*(p){return yield*U.useEffect(I,s=>s.restore(p))}),revert:l.fn("Snapshot.revert")(function*(p){return yield*U.useEffect(I,s=>s.revert(p))}),diff:l.fn("Snapshot.diff")(function*(p){return yield*U.useEffect(I,s=>s.diff(p))}),diffFull:l.fn("Snapshot.diffFull")(function*(p,s){return yield*U.useEffect(I,b=>b.diffFull(p,s))})})})),Xn=de.make({service:Ve,layer:Zn,deps:[Ne.node,vt.node,Pt.node]});import{Effect as S,Layer as no,Option as Fr,Context as oo,Schema as D}from"effect";var Br="New session - ",Ur="Child session - ";function so(e){return new RegExp(`^(${Br}|${Ur})\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$`).test(e)}i(so,"isDefaultTitle");function Xe(e){let t=e.summary_additions!==null||e.summary_deletions!==null||e.summary_files!==null?{additions:e.summary_additions??0,deletions:e.summary_deletions??0,files:e.summary_files??0,diffs:e.summary_diffs??void 0}:void 0,r=e.share_url?{url:e.share_url}:void 0,o=e.revert?{messageID:ve.make(e.revert.messageID),partID:e.revert.partID?ct.make(e.revert.partID):void 0,snapshot:e.revert.snapshot,diff:e.revert.diff}:void 0;return{id:e.id,slug:e.slug,projectID:e.project_id,workspaceID:e.workspace_id??void 0,directory:e.directory,path:e.path??void 0,parentID:e.parent_id??void 0,title:e.title,agent:e.agent??void 0,model:e.model?{id:St.ID.make(e.model.id),providerID:Dt.ID.make(e.model.providerID),variant:e.model.variant}:void 0,version:e.version,summary:t,cost:e.cost,tokens:{input:e.tokens_input,output:e.tokens_output,reasoning:e.tokens_reasoning,cache:{read:e.tokens_cache_read,write:e.tokens_cache_write}},share:r,metadata:e.metadata??void 0,revert:o,permission:e.permission?[...e.permission]:void 0,time:{created:e.time_created,updated:e.time_updated,compacting:e.time_compacting??void 0,archived:e.time_archived??void 0}}}i(Xe,"fromRow");function io(e){return{id:e.id,project_id:e.projectID,workspace_id:e.workspaceID,parent_id:e.parentID,slug:e.slug,directory:e.directory,path:e.path,title:e.title,agent:e.agent,model:e.model,version:e.version,share_url:e.share?.url,summary_additions:e.summary?.additions,summary_deletions:e.summary?.deletions,summary_files:e.summary?.files,summary_diffs:e.summary?.diffs,metadata:e.metadata,cost:e.cost??0,tokens_input:(e.tokens??Le).input,tokens_output:(e.tokens??Le).output,tokens_reasoning:(e.tokens??Le).reasoning,tokens_cache_read:(e.tokens??Le).cache.read,tokens_cache_write:(e.tokens??Le).cache.write,revert:e.revert?{messageID:rr.ID.make(e.revert.messageID),partID:e.revert.partID,snapshot:e.revert.snapshot,diff:e.revert.diff}:null,permission:e.permission,time_created:e.time.created,time_updated:e.time.updated,time_compacting:e.time.compacting,time_archived:e.time.archived}}i(io,"toRow");function ao(e){let t=e.match(/^(.+) \(fork #(\d+)\)$/);if(t){let r=t[1],o=parseInt(t[2],10);return`${r} (fork #${o+1})`}return`${e} (fork #1)`}i(ao,"getForkedTitle");function Nr(e,t){return Ye.relative(Ye.resolve(e),t).replaceAll("\\","/")}i(Nr,"sessionPath");var $r=D.Struct({additions:D.Finite,deletions:D.Finite,files:D.Finite,diffs:V(D.Array(Ke.FileDiff))}),co=D.Struct({input:D.Finite,output:D.Finite,reasoning:D.Finite,cache:D.Struct({read:D.Finite,write:D.Finite})}),Le={input:0,output:0,reasoning:0,cache:{read:0,write:0}},fo=D.Struct({url:D.String}),qt=D.Finite,lo=D.Struct({created:he,updated:he,compacting:V(he),archived:V(qt)}),Wr=D.Struct({messageID:ve,partID:V(ct),snapshot:V(D.String),diff:V(D.String)}),Vr=D.Struct({id:St.ID,providerID:Dt.ID,variant:V(D.String)}),pt=D.Record(D.String,D.Any),Lr=D.Struct({id:Q,slug:D.String,projectID:xt.ID,workspaceID:V(bt.ID),directory:D.String,path:V(D.String),parentID:V(Q),summary:V($r),cost:V(D.Finite),tokens:V(co),share:V(fo),title:D.String,agent:V(D.String),model:V(Vr),version:D.String,metadata:V(pt),time:lo,permission:V(st.Ruleset),revert:V(Wr)}).annotate({identifier:"Session"}),Jr=D.Struct({id:xt.ID,name:V(D.String),worktree:D.String}).annotate({identifier:"ProjectSummary"}),uo=D.Struct({...Lr.fields,project:D.NullOr(Jr)}).annotate({identifier:"GlobalSession"}),po=D.optional(D.Struct({parentID:D.optional(Q),title:D.optional(D.String),agent:D.optional(D.String),model:D.optional(Vr),metadata:D.optional(pt),permission:D.optional(st.Ruleset),workspaceID:D.optional(bt.ID)})),mo=D.Struct({sessionID:Q,messageID:D.optional(ve)}),go=Q,yo=Q,ho=Q,Io=D.Struct({sessionID:Q,title:D.String}),Do=D.Struct({sessionID:Q,time:D.optional(qt)}),So=D.Struct({sessionID:Q,metadata:pt}),vo=D.Struct({sessionID:Q,permission:st.Ruleset}),xo=D.Struct({sessionID:Q,revert:D.optional(Wr),summary:D.optional($r)}),bo=D.Struct({sessionID:Q,limit:D.optional(he)}),ko={Created:z.Event.Created,Updated:z.Event.Updated,Deleted:z.Event.Deleted,Diff:z.Event.Diff,Error:z.Event.Error};function Eo(e,t){let r=t.project.vcs?Ye.join(t.worktree,".opencode","plans"):Ye.join(Fe.Path.data,"plans");return Ye.join(r,[e.time.created,e.slug].join("-")+".md")}i(Eo,"plan");var wo=i(e=>{let t=i(c=>Number.isFinite(c)?c:0,"finite"),r=i(c=>Math.max(0,t(c)),"safe"),o=r(e.usage.inputTokens??0),h=r(e.usage.outputTokens??0),I=r(e.usage.reasoningTokens??0),p=r(e.usage.cacheReadInputTokens??0),s=r(Number(e.usage.cacheWriteInputTokens??e.metadata?.anthropic?.cacheCreationInputTokens??e.metadata?.vertex?.cacheCreationInputTokens??e.metadata?.bedrock?.usage?.cacheWriteInputTokens??e.metadata?.venice?.usage?.cacheCreationInputTokens??0)),b=r(o-p-s),T={total:e.usage.totalTokens,input:b,output:r(h-I),reasoning:I,cache:{write:s,read:p}},u=o,f=e.model.cost?.tiers?.filter(c=>c.tier.type==="context"&&u>c.tier.size).sort((c,x)=>x.tier.size-c.tier.size)[0]??(e.model.cost?.experimentalOver200K&&u>2e5?e.model.cost.experimentalOver200K:e.model.cost),a=e.metadata?.copilot?.totalNanoAiu;return{cost:typeof a=="number"&&Number.isFinite(a)&&a>=0?new je(a).div(1e11).toNumber():r(new je(0).add(new je(T.input).mul(t(f?.input??0)).div(1e6)).add(new je(T.output).mul(t(f?.output??0)).div(1e6)).add(new je(T.cache.read).mul(t(f?.cache?.read??0)).div(1e6)).add(new je(T.cache.write).mul(t(f?.cache?.write??0)).div(1e6)).add(new je(T.reasoning).mul(t(f?.output??0)).div(1e6)).toNumber()),tokens:T}},"getUsage"),Jt=class extends D.TaggedErrorClass()("SessionBusyError",{sessionID:Q}){static{i(this,"BusyError")}},Re=class extends oo.Service()("@opencode/Session"){static{i(this,"Service")}},Po=er(Re),_o=no.effect(Re,S.gen(function*(){let{db:e}=yield*oe.Service,t=yield*oe.Service,r=yield*Be.Service,o=yield*Mt.Service,h=yield*jt.Service,I=S.fn("Session.createNext")(function*(n){let g=yield*U.context,E={id:Q.descending(n.id),slug:ir.create(),version:Zt,projectID:g.project.id,directory:n.directory,path:n.path,workspaceID:n.workspaceID,parentID:n.parentID,title:n.title??(n.parentID?Ur:Br)+new Date().toISOString(),agent:n.agent,model:n.model,metadata:n.metadata,permission:n.permission?[...n.permission]:void 0,cost:0,tokens:Le,time:{created:Date.now(),updated:Date.now()}};return yield*S.logInfo("created",E),yield*o.publish(z.Event.Created,{sessionID:E.id,info:E}),E}),p=S.fn("Session.get")(function*(n){let g=yield*e.select().from(A).where(ce(A.id,n)).get().pipe(S.orDie);return g?Xe(g):yield*S.fail(new le({message:`Session not found: ${n}`}))}),s=S.fn("Session.list")(function*(n){let g=yield*U.context;return yield*To(e,{projectID:g.project.id,experimentalWorkspaces:h.experimentalWorkspaces,...n})}),b=S.fn("Session.listGlobal")(function*(n){let g=[];n?.directory&&g.push(ce(A.directory,n.directory)),n?.roots&&g.push(ut(A.parent_id)),n?.start&&g.push(Or(A.time_updated,n.start)),n?.cursor&&g.push(ro(A.time_updated,n.cursor)),n?.search&&g.push(Lt(A.title,`%${n.search}%`)),n?.archived||g.push(ut(A.time_archived));let $=yield*(g.length>0?e.select().from(A).where(Ze(...g)):e.select().from(A)).orderBy(Vt(A.time_updated),Vt(A.id)).limit(n?.limit??100).all().pipe(S.orDie),v=[...new Set($.map(_=>_.project_id))],M=new Map;if(v.length>0){let _=yield*e.select({id:Oe.id,name:Oe.name,worktree:Oe.worktree}).from(Oe).where(to(Oe.id,v)).all().pipe(S.orDie);for(let C of _)M.set(C.id,{id:C.id,name:C.name??void 0,worktree:C.worktree})}return $.map(_=>({...Xe(_),project:M.get(_.project_id)??null}))}),P=S.fn("Session.children")(function*(n){return(yield*e.select().from(A).where(Ze(ce(A.parent_id,n))).all().pipe(S.orDie)).map(Xe)}),T=S.fnUntraced(function*(n){let g=yield*p(n);try{(yield*U.directory.pipe(S.as(!0),S.catchCause(()=>S.succeed(!1))))&&(yield*Mo(r,n));let $=yield*P(n);for(let v of $)yield*T(v.id);yield*o.publish(z.Event.Deleted,{sessionID:n,info:g}),yield*o.remove(n)}catch(E){yield*S.logError("failed to remove session",{sessionID:n,error:E})}}),u=i(n=>S.gen(function*(){return yield*o.publish(z.Event.MessageUpdated,{sessionID:n.sessionID,info:n}),n}).pipe(S.withSpan("Session.updateMessage")),"updateMessage"),f=i(n=>S.gen(function*(){return yield*o.publish(z.Event.PartUpdated,{sessionID:n.sessionID,part:structuredClone(n),time:Date.now()}),n}).pipe(S.withSpan("Session.updatePart")),"updatePart"),a=S.fn("Session.getPart")(function*(n){let g=yield*e.select().from(Z).where(Ze(ce(Z.session_id,n.sessionID),ce(Z.message_id,n.messageID),ce(Z.id,n.partID))).get().pipe(S.orDie);if(g)return{...g.data,id:g.id,sessionID:g.session_id,messageID:g.message_id}}),c=S.fn("Session.create")(function*(n){let g=yield*U.context,E=yield*U.workspaceID;return yield*I({parentID:n?.parentID,directory:g.directory,path:Nr(g.worktree,g.directory),title:n?.title,agent:n?.agent,model:n?.model,metadata:n?.metadata,permission:n?.permission,workspaceID:n?.workspaceID??E})}),x=S.fn("Session.fork")(function*(n){let g=yield*U.context,E=yield*p(n.sessionID),$=ao(E.title),v=yield*I({directory:g.directory,path:Nr(g.worktree,g.directory),workspaceID:E.workspaceID,title:$,metadata:structuredClone(E.metadata)}),M=yield*tt({sessionID:n.sessionID}),_=new Map,C=n.messageID?M.findIndex(J=>J.info.id===n.messageID):M.length;for(let J of M.slice(0,C<0?M.length:C)){let ge=ve.ascending();_.set(J.info.id,ge);let j=J.info.role==="assistant"&&J.info.parentID?_.get(J.info.parentID):void 0,w=yield*u({...J.info,sessionID:v.id,id:ge,...j&&{parentID:j}});for(let W of J.parts){let B={...W,id:ct.ascending(),messageID:w.id,sessionID:v.id};B.type==="compaction"&&B.tail_start_id&&(B.tail_start_id=_.get(B.tail_start_id)),yield*f(B)}}return v}),m=i((n,g)=>S.gen(function*(){let E=yield*p(n),$={...E,...g,time:g.time?{...E.time,...g.time}:E.time,share:g.share===null?void 0:g.share?{...E.share,...g.share}:E.share,summary:g.summary===null?void 0:g.summary??E.summary,revert:g.revert===null?void 0:g.revert??E.revert,permission:g.permission===null?void 0:g.permission??E.permission};yield*o.publish(z.Event.Updated,{sessionID:n,info:$})}),"patch"),F=S.fn("Session.touch")(function*(n){yield*m(n,{time:{updated:Date.now()}}).pipe(S.orDie)}),d=S.fn("Session.setTitle")(function*(n){yield*m(n.sessionID,{title:n.title}).pipe(S.orDie)}),O=S.fn("Session.setArchived")(function*(n){yield*m(n.sessionID,{time:{archived:n.time}}).pipe(S.orDie)}),G=S.fn("Session.setMetadata")(function*(n){yield*m(n.sessionID,{metadata:n.metadata,time:{updated:Date.now()}}).pipe(S.orDie)}),te=S.fn("Session.setAgentModel")(function*(n){yield*m(n.sessionID,{agent:n.agent,model:n.model,time:{updated:n.time}}).pipe(S.orDie)}),re=S.fn("Session.setPermission")(function*(n){yield*m(n.sessionID,{permission:[...n.permission],time:{updated:Date.now()}}).pipe(S.orDie)}),ie=S.fn("Session.setRevert")(function*(n){yield*m(n.sessionID,{summary:n.summary,time:{updated:Date.now()},revert:n.revert}).pipe(S.orDie)}),Ce=S.fn("Session.clearRevert")(function*(n){yield*m(n,{time:{updated:Date.now()},revert:null}).pipe(S.orDie)}),ne=S.fn("Session.setSummary")(function*(n){yield*m(n.sessionID,{time:{updated:Date.now()},summary:n.summary}).pipe(S.orDie)}),mt=S.fn("Session.setShare")(function*(n){yield*m(n.sessionID,{share:n.share??null,time:{updated:Date.now()}}).pipe(S.orDie)}),et=S.fn("Session.setWorkspace")(function*(n){yield*m(n.sessionID,{workspaceID:n.workspaceID,time:{updated:Date.now()}}).pipe(S.orDie)}),gt=S.fn("Session.diff")(function*(n){return[]}),tt=S.fn("Session.messages")(function*(n){if(n.limit)return(yield*be.page({sessionID:n.sessionID,limit:n.limit}).pipe(S.provideService(oe.Service,t))).items;let g=50,E=[],$;for(;;){let v=yield*be.page({sessionID:n.sessionID,limit:g,before:$}).pipe(S.provideService(oe.Service,t));if(v.items.length===0)break;for(let M=v.items.length-1;M>=0;M--){let _=v.items[M];_&&E.push(_)}if(!v.more||!v.cursor)break;$=v.cursor}return E.reverse()}),yt=S.fn("Session.removeMessage")(function*(n){return yield*o.publish(z.Event.MessageRemoved,{sessionID:n.sessionID,messageID:n.messageID}),n.messageID}),ht=S.fn("Session.removePart")(function*(n){return yield*o.publish(z.Event.PartRemoved,{sessionID:n.sessionID,messageID:n.messageID,partID:n.partID}),n.partID}),y=S.fnUntraced(function*(n){yield*o.publish(be.Event.PartDelta,n)}),k=S.fn("Session.findMessage")(function*(n,g){let $;for(;;){let v=yield*be.page({sessionID:n,limit:50,before:$}).pipe(S.provideService(oe.Service,t));if(v.items.length===0)break;for(let M=v.items.length-1;M>=0;M--){let _=v.items[M];if(_&&g(_))return Fr.some(_)}if(!v.more||!v.cursor)break;$=v.cursor}return Fr.none()});return Re.of({list:s,listGlobal:b,create:c,fork:x,touch:F,get:p,setTitle:d,setArchived:O,setMetadata:G,setAgentModel:te,setPermission:re,setRevert:ie,clearRevert:Ce,setSummary:ne,setShare:mt,setWorkspace:et,diff:gt,messages:tt,children:P,remove:T,updateMessage:u,removeMessage:yt,removePart:ht,updatePart:f,getPart:a,updatePartDelta:y,findMessage:k})})),Mo=S.fn("Session.cancelBackgroundJobs")(function*(e,t){let r=yield*e.list();yield*S.forEach(r.filter(o=>o.status!=="running"?!1:o.id===t||o.metadata?.sessionId===t?!0:o.metadata?.parentSessionId===t),o=>e.cancel(o.id),{concurrency:"unbounded",discard:!0})});function To(e,t){let r=[ce(A.project_id,t.projectID)];if(t.workspaceID&&r.push(ce(A.workspace_id,t.workspaceID)),t.path!==void 0){if(t.path){let h=[ce(A.path,t.path),Lt(A.path,eo.param(`${t.path}/%`,A.path))];r.push(t.directory?Ar(...h,Ze(ut(A.path),ce(A.directory,t.directory))):Ar(...h))}}else t.scope!=="project"&&t.directory&&r.push(ce(A.directory,t.directory));t.roots&&r.push(ut(A.parent_id)),t.start&&r.push(Or(A.time_updated,t.start)),t.search&&r.push(Lt(A.title,`%${t.search}%`));let o=t.limit??100;return e.select().from(A).where(Ze(...r)).orderBy(Vt(A.time_updated)).limit(o).all().pipe(S.orDie,S.map(h=>h.map(Xe)))}i(To,"listByProject");var jo=de.make({service:Re,layer:_o,deps:[Be.node,jt.node,oe.node,Mt.node]});export{We as a,xe as b,Be as c,le as d,Ft as e,Q as f,ve as g,ct as h,kn as i,fs as j,ls as k,be as l,Ke as m,so as n,Xe as o,io as p,qt as q,pt as r,Lr as s,Jr as t,uo as u,po as v,mo as w,go as x,yo as y,ho as z,Io as A,Do as B,So as C,vo as D,xo as E,bo as F,ko as G,Eo as H,wo as I,Jt as J,Re as K,Po as L,jo as M,zt as N};
|