refactor(core): support tiered layer nodes (#33937)

This commit is contained in:
James Long
2026-06-25 14:34:17 -04:00
committed by GitHub
parent 21b78c49fc
commit 0e731c2a1a
80 changed files with 1132 additions and 601 deletions
+1 -1
View File
@@ -458,6 +458,6 @@ export const layer: Layer.Layer<Service, never, AccountRepo.Service | HttpClient
export const defaultLayer = layer.pipe(Layer.provide(AccountRepo.defaultLayer), Layer.provide(FetchHttpClient.layer))
export const node = LayerNode.make(layer, [AccountRepo.node, httpClient])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [AccountRepo.node, httpClient] })
export * as Account from "./account"
+1 -1
View File
@@ -168,6 +168,6 @@ export const layer = Layer.effect(
export const defaultLayer = layer.pipe(Layer.provide(Database.defaultLayer))
export const node = LayerNode.make(layer, [Database.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [Database.node] })
export * as AccountRepo from "./repo"
+6 -9
View File
@@ -447,15 +447,12 @@ export const defaultLayer = layer.pipe(
Layer.provide(LocationServiceMap.layer),
)
const locationServiceMapNode = LayerNode.make(LocationServiceMap.layer, [])
const locationServiceMapNode = LayerNode.make({ service: Service, layer: LocationServiceMap.layer, deps: [] })
export const node = LayerNode.make(layer, [
Config.node,
Auth.node,
Plugin.node,
Skill.node,
Provider.node,
locationServiceMapNode,
])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [Config.node, Auth.node, Plugin.node, Skill.node, Provider.node, locationServiceMapNode],
})
export * as Agent from "./agent"
+1 -1
View File
@@ -94,6 +94,6 @@ export const layer = Layer.effect(
export const defaultLayer = layer.pipe(Layer.provide(FSUtil.defaultLayer))
export const node = LayerNode.make(layer, [FSUtil.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [FSUtil.node] })
export * as Auth from "."
+1 -1
View File
@@ -34,6 +34,6 @@ export const layer = Layer.effect(
export const defaultLayer = layer
export const node = LayerNode.make(layer, [])
export const node = LayerNode.make({ service: CoreBackgroundJob.Service, layer, deps: [] })
export * as BackgroundJob from "./job"
+1 -1
View File
@@ -170,6 +170,6 @@ export const defaultLayer = layer.pipe(
Layer.provide(Skill.defaultLayer),
)
export const node = LayerNode.make(layer, [Config.node, MCP.node, Skill.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [Config.node, MCP.node, Skill.node] })
export * as Command from "."
+5 -1
View File
@@ -681,6 +681,10 @@ export const defaultLayer = layer.pipe(
Layer.provide(FetchHttpClient.layer),
)
export const node = LayerNode.make(layer, [FSUtil.node, Auth.node, Account.node, Env.node, Npm.node, httpClient])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [FSUtil.node, Auth.node, Account.node, Env.node, Npm.node, httpClient],
})
export * as Config from "./config"
@@ -958,16 +958,20 @@ function route(url: string | URL, path: string) {
return next
}
export const node = LayerNode.make(layer, [
Auth.node,
Session.node,
SessionPrompt.node,
httpClient,
EventV2Bridge.node,
Vcs.node,
RuntimeFlags.node,
FSUtil.node,
Database.node,
])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [
Auth.node,
Session.node,
SessionPrompt.node,
httpClient,
EventV2Bridge.node,
Vcs.node,
RuntimeFlags.node,
FSUtil.node,
Database.node,
],
})
export * as Workspace from "./workspace"
@@ -73,7 +73,7 @@ export const layer = (overrides: Partial<Info> = {}) =>
export const defaultLayer = Service.defaultLayer.pipe(Layer.orDie)
export const node = LayerNode.make(defaultLayer, [])
export const node = LayerNode.make({ service: Service, layer: defaultLayer, deps: [] })
export * as RuntimeFlags from "./runtime-flags"
import { LayerNode } from "@opencode-ai/core/effect/layer-node"
+1 -1
View File
@@ -38,6 +38,6 @@ export const layer = Layer.effect(
export const defaultLayer = layer
export const node = LayerNode.make(layer, [])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [] })
export * as Env from "."
+1 -1
View File
@@ -68,6 +68,6 @@ export const layer = Layer.effect(
export const defaultLayer = layer.pipe(Layer.provide(EventV2.defaultLayer))
export const node = LayerNode.make(layer, [EventV2.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [EventV2.node] })
export * as EventV2Bridge from "./event-v2-bridge"
+5 -1
View File
@@ -200,6 +200,10 @@ export const defaultLayer = layer.pipe(
Layer.provide(RuntimeFlags.defaultLayer),
)
export const node = LayerNode.make(layer, [Config.node, AppProcess.node, RuntimeFlags.node])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [Config.node, AppProcess.node, RuntimeFlags.node],
})
export * as Format from "."
+1 -1
View File
@@ -345,6 +345,6 @@ export const layer = Layer.effect(
export const defaultLayer = layer.pipe(Layer.provide(AppProcess.defaultLayer))
export const node = LayerNode.make(layer, [AppProcess.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [AppProcess.node] })
export * as Git from "."
+1 -1
View File
@@ -169,6 +169,6 @@ export const layer = Layer.effect(
export const defaultLayer = layer.pipe(Layer.provide(Config.defaultLayer))
export const node = LayerNode.make(layer, [Config.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [Config.node] })
export * as Image from "./image"
+1 -1
View File
@@ -332,6 +332,6 @@ export const latest = (...args: Parameters<Interface["latest"]>) => runPromise((
export const method = () => runPromise((s) => s.method())
export const upgrade = (...args: Parameters<Interface["upgrade"]>) => runPromise((s) => s.upgrade(...args))
export const node = LayerNode.make(layer, [httpClient, AppProcess.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [httpClient, AppProcess.node] })
export * as Installation from "."
+5 -1
View File
@@ -504,6 +504,10 @@ export const defaultLayer = layer.pipe(
export * as Diagnostic from "./diagnostic"
export const node = LayerNode.make(layer, [Config.node, RuntimeFlags.node, FSUtil.node, EventV2Bridge.node])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [Config.node, RuntimeFlags.node, FSUtil.node, EventV2Bridge.node],
})
export * as LSP from "./lsp"
+1 -1
View File
@@ -169,6 +169,6 @@ export const layer = Layer.effect(
export const defaultLayer = layer.pipe(Layer.provide(EffectFlock.defaultLayer), Layer.provide(FSUtil.defaultLayer))
export const node = LayerNode.make(layer, [FSUtil.node, EffectFlock.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [FSUtil.node, EffectFlock.node] })
export * as McpAuth from "./auth"
+5 -1
View File
@@ -1005,6 +1005,10 @@ export const defaultLayer = layer.pipe(
Layer.provide(FSUtil.defaultLayer),
)
export const node = LayerNode.make(layer, [CrossSpawnSpawner.node, McpAuth.node, EventV2Bridge.node, Config.node])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [CrossSpawnSpawner.node, McpAuth.node, EventV2Bridge.node, Config.node],
})
export * as MCP from "."
+1 -1
View File
@@ -215,6 +215,6 @@ export function disabled(tools: string[], ruleset: PermissionV1.Ruleset): Set<st
export const defaultLayer = layer.pipe(Layer.provide(EventV2Bridge.defaultLayer))
export const node = LayerNode.make(layer, [EventV2Bridge.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [EventV2Bridge.node] })
export * as Permission from "."
+5 -1
View File
@@ -311,6 +311,10 @@ export const defaultLayer = layer.pipe(
Layer.provide(RuntimeFlags.defaultLayer),
)
export const node = LayerNode.make(layer, [EventV2Bridge.node, Config.node, RuntimeFlags.node])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [EventV2Bridge.node, Config.node, RuntimeFlags.node],
})
export * as Plugin from "."
+5 -10
View File
@@ -62,15 +62,10 @@ export const defaultLayer: Layer.Layer<Service> = layer.pipe(
]),
)
export const node = LayerNode.make(layer, [
Config.node,
Format.node,
LSP.node,
Plugin.node,
Project.node,
ShareNext.node,
Snapshot.node,
Vcs.node,
])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [Config.node, Format.node, LSP.node, Plugin.node, Project.node, ShareNext.node, Snapshot.node, Vcs.node],
})
export * as InstanceBootstrap from "./bootstrap"
@@ -204,6 +204,10 @@ export const layer: Layer.Layer<Service, never, Project.Service | InstanceBootst
export const defaultLayer = layer.pipe(Layer.provide(Project.defaultLayer))
export const node = LayerNode.make(layer, [Project.node, InstanceBootstrapGraph.node])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [Project.node, InstanceBootstrapGraph.node],
})
export * as InstanceStore from "./instance-store"
+14 -10
View File
@@ -476,15 +476,19 @@ export const defaultLayer = layer.pipe(
export const use = serviceUse(Service)
export const node = LayerNode.make(layer, [
FSUtil.node,
AppProcess.node,
CrossSpawnSpawner.node,
ProjectV2.node,
ProjectDirectories.node,
EventV2Bridge.node,
RuntimeFlags.node,
Database.node,
])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [
FSUtil.node,
AppProcess.node,
CrossSpawnSpawner.node,
ProjectV2.node,
ProjectDirectories.node,
EventV2Bridge.node,
RuntimeFlags.node,
Database.node,
],
})
export * as Project from "./project"
+1 -1
View File
@@ -420,6 +420,6 @@ export const layer: Layer.Layer<Service, never, Git.Service | EventV2Bridge.Serv
export const defaultLayer = layer.pipe(Layer.provide(Git.defaultLayer), Layer.provide(EventV2Bridge.defaultLayer))
export const node = LayerNode.make(layer, [Git.node, EventV2Bridge.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [Git.node, EventV2Bridge.node] })
export * as Vcs from "./vcs"
+1 -1
View File
@@ -228,6 +228,6 @@ export const defaultLayer = Layer.suspend(() =>
layer.pipe(Layer.provide(Auth.defaultLayer), Layer.provide(Plugin.defaultLayer)),
)
export const node = LayerNode.make(layer, [Auth.node, Plugin.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [Auth.node, Plugin.node] })
export * as ProviderAuth from "./auth"
+5 -9
View File
@@ -1979,14 +1979,10 @@ export function parseModel(model: string) {
}
}
export const node = LayerNode.make(layer, [
FSUtil.node,
Config.node,
Auth.node,
Env.node,
Plugin.node,
ModelsDev.node,
RuntimeFlags.node,
])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [FSUtil.node, Config.node, Auth.node, Env.node, Plugin.node, ModelsDev.node, RuntimeFlags.node],
})
export * as Provider from "./provider"
+1 -1
View File
@@ -158,6 +158,6 @@ export const layer = Layer.effect(
export const defaultLayer = layer.pipe(Layer.provide(EventV2Bridge.defaultLayer))
export const node = LayerNode.make(layer, [EventV2Bridge.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [EventV2Bridge.node] })
export * as Question from "."
+14 -10
View File
@@ -599,15 +599,19 @@ export const defaultLayer = Layer.suspend(() =>
),
)
export const node = LayerNode.make(layer, [
Config.node,
Session.node,
Agent.node,
Plugin.node,
SessionProcessor.node,
Provider.node,
EventV2Bridge.node,
RuntimeFlags.node,
])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [
Config.node,
Session.node,
Agent.node,
Plugin.node,
SessionProcessor.node,
Provider.node,
EventV2Bridge.node,
RuntimeFlags.node,
],
})
export * as SessionCompaction from "./compaction"
+5 -1
View File
@@ -236,6 +236,10 @@ export function loaded(messages: SessionV1.WithParts[]) {
return extract(messages)
}
export const node = LayerNode.make(layer, [Config.node, FSUtil.node, Global.node, RuntimeFlags.node, httpClient])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [Config.node, FSUtil.node, Global.node, RuntimeFlags.node, httpClient],
})
export * as Instruction from "./instruction"
+14 -10
View File
@@ -401,15 +401,19 @@ export const defaultLayer = Layer.suspend(() =>
export const hasToolCalls = LLMRequestPrep.hasToolCalls
export const node = LayerNode.make(layer, [
Auth.node,
Config.node,
Provider.node,
Plugin.node,
Permission.node,
EventV2Bridge.node,
llmClient,
RuntimeFlags.node,
])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [
Auth.node,
Config.node,
Provider.node,
Plugin.node,
Permission.node,
EventV2Bridge.node,
llmClient,
RuntimeFlags.node,
],
})
export * as LLM from "./llm"
+19 -15
View File
@@ -1065,20 +1065,24 @@ export const defaultLayer = Layer.suspend(() =>
),
)
export const node = LayerNode.make(layer, [
Session.node,
Config.node,
Snapshot.node,
Agent.node,
LLM.node,
Permission.node,
Plugin.node,
SessionSummary.node,
SessionStatus.node,
Image.node,
EventV2Bridge.node,
RuntimeFlags.node,
Database.node,
])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [
Session.node,
Config.node,
Snapshot.node,
Agent.node,
LLM.node,
Permission.node,
Plugin.node,
SessionSummary.node,
SessionStatus.node,
Image.node,
EventV2Bridge.node,
RuntimeFlags.node,
Database.node,
],
})
export * as SessionProcessor from "./processor"
+32 -28
View File
@@ -1731,33 +1731,37 @@ const argsRegex = /(?:\[Image\s+\d+\]|"[^"]*"|'[^']*'|[^\s"']+)/gi
const placeholderRegex = /\$(\d+)/g
const quoteTrimRegex = /^["']|["']$/g
export const node = LayerNode.make(layer, [
SessionStatus.node,
Session.node,
Agent.node,
Provider.node,
SessionProcessor.node,
SessionCompaction.node,
Plugin.node,
Command.node,
Config.node,
Permission.node,
FSUtil.node,
MCP.node,
LSP.node,
ToolRegistry.node,
Truncate.node,
Image.node,
CrossSpawnSpawner.node,
Instruction.node,
SessionRunState.node,
SessionRevert.node,
SessionSummary.node,
SystemPrompt.node,
LLM.node,
EventV2Bridge.node,
RuntimeFlags.node,
Database.node,
])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [
SessionStatus.node,
Session.node,
Agent.node,
Provider.node,
SessionProcessor.node,
SessionCompaction.node,
Plugin.node,
Command.node,
Config.node,
Permission.node,
FSUtil.node,
MCP.node,
LSP.node,
ToolRegistry.node,
Truncate.node,
Image.node,
CrossSpawnSpawner.node,
Instruction.node,
SessionRunState.node,
SessionRevert.node,
SessionSummary.node,
SystemPrompt.node,
LLM.node,
EventV2Bridge.node,
RuntimeFlags.node,
Database.node,
],
})
export * as SessionPrompt from "./prompt"
+5 -8
View File
@@ -148,13 +148,10 @@ export const defaultLayer = Layer.suspend(() =>
),
)
export const node = LayerNode.make(layer, [
Session.node,
Snapshot.node,
Storage.node,
EventV2Bridge.node,
SessionSummary.node,
SessionRunState.node,
])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [Session.node, Snapshot.node, Storage.node, EventV2Bridge.node, SessionSummary.node, SessionRunState.node],
})
export * as SessionRevert from "./revert"
+1 -1
View File
@@ -151,6 +151,6 @@ function busyError(sessionID: SessionID) {
return new Session.BusyError({ sessionID })
}
export const node = LayerNode.make(layer, [BackgroundJob.node, SessionStatus.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [BackgroundJob.node, SessionStatus.node] })
export * as SessionRunState from "./run-state"
+5 -1
View File
@@ -1070,6 +1070,10 @@ export function* listGlobal(input?: {
}
}
export const node = LayerNode.make(layer, [BackgroundJob.node, RuntimeFlags.node, Database.node, EventV2Bridge.node])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [BackgroundJob.node, RuntimeFlags.node, Database.node, EventV2Bridge.node],
})
export * as Session from "./session"
+1 -1
View File
@@ -53,6 +53,6 @@ export const layer = Layer.effect(
export const defaultLayer = layer.pipe(Layer.provide(EventV2Bridge.defaultLayer))
export const node = LayerNode.make(layer, [EventV2Bridge.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [EventV2Bridge.node] })
export * as SessionStatus from "./status"
+5 -1
View File
@@ -160,6 +160,10 @@ export const DiffInput = Schema.Struct({
})
export type DiffInput = Schema.Schema.Type<typeof DiffInput>
export const node = LayerNode.make(layer, [Session.node, Snapshot.node, EventV2Bridge.node, Config.node])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [Session.node, Snapshot.node, EventV2Bridge.node, Config.node],
})
export * as SessionSummary from "./summary"
+6 -2
View File
@@ -134,8 +134,12 @@ export const defaultLayer = layer.pipe(
Layer.provide(LocationServiceMap.layer),
)
const locationServiceMapNode = LayerNode.make(LocationServiceMap.layer, [])
const locationServiceMapNode = LayerNode.make({ service: Service, layer: LocationServiceMap.layer, deps: [] })
export const node = LayerNode.make(layer, [Skill.node, MCP.node, locationServiceMapNode])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [Skill.node, MCP.node, locationServiceMapNode],
})
export * as SystemPrompt from "./system"
+1 -1
View File
@@ -71,6 +71,6 @@ export const layer = Layer.effect(
export const defaultLayer = layer.pipe(Layer.provide(EventV2Bridge.defaultLayer), Layer.provide(Database.defaultLayer))
export const node = LayerNode.make(layer, [EventV2Bridge.node, Database.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [EventV2Bridge.node, Database.node] })
export * as Todo from "./todo"
+5 -1
View File
@@ -56,6 +56,10 @@ export const defaultLayer = layer.pipe(
Layer.provide(RuntimeFlags.defaultLayer),
)
export const node = LayerNode.make(layer, [Config.node, Session.node, ShareNext.node, RuntimeFlags.node])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [Config.node, Session.node, ShareNext.node, RuntimeFlags.node],
})
export * as SessionShare from "./session"
+5 -9
View File
@@ -372,14 +372,10 @@ export const defaultLayer = layer.pipe(
Layer.provide(Session.defaultLayer),
)
export const node = LayerNode.make(layer, [
Account.node,
EventV2Bridge.node,
Config.node,
Database.node,
httpClient,
Provider.node,
Session.node,
])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [Account.node, EventV2Bridge.node, Config.node, Database.node, httpClient, Provider.node, Session.node],
})
export * as ShareNext from "./share-next"
+1 -1
View File
@@ -104,6 +104,6 @@ export const defaultLayer: Layer.Layer<Service> = layer.pipe(
Layer.provide(NodePath.layer),
)
export const node = LayerNode.make(layer, [FSUtil.node, path, httpClient])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [FSUtil.node, path, httpClient] })
export * as Discovery from "./discovery"
+5 -8
View File
@@ -354,13 +354,10 @@ export function fmt(list: Info[], opts: { verbose: boolean }) {
].join("\n")
}
export const node = LayerNode.make(layer, [
Discovery.node,
Config.node,
EventV2Bridge.node,
FSUtil.node,
Global.node,
RuntimeFlags.node,
])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [Discovery.node, Config.node, EventV2Bridge.node, FSUtil.node, Global.node, RuntimeFlags.node],
})
export * as Skill from "."
+5 -1
View File
@@ -804,6 +804,10 @@ export const defaultLayer = layer.pipe(
Layer.provide(Config.defaultLayer),
)
export const node = LayerNode.make(layer, [FSUtil.node, AppProcess.node, Config.node])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [FSUtil.node, AppProcess.node, Config.node],
})
export * as Snapshot from "."
+1 -1
View File
@@ -324,6 +324,6 @@ export const layer = Layer.effect(
export const defaultLayer = layer.pipe(Layer.provide(FSUtil.defaultLayer), Layer.provide(Git.defaultLayer))
export const node = LayerNode.make(layer, [FSUtil.node, Git.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [FSUtil.node, Git.node] })
export * as Storage from "./storage"
+25 -21
View File
@@ -415,26 +415,30 @@ function isJsonSchemaObject(value: unknown): value is Record<string, unknown> {
return typeof value === "object" && value !== null && !Array.isArray(value)
}
export const node = LayerNode.make(layer.pipe(Layer.provide(Ripgrep.defaultLayer)), [
Config.node,
Plugin.node,
Question.node,
Todo.node,
Agent.node,
Skill.node,
Session.node,
BackgroundJob.node,
Provider.node,
LSP.node,
Instruction.node,
FSUtil.node,
EventV2Bridge.node,
httpClient,
CrossSpawnSpawner.node,
Format.node,
Truncate.node,
RuntimeFlags.node,
Database.node,
])
export const node = LayerNode.make({
service: Service,
layer: layer.pipe(Layer.provide(Ripgrep.defaultLayer)),
deps: [
Config.node,
Plugin.node,
Question.node,
Todo.node,
Agent.node,
Skill.node,
Session.node,
BackgroundJob.node,
Provider.node,
LSP.node,
Instruction.node,
FSUtil.node,
EventV2Bridge.node,
httpClient,
CrossSpawnSpawner.node,
Format.node,
Truncate.node,
RuntimeFlags.node,
Database.node,
],
})
export * as ToolRegistry from "./registry"
+1 -1
View File
@@ -153,6 +153,6 @@ export const layer = Layer.effect(
export const defaultLayer = layer.pipe(Layer.provide(FSUtil.defaultLayer), Layer.provide(NodePath.layer))
export const node = LayerNode.make(layer, [FSUtil.node])
export const node = LayerNode.make({ service: Service, layer: layer, deps: [FSUtil.node] })
export * as Truncate from "./truncate"
+5 -9
View File
@@ -627,14 +627,10 @@ export const appLayer = layer.pipe(
export const defaultLayer = appLayer.pipe(Layer.provide(InstanceLayer.layer))
export const node = LayerNode.make(layer, [
FSUtil.node,
path,
AppProcess.node,
Git.node,
Project.node,
InstanceStore.node,
Database.node,
])
export const node = LayerNode.make({
service: Service,
layer: layer,
deps: [FSUtil.node, path, AppProcess.node, Git.node, Project.node, InstanceStore.node, Database.node],
})
export * as Worktree from "."