summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--packages/core/src/global.ts70
-rw-r--r--packages/opencode/src/agent/agent.ts2
-rw-r--r--packages/opencode/src/auth/index.ts2
-rw-r--r--packages/opencode/src/cli/cmd/agent.ts2
-rw-r--r--packages/opencode/src/cli/cmd/debug/index.ts2
-rw-r--r--packages/opencode/src/cli/cmd/mcp.ts2
-rw-r--r--packages/opencode/src/cli/cmd/plug.ts2
-rw-r--r--packages/opencode/src/cli/cmd/providers.ts2
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/prompt/frecency.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/prompt/history.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/prompt/stash.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/config/tui-migrate.ts2
-rw-r--r--packages/opencode/src/cli/cmd/tui/config/tui.ts2
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/directory.ts2
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/kv.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/local.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/theme.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/feature-plugins/home/footer.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/plugin/runtime.ts2
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/index.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/uninstall.ts2
-rw-r--r--packages/opencode/src/cli/heap.ts2
-rw-r--r--packages/opencode/src/config/config.ts2
-rw-r--r--packages/opencode/src/config/paths.ts2
-rw-r--r--packages/opencode/src/file/index.ts2
-rw-r--r--packages/opencode/src/file/ripgrep.ts2
-rw-r--r--packages/opencode/src/global/index.ts58
-rw-r--r--packages/opencode/src/index.ts2
-rw-r--r--packages/opencode/src/lsp/server.ts2
-rw-r--r--packages/opencode/src/mcp/auth.ts2
-rw-r--r--packages/opencode/src/plugin/install.ts2
-rw-r--r--packages/opencode/src/plugin/meta.ts2
-rw-r--r--packages/opencode/src/provider/models.ts2
-rw-r--r--packages/opencode/src/provider/provider.ts2
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/instance.ts2
-rw-r--r--packages/opencode/src/server/routes/instance/index.ts2
-rw-r--r--packages/opencode/src/session/instruction.ts2
-rw-r--r--packages/opencode/src/session/session.ts2
-rw-r--r--packages/opencode/src/skill/discovery.ts2
-rw-r--r--packages/opencode/src/skill/index.ts2
-rw-r--r--packages/opencode/src/snapshot/index.ts2
-rw-r--r--packages/opencode/src/storage/db.ts2
-rw-r--r--packages/opencode/src/storage/json-migration.ts2
-rw-r--r--packages/opencode/src/storage/storage.ts2
-rw-r--r--packages/opencode/src/tool/truncation-dir.ts2
-rw-r--r--packages/opencode/src/util/which.ts2
-rw-r--r--packages/opencode/src/worktree/index.ts2
-rw-r--r--packages/opencode/test/cli/tui/plugin-loader.test.ts2
-rw-r--r--packages/opencode/test/config/config.test.ts2
-rw-r--r--packages/opencode/test/config/tui.test.ts2
-rw-r--r--packages/opencode/test/provider/amazon-bedrock.test.ts2
-rw-r--r--packages/opencode/test/provider/gitlab-duo.test.ts2
-rw-r--r--packages/opencode/test/provider/provider.test.ts2
-rw-r--r--packages/opencode/test/session/instruction.test.ts2
-rw-r--r--packages/opencode/test/skill/discovery.test.ts2
-rw-r--r--packages/opencode/test/storage/db.test.ts2
-rw-r--r--packages/opencode/test/storage/json-migration.test.ts2
-rw-r--r--packages/opencode/test/storage/storage.test.ts2
-rw-r--r--packages/opencode/test/util/log.test.ts2
61 files changed, 101 insertions, 145 deletions
diff --git a/packages/core/src/global.ts b/packages/core/src/global.ts
index bf605618f..0c83e3a1f 100644
--- a/packages/core/src/global.ts
+++ b/packages/core/src/global.ts
@@ -1,7 +1,9 @@
import path from "path"
+import fs from "fs/promises"
import { xdgData, xdgCache, xdgConfig, xdgState } from "xdg-basedir"
import os from "os"
import { Context, Effect, Layer } from "effect"
+import { Flock } from "./util/flock"
const app = "opencode"
const data = path.join(xdgData!, app)
@@ -9,7 +11,7 @@ const cache = path.join(xdgCache!, app)
const config = path.join(xdgConfig!, app)
const state = path.join(xdgState!, app)
-export const Path = {
+const paths = {
get home() {
return process.env.OPENCODE_TEST_HOME ?? os.homedir()
},
@@ -21,31 +23,43 @@ export const Path = {
state,
}
-export namespace Global {
- export class Service extends Context.Service<Service, Interface>()("@opencode/Global") {}
-
- 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 const Path = paths
+
+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 }),
+])
+
+export class Service extends Context.Service<Service, Interface>()("@opencode/Global") {}
+
+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"
diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts
index 355718b6b..a37e0c194 100644
--- a/packages/opencode/src/agent/agent.ts
+++ b/packages/opencode/src/agent/agent.ts
@@ -15,7 +15,7 @@ import PROMPT_SUMMARY from "./prompt/summary.txt"
import PROMPT_TITLE from "./prompt/title.txt"
import { Permission } from "@/permission"
import { mergeDeep, pipe, sortBy, values } from "remeda"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import path from "path"
import { Plugin } from "@/plugin"
import { Skill } from "../skill"
diff --git a/packages/opencode/src/auth/index.ts b/packages/opencode/src/auth/index.ts
index 00bc22329..539c40c1a 100644
--- a/packages/opencode/src/auth/index.ts
+++ b/packages/opencode/src/auth/index.ts
@@ -1,7 +1,7 @@
import path from "path"
import { Effect, Layer, Record, Result, Schema, Context } from "effect"
import { zod } from "@/util/effect-zod"
-import { Global } from "../global"
+import { Global } from "@opencode-ai/core/global"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
export const OAUTH_DUMMY_KEY = "opencode-oauth-dummy-key"
diff --git a/packages/opencode/src/cli/cmd/agent.ts b/packages/opencode/src/cli/cmd/agent.ts
index fd559935f..acad38668 100644
--- a/packages/opencode/src/cli/cmd/agent.ts
+++ b/packages/opencode/src/cli/cmd/agent.ts
@@ -2,7 +2,7 @@ import { cmd } from "./cmd"
import * as prompts from "@clack/prompts"
import { AppRuntime } from "@/effect/app-runtime"
import { UI } from "../ui"
-import { Global } from "../../global"
+import { Global } from "@opencode-ai/core/global"
import { Agent } from "../../agent/agent"
import { Provider } from "../../provider"
import path from "path"
diff --git a/packages/opencode/src/cli/cmd/debug/index.ts b/packages/opencode/src/cli/cmd/debug/index.ts
index e780c4ccb..194e66b1f 100644
--- a/packages/opencode/src/cli/cmd/debug/index.ts
+++ b/packages/opencode/src/cli/cmd/debug/index.ts
@@ -1,4 +1,4 @@
-import { Global } from "../../../global"
+import { Global } from "@opencode-ai/core/global"
import { bootstrap } from "../../bootstrap"
import { cmd } from "../cmd"
import { ConfigCommand } from "./config"
diff --git a/packages/opencode/src/cli/cmd/mcp.ts b/packages/opencode/src/cli/cmd/mcp.ts
index 3269b4a3d..ef22340fb 100644
--- a/packages/opencode/src/cli/cmd/mcp.ts
+++ b/packages/opencode/src/cli/cmd/mcp.ts
@@ -13,7 +13,7 @@ import { Instance } from "../../project/instance"
import { Installation } from "../../installation"
import { InstallationVersion } from "@opencode-ai/core/installation/version"
import path from "path"
-import { Global } from "../../global"
+import { Global } from "@opencode-ai/core/global"
import { modify, applyEdits } from "jsonc-parser"
import { Filesystem } from "../../util"
import { Bus } from "../../bus"
diff --git a/packages/opencode/src/cli/cmd/plug.ts b/packages/opencode/src/cli/cmd/plug.ts
index 9dfda16d6..14c846f2c 100644
--- a/packages/opencode/src/cli/cmd/plug.ts
+++ b/packages/opencode/src/cli/cmd/plug.ts
@@ -2,7 +2,7 @@ import { intro, log, outro, spinner } from "@clack/prompts"
import type { Argv } from "yargs"
import { ConfigPaths } from "../../config"
-import { Global } from "../../global"
+import { Global } from "@opencode-ai/core/global"
import { installPlugin, patchPluginConfig, readPluginManifest } from "../../plugin/install"
import { resolvePluginTarget } from "../../plugin/shared"
import { Instance } from "../../project/instance"
diff --git a/packages/opencode/src/cli/cmd/providers.ts b/packages/opencode/src/cli/cmd/providers.ts
index e2eb0b65a..158405e5f 100644
--- a/packages/opencode/src/cli/cmd/providers.ts
+++ b/packages/opencode/src/cli/cmd/providers.ts
@@ -8,7 +8,7 @@ import { map, pipe, sortBy, values } from "remeda"
import path from "path"
import os from "os"
import { Config } from "../../config"
-import { Global } from "../../global"
+import { Global } from "@opencode-ai/core/global"
import { Plugin } from "../../plugin"
import { Instance } from "../../project/instance"
import type { Hooks } from "@opencode-ai/plugin"
diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/frecency.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/frecency.tsx
index 929f3a07d..61d4c9e99 100644
--- a/packages/opencode/src/cli/cmd/tui/component/prompt/frecency.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/prompt/frecency.tsx
@@ -1,5 +1,5 @@
import path from "path"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util"
import { onMount } from "solid-js"
import { createStore } from "solid-js/store"
diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/history.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/history.tsx
index 03db74de9..2d979ce99 100644
--- a/packages/opencode/src/cli/cmd/tui/component/prompt/history.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/prompt/history.tsx
@@ -1,5 +1,5 @@
import path from "path"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util"
import { onMount } from "solid-js"
import { createStore, produce, unwrap } from "solid-js/store"
diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/stash.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/stash.tsx
index 84ba62338..a7dd28965 100644
--- a/packages/opencode/src/cli/cmd/tui/component/prompt/stash.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/prompt/stash.tsx
@@ -1,5 +1,5 @@
import path from "path"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util"
import { onMount } from "solid-js"
import { createStore, produce, unwrap } from "solid-js/store"
diff --git a/packages/opencode/src/cli/cmd/tui/config/tui-migrate.ts b/packages/opencode/src/cli/cmd/tui/config/tui-migrate.ts
index d5599c170..b6a832dcb 100644
--- a/packages/opencode/src/cli/cmd/tui/config/tui-migrate.ts
+++ b/packages/opencode/src/cli/cmd/tui/config/tui-migrate.ts
@@ -4,7 +4,7 @@ import { unique } from "remeda"
import z from "zod"
import { TuiInfo, TuiOptions } from "./tui-schema"
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 * as ConfigPaths from "@/config/paths"
diff --git a/packages/opencode/src/cli/cmd/tui/config/tui.ts b/packages/opencode/src/cli/cmd/tui/config/tui.ts
index 64ec5f1c5..b55e5807e 100644
--- a/packages/opencode/src/cli/cmd/tui/config/tui.ts
+++ b/packages/opencode/src/cli/cmd/tui/config/tui.ts
@@ -9,7 +9,7 @@ import { migrateTuiConfig } from "./tui-migrate"
import { TuiInfo } from "./tui-schema"
import { Flag } from "@opencode-ai/core/flag/flag"
import { isRecord } from "@/util/record"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { CurrentWorkingDirectory } from "./cwd"
import { ConfigPlugin } from "@/config/plugin"
diff --git a/packages/opencode/src/cli/cmd/tui/context/directory.ts b/packages/opencode/src/cli/cmd/tui/context/directory.ts
index 81f217398..0c4e5feb9 100644
--- a/packages/opencode/src/cli/cmd/tui/context/directory.ts
+++ b/packages/opencode/src/cli/cmd/tui/context/directory.ts
@@ -1,7 +1,7 @@
import { createMemo } from "solid-js"
import { useProject } from "./project"
import { useSync } from "./sync"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
export function useDirectory() {
const project = useProject()
diff --git a/packages/opencode/src/cli/cmd/tui/context/kv.tsx b/packages/opencode/src/cli/cmd/tui/context/kv.tsx
index df8a8394c..2efa314d9 100644
--- a/packages/opencode/src/cli/cmd/tui/context/kv.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/kv.tsx
@@ -1,4 +1,4 @@
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util"
import { Flock } from "@opencode-ai/core/util/flock"
import { rename, rm } from "fs/promises"
diff --git a/packages/opencode/src/cli/cmd/tui/context/local.tsx b/packages/opencode/src/cli/cmd/tui/context/local.tsx
index 910483764..af06a2bf2 100644
--- a/packages/opencode/src/cli/cmd/tui/context/local.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/local.tsx
@@ -5,7 +5,7 @@ import { useSync } from "@tui/context/sync"
import { useTheme } from "@tui/context/theme"
import { uniqueBy } from "remeda"
import path from "path"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { iife } from "@/util/iife"
import { useToast } from "../ui/toast"
import { useArgs } from "./args"
diff --git a/packages/opencode/src/cli/cmd/tui/context/theme.tsx b/packages/opencode/src/cli/cmd/tui/context/theme.tsx
index 10f2dc49d..ca6c0a6cf 100644
--- a/packages/opencode/src/cli/cmd/tui/context/theme.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/theme.tsx
@@ -39,7 +39,7 @@ import carbonfox from "./theme/carbonfox.json" with { type: "json" }
import { useKV } from "./kv"
import { useRenderer } from "@opentui/solid"
import { createStore, produce } from "solid-js/store"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util"
import { useTuiConfig } from "./tui-config"
import { isRecord } from "@/util/record"
diff --git a/packages/opencode/src/cli/cmd/tui/feature-plugins/home/footer.tsx b/packages/opencode/src/cli/cmd/tui/feature-plugins/home/footer.tsx
index 8047c2645..7f2ef55e9 100644
--- a/packages/opencode/src/cli/cmd/tui/feature-plugins/home/footer.tsx
+++ b/packages/opencode/src/cli/cmd/tui/feature-plugins/home/footer.tsx
@@ -1,6 +1,6 @@
import type { TuiPlugin, TuiPluginApi, TuiPluginModule } from "@opencode-ai/plugin/tui"
import { createMemo, Match, Show, Switch } from "solid-js"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
const id = "internal:home-footer"
diff --git a/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx b/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx
index b468d851b..bb51d4f42 100644
--- a/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx
+++ b/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx
@@ -1,6 +1,6 @@
import type { TuiPlugin, TuiPluginApi, TuiPluginModule } from "@opencode-ai/plugin/tui"
import { createMemo, Show } from "solid-js"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
const id = "internal:sidebar-footer"
diff --git a/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts b/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts
index 95d050d7f..556e97684 100644
--- a/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts
+++ b/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts
@@ -29,7 +29,7 @@ import { PluginLoader } from "@/plugin/loader"
import { PluginMeta } from "@/plugin/meta"
import { installPlugin as installModulePlugin, patchPluginConfig, readPluginManifest } from "@/plugin/install"
import { hasTheme, upsertTheme } from "../context/theme"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util"
import { Process } from "@/util"
import { Flock } from "@opencode-ai/core/util/flock"
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
index 6ba43deb9..516f406ae 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
@@ -76,7 +76,7 @@ import stripAnsi from "strip-ansi"
import { usePromptRef } from "../../context/prompt"
import { useExit } from "../../context/exit"
import { Filesystem } from "@/util"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { PermissionPrompt } from "./permission"
import { QuestionPrompt } from "./question"
import { DialogExportOptions } from "../../ui/dialog-export-options"
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx
index e48f348b9..d124734a3 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx
@@ -14,7 +14,7 @@ import path from "path"
import { LANGUAGE_EXTENSIONS } from "@/lsp/language"
import { Keybind } from "@/util"
import { Locale } from "@/util"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { useDialog } from "../../ui/dialog"
import { getScrollAcceleration } from "../../util/scroll"
import { useTuiConfig } from "../../context/tui-config"
diff --git a/packages/opencode/src/cli/cmd/uninstall.ts b/packages/opencode/src/cli/cmd/uninstall.ts
index c0517d491..dc076913b 100644
--- a/packages/opencode/src/cli/cmd/uninstall.ts
+++ b/packages/opencode/src/cli/cmd/uninstall.ts
@@ -3,7 +3,7 @@ import { UI } from "../ui"
import * as prompts from "@clack/prompts"
import { AppRuntime } from "@/effect/app-runtime"
import { Installation } from "../../installation"
-import { Global } from "../../global"
+import { Global } from "@opencode-ai/core/global"
import fs from "fs/promises"
import path from "path"
import os from "os"
diff --git a/packages/opencode/src/cli/heap.ts b/packages/opencode/src/cli/heap.ts
index 0cb4299c5..45557391a 100644
--- a/packages/opencode/src/cli/heap.ts
+++ b/packages/opencode/src/cli/heap.ts
@@ -1,7 +1,7 @@
import path from "path"
import { writeHeapSnapshot } from "node:v8"
import { Flag } from "@opencode-ai/core/flag/flag"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { Log } from "@/util"
const log = Log.create({ service: "heap" })
diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts
index 3958e1436..ddd31a3fc 100644
--- a/packages/opencode/src/config/config.ts
+++ b/packages/opencode/src/config/config.ts
@@ -4,7 +4,7 @@ import { pathToFileURL } from "url"
import os from "os"
import z from "zod"
import { mergeDeep, pipe } from "remeda"
-import { Global } from "../global"
+import { Global } from "@opencode-ai/core/global"
import fsNode from "fs/promises"
import { NamedError } from "@opencode-ai/core/util/error"
import { Flag } from "@opencode-ai/core/flag/flag"
diff --git a/packages/opencode/src/config/paths.ts b/packages/opencode/src/config/paths.ts
index df98bebb2..92c1f45e1 100644
--- a/packages/opencode/src/config/paths.ts
+++ b/packages/opencode/src/config/paths.ts
@@ -3,7 +3,7 @@ export * as ConfigPaths from "./paths"
import path from "path"
import { Filesystem } from "@/util"
import { Flag } from "@opencode-ai/core/flag/flag"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { unique } from "remeda"
import { JsonError } from "./error"
import * as Effect from "effect/Effect"
diff --git a/packages/opencode/src/file/index.ts b/packages/opencode/src/file/index.ts
index 4710fd76d..1308d3f69 100644
--- a/packages/opencode/src/file/index.ts
+++ b/packages/opencode/src/file/index.ts
@@ -9,7 +9,7 @@ import { formatPatch, structuredPatch } from "diff"
import fuzzysort from "fuzzysort"
import ignore from "ignore"
import path from "path"
-import { Global } from "../global"
+import { Global } from "@opencode-ai/core/global"
import { Instance } from "../project/instance"
import { Log } from "../util"
import { Protected } from "./protected"
diff --git a/packages/opencode/src/file/ripgrep.ts b/packages/opencode/src/file/ripgrep.ts
index 5602a4c41..ab725b731 100644
--- a/packages/opencode/src/file/ripgrep.ts
+++ b/packages/opencode/src/file/ripgrep.ts
@@ -7,7 +7,7 @@ import { ChildProcess } from "effect/unstable/process"
import { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner"
import * as CrossSpawnSpawner from "@/effect/cross-spawn-spawner"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { Log } from "@/util"
import { sanitizedProcessEnv } from "@opencode-ai/core/util/opencode-process"
import { which } from "@/util/which"
diff --git a/packages/opencode/src/global/index.ts b/packages/opencode/src/global/index.ts
deleted file mode 100644
index 7f48a0f88..000000000
--- a/packages/opencode/src/global/index.ts
+++ /dev/null
@@ -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 "."
diff --git a/packages/opencode/src/index.ts b/packages/opencode/src/index.ts
index 3764e1b1c..3c475f133 100644
--- a/packages/opencode/src/index.ts
+++ b/packages/opencode/src/index.ts
@@ -31,7 +31,7 @@ import { PrCommand } from "./cli/cmd/pr"
import { SessionCommand } from "./cli/cmd/session"
import { DbCommand } from "./cli/cmd/db"
import path from "path"
-import { Global } from "./global"
+import { Global } from "@opencode-ai/core/global"
import { JsonMigration } from "./storage"
import { Database } from "./storage"
import { errorMessage } from "./util/error"
diff --git a/packages/opencode/src/lsp/server.ts b/packages/opencode/src/lsp/server.ts
index 9b585c9fb..14b674a98 100644
--- a/packages/opencode/src/lsp/server.ts
+++ b/packages/opencode/src/lsp/server.ts
@@ -1,7 +1,7 @@
import type { ChildProcessWithoutNullStreams } from "child_process"
import path from "path"
import os from "os"
-import { Global } from "../global"
+import { Global } from "@opencode-ai/core/global"
import { Log } from "../util"
import { text } from "node:stream/consumers"
import fs from "fs/promises"
diff --git a/packages/opencode/src/mcp/auth.ts b/packages/opencode/src/mcp/auth.ts
index 0a57fa141..b07d59870 100644
--- a/packages/opencode/src/mcp/auth.ts
+++ b/packages/opencode/src/mcp/auth.ts
@@ -1,6 +1,6 @@
import path from "path"
import z from "zod"
-import { Global } from "../global"
+import { Global } from "@opencode-ai/core/global"
import { Effect, Layer, Context } from "effect"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
diff --git a/packages/opencode/src/plugin/install.ts b/packages/opencode/src/plugin/install.ts
index 87798f56d..a76048312 100644
--- a/packages/opencode/src/plugin/install.ts
+++ b/packages/opencode/src/plugin/install.ts
@@ -8,7 +8,7 @@ import {
} from "jsonc-parser"
import * as ConfigPaths from "@/config/paths"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util"
import { Flock } from "@opencode-ai/core/util/flock"
import { isRecord } from "@/util/record"
diff --git a/packages/opencode/src/plugin/meta.ts b/packages/opencode/src/plugin/meta.ts
index ab067c592..4bc8f5772 100644
--- a/packages/opencode/src/plugin/meta.ts
+++ b/packages/opencode/src/plugin/meta.ts
@@ -2,7 +2,7 @@ import path from "path"
import { fileURLToPath } from "url"
import { Flag } from "@opencode-ai/core/flag/flag"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "@/util"
import { Flock } from "@opencode-ai/core/util/flock"
diff --git a/packages/opencode/src/provider/models.ts b/packages/opencode/src/provider/models.ts
index c3df06abc..8d7d7b03b 100644
--- a/packages/opencode/src/provider/models.ts
+++ b/packages/opencode/src/provider/models.ts
@@ -1,4 +1,4 @@
-import { Global } from "../global"
+import { Global } from "@opencode-ai/core/global"
import { Log } from "../util"
import path from "path"
import { Schema } from "effect"
diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts
index 96039af9b..c2439d04f 100644
--- a/packages/opencode/src/provider/provider.ts
+++ b/packages/opencode/src/provider/provider.ts
@@ -16,7 +16,7 @@ import { Flag } from "@opencode-ai/core/flag/flag"
import { zod } from "@/util/effect-zod"
import { namedSchemaError } from "@/util/named-schema-error"
import { iife } from "@/util/iife"
-import { Global } from "../global"
+import { Global } from "@opencode-ai/core/global"
import path from "path"
import { pathToFileURL } from "url"
import { Effect, Layer, Context, Schema, Types } from "effect"
diff --git a/packages/opencode/src/server/routes/instance/httpapi/instance.ts b/packages/opencode/src/server/routes/instance/httpapi/instance.ts
index 97b53c1e9..d349ae9cd 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/instance.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/instance.ts
@@ -1,4 +1,4 @@
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { Vcs } from "@/project"
import * as InstanceState from "@/effect/instance-state"
import { Effect, Layer, Schema } from "effect"
diff --git a/packages/opencode/src/server/routes/instance/index.ts b/packages/opencode/src/server/routes/instance/index.ts
index df50be406..d36964ad1 100644
--- a/packages/opencode/src/server/routes/instance/index.ts
+++ b/packages/opencode/src/server/routes/instance/index.ts
@@ -9,7 +9,7 @@ import { Instance } from "@/project/instance"
import { Vcs } from "@/project"
import { Agent } from "@/agent/agent"
import { Skill } from "@/skill"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { LSP } from "@/lsp"
import { Command } from "@/command"
import { QuestionRoutes } from "./question"
diff --git a/packages/opencode/src/session/instruction.ts b/packages/opencode/src/session/instruction.ts
index 56fca5359..35de71819 100644
--- a/packages/opencode/src/session/instruction.ts
+++ b/packages/opencode/src/session/instruction.ts
@@ -7,7 +7,7 @@ import { InstanceState } from "@/effect"
import { Flag } from "@opencode-ai/core/flag/flag"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { withTransientReadRetry } from "@/util/effect-http-client"
-import { Global } from "../global"
+import { Global } from "@opencode-ai/core/global"
import { Log } from "../util"
import type { MessageV2 } from "./message-v2"
import type { MessageID } from "./schema"
diff --git a/packages/opencode/src/session/session.ts b/packages/opencode/src/session/session.ts
index db77c0e21..6c67b8517 100644
--- a/packages/opencode/src/session/session.ts
+++ b/packages/opencode/src/session/session.ts
@@ -25,7 +25,7 @@ import { SessionID, MessageID, PartID } from "./schema"
import type { Provider } from "@/provider"
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 { zod } from "@/util/effect-zod"
import { withStatics } from "@/util/schema"
diff --git a/packages/opencode/src/skill/discovery.ts b/packages/opencode/src/skill/discovery.ts
index e620de983..9ce56d4ce 100644
--- a/packages/opencode/src/skill/discovery.ts
+++ b/packages/opencode/src/skill/discovery.ts
@@ -3,7 +3,7 @@ import { Effect, Layer, Path, Schema, Context } from "effect"
import { FetchHttpClient, HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http"
import { withTransientReadRetry } from "@/util/effect-http-client"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
-import { Global } from "../global"
+import { Global } from "@opencode-ai/core/global"
import { Log } from "../util"
const skillConcurrency = 4
diff --git a/packages/opencode/src/skill/index.ts b/packages/opencode/src/skill/index.ts
index a425e13d5..60527cd0b 100644
--- a/packages/opencode/src/skill/index.ts
+++ b/packages/opencode/src/skill/index.ts
@@ -8,7 +8,7 @@ import type { Agent } from "@/agent/agent"
import { Bus } from "@/bus"
import { InstanceState } from "@/effect"
import { Flag } from "@opencode-ai/core/flag/flag"
-import { Global } from "@/global"
+import { Global } from "@opencode-ai/core/global"
import { Permission } from "@/permission"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Config } from "../config"
diff --git a/packages/opencode/src/snapshot/index.ts b/packages/opencode/src/snapshot/index.ts
index 50804ca2b..3701b8210 100644
--- a/packages/opencode/src/snapshot/index.ts
+++ b/packages/opencode/src/snapshot/index.ts
@@ -8,7 +8,7 @@ import { InstanceState } from "@/effect"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Hash } from "@opencode-ai/core/util/hash"
import { Config } from "../config"
-import { Global } from "../global"
+import { Global } from "@opencode-ai/core/global"
import { Log } from "../util"
import { withStatics } from "@/util/schema"
import { zod } from "@/util/effect-zod"
diff --git a/packages/opencode/src/storage/db.ts b/packages/opencode/src/storage/db.ts
index 898810581..e442b2a76 100644
--- a/packages/opencode/src/storage/db.ts
+++ b/packages/opencode/src/storage/db.ts
@@ -4,7 +4,7 @@ import { type SQLiteTransaction } from "drizzle-orm/sqlite-core"
export * from "drizzle-orm"
import { LocalContext } from "../util"
import { lazy } from "../util/lazy"
-import { Global } from "../global"
+import { Global } from "@opencode-ai/core/global"
import { Log } from "../util"
import { NamedError } from "@opencode-ai/core/util/error"
import z from "zod"
diff --git a/packages/opencode/src/storage/json-migration.ts b/packages/opencode/src/storage/json-migration.ts
index 20ca3ff53..787b50117 100644
--- a/packages/opencode/src/storage/json-migration.ts
+++ b/packages/opencode/src/storage/json-migration.ts
@@ -1,6 +1,6 @@
import type { SQLiteBunDatabase } from "drizzle-orm/bun-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 { ProjectTable } from "../project/project.sql"
import { SessionTable, MessageTable, PartTable, TodoTable, PermissionTable } from "../session/session.sql"
diff --git a/packages/opencode/src/storage/storage.ts b/packages/opencode/src/storage/storage.ts
index 8f6332677..71cc37e01 100644
--- a/packages/opencode/src/storage/storage.ts
+++ b/packages/opencode/src/storage/storage.ts
@@ -1,6 +1,6 @@
import { Log } from "../util"
import path from "path"
-import { Global } from "../global"
+import { Global } from "@opencode-ai/core/global"
import { NamedError } from "@opencode-ai/core/util/error"
import z from "zod"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
diff --git a/packages/opencode/src/tool/truncation-dir.ts b/packages/opencode/src/tool/truncation-dir.ts
index d6d5d013d..9ed82e1f3 100644
--- a/packages/opencode/src/tool/truncation-dir.ts
+++ b/packages/opencode/src/tool/truncation-dir.ts
@@ -1,4 +1,4 @@
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")
diff --git a/packages/opencode/src/util/which.ts b/packages/opencode/src/util/which.ts
index 2e4073914..b9bea421c 100644
--- a/packages/opencode/src/util/which.ts
+++ b/packages/opencode/src/util/which.ts
@@ -1,6 +1,6 @@
import whichPkg from "which"
import path from "path"
-import { Global } from "../global"
+import { Global } from "@opencode-ai/core/global"
export function which(cmd: string, env?: NodeJS.ProcessEnv) {
const base = env?.PATH ?? env?.Path ?? process.env.PATH ?? process.env.Path ?? ""
diff --git a/packages/opencode/src/worktree/index.ts b/packages/opencode/src/worktree/index.ts
index 7539e8d58..b89ac32a9 100644
--- a/packages/opencode/src/worktree/index.ts
+++ b/packages/opencode/src/worktree/index.ts
@@ -1,6 +1,6 @@
import z from "zod"
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 { InstanceBootstrap } from "../project/bootstrap"
import { Project } from "../project"
diff --git a/packages/opencode/test/cli/tui/plugin-loader.test.ts b/packages/opencode/test/cli/tui/plugin-loader.test.ts
index f5b04ff43..3dd8b6015 100644
--- a/packages/opencode/test/cli/tui/plugin-loader.test.ts
+++ b/packages/opencode/test/cli/tui/plugin-loader.test.ts
@@ -4,7 +4,7 @@ import path from "path"
import { pathToFileURL } from "url"
import { tmpdir } from "../../fixture/fixture"
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 { Filesystem } from "../../../src/util/"
diff --git a/packages/opencode/test/config/config.test.ts b/packages/opencode/test/config/config.test.ts
index 3b75e1501..8512236a3 100644
--- a/packages/opencode/test/config/config.test.ts
+++ b/packages/opencode/test/config/config.test.ts
@@ -23,7 +23,7 @@ const infra = CrossSpawnSpawner.defaultLayer.pipe(
import path from "path"
import fs from "fs/promises"
import { pathToFileURL } from "url"
-import { Global } from "../../src/global"
+import { Global } from "@opencode-ai/core/global"
import { ProjectID } from "../../src/project/schema"
import { Filesystem } from "../../src/util"
import { ConfigPlugin } from "@/config/plugin"
diff --git a/packages/opencode/test/config/tui.test.ts b/packages/opencode/test/config/tui.test.ts
index c7b6d4a50..0dbe49cef 100644
--- a/packages/opencode/test/config/tui.test.ts
+++ b/packages/opencode/test/config/tui.test.ts
@@ -5,7 +5,7 @@ import { tmpdir } from "../fixture/fixture"
import { Instance } from "../../src/project/instance"
import { TuiConfig } from "../../src/cli/cmd/tui/config/tui"
import { Config } from "../../src/config"
-import { Global } from "../../src/global"
+import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "../../src/util"
import { AppRuntime } from "../../src/effect/app-runtime"
import { Effect, Layer } from "effect"
diff --git a/packages/opencode/test/provider/amazon-bedrock.test.ts b/packages/opencode/test/provider/amazon-bedrock.test.ts
index 03f83601d..aff67494b 100644
--- a/packages/opencode/test/provider/amazon-bedrock.test.ts
+++ b/packages/opencode/test/provider/amazon-bedrock.test.ts
@@ -7,7 +7,7 @@ import { tmpdir } from "../fixture/fixture"
import { Instance } from "../../src/project/instance"
import { Provider } from "../../src/provider"
import { Env } from "../../src/env"
-import { Global } from "../../src/global"
+import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "../../src/util"
import { Effect } from "effect"
import { AppRuntime } from "../../src/effect/app-runtime"
diff --git a/packages/opencode/test/provider/gitlab-duo.test.ts b/packages/opencode/test/provider/gitlab-duo.test.ts
index 907a32d61..a74ef360b 100644
--- a/packages/opencode/test/provider/gitlab-duo.test.ts
+++ b/packages/opencode/test/provider/gitlab-duo.test.ts
@@ -11,7 +11,7 @@ export {}
// import { Instance } from "../../src/project/instance"
// import { Provider } from "../../src/provider"
// import { Env } from "../../src/env"
-// import { Global } from "../../src/global"
+// import { Global } from "@opencode-ai/core/global"
// import { GitLabWorkflowLanguageModel } from "gitlab-ai-provider"
// test("GitLab Duo: loads provider with API key from environment", async () => {
diff --git a/packages/opencode/test/provider/provider.test.ts b/packages/opencode/test/provider/provider.test.ts
index 899302082..612fe3e97 100644
--- a/packages/opencode/test/provider/provider.test.ts
+++ b/packages/opencode/test/provider/provider.test.ts
@@ -3,7 +3,7 @@ import { mkdir, unlink } from "fs/promises"
import path from "path"
import { tmpdir } from "../fixture/fixture"
-import { Global } from "../../src/global"
+import { Global } from "@opencode-ai/core/global"
import { Instance } from "../../src/project/instance"
import { Plugin } from "../../src/plugin/index"
import { ModelsDev } from "../../src/provider"
diff --git a/packages/opencode/test/session/instruction.test.ts b/packages/opencode/test/session/instruction.test.ts
index c46bbd20b..60882d2b3 100644
--- a/packages/opencode/test/session/instruction.test.ts
+++ b/packages/opencode/test/session/instruction.test.ts
@@ -6,7 +6,7 @@ import { Instruction } from "../../src/session/instruction"
import type { MessageV2 } from "../../src/session/message-v2"
import { Instance } from "../../src/project/instance"
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"
const run = <A>(effect: Effect.Effect<A, any, Instruction.Service>) =>
diff --git a/packages/opencode/test/skill/discovery.test.ts b/packages/opencode/test/skill/discovery.test.ts
index 3f8210329..230a9e03e 100644
--- a/packages/opencode/test/skill/discovery.test.ts
+++ b/packages/opencode/test/skill/discovery.test.ts
@@ -1,7 +1,7 @@
import { describe, test, expect, beforeAll, afterAll } from "bun:test"
import { Effect } from "effect"
import { Discovery } from "../../src/skill/discovery"
-import { Global } from "../../src/global"
+import { Global } from "@opencode-ai/core/global"
import { Filesystem } from "../../src/util"
import { rm } from "fs/promises"
import path from "path"
diff --git a/packages/opencode/test/storage/db.test.ts b/packages/opencode/test/storage/db.test.ts
index 2bfaae1da..2cd9f817c 100644
--- a/packages/opencode/test/storage/db.test.ts
+++ b/packages/opencode/test/storage/db.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, test } from "bun:test"
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 { Database } from "../../src/storage"
diff --git a/packages/opencode/test/storage/json-migration.test.ts b/packages/opencode/test/storage/json-migration.test.ts
index 019faf061..263573794 100644
--- a/packages/opencode/test/storage/json-migration.test.ts
+++ b/packages/opencode/test/storage/json-migration.test.ts
@@ -6,7 +6,7 @@ import path from "path"
import fs from "fs/promises"
import { readFileSync, readdirSync } from "fs"
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 { ProjectID } from "../../src/project/schema"
import { SessionTable, MessageTable, PartTable, TodoTable, PermissionTable } from "../../src/session/session.sql"
diff --git a/packages/opencode/test/storage/storage.test.ts b/packages/opencode/test/storage/storage.test.ts
index 0587b9dd6..6be653ecb 100644
--- a/packages/opencode/test/storage/storage.test.ts
+++ b/packages/opencode/test/storage/storage.test.ts
@@ -4,7 +4,7 @@ import { Effect, Exit, Layer } from "effect"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner"
import { Git } from "../../src/git"
-import { Global } from "../../src/global"
+import { Global } from "@opencode-ai/core/global"
import { Storage } from "../../src/storage"
import { tmpdirScoped } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
diff --git a/packages/opencode/test/util/log.test.ts b/packages/opencode/test/util/log.test.ts
index 336b16a17..9a3b61732 100644
--- a/packages/opencode/test/util/log.test.ts
+++ b/packages/opencode/test/util/log.test.ts
@@ -1,7 +1,7 @@
import { afterEach, expect, test } from "bun:test"
import fs from "fs/promises"
import path from "path"
-import { Global } from "../../src/global"
+import { Global } from "@opencode-ai/core/global"
import { Log } from "../../src/util"
import { tmpdir } from "../fixture/fixture"