refactor(worktree): provide runtime reentry refs (#27754)

This commit is contained in:
Shoubhit Dash
2026-05-15 20:30:29 +05:30
committed by GitHub
parent f9371eb66c
commit a2392ca60d
@@ -1,4 +1,6 @@
import { Schema } from "effect" import { Effect, Schema } from "effect"
import { InstanceRef, WorkspaceRef } from "@/effect/instance-ref"
import { WorkspaceContext } from "../workspace-context"
import { type WorkspaceAdapter, WorkspaceInfo } from "../types" import { type WorkspaceAdapter, WorkspaceInfo } from "../types"
const WorktreeConfig = Schema.Struct({ const WorktreeConfig = Schema.Struct({
@@ -21,8 +23,15 @@ export const WorktreeAdapter: WorkspaceAdapter = {
name: "Worktree", name: "Worktree",
description: "Create a git worktree", description: "Create a git worktree",
async configure(info) { async configure(info) {
const { AppRuntime, Worktree } = await loadWorktree() const { AppRuntime, Instance, Worktree } = await loadWorktree()
const next = await AppRuntime.runPromise(Worktree.Service.use((svc) => svc.makeWorktreeInfo({ detached: true }))) const ctx = Instance.current
const workspaceID = WorkspaceContext.workspaceID
const next = await AppRuntime.runPromise(
Worktree.Service.use((svc) => svc.makeWorktreeInfo({ detached: true })).pipe(
Effect.provideService(InstanceRef, ctx),
Effect.provideService(WorkspaceRef, workspaceID),
),
)
return { return {
...info, ...info,
name: next.name, name: next.name,
@@ -30,7 +39,9 @@ export const WorktreeAdapter: WorkspaceAdapter = {
} }
}, },
async create(info) { async create(info) {
const { AppRuntime, Worktree } = await loadWorktree() const { AppRuntime, Instance, Worktree } = await loadWorktree()
const ctx = Instance.current
const workspaceID = WorkspaceContext.workspaceID
const config = decodeWorktreeConfig(info) const config = decodeWorktreeConfig(info)
await AppRuntime.runPromise( await AppRuntime.runPromise(
Worktree.Service.use((svc) => Worktree.Service.use((svc) =>
@@ -39,23 +50,40 @@ export const WorktreeAdapter: WorkspaceAdapter = {
directory: config.directory, directory: config.directory,
...(config.branch ? { branch: config.branch } : {}), ...(config.branch ? { branch: config.branch } : {}),
}), }),
).pipe(
Effect.provideService(InstanceRef, ctx),
Effect.provideService(WorkspaceRef, workspaceID),
), ),
) )
}, },
async list() { async list() {
const { AppRuntime, Instance, Worktree } = await loadWorktree() const { AppRuntime, Instance, Worktree } = await loadWorktree()
return (await AppRuntime.runPromise(Worktree.Service.use((svc) => svc.list()))).map((info) => ({ const ctx = Instance.current
const workspaceID = WorkspaceContext.workspaceID
return (await AppRuntime.runPromise(
Worktree.Service.use((svc) => svc.list()).pipe(
Effect.provideService(InstanceRef, ctx),
Effect.provideService(WorkspaceRef, workspaceID),
),
)).map((info) => ({
type: "worktree", type: "worktree",
name: info.name, name: info.name,
branch: info.branch, branch: info.branch,
directory: info.directory, directory: info.directory,
projectID: Instance.project.id, projectID: ctx.project.id,
})) }))
}, },
async remove(info) { async remove(info) {
const { AppRuntime, Worktree } = await loadWorktree() const { AppRuntime, Instance, Worktree } = await loadWorktree()
const ctx = Instance.current
const workspaceID = WorkspaceContext.workspaceID
const config = decodeWorktreeConfig(info) const config = decodeWorktreeConfig(info)
await AppRuntime.runPromise(Worktree.Service.use((svc) => svc.remove({ directory: config.directory }))) await AppRuntime.runPromise(
Worktree.Service.use((svc) => svc.remove({ directory: config.directory })).pipe(
Effect.provideService(InstanceRef, ctx),
Effect.provideService(WorkspaceRef, workspaceID),
),
)
}, },
target(info) { target(info) {
const config = decodeWorktreeConfig(info) const config = decodeWorktreeConfig(info)