core: move Global module to @opencode-ai/core for centralized path management

Move the Global module from packages/opencode/src/global to packages/core/src/global
to provide a unified location for managing XDG directories and application paths.
This eliminates duplicate path definitions across packages and ensures consistent
access to data, config, cache, state, log, and bin directories throughout the codebase.
This commit is contained in:
Dax Raad
2026-04-25 13:52:32 -04:00
parent 716cf74190
commit 705f792e87
61 changed files with 99 additions and 143 deletions
+40 -26
View File
@@ -1,7 +1,9 @@
import path from "path" import path from "path"
import fs from "fs/promises"
import { xdgData, xdgCache, xdgConfig, xdgState } from "xdg-basedir" import { xdgData, xdgCache, xdgConfig, xdgState } from "xdg-basedir"
import os from "os" import os from "os"
import { Context, Effect, Layer } from "effect" import { Context, Effect, Layer } from "effect"
import { Flock } from "./util/flock"
const app = "opencode" const app = "opencode"
const data = path.join(xdgData!, app) const data = path.join(xdgData!, app)
@@ -9,7 +11,7 @@ const cache = path.join(xdgCache!, app)
const config = path.join(xdgConfig!, app) const config = path.join(xdgConfig!, app)
const state = path.join(xdgState!, app) const state = path.join(xdgState!, app)
export const Path = { const paths = {
get home() { get home() {
return process.env.OPENCODE_TEST_HOME ?? os.homedir() return process.env.OPENCODE_TEST_HOME ?? os.homedir()
}, },
@@ -21,31 +23,43 @@ export const Path = {
state, state,
} }
export namespace Global { export const Path = paths
export class Service extends Context.Service<Service, Interface>()("@opencode/Global") {}
export interface Interface { Flock.setGlobal({ state })
readonly home: string
readonly data: string
readonly cache: string
readonly config: string
readonly state: string
readonly bin: string
readonly log: string
}
export const layer = Layer.effect( await Promise.all([
Service, fs.mkdir(Path.data, { recursive: true }),
Effect.gen(function* () { fs.mkdir(Path.config, { recursive: true }),
return Service.of({ fs.mkdir(Path.state, { recursive: true }),
home: Path.home, fs.mkdir(Path.log, { recursive: true }),
data: Path.data, fs.mkdir(Path.bin, { recursive: true }),
cache: Path.cache, ])
config: Path.config,
state: Path.state, export class Service extends Context.Service<Service, Interface>()("@opencode/Global") {}
bin: Path.bin,
log: Path.log, export interface Interface {
}) readonly home: string
}), readonly data: string
) readonly cache: string
readonly config: string
readonly state: string
readonly bin: string
readonly log: string
} }
export const layer = Layer.effect(
Service,
Effect.gen(function* () {
return Service.of({
home: Path.home,
data: Path.data,
cache: Path.cache,
config: Path.config,
state: Path.state,
bin: Path.bin,
log: Path.log,
})
}),
)
export * as Global from "./global"
+1 -1
View File
@@ -15,7 +15,7 @@ import PROMPT_SUMMARY from "./prompt/summary.txt"
import PROMPT_TITLE from "./prompt/title.txt" import PROMPT_TITLE from "./prompt/title.txt"
import { Permission } from "@/permission" import { Permission } from "@/permission"
import { mergeDeep, pipe, sortBy, values } from "remeda" import { mergeDeep, pipe, sortBy, values } from "remeda"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import path from "path" import path from "path"
import { Plugin } from "@/plugin" import { Plugin } from "@/plugin"
import { Skill } from "../skill" import { Skill } from "../skill"
+1 -1
View File
@@ -1,7 +1,7 @@
import path from "path" import path from "path"
import { Effect, Layer, Record, Result, Schema, Context } from "effect" import { Effect, Layer, Record, Result, Schema, Context } from "effect"
import { zod } from "@/util/effect-zod" import { zod } from "@/util/effect-zod"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
import { AppFileSystem } from "@opencode-ai/core/filesystem" import { AppFileSystem } from "@opencode-ai/core/filesystem"
export const OAUTH_DUMMY_KEY = "opencode-oauth-dummy-key" export const OAUTH_DUMMY_KEY = "opencode-oauth-dummy-key"
+1 -1
View File
@@ -2,7 +2,7 @@ import { cmd } from "./cmd"
import * as prompts from "@clack/prompts" import * as prompts from "@clack/prompts"
import { AppRuntime } from "@/effect/app-runtime" import { AppRuntime } from "@/effect/app-runtime"
import { UI } from "../ui" import { UI } from "../ui"
import { Global } from "../../global" import { Global } from "@opencode-ai/core/global"
import { Agent } from "../../agent/agent" import { Agent } from "../../agent/agent"
import { Provider } from "../../provider" import { Provider } from "../../provider"
import path from "path" import path from "path"
+1 -1
View File
@@ -1,4 +1,4 @@
import { Global } from "../../../global" import { Global } from "@opencode-ai/core/global"
import { bootstrap } from "../../bootstrap" import { bootstrap } from "../../bootstrap"
import { cmd } from "../cmd" import { cmd } from "../cmd"
import { ConfigCommand } from "./config" import { ConfigCommand } from "./config"
+1 -1
View File
@@ -13,7 +13,7 @@ import { Instance } from "../../project/instance"
import { Installation } from "../../installation" import { Installation } from "../../installation"
import { InstallationVersion } from "@opencode-ai/core/installation/version" import { InstallationVersion } from "@opencode-ai/core/installation/version"
import path from "path" import path from "path"
import { Global } from "../../global" import { Global } from "@opencode-ai/core/global"
import { modify, applyEdits } from "jsonc-parser" import { modify, applyEdits } from "jsonc-parser"
import { Filesystem } from "../../util" import { Filesystem } from "../../util"
import { Bus } from "../../bus" import { Bus } from "../../bus"
+1 -1
View File
@@ -2,7 +2,7 @@ import { intro, log, outro, spinner } from "@clack/prompts"
import type { Argv } from "yargs" import type { Argv } from "yargs"
import { ConfigPaths } from "../../config" import { ConfigPaths } from "../../config"
import { Global } from "../../global" import { Global } from "@opencode-ai/core/global"
import { installPlugin, patchPluginConfig, readPluginManifest } from "../../plugin/install" import { installPlugin, patchPluginConfig, readPluginManifest } from "../../plugin/install"
import { resolvePluginTarget } from "../../plugin/shared" import { resolvePluginTarget } from "../../plugin/shared"
import { Instance } from "../../project/instance" import { Instance } from "../../project/instance"
+1 -1
View File
@@ -8,7 +8,7 @@ import { map, pipe, sortBy, values } from "remeda"
import path from "path" import path from "path"
import os from "os" import os from "os"
import { Config } from "../../config" import { Config } from "../../config"
import { Global } from "../../global" import { Global } from "@opencode-ai/core/global"
import { Plugin } from "../../plugin" import { Plugin } from "../../plugin"
import { Instance } from "../../project/instance" import { Instance } from "../../project/instance"
import type { Hooks } from "@opencode-ai/plugin" import type { Hooks } from "@opencode-ai/plugin"
@@ -1,5 +1,5 @@
import path from "path" import path from "path"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util" import { Filesystem } from "@/util"
import { onMount } from "solid-js" import { onMount } from "solid-js"
import { createStore } from "solid-js/store" import { createStore } from "solid-js/store"
@@ -1,5 +1,5 @@
import path from "path" import path from "path"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util" import { Filesystem } from "@/util"
import { onMount } from "solid-js" import { onMount } from "solid-js"
import { createStore, produce, unwrap } from "solid-js/store" import { createStore, produce, unwrap } from "solid-js/store"
@@ -1,5 +1,5 @@
import path from "path" import path from "path"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util" import { Filesystem } from "@/util"
import { onMount } from "solid-js" import { onMount } from "solid-js"
import { createStore, produce, unwrap } from "solid-js/store" import { createStore, produce, unwrap } from "solid-js/store"
@@ -4,7 +4,7 @@ import { unique } from "remeda"
import z from "zod" import z from "zod"
import { TuiInfo, TuiOptions } from "./tui-schema" import { TuiInfo, TuiOptions } from "./tui-schema"
import { Flag } from "@opencode-ai/core/flag/flag" import { Flag } from "@opencode-ai/core/flag/flag"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { Filesystem, Log } from "@/util" import { Filesystem, Log } from "@/util"
import * as ConfigPaths from "@/config/paths" import * as ConfigPaths from "@/config/paths"
@@ -9,7 +9,7 @@ import { migrateTuiConfig } from "./tui-migrate"
import { TuiInfo } from "./tui-schema" import { TuiInfo } from "./tui-schema"
import { Flag } from "@opencode-ai/core/flag/flag" import { Flag } from "@opencode-ai/core/flag/flag"
import { isRecord } from "@/util/record" import { isRecord } from "@/util/record"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { AppFileSystem } from "@opencode-ai/core/filesystem" import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { CurrentWorkingDirectory } from "./cwd" import { CurrentWorkingDirectory } from "./cwd"
import { ConfigPlugin } from "@/config/plugin" import { ConfigPlugin } from "@/config/plugin"
@@ -1,7 +1,7 @@
import { createMemo } from "solid-js" import { createMemo } from "solid-js"
import { useProject } from "./project" import { useProject } from "./project"
import { useSync } from "./sync" import { useSync } from "./sync"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
export function useDirectory() { export function useDirectory() {
const project = useProject() const project = useProject()
@@ -1,4 +1,4 @@
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util" import { Filesystem } from "@/util"
import { Flock } from "@opencode-ai/core/util/flock" import { Flock } from "@opencode-ai/core/util/flock"
import { rename, rm } from "fs/promises" import { rename, rm } from "fs/promises"
@@ -5,7 +5,7 @@ import { useSync } from "@tui/context/sync"
import { useTheme } from "@tui/context/theme" import { useTheme } from "@tui/context/theme"
import { uniqueBy } from "remeda" import { uniqueBy } from "remeda"
import path from "path" import path from "path"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { iife } from "@/util/iife" import { iife } from "@/util/iife"
import { useToast } from "../ui/toast" import { useToast } from "../ui/toast"
import { useArgs } from "./args" import { useArgs } from "./args"
@@ -39,7 +39,7 @@ import carbonfox from "./theme/carbonfox.json" with { type: "json" }
import { useKV } from "./kv" import { useKV } from "./kv"
import { useRenderer } from "@opentui/solid" import { useRenderer } from "@opentui/solid"
import { createStore, produce } from "solid-js/store" import { createStore, produce } from "solid-js/store"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util" import { Filesystem } from "@/util"
import { useTuiConfig } from "./tui-config" import { useTuiConfig } from "./tui-config"
import { isRecord } from "@/util/record" import { isRecord } from "@/util/record"
@@ -1,6 +1,6 @@
import type { TuiPlugin, TuiPluginApi, TuiPluginModule } from "@opencode-ai/plugin/tui" import type { TuiPlugin, TuiPluginApi, TuiPluginModule } from "@opencode-ai/plugin/tui"
import { createMemo, Match, Show, Switch } from "solid-js" import { createMemo, Match, Show, Switch } from "solid-js"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
const id = "internal:home-footer" const id = "internal:home-footer"
@@ -1,6 +1,6 @@
import type { TuiPlugin, TuiPluginApi, TuiPluginModule } from "@opencode-ai/plugin/tui" import type { TuiPlugin, TuiPluginApi, TuiPluginModule } from "@opencode-ai/plugin/tui"
import { createMemo, Show } from "solid-js" import { createMemo, Show } from "solid-js"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
const id = "internal:sidebar-footer" const id = "internal:sidebar-footer"
@@ -29,7 +29,7 @@ import { PluginLoader } from "@/plugin/loader"
import { PluginMeta } from "@/plugin/meta" import { PluginMeta } from "@/plugin/meta"
import { installPlugin as installModulePlugin, patchPluginConfig, readPluginManifest } from "@/plugin/install" import { installPlugin as installModulePlugin, patchPluginConfig, readPluginManifest } from "@/plugin/install"
import { hasTheme, upsertTheme } from "../context/theme" import { hasTheme, upsertTheme } from "../context/theme"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util" import { Filesystem } from "@/util"
import { Process } from "@/util" import { Process } from "@/util"
import { Flock } from "@opencode-ai/core/util/flock" import { Flock } from "@opencode-ai/core/util/flock"
@@ -76,7 +76,7 @@ import stripAnsi from "strip-ansi"
import { usePromptRef } from "../../context/prompt" import { usePromptRef } from "../../context/prompt"
import { useExit } from "../../context/exit" import { useExit } from "../../context/exit"
import { Filesystem } from "@/util" import { Filesystem } from "@/util"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { PermissionPrompt } from "./permission" import { PermissionPrompt } from "./permission"
import { QuestionPrompt } from "./question" import { QuestionPrompt } from "./question"
import { DialogExportOptions } from "../../ui/dialog-export-options" import { DialogExportOptions } from "../../ui/dialog-export-options"
@@ -14,7 +14,7 @@ import path from "path"
import { LANGUAGE_EXTENSIONS } from "@/lsp/language" import { LANGUAGE_EXTENSIONS } from "@/lsp/language"
import { Keybind } from "@/util" import { Keybind } from "@/util"
import { Locale } from "@/util" import { Locale } from "@/util"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { useDialog } from "../../ui/dialog" import { useDialog } from "../../ui/dialog"
import { getScrollAcceleration } from "../../util/scroll" import { getScrollAcceleration } from "../../util/scroll"
import { useTuiConfig } from "../../context/tui-config" import { useTuiConfig } from "../../context/tui-config"
+1 -1
View File
@@ -3,7 +3,7 @@ import { UI } from "../ui"
import * as prompts from "@clack/prompts" import * as prompts from "@clack/prompts"
import { AppRuntime } from "@/effect/app-runtime" import { AppRuntime } from "@/effect/app-runtime"
import { Installation } from "../../installation" import { Installation } from "../../installation"
import { Global } from "../../global" import { Global } from "@opencode-ai/core/global"
import fs from "fs/promises" import fs from "fs/promises"
import path from "path" import path from "path"
import os from "os" import os from "os"
+1 -1
View File
@@ -1,7 +1,7 @@
import path from "path" import path from "path"
import { writeHeapSnapshot } from "node:v8" import { writeHeapSnapshot } from "node:v8"
import { Flag } from "@opencode-ai/core/flag/flag" import { Flag } from "@opencode-ai/core/flag/flag"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { Log } from "@/util" import { Log } from "@/util"
const log = Log.create({ service: "heap" }) const log = Log.create({ service: "heap" })
+1 -1
View File
@@ -4,7 +4,7 @@ import { pathToFileURL } from "url"
import os from "os" import os from "os"
import z from "zod" import z from "zod"
import { mergeDeep, pipe } from "remeda" import { mergeDeep, pipe } from "remeda"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
import fsNode from "fs/promises" import fsNode from "fs/promises"
import { NamedError } from "@opencode-ai/core/util/error" import { NamedError } from "@opencode-ai/core/util/error"
import { Flag } from "@opencode-ai/core/flag/flag" import { Flag } from "@opencode-ai/core/flag/flag"
+1 -1
View File
@@ -3,7 +3,7 @@ export * as ConfigPaths from "./paths"
import path from "path" import path from "path"
import { Filesystem } from "@/util" import { Filesystem } from "@/util"
import { Flag } from "@opencode-ai/core/flag/flag" import { Flag } from "@opencode-ai/core/flag/flag"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { unique } from "remeda" import { unique } from "remeda"
import { JsonError } from "./error" import { JsonError } from "./error"
import * as Effect from "effect/Effect" import * as Effect from "effect/Effect"
+1 -1
View File
@@ -9,7 +9,7 @@ import { formatPatch, structuredPatch } from "diff"
import fuzzysort from "fuzzysort" import fuzzysort from "fuzzysort"
import ignore from "ignore" import ignore from "ignore"
import path from "path" import path from "path"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
import { Instance } from "../project/instance" import { Instance } from "../project/instance"
import { Log } from "../util" import { Log } from "../util"
import { Protected } from "./protected" import { Protected } from "./protected"
+1 -1
View File
@@ -7,7 +7,7 @@ import { ChildProcess } from "effect/unstable/process"
import { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner" import { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner"
import * as CrossSpawnSpawner from "@/effect/cross-spawn-spawner" import * as CrossSpawnSpawner from "@/effect/cross-spawn-spawner"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { Log } from "@/util" import { Log } from "@/util"
import { sanitizedProcessEnv } from "@opencode-ai/core/util/opencode-process" import { sanitizedProcessEnv } from "@opencode-ai/core/util/opencode-process"
import { which } from "@/util/which" import { which } from "@/util/which"
-58
View File
@@ -1,58 +0,0 @@
import fs from "fs/promises"
import { xdgData, xdgCache, xdgConfig, xdgState } from "xdg-basedir"
import path from "path"
import os from "os"
import { Filesystem } from "../util"
import { Flock } from "@opencode-ai/core/util/flock"
const app = "opencode"
const data = path.join(xdgData!, app)
const cache = path.join(xdgCache!, app)
const config = path.join(xdgConfig!, app)
const state = path.join(xdgState!, app)
export const Path = {
// Allow override via OPENCODE_TEST_HOME for test isolation
get home() {
return process.env.OPENCODE_TEST_HOME || os.homedir()
},
data,
bin: path.join(cache, "bin"),
log: path.join(data, "log"),
cache,
config,
state,
}
// Initialize Flock with global state path
Flock.setGlobal({ state })
await Promise.all([
fs.mkdir(Path.data, { recursive: true }),
fs.mkdir(Path.config, { recursive: true }),
fs.mkdir(Path.state, { recursive: true }),
fs.mkdir(Path.log, { recursive: true }),
fs.mkdir(Path.bin, { recursive: true }),
])
const CACHE_VERSION = "21"
const version = await Filesystem.readText(path.join(Path.cache, "version")).catch(() => "0")
if (version !== CACHE_VERSION) {
try {
const contents = await fs.readdir(Path.cache)
await Promise.all(
contents.map((item) =>
fs.rm(path.join(Path.cache, item), {
recursive: true,
force: true,
}),
),
)
} catch {}
await Filesystem.write(path.join(Path.cache, "version"), CACHE_VERSION)
}
export * as Global from "."
+1 -1
View File
@@ -31,7 +31,7 @@ import { PrCommand } from "./cli/cmd/pr"
import { SessionCommand } from "./cli/cmd/session" import { SessionCommand } from "./cli/cmd/session"
import { DbCommand } from "./cli/cmd/db" import { DbCommand } from "./cli/cmd/db"
import path from "path" import path from "path"
import { Global } from "./global" import { Global } from "@opencode-ai/core/global"
import { JsonMigration } from "./storage" import { JsonMigration } from "./storage"
import { Database } from "./storage" import { Database } from "./storage"
import { errorMessage } from "./util/error" import { errorMessage } from "./util/error"
+1 -1
View File
@@ -1,7 +1,7 @@
import type { ChildProcessWithoutNullStreams } from "child_process" import type { ChildProcessWithoutNullStreams } from "child_process"
import path from "path" import path from "path"
import os from "os" import os from "os"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
import { Log } from "../util" import { Log } from "../util"
import { text } from "node:stream/consumers" import { text } from "node:stream/consumers"
import fs from "fs/promises" import fs from "fs/promises"
+1 -1
View File
@@ -1,6 +1,6 @@
import path from "path" import path from "path"
import z from "zod" import z from "zod"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
import { Effect, Layer, Context } from "effect" import { Effect, Layer, Context } from "effect"
import { AppFileSystem } from "@opencode-ai/core/filesystem" import { AppFileSystem } from "@opencode-ai/core/filesystem"
+1 -1
View File
@@ -8,7 +8,7 @@ import {
} from "jsonc-parser" } from "jsonc-parser"
import * as ConfigPaths from "@/config/paths" import * as ConfigPaths from "@/config/paths"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util" import { Filesystem } from "@/util"
import { Flock } from "@opencode-ai/core/util/flock" import { Flock } from "@opencode-ai/core/util/flock"
import { isRecord } from "@/util/record" import { isRecord } from "@/util/record"
+1 -1
View File
@@ -2,7 +2,7 @@ import path from "path"
import { fileURLToPath } from "url" import { fileURLToPath } from "url"
import { Flag } from "@opencode-ai/core/flag/flag" import { Flag } from "@opencode-ai/core/flag/flag"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util" import { Filesystem } from "@/util"
import { Flock } from "@opencode-ai/core/util/flock" import { Flock } from "@opencode-ai/core/util/flock"
+1 -1
View File
@@ -1,4 +1,4 @@
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
import { Log } from "../util" import { Log } from "../util"
import path from "path" import path from "path"
import { Schema } from "effect" import { Schema } from "effect"
+1 -1
View File
@@ -16,7 +16,7 @@ import { Flag } from "@opencode-ai/core/flag/flag"
import { zod } from "@/util/effect-zod" import { zod } from "@/util/effect-zod"
import { namedSchemaError } from "@/util/named-schema-error" import { namedSchemaError } from "@/util/named-schema-error"
import { iife } from "@/util/iife" import { iife } from "@/util/iife"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
import path from "path" import path from "path"
import { pathToFileURL } from "url" import { pathToFileURL } from "url"
import { Effect, Layer, Context, Schema, Types } from "effect" import { Effect, Layer, Context, Schema, Types } from "effect"
@@ -1,4 +1,4 @@
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { Vcs } from "@/project" import { Vcs } from "@/project"
import * as InstanceState from "@/effect/instance-state" import * as InstanceState from "@/effect/instance-state"
import { Effect, Layer, Schema } from "effect" import { Effect, Layer, Schema } from "effect"
@@ -9,7 +9,7 @@ import { Instance } from "@/project/instance"
import { Vcs } from "@/project" import { Vcs } from "@/project"
import { Agent } from "@/agent/agent" import { Agent } from "@/agent/agent"
import { Skill } from "@/skill" import { Skill } from "@/skill"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { LSP } from "@/lsp" import { LSP } from "@/lsp"
import { Command } from "@/command" import { Command } from "@/command"
import { QuestionRoutes } from "./question" import { QuestionRoutes } from "./question"
+1 -1
View File
@@ -7,7 +7,7 @@ import { InstanceState } from "@/effect"
import { Flag } from "@opencode-ai/core/flag/flag" import { Flag } from "@opencode-ai/core/flag/flag"
import { AppFileSystem } from "@opencode-ai/core/filesystem" import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { withTransientReadRetry } from "@/util/effect-http-client" import { withTransientReadRetry } from "@/util/effect-http-client"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
import { Log } from "../util" import { Log } from "../util"
import type { MessageV2 } from "./message-v2" import type { MessageV2 } from "./message-v2"
import type { MessageID } from "./schema" import type { MessageID } from "./schema"
+1 -1
View File
@@ -25,7 +25,7 @@ import { SessionID, MessageID, PartID } from "./schema"
import type { Provider } from "@/provider" import type { Provider } from "@/provider"
import { Permission } from "@/permission" import { Permission } from "@/permission"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { Effect, Layer, Option, Context, Schema, Types } from "effect" import { Effect, Layer, Option, Context, Schema, Types } from "effect"
import { zod } from "@/util/effect-zod" import { zod } from "@/util/effect-zod"
import { withStatics } from "@/util/schema" import { withStatics } from "@/util/schema"
+1 -1
View File
@@ -3,7 +3,7 @@ import { Effect, Layer, Path, Schema, Context } from "effect"
import { FetchHttpClient, HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http" import { FetchHttpClient, HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http"
import { withTransientReadRetry } from "@/util/effect-http-client" import { withTransientReadRetry } from "@/util/effect-http-client"
import { AppFileSystem } from "@opencode-ai/core/filesystem" import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
import { Log } from "../util" import { Log } from "../util"
const skillConcurrency = 4 const skillConcurrency = 4
+1 -1
View File
@@ -8,7 +8,7 @@ import type { Agent } from "@/agent/agent"
import { Bus } from "@/bus" import { Bus } from "@/bus"
import { InstanceState } from "@/effect" import { InstanceState } from "@/effect"
import { Flag } from "@opencode-ai/core/flag/flag" import { Flag } from "@opencode-ai/core/flag/flag"
import { Global } from "@/global" import { Global } from "@opencode-ai/core/global"
import { Permission } from "@/permission" import { Permission } from "@/permission"
import { AppFileSystem } from "@opencode-ai/core/filesystem" import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Config } from "../config" import { Config } from "../config"
+1 -1
View File
@@ -8,7 +8,7 @@ import { InstanceState } from "@/effect"
import { AppFileSystem } from "@opencode-ai/core/filesystem" import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Hash } from "@opencode-ai/core/util/hash" import { Hash } from "@opencode-ai/core/util/hash"
import { Config } from "../config" import { Config } from "../config"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
import { Log } from "../util" import { Log } from "../util"
import { withStatics } from "@/util/schema" import { withStatics } from "@/util/schema"
import { zod } from "@/util/effect-zod" import { zod } from "@/util/effect-zod"
+1 -1
View File
@@ -4,7 +4,7 @@ import { type SQLiteTransaction } from "drizzle-orm/sqlite-core"
export * from "drizzle-orm" export * from "drizzle-orm"
import { LocalContext } from "../util" import { LocalContext } from "../util"
import { lazy } from "../util/lazy" import { lazy } from "../util/lazy"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
import { Log } from "../util" import { Log } from "../util"
import { NamedError } from "@opencode-ai/core/util/error" import { NamedError } from "@opencode-ai/core/util/error"
import z from "zod" import z from "zod"
@@ -1,6 +1,6 @@
import type { SQLiteBunDatabase } from "drizzle-orm/bun-sqlite" import type { SQLiteBunDatabase } from "drizzle-orm/bun-sqlite"
import type { NodeSQLiteDatabase } from "drizzle-orm/node-sqlite" import type { NodeSQLiteDatabase } from "drizzle-orm/node-sqlite"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
import { Log } from "../util" import { Log } from "../util"
import { ProjectTable } from "../project/project.sql" import { ProjectTable } from "../project/project.sql"
import { SessionTable, MessageTable, PartTable, TodoTable, PermissionTable } from "../session/session.sql" import { SessionTable, MessageTable, PartTable, TodoTable, PermissionTable } from "../session/session.sql"
+1 -1
View File
@@ -1,6 +1,6 @@
import { Log } from "../util" import { Log } from "../util"
import path from "path" import path from "path"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
import { NamedError } from "@opencode-ai/core/util/error" import { NamedError } from "@opencode-ai/core/util/error"
import z from "zod" import z from "zod"
import { AppFileSystem } from "@opencode-ai/core/filesystem" import { AppFileSystem } from "@opencode-ai/core/filesystem"
+1 -1
View File
@@ -1,4 +1,4 @@
import path from "path" import path from "path"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
export const TRUNCATION_DIR = path.join(Global.Path.data, "tool-output") export const TRUNCATION_DIR = path.join(Global.Path.data, "tool-output")
+1 -1
View File
@@ -1,6 +1,6 @@
import whichPkg from "which" import whichPkg from "which"
import path from "path" import path from "path"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
export function which(cmd: string, env?: NodeJS.ProcessEnv) { export function which(cmd: string, env?: NodeJS.ProcessEnv) {
const base = env?.PATH ?? env?.Path ?? process.env.PATH ?? process.env.Path ?? "" const base = env?.PATH ?? env?.Path ?? process.env.PATH ?? process.env.Path ?? ""
+1 -1
View File
@@ -1,6 +1,6 @@
import z from "zod" import z from "zod"
import { NamedError } from "@opencode-ai/core/util/error" import { NamedError } from "@opencode-ai/core/util/error"
import { Global } from "../global" import { Global } from "@opencode-ai/core/global"
import { Instance } from "../project/instance" import { Instance } from "../project/instance"
import { InstanceBootstrap } from "../project/bootstrap" import { InstanceBootstrap } from "../project/bootstrap"
import { Project } from "../project" import { Project } from "../project"
@@ -4,7 +4,7 @@ import path from "path"
import { pathToFileURL } from "url" import { pathToFileURL } from "url"
import { tmpdir } from "../../fixture/fixture" import { tmpdir } from "../../fixture/fixture"
import { createTuiPluginApi } from "../../fixture/tui-plugin" import { createTuiPluginApi } from "../../fixture/tui-plugin"
import { Global } from "../../../src/global" import { Global } from "@opencode-ai/core/global"
import { TuiConfig } from "../../../src/cli/cmd/tui/config/tui" import { TuiConfig } from "../../../src/cli/cmd/tui/config/tui"
import { Filesystem } from "../../../src/util/" import { Filesystem } from "../../../src/util/"
+1 -1
View File
@@ -23,7 +23,7 @@ const infra = CrossSpawnSpawner.defaultLayer.pipe(
import path from "path" import path from "path"
import fs from "fs/promises" import fs from "fs/promises"
import { pathToFileURL } from "url" import { pathToFileURL } from "url"
import { Global } from "../../src/global" import { Global } from "@opencode-ai/core/global"
import { ProjectID } from "../../src/project/schema" import { ProjectID } from "../../src/project/schema"
import { Filesystem } from "../../src/util" import { Filesystem } from "../../src/util"
import { ConfigPlugin } from "@/config/plugin" import { ConfigPlugin } from "@/config/plugin"
+1 -1
View File
@@ -5,7 +5,7 @@ import { tmpdir } from "../fixture/fixture"
import { Instance } from "../../src/project/instance" import { Instance } from "../../src/project/instance"
import { TuiConfig } from "../../src/cli/cmd/tui/config/tui" import { TuiConfig } from "../../src/cli/cmd/tui/config/tui"
import { Config } from "../../src/config" import { Config } from "../../src/config"
import { Global } from "../../src/global" import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "../../src/util" import { Filesystem } from "../../src/util"
import { AppRuntime } from "../../src/effect/app-runtime" import { AppRuntime } from "../../src/effect/app-runtime"
import { Effect, Layer } from "effect" import { Effect, Layer } from "effect"
@@ -7,7 +7,7 @@ import { tmpdir } from "../fixture/fixture"
import { Instance } from "../../src/project/instance" import { Instance } from "../../src/project/instance"
import { Provider } from "../../src/provider" import { Provider } from "../../src/provider"
import { Env } from "../../src/env" import { Env } from "../../src/env"
import { Global } from "../../src/global" import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "../../src/util" import { Filesystem } from "../../src/util"
import { Effect } from "effect" import { Effect } from "effect"
import { AppRuntime } from "../../src/effect/app-runtime" import { AppRuntime } from "../../src/effect/app-runtime"
@@ -11,7 +11,7 @@ export {}
// import { Instance } from "../../src/project/instance" // import { Instance } from "../../src/project/instance"
// import { Provider } from "../../src/provider" // import { Provider } from "../../src/provider"
// import { Env } from "../../src/env" // import { Env } from "../../src/env"
// import { Global } from "../../src/global" // import { Global } from "@opencode-ai/core/global"
// import { GitLabWorkflowLanguageModel } from "gitlab-ai-provider" // import { GitLabWorkflowLanguageModel } from "gitlab-ai-provider"
// test("GitLab Duo: loads provider with API key from environment", async () => { // test("GitLab Duo: loads provider with API key from environment", async () => {
@@ -3,7 +3,7 @@ import { mkdir, unlink } from "fs/promises"
import path from "path" import path from "path"
import { tmpdir } from "../fixture/fixture" import { tmpdir } from "../fixture/fixture"
import { Global } from "../../src/global" import { Global } from "@opencode-ai/core/global"
import { Instance } from "../../src/project/instance" import { Instance } from "../../src/project/instance"
import { Plugin } from "../../src/plugin/index" import { Plugin } from "../../src/plugin/index"
import { ModelsDev } from "../../src/provider" import { ModelsDev } from "../../src/provider"
@@ -6,7 +6,7 @@ import { Instruction } from "../../src/session/instruction"
import type { MessageV2 } from "../../src/session/message-v2" import type { MessageV2 } from "../../src/session/message-v2"
import { Instance } from "../../src/project/instance" import { Instance } from "../../src/project/instance"
import { MessageID, PartID, SessionID } from "../../src/session/schema" import { MessageID, PartID, SessionID } from "../../src/session/schema"
import { Global } from "../../src/global" import { Global } from "@opencode-ai/core/global"
import { tmpdir } from "../fixture/fixture" import { tmpdir } from "../fixture/fixture"
const run = <A>(effect: Effect.Effect<A, any, Instruction.Service>) => const run = <A>(effect: Effect.Effect<A, any, Instruction.Service>) =>
@@ -1,7 +1,7 @@
import { describe, test, expect, beforeAll, afterAll } from "bun:test" import { describe, test, expect, beforeAll, afterAll } from "bun:test"
import { Effect } from "effect" import { Effect } from "effect"
import { Discovery } from "../../src/skill/discovery" import { Discovery } from "../../src/skill/discovery"
import { Global } from "../../src/global" import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "../../src/util" import { Filesystem } from "../../src/util"
import { rm } from "fs/promises" import { rm } from "fs/promises"
import path from "path" import path from "path"
+1 -1
View File
@@ -1,6 +1,6 @@
import { describe, expect, test } from "bun:test" import { describe, expect, test } from "bun:test"
import path from "path" import path from "path"
import { Global } from "../../src/global" import { Global } from "@opencode-ai/core/global"
import { InstallationChannel } from "@opencode-ai/core/installation/version" import { InstallationChannel } from "@opencode-ai/core/installation/version"
import { Database } from "../../src/storage" import { Database } from "../../src/storage"
@@ -6,7 +6,7 @@ import path from "path"
import fs from "fs/promises" import fs from "fs/promises"
import { readFileSync, readdirSync } from "fs" import { readFileSync, readdirSync } from "fs"
import { JsonMigration } from "../../src/storage" import { JsonMigration } from "../../src/storage"
import { Global } from "../../src/global" import { Global } from "@opencode-ai/core/global"
import { ProjectTable } from "../../src/project/project.sql" import { ProjectTable } from "../../src/project/project.sql"
import { ProjectID } from "../../src/project/schema" import { ProjectID } from "../../src/project/schema"
import { SessionTable, MessageTable, PartTable, TodoTable, PermissionTable } from "../../src/session/session.sql" import { SessionTable, MessageTable, PartTable, TodoTable, PermissionTable } from "../../src/session/session.sql"
@@ -4,7 +4,7 @@ import { Effect, Exit, Layer } from "effect"
import { AppFileSystem } from "@opencode-ai/core/filesystem" import { AppFileSystem } from "@opencode-ai/core/filesystem"
import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner" import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner"
import { Git } from "../../src/git" import { Git } from "../../src/git"
import { Global } from "../../src/global" import { Global } from "@opencode-ai/core/global"
import { Storage } from "../../src/storage" import { Storage } from "../../src/storage"
import { tmpdirScoped } from "../fixture/fixture" import { tmpdirScoped } from "../fixture/fixture"
import { testEffect } from "../lib/effect" import { testEffect } from "../lib/effect"
+1 -1
View File
@@ -1,7 +1,7 @@
import { afterEach, expect, test } from "bun:test" import { afterEach, expect, test } from "bun:test"
import fs from "fs/promises" import fs from "fs/promises"
import path from "path" import path from "path"
import { Global } from "../../src/global" import { Global } from "@opencode-ai/core/global"
import { Log } from "../../src/util" import { Log } from "../../src/util"
import { tmpdir } from "../fixture/fixture" import { tmpdir } from "../fixture/fixture"