summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xpackages/opencode/script/schema.ts2
-rw-r--r--packages/opencode/src/account/repo.ts2
-rw-r--r--packages/opencode/src/acp/agent.ts8
-rw-r--r--packages/opencode/src/acp/session.ts2
-rw-r--r--packages/opencode/src/agent/agent.ts10
-rw-r--r--packages/opencode/src/bus/index.ts6
-rw-r--r--packages/opencode/src/cli/cmd/acp.ts2
-rw-r--r--packages/opencode/src/cli/cmd/agent.ts4
-rw-r--r--packages/opencode/src/cli/cmd/db.ts4
-rw-r--r--packages/opencode/src/cli/cmd/debug/agent.ts6
-rw-r--r--packages/opencode/src/cli/cmd/debug/config.ts2
-rw-r--r--packages/opencode/src/cli/cmd/debug/lsp.ts4
-rw-r--r--packages/opencode/src/cli/cmd/debug/scrap.ts4
-rw-r--r--packages/opencode/src/cli/cmd/export.ts2
-rw-r--r--packages/opencode/src/cli/cmd/github.ts12
-rw-r--r--packages/opencode/src/cli/cmd/import.ts8
-rw-r--r--packages/opencode/src/cli/cmd/mcp.ts4
-rw-r--r--packages/opencode/src/cli/cmd/models.ts4
-rw-r--r--packages/opencode/src/cli/cmd/plug.ts6
-rw-r--r--packages/opencode/src/cli/cmd/pr.ts2
-rw-r--r--packages/opencode/src/cli/cmd/providers.ts6
-rw-r--r--packages/opencode/src/cli/cmd/run.ts8
-rw-r--r--packages/opencode/src/cli/cmd/session.ts8
-rw-r--r--packages/opencode/src/cli/cmd/stats.ts6
-rw-r--r--packages/opencode/src/cli/cmd/tui/app.tsx8
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/dialog-mcp.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx4
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/dialog-stash.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx2
-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/index.tsx4
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/prompt/stash.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/textarea-keybindings.ts2
-rw-r--r--packages/opencode/src/cli/cmd/tui/config/tui-migrate.ts3
-rw-r--r--packages/opencode/src/cli/cmd/tui/config/tui.ts3
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/editor-zed.ts2
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/keybind.tsx2
-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/sync.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/theme.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/feature-plugins/system/plugins.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/plugin/index.ts3
-rw-r--r--packages/opencode/src/cli/cmd/tui/plugin/runtime.ts6
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/home.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/index.tsx8
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx4
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/subagent-footer.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/thread.ts6
-rw-r--r--packages/opencode/src/cli/cmd/tui/ui/dialog-confirm.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx4
-rw-r--r--packages/opencode/src/cli/cmd/tui/util/clipboard.ts2
-rw-r--r--packages/opencode/src/cli/cmd/tui/util/editor.ts6
-rw-r--r--packages/opencode/src/cli/cmd/tui/util/index.ts4
-rw-r--r--packages/opencode/src/cli/cmd/tui/util/selection.ts2
-rw-r--r--packages/opencode/src/cli/cmd/tui/util/sound.ts4
-rw-r--r--packages/opencode/src/cli/cmd/tui/util/transcript.ts2
-rw-r--r--packages/opencode/src/cli/cmd/tui/worker.ts6
-rw-r--r--packages/opencode/src/cli/cmd/uninstall.ts4
-rw-r--r--packages/opencode/src/cli/heap.ts2
-rw-r--r--packages/opencode/src/cli/network.ts2
-rw-r--r--packages/opencode/src/cli/upgrade.ts2
-rw-r--r--packages/opencode/src/command/index.ts6
-rw-r--r--packages/opencode/src/config/agent.ts6
-rw-r--r--packages/opencode/src/config/command.ts4
-rw-r--r--packages/opencode/src/config/config.ts6
-rw-r--r--packages/opencode/src/config/index.ts16
-rw-r--r--packages/opencode/src/config/managed.ts3
-rw-r--r--packages/opencode/src/config/markdown.ts4
-rw-r--r--packages/opencode/src/config/paths.ts2
-rw-r--r--packages/opencode/src/config/variable.ts2
-rw-r--r--packages/opencode/src/control-plane/workspace-context.ts2
-rw-r--r--packages/opencode/src/control-plane/workspace.ts13
-rw-r--r--packages/opencode/src/effect/app-runtime.ts24
-rw-r--r--packages/opencode/src/effect/bootstrap-runtime.ts8
-rw-r--r--packages/opencode/src/effect/bridge.ts4
-rw-r--r--packages/opencode/src/effect/index.ts5
-rw-r--r--packages/opencode/src/effect/instance-state.ts4
-rw-r--r--packages/opencode/src/effect/run-service.ts2
-rw-r--r--packages/opencode/src/effect/runner.ts2
-rw-r--r--packages/opencode/src/env/index.ts2
-rw-r--r--packages/opencode/src/file/index.ts4
-rw-r--r--packages/opencode/src/file/ripgrep.ts2
-rw-r--r--packages/opencode/src/file/watcher.ts6
-rw-r--r--packages/opencode/src/format/formatter.ts4
-rw-r--r--packages/opencode/src/format/index.ts6
-rw-r--r--packages/opencode/src/ide/index.ts4
-rw-r--r--packages/opencode/src/index.ts8
-rw-r--r--packages/opencode/src/installation/index.ts2
-rw-r--r--packages/opencode/src/lsp/client.ts8
-rw-r--r--packages/opencode/src/lsp/index.ts3
-rw-r--r--packages/opencode/src/lsp/launch.ts2
-rw-r--r--packages/opencode/src/lsp/lsp.ts10
-rw-r--r--packages/opencode/src/lsp/server.ts8
-rw-r--r--packages/opencode/src/mcp/index.ts8
-rw-r--r--packages/opencode/src/mcp/oauth-callback.ts2
-rw-r--r--packages/opencode/src/mcp/oauth-provider.ts2
-rw-r--r--packages/opencode/src/node.ts8
-rw-r--r--packages/opencode/src/patch/index.ts2
-rw-r--r--packages/opencode/src/permission/evaluate.ts2
-rw-r--r--packages/opencode/src/permission/index.ts9
-rw-r--r--packages/opencode/src/plugin/codex.ts2
-rw-r--r--packages/opencode/src/plugin/github-copilot/copilot.ts2
-rw-r--r--packages/opencode/src/plugin/index.ts10
-rw-r--r--packages/opencode/src/plugin/install.ts2
-rw-r--r--packages/opencode/src/plugin/meta.ts2
-rw-r--r--packages/opencode/src/plugin/shared.ts2
-rw-r--r--packages/opencode/src/project/bootstrap.ts8
-rw-r--r--packages/opencode/src/project/index.ts2
-rw-r--r--packages/opencode/src/project/instance.ts4
-rw-r--r--packages/opencode/src/project/project.ts8
-rw-r--r--packages/opencode/src/project/vcs.ts6
-rw-r--r--packages/opencode/src/provider/auth.ts4
-rw-r--r--packages/opencode/src/provider/error.ts2
-rw-r--r--packages/opencode/src/provider/index.ts5
-rw-r--r--packages/opencode/src/provider/models.ts6
-rw-r--r--packages/opencode/src/provider/provider.ts12
-rw-r--r--packages/opencode/src/provider/sdk/copilot/index.ts2
-rw-r--r--packages/opencode/src/provider/transform.ts2
-rw-r--r--packages/opencode/src/pty/index.ts7
-rw-r--r--packages/opencode/src/question/index.ts4
-rw-r--r--packages/opencode/src/server/error.ts2
-rw-r--r--packages/opencode/src/server/fence.ts5
-rw-r--r--packages/opencode/src/server/mdns.ts2
-rw-r--r--packages/opencode/src/server/middleware.ts8
-rw-r--r--packages/opencode/src/server/projectors.ts5
-rw-r--r--packages/opencode/src/server/proxy.ts2
-rw-r--r--packages/opencode/src/server/routes/control/index.ts2
-rw-r--r--packages/opencode/src/server/routes/control/workspace.ts2
-rw-r--r--packages/opencode/src/server/routes/global.ts4
-rw-r--r--packages/opencode/src/server/routes/instance/config.ts4
-rw-r--r--packages/opencode/src/server/routes/instance/event.ts2
-rw-r--r--packages/opencode/src/server/routes/instance/experimental.ts8
-rw-r--r--packages/opencode/src/server/routes/instance/file.ts2
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/config.ts4
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/event.ts2
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/experimental.ts10
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/file.ts2
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/instance.ts4
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/project.ts2
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/provider.ts8
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/pty.ts2
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/server.ts6
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/session.ts6
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/sync.ts8
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/tui.ts12
-rw-r--r--packages/opencode/src/server/routes/instance/index.ts4
-rw-r--r--packages/opencode/src/server/routes/instance/project.ts2
-rw-r--r--packages/opencode/src/server/routes/instance/provider.ts8
-rw-r--r--packages/opencode/src/server/routes/instance/pty.ts2
-rw-r--r--packages/opencode/src/server/routes/instance/session.ts6
-rw-r--r--packages/opencode/src/server/routes/instance/sync.ts10
-rw-r--r--packages/opencode/src/server/routes/instance/tui.ts2
-rw-r--r--packages/opencode/src/server/server.ts2
-rw-r--r--packages/opencode/src/server/workspace.ts4
-rw-r--r--packages/opencode/src/session/compaction.ts12
-rw-r--r--packages/opencode/src/session/index.ts1
-rw-r--r--packages/opencode/src/session/instruction.ts6
-rw-r--r--packages/opencode/src/session/llm.ts12
-rw-r--r--packages/opencode/src/session/message-v2.ts17
-rw-r--r--packages/opencode/src/session/overflow.ts6
-rw-r--r--packages/opencode/src/session/processor.ts6
-rw-r--r--packages/opencode/src/session/projectors.ts6
-rw-r--r--packages/opencode/src/session/prompt.ts25
-rw-r--r--packages/opencode/src/session/revert.ts4
-rw-r--r--packages/opencode/src/session/run-state.ts4
-rw-r--r--packages/opencode/src/session/session.ts23
-rw-r--r--packages/opencode/src/session/status.ts2
-rw-r--r--packages/opencode/src/session/summary.ts2
-rw-r--r--packages/opencode/src/session/system.ts2
-rw-r--r--packages/opencode/src/session/todo.ts4
-rw-r--r--packages/opencode/src/share/index.ts2
-rw-r--r--packages/opencode/src/share/session.ts6
-rw-r--r--packages/opencode/src/share/share-next.ts15
-rw-r--r--packages/opencode/src/shell/shell.ts2
-rw-r--r--packages/opencode/src/skill/discovery.ts2
-rw-r--r--packages/opencode/src/skill/index.ts10
-rw-r--r--packages/opencode/src/snapshot/index.ts6
-rw-r--r--packages/opencode/src/storage/db.ts8
-rw-r--r--packages/opencode/src/storage/index.ts26
-rw-r--r--packages/opencode/src/storage/json-migration.ts6
-rw-r--r--packages/opencode/src/storage/storage.ts4
-rw-r--r--packages/opencode/src/sync/index.ts3
-rw-r--r--packages/opencode/src/tool/apply_patch.ts2
-rw-r--r--packages/opencode/src/tool/bash.ts6
-rw-r--r--packages/opencode/src/tool/edit.ts2
-rw-r--r--packages/opencode/src/tool/external-directory.ts4
-rw-r--r--packages/opencode/src/tool/glob.ts2
-rw-r--r--packages/opencode/src/tool/grep.ts2
-rw-r--r--packages/opencode/src/tool/index.ts3
-rw-r--r--packages/opencode/src/tool/lsp.ts2
-rw-r--r--packages/opencode/src/tool/plan.ts4
-rw-r--r--packages/opencode/src/tool/read.ts2
-rw-r--r--packages/opencode/src/tool/registry.ts14
-rw-r--r--packages/opencode/src/tool/task.ts4
-rw-r--r--packages/opencode/src/tool/tool.ts2
-rw-r--r--packages/opencode/src/tool/truncate.ts6
-rw-r--r--packages/opencode/src/tool/write.ts2
-rw-r--r--packages/opencode/src/util/archive.ts2
-rw-r--r--packages/opencode/src/util/color.ts2
-rw-r--r--packages/opencode/src/util/filesystem.ts2
-rw-r--r--packages/opencode/src/util/index.ts12
-rw-r--r--packages/opencode/src/util/keybind.ts2
-rw-r--r--packages/opencode/src/util/local-context.ts2
-rw-r--r--packages/opencode/src/util/locale.ts2
-rw-r--r--packages/opencode/src/util/lock.ts2
-rw-r--r--packages/opencode/src/util/process.ts2
-rw-r--r--packages/opencode/src/util/rpc.ts2
-rw-r--r--packages/opencode/src/util/token.ts2
-rw-r--r--packages/opencode/src/util/wildcard.ts2
-rw-r--r--packages/opencode/src/v2/session.ts2
-rw-r--r--packages/opencode/src/worktree/index.ts9
-rw-r--r--packages/opencode/test/account/repo.test.ts2
-rw-r--r--packages/opencode/test/account/service.test.ts2
-rw-r--r--packages/opencode/test/agent/agent.test.ts8
-rw-r--r--packages/opencode/test/cli/tui/plugin-loader.test.ts2
-rw-r--r--packages/opencode/test/cli/tui/thread.test.ts2
-rw-r--r--packages/opencode/test/config/agent-color.test.ts4
-rw-r--r--packages/opencode/test/config/config.test.ts5
-rw-r--r--packages/opencode/test/config/markdown.test.ts2
-rw-r--r--packages/opencode/test/config/tui.test.ts4
-rw-r--r--packages/opencode/test/effect/app-runtime-logger.test.ts4
-rw-r--r--packages/opencode/test/effect/instance-state.test.ts2
-rw-r--r--packages/opencode/test/effect/runner.test.ts2
-rw-r--r--packages/opencode/test/fake/provider.ts2
-rw-r--r--packages/opencode/test/file/index.test.ts2
-rw-r--r--packages/opencode/test/file/path-traversal.test.ts2
-rw-r--r--packages/opencode/test/file/watcher.test.ts2
-rw-r--r--packages/opencode/test/fixture/db.ts2
-rw-r--r--packages/opencode/test/fixture/fixture.ts2
-rw-r--r--packages/opencode/test/fixture/plug-worker.ts2
-rw-r--r--packages/opencode/test/keybind.test.ts2
-rw-r--r--packages/opencode/test/lsp/client.test.ts6
-rw-r--r--packages/opencode/test/lsp/index.test.ts4
-rw-r--r--packages/opencode/test/lsp/lifecycle.test.ts4
-rw-r--r--packages/opencode/test/permission-task.test.ts2
-rw-r--r--packages/opencode/test/plugin/auth-override.test.ts2
-rw-r--r--packages/opencode/test/plugin/install-concurrency.test.ts4
-rw-r--r--packages/opencode/test/plugin/install.test.ts2
-rw-r--r--packages/opencode/test/plugin/loader-shared.test.ts2
-rw-r--r--packages/opencode/test/plugin/meta.test.ts4
-rw-r--r--packages/opencode/test/preload.ts4
-rw-r--r--packages/opencode/test/project/migrate-global.test.ts7
-rw-r--r--packages/opencode/test/project/project.test.ts4
-rw-r--r--packages/opencode/test/project/vcs.test.ts2
-rw-r--r--packages/opencode/test/provider/amazon-bedrock.test.ts4
-rw-r--r--packages/opencode/test/provider/gitlab-duo.test.ts2
-rw-r--r--packages/opencode/test/provider/provider.test.ts6
-rw-r--r--packages/opencode/test/provider/transform.test.ts2
-rw-r--r--packages/opencode/test/server/global-session-list.test.ts6
-rw-r--r--packages/opencode/test/server/httpapi-bridge.test.ts2
-rw-r--r--packages/opencode/test/server/httpapi-config.test.ts2
-rw-r--r--packages/opencode/test/server/httpapi-event.test.ts2
-rw-r--r--packages/opencode/test/server/httpapi-experimental.test.ts6
-rw-r--r--packages/opencode/test/server/httpapi-file.test.ts2
-rw-r--r--packages/opencode/test/server/httpapi-instance.test.ts2
-rw-r--r--packages/opencode/test/server/httpapi-mcp.test.ts2
-rw-r--r--packages/opencode/test/server/httpapi-pty.test.ts2
-rw-r--r--packages/opencode/test/server/httpapi-session.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-sync.test.ts4
-rw-r--r--packages/opencode/test/server/httpapi-tui.test.ts2
-rw-r--r--packages/opencode/test/server/httpapi-workspace.test.ts4
-rw-r--r--packages/opencode/test/server/project-init-git.test.ts4
-rw-r--r--packages/opencode/test/server/session-actions.test.ts4
-rw-r--r--packages/opencode/test/server/session-list.test.ts4
-rw-r--r--packages/opencode/test/server/session-messages.test.ts4
-rw-r--r--packages/opencode/test/server/session-select.test.ts4
-rw-r--r--packages/opencode/test/session/compaction.test.ts10
-rw-r--r--packages/opencode/test/session/llm.test.ts8
-rw-r--r--packages/opencode/test/session/message-v2.test.ts4
-rw-r--r--packages/opencode/test/session/messages-pagination.test.ts4
-rw-r--r--packages/opencode/test/session/processor-effect.test.ts8
-rw-r--r--packages/opencode/test/session/prompt.test.ts14
-rw-r--r--packages/opencode/test/session/revert-compact.test.ts4
-rw-r--r--packages/opencode/test/session/schema-decoding.test.ts2
-rw-r--r--packages/opencode/test/session/session.test.ts4
-rw-r--r--packages/opencode/test/session/snapshot-tool-race.test.ts14
-rw-r--r--packages/opencode/test/session/structured-output-integration.test.ts4
-rw-r--r--packages/opencode/test/share/share-next.test.ts11
-rw-r--r--packages/opencode/test/shell/shell.test.ts2
-rw-r--r--packages/opencode/test/skill/discovery.test.ts2
-rw-r--r--packages/opencode/test/snapshot/snapshot.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/sync/index.test.ts2
-rw-r--r--packages/opencode/test/tool/apply_patch.test.ts4
-rw-r--r--packages/opencode/test/tool/bash.test.ts6
-rw-r--r--packages/opencode/test/tool/edit.test.ts4
-rw-r--r--packages/opencode/test/tool/external-directory.test.ts4
-rw-r--r--packages/opencode/test/tool/glob.test.ts2
-rw-r--r--packages/opencode/test/tool/grep.test.ts2
-rw-r--r--packages/opencode/test/tool/lsp.test.ts5
-rw-r--r--packages/opencode/test/tool/question.test.ts2
-rw-r--r--packages/opencode/test/tool/read.test.ts8
-rw-r--r--packages/opencode/test/tool/registry.test.ts2
-rw-r--r--packages/opencode/test/tool/skill.test.ts4
-rw-r--r--packages/opencode/test/tool/task.test.ts8
-rw-r--r--packages/opencode/test/tool/tool-define.test.ts4
-rw-r--r--packages/opencode/test/tool/truncation.test.ts8
-rw-r--r--packages/opencode/test/tool/webfetch.test.ts2
-rw-r--r--packages/opencode/test/tool/write.test.ts6
-rw-r--r--packages/opencode/test/util/filesystem.test.ts2
-rw-r--r--packages/opencode/test/util/lock.test.ts2
-rw-r--r--packages/opencode/test/util/log.test.ts2
-rw-r--r--packages/opencode/test/util/module.test.ts2
-rw-r--r--packages/opencode/test/util/process.test.ts2
-rw-r--r--packages/opencode/test/util/wildcard.test.ts2
-rw-r--r--packages/opencode/test/workspace/workspace-restore.test.ts8
313 files changed, 727 insertions, 677 deletions
diff --git a/packages/opencode/script/schema.ts b/packages/opencode/script/schema.ts
index 448760ae1..7a7cc4a73 100755
--- a/packages/opencode/script/schema.ts
+++ b/packages/opencode/script/schema.ts
@@ -1,7 +1,7 @@
#!/usr/bin/env bun
import { z } from "zod"
-import { Config } from "../src/config"
+import { Config } from "@/config/config"
import { TuiConfig } from "../src/cli/cmd/tui/config/tui"
function generate(schema: z.ZodType) {
diff --git a/packages/opencode/src/account/repo.ts b/packages/opencode/src/account/repo.ts
index 450db1bd7..04380137c 100644
--- a/packages/opencode/src/account/repo.ts
+++ b/packages/opencode/src/account/repo.ts
@@ -1,7 +1,7 @@
import { eq } from "drizzle-orm"
import { Effect, Layer, Option, Schema, Context } from "effect"
-import { Database } from "@/storage"
+import { Database } from "@/storage/db"
import { AccountStateTable, AccountTable } from "./account.sql"
import { AccessToken, AccountID, AccountRepoError, Info, OrgID, RefreshToken } from "./schema"
import { normalizeServerUrl } from "./url"
diff --git a/packages/opencode/src/acp/agent.ts b/packages/opencode/src/acp/agent.ts
index aff523a7e..af16cba11 100644
--- a/packages/opencode/src/acp/agent.ts
+++ b/packages/opencode/src/acp/agent.ts
@@ -31,19 +31,19 @@ import {
type Usage,
} from "@agentclientprotocol/sdk"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { pathToFileURL } from "url"
-import { Filesystem } from "../util"
+import { Filesystem } from "@/util/filesystem"
import { Hash } from "@opencode-ai/core/util/hash"
import { ACPSessionManager } from "./session"
import type { ACPConfig } from "./types"
-import { Provider } from "../provider"
+import { Provider } from "@/provider/provider"
import { ModelID, ProviderID } from "../provider/schema"
import { Agent as AgentModule } from "../agent/agent"
import { AppRuntime } from "@/effect/app-runtime"
import { Installation } from "@/installation"
import { MessageV2 } from "@/session/message-v2"
-import { Config } from "@/config"
+import { Config } from "@/config/config"
import { ConfigMCP } from "@/config/mcp"
import { Todo } from "@/session/todo"
import { Result, Schema } from "effect"
diff --git a/packages/opencode/src/acp/session.ts b/packages/opencode/src/acp/session.ts
index 523b03737..d932b6570 100644
--- a/packages/opencode/src/acp/session.ts
+++ b/packages/opencode/src/acp/session.ts
@@ -1,6 +1,6 @@
import { RequestError, type McpServer } from "@agentclientprotocol/sdk"
import type { ACPSessionState } from "./types"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import type { OpencodeClient } from "@opencode-ai/sdk/v2"
const log = Log.create({ service: "acp-session-manager" })
diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts
index 231e17467..5e839ead5 100644
--- a/packages/opencode/src/agent/agent.ts
+++ b/packages/opencode/src/agent/agent.ts
@@ -1,11 +1,11 @@
-import { Config } from "../config"
+import { Config } from "@/config/config"
import z from "zod"
-import { Provider } from "../provider"
+import { Provider } from "@/provider/provider"
import { ModelID, ProviderID } from "../provider/schema"
import { generateObject, streamObject, type ModelMessage } from "ai"
-import { Truncate } from "../tool"
+import { Truncate } from "@/tool/truncate"
import { Auth } from "../auth"
-import { ProviderTransform } from "../provider"
+import { ProviderTransform } from "@/provider/transform"
import PROMPT_GENERATE from "./generate.txt"
import PROMPT_COMPACTION from "./prompt/compaction.txt"
@@ -19,7 +19,7 @@ import path from "path"
import { Plugin } from "@/plugin"
import { Skill } from "../skill"
import { Effect, Context, Layer, Schema } from "effect"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import * as Option from "effect/Option"
import * as OtelTracer from "@effect/opentelemetry/Tracer"
import { zod } from "@/util/effect-zod"
diff --git a/packages/opencode/src/bus/index.ts b/packages/opencode/src/bus/index.ts
index 12251f26c..9ee8e6fb0 100644
--- a/packages/opencode/src/bus/index.ts
+++ b/packages/opencode/src/bus/index.ts
@@ -1,9 +1,9 @@
import { Effect, Exit, Layer, PubSub, Scope, Context, Stream, Schema } from "effect"
-import { EffectBridge } from "@/effect"
-import { Log } from "../util"
+import { EffectBridge } from "@/effect/bridge"
+import * as Log from "@opencode-ai/core/util/log"
import { BusEvent } from "./bus-event"
import { GlobalBus } from "./global"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { makeRuntime } from "@/effect/run-service"
const log = Log.create({ service: "bus" })
diff --git a/packages/opencode/src/cli/cmd/acp.ts b/packages/opencode/src/cli/cmd/acp.ts
index 8141adc4f..9095984fe 100644
--- a/packages/opencode/src/cli/cmd/acp.ts
+++ b/packages/opencode/src/cli/cmd/acp.ts
@@ -1,4 +1,4 @@
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { bootstrap } from "../bootstrap"
import { cmd } from "./cmd"
import { AgentSideConnection, ndJsonStream } from "@agentclientprotocol/sdk"
diff --git a/packages/opencode/src/cli/cmd/agent.ts b/packages/opencode/src/cli/cmd/agent.ts
index 1d804c00e..80f91e7af 100644
--- a/packages/opencode/src/cli/cmd/agent.ts
+++ b/packages/opencode/src/cli/cmd/agent.ts
@@ -4,10 +4,10 @@ import { AppRuntime } from "@/effect/app-runtime"
import { UI } from "../ui"
import { Global } from "@opencode-ai/core/global"
import { Agent } from "../../agent/agent"
-import { Provider } from "../../provider"
+import { Provider } from "@/provider/provider"
import path from "path"
import fs from "fs/promises"
-import { Filesystem } from "../../util"
+import { Filesystem } from "@/util/filesystem"
import matter from "gray-matter"
import { Instance } from "../../project/instance"
import { EOL } from "os"
diff --git a/packages/opencode/src/cli/cmd/db.ts b/packages/opencode/src/cli/cmd/db.ts
index 235b59793..2aa5caf10 100644
--- a/packages/opencode/src/cli/cmd/db.ts
+++ b/packages/opencode/src/cli/cmd/db.ts
@@ -1,11 +1,11 @@
import type { Argv } from "yargs"
import { spawn } from "child_process"
-import { Database } from "../../storage"
+import { Database } from "@/storage/db"
import { drizzle } from "drizzle-orm/bun-sqlite"
import { Database as BunDatabase } from "bun:sqlite"
import { UI } from "../ui"
import { cmd } from "./cmd"
-import { JsonMigration } from "../../storage"
+import { JsonMigration } from "@/storage/json-migration"
import { EOL } from "os"
import { errorMessage } from "../../util/error"
diff --git a/packages/opencode/src/cli/cmd/debug/agent.ts b/packages/opencode/src/cli/cmd/debug/agent.ts
index 10b6d5c9e..cff9a7f9c 100644
--- a/packages/opencode/src/cli/cmd/debug/agent.ts
+++ b/packages/opencode/src/cli/cmd/debug/agent.ts
@@ -2,11 +2,11 @@ import { EOL } from "os"
import { basename } from "path"
import { Effect } from "effect"
import { Agent } from "../../../agent/agent"
-import { Provider } from "../../../provider"
-import { Session } from "../../../session"
+import { Provider } from "@/provider/provider"
+import { Session } from "@/session/session"
import type { MessageV2 } from "../../../session/message-v2"
import { MessageID, PartID } from "../../../session/schema"
-import { ToolRegistry } from "../../../tool"
+import { ToolRegistry } from "@/tool/registry"
import { Instance } from "../../../project/instance"
import { Permission } from "../../../permission"
import { iife } from "../../../util/iife"
diff --git a/packages/opencode/src/cli/cmd/debug/config.ts b/packages/opencode/src/cli/cmd/debug/config.ts
index b1f1c25e9..a80b6a581 100644
--- a/packages/opencode/src/cli/cmd/debug/config.ts
+++ b/packages/opencode/src/cli/cmd/debug/config.ts
@@ -1,5 +1,5 @@
import { EOL } from "os"
-import { Config } from "../../../config"
+import { Config } from "@/config/config"
import { AppRuntime } from "@/effect/app-runtime"
import { bootstrap } from "../../bootstrap"
import { cmd } from "../cmd"
diff --git a/packages/opencode/src/cli/cmd/debug/lsp.ts b/packages/opencode/src/cli/cmd/debug/lsp.ts
index 47db6358b..6312afcf1 100644
--- a/packages/opencode/src/cli/cmd/debug/lsp.ts
+++ b/packages/opencode/src/cli/cmd/debug/lsp.ts
@@ -1,9 +1,9 @@
-import { LSP } from "../../../lsp"
+import { LSP } from "@/lsp/lsp"
import { AppRuntime } from "../../../effect/app-runtime"
import { Effect } from "effect"
import { bootstrap } from "../../bootstrap"
import { cmd } from "../cmd"
-import { Log } from "../../../util"
+import * as Log from "@opencode-ai/core/util/log"
import { EOL } from "os"
export const LSPCommand = cmd({
diff --git a/packages/opencode/src/cli/cmd/debug/scrap.ts b/packages/opencode/src/cli/cmd/debug/scrap.ts
index 300a7b965..2a127e5db 100644
--- a/packages/opencode/src/cli/cmd/debug/scrap.ts
+++ b/packages/opencode/src/cli/cmd/debug/scrap.ts
@@ -1,6 +1,6 @@
import { EOL } from "os"
-import { Project } from "../../../project"
-import { Log } from "../../../util"
+import { Project } from "@/project/project"
+import * as Log from "@opencode-ai/core/util/log"
import { cmd } from "../cmd"
export const ScrapCommand = cmd({
diff --git a/packages/opencode/src/cli/cmd/export.ts b/packages/opencode/src/cli/cmd/export.ts
index 06b361c6d..4f19c3c4d 100644
--- a/packages/opencode/src/cli/cmd/export.ts
+++ b/packages/opencode/src/cli/cmd/export.ts
@@ -1,5 +1,5 @@
import type { Argv } from "yargs"
-import { Session } from "../../session"
+import { Session } from "@/session/session"
import { MessageV2 } from "../../session/message-v2"
import { SessionID } from "../../session/schema"
import { cmd } from "./cmd"
diff --git a/packages/opencode/src/cli/cmd/github.ts b/packages/opencode/src/cli/cmd/github.ts
index fe8e233dd..b31825fd9 100644
--- a/packages/opencode/src/cli/cmd/github.ts
+++ b/packages/opencode/src/cli/cmd/github.ts
@@ -1,6 +1,6 @@
import path from "path"
import { exec } from "child_process"
-import { Filesystem } from "../../util"
+import { Filesystem } from "@/util/filesystem"
import * as prompts from "@clack/prompts"
import { map, pipe, sortBy, values } from "remeda"
import { Octokit } from "@octokit/rest"
@@ -18,21 +18,21 @@ import type {
} from "@octokit/webhooks-types"
import { UI } from "../ui"
import { cmd } from "./cmd"
-import { ModelsDev } from "../../provider"
+import { ModelsDev } from "@/provider/models"
import { Instance } from "@/project/instance"
import { bootstrap } from "../bootstrap"
-import { SessionShare } from "@/share"
-import { Session } from "../../session"
+import { SessionShare } from "@/share/session"
+import { Session } from "@/session/session"
import type { SessionID } from "../../session/schema"
import { MessageID, PartID } from "../../session/schema"
-import { Provider } from "../../provider"
+import { Provider } from "@/provider/provider"
import { Bus } from "../../bus"
import { MessageV2 } from "../../session/message-v2"
import { SessionPrompt } from "@/session/prompt"
import { AppRuntime } from "@/effect/app-runtime"
import { Git } from "@/git"
import { setTimeout as sleep } from "node:timers/promises"
-import { Process } from "@/util"
+import { Process } from "@/util/process"
import { Effect } from "effect"
type GitHubAuthor = {
diff --git a/packages/opencode/src/cli/cmd/import.ts b/packages/opencode/src/cli/cmd/import.ts
index 26256a770..d55aba091 100644
--- a/packages/opencode/src/cli/cmd/import.ts
+++ b/packages/opencode/src/cli/cmd/import.ts
@@ -1,15 +1,15 @@
import type { Argv } from "yargs"
import type { Session as SDKSession, Message, Part } from "@opencode-ai/sdk/v2"
-import { Session } from "../../session"
+import { Session } from "@/session/session"
import { MessageV2 } from "../../session/message-v2"
import { cmd } from "./cmd"
import { bootstrap } from "../bootstrap"
-import { Database } from "../../storage"
+import { Database } from "@/storage/db"
import { SessionTable, MessageTable, PartTable } from "../../session/session.sql"
import { Instance } from "../../project/instance"
-import { ShareNext } from "../../share"
+import { ShareNext } from "@/share/share-next"
import { EOL } from "os"
-import { Filesystem } from "../../util"
+import { Filesystem } from "@/util/filesystem"
import { AppRuntime } from "@/effect/app-runtime"
import { Schema } from "effect"
diff --git a/packages/opencode/src/cli/cmd/mcp.ts b/packages/opencode/src/cli/cmd/mcp.ts
index ef22340fb..d244549ff 100644
--- a/packages/opencode/src/cli/cmd/mcp.ts
+++ b/packages/opencode/src/cli/cmd/mcp.ts
@@ -7,7 +7,7 @@ import { UI } from "../ui"
import { MCP } from "../../mcp"
import { McpAuth } from "../../mcp/auth"
import { McpOAuthProvider } from "../../mcp/oauth-provider"
-import { Config } from "../../config"
+import { Config } from "@/config/config"
import { ConfigMCP } from "../../config/mcp"
import { Instance } from "../../project/instance"
import { Installation } from "../../installation"
@@ -15,7 +15,7 @@ import { InstallationVersion } from "@opencode-ai/core/installation/version"
import path from "path"
import { Global } from "@opencode-ai/core/global"
import { modify, applyEdits } from "jsonc-parser"
-import { Filesystem } from "../../util"
+import { Filesystem } from "@/util/filesystem"
import { Bus } from "../../bus"
import { AppRuntime } from "../../effect/app-runtime"
import { Effect } from "effect"
diff --git a/packages/opencode/src/cli/cmd/models.ts b/packages/opencode/src/cli/cmd/models.ts
index 446d21f5d..0b5d35275 100644
--- a/packages/opencode/src/cli/cmd/models.ts
+++ b/packages/opencode/src/cli/cmd/models.ts
@@ -1,8 +1,8 @@
import type { Argv } from "yargs"
import { Instance } from "../../project/instance"
-import { Provider } from "../../provider"
+import { Provider } from "@/provider/provider"
import { ProviderID } from "../../provider/schema"
-import { ModelsDev } from "../../provider"
+import { ModelsDev } from "@/provider/models"
import { cmd } from "./cmd"
import { UI } from "../ui"
import { EOL } from "os"
diff --git a/packages/opencode/src/cli/cmd/plug.ts b/packages/opencode/src/cli/cmd/plug.ts
index 14c846f2c..1ac0b071d 100644
--- a/packages/opencode/src/cli/cmd/plug.ts
+++ b/packages/opencode/src/cli/cmd/plug.ts
@@ -1,14 +1,14 @@
import { intro, log, outro, spinner } from "@clack/prompts"
import type { Argv } from "yargs"
-import { ConfigPaths } from "../../config"
+import { ConfigPaths } from "@/config/paths"
import { Global } from "@opencode-ai/core/global"
import { installPlugin, patchPluginConfig, readPluginManifest } from "../../plugin/install"
import { resolvePluginTarget } from "../../plugin/shared"
import { Instance } from "../../project/instance"
import { errorMessage } from "../../util/error"
-import { Filesystem } from "../../util"
-import { Process } from "../../util"
+import { Filesystem } from "@/util/filesystem"
+import { Process } from "@/util/process"
import { UI } from "../ui"
import { cmd } from "./cmd"
diff --git a/packages/opencode/src/cli/cmd/pr.ts b/packages/opencode/src/cli/cmd/pr.ts
index 6141ef90a..f392bab4c 100644
--- a/packages/opencode/src/cli/cmd/pr.ts
+++ b/packages/opencode/src/cli/cmd/pr.ts
@@ -3,7 +3,7 @@ import { cmd } from "./cmd"
import { AppRuntime } from "@/effect/app-runtime"
import { Git } from "@/git"
import { Instance } from "@/project/instance"
-import { Process } from "@/util"
+import { Process } from "@/util/process"
export const PrCommand = cmd({
command: "pr <number>",
diff --git a/packages/opencode/src/cli/cmd/providers.ts b/packages/opencode/src/cli/cmd/providers.ts
index 158405e5f..61fe4b2da 100644
--- a/packages/opencode/src/cli/cmd/providers.ts
+++ b/packages/opencode/src/cli/cmd/providers.ts
@@ -3,16 +3,16 @@ import { AppRuntime } from "../../effect/app-runtime"
import { cmd } from "./cmd"
import * as prompts from "@clack/prompts"
import { UI } from "../ui"
-import { ModelsDev } from "../../provider"
+import { ModelsDev } from "@/provider/models"
import { map, pipe, sortBy, values } from "remeda"
import path from "path"
import os from "os"
-import { Config } from "../../config"
+import { Config } from "@/config/config"
import { Global } from "@opencode-ai/core/global"
import { Plugin } from "../../plugin"
import { Instance } from "../../project/instance"
import type { Hooks } from "@opencode-ai/plugin"
-import { Process } from "../../util"
+import { Process } from "@/util/process"
import { text } from "node:stream/consumers"
import { Effect } from "effect"
diff --git a/packages/opencode/src/cli/cmd/run.ts b/packages/opencode/src/cli/cmd/run.ts
index a9e044f18..4c60023b7 100644
--- a/packages/opencode/src/cli/cmd/run.ts
+++ b/packages/opencode/src/cli/cmd/run.ts
@@ -6,13 +6,13 @@ import { cmd } from "./cmd"
import { Flag } from "@opencode-ai/core/flag/flag"
import { bootstrap } from "../bootstrap"
import { EOL } from "os"
-import { Filesystem } from "../../util"
+import { Filesystem } from "@/util/filesystem"
import { createOpencodeClient, type OpencodeClient, type ToolPart } from "@opencode-ai/sdk/v2"
import { Server } from "../../server/server"
-import { Provider } from "../../provider"
+import { Provider } from "@/provider/provider"
import { Agent } from "../../agent/agent"
import { Permission } from "../../permission"
-import { Tool } from "../../tool"
+import { Tool } from "@/tool/tool"
import { GlobTool } from "../../tool/glob"
import { GrepTool } from "../../tool/grep"
import { ReadTool } from "../../tool/read"
@@ -25,7 +25,7 @@ import { TaskTool } from "../../tool/task"
import { SkillTool } from "../../tool/skill"
import { BashTool } from "../../tool/bash"
import { TodoWriteTool } from "../../tool/todo"
-import { Locale } from "../../util"
+import { Locale } from "@/util/locale"
import { AppRuntime } from "@/effect/app-runtime"
type ToolProps<T> = {
diff --git a/packages/opencode/src/cli/cmd/session.ts b/packages/opencode/src/cli/cmd/session.ts
index 0d4bd96b0..ae9f7c884 100644
--- a/packages/opencode/src/cli/cmd/session.ts
+++ b/packages/opencode/src/cli/cmd/session.ts
@@ -1,13 +1,13 @@
import type { Argv } from "yargs"
import { cmd } from "./cmd"
-import { Session } from "../../session"
+import { Session } from "@/session/session"
import { SessionID } from "../../session/schema"
import { bootstrap } from "../bootstrap"
import { UI } from "../ui"
-import { Locale } from "../../util"
+import { Locale } from "@/util/locale"
import { Flag } from "@opencode-ai/core/flag/flag"
-import { Filesystem } from "../../util"
-import { Process } from "../../util"
+import { Filesystem } from "@/util/filesystem"
+import { Process } from "@/util/process"
import { EOL } from "os"
import path from "path"
import { which } from "../../util/which"
diff --git a/packages/opencode/src/cli/cmd/stats.ts b/packages/opencode/src/cli/cmd/stats.ts
index 34af56ad7..6d00fdf9f 100644
--- a/packages/opencode/src/cli/cmd/stats.ts
+++ b/packages/opencode/src/cli/cmd/stats.ts
@@ -1,10 +1,10 @@
import type { Argv } from "yargs"
import { cmd } from "./cmd"
-import { Session } from "../../session"
+import { Session } from "@/session/session"
import { bootstrap } from "../bootstrap"
-import { Database } from "../../storage"
+import { Database } from "@/storage/db"
import { SessionTable } from "../../session/session.sql"
-import { Project } from "../../project"
+import { Project } from "@/project/project"
import { Instance } from "../../project/instance"
import { AppRuntime } from "@/effect/app-runtime"
diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx
index 69987b146..c98d4e263 100644
--- a/packages/opencode/src/cli/cmd/tui/app.tsx
+++ b/packages/opencode/src/cli/cmd/tui/app.tsx
@@ -50,16 +50,18 @@ import { DialogAlert } from "./ui/dialog-alert"
import { DialogConfirm } from "./ui/dialog-confirm"
import { ToastProvider, useToast } from "./ui/toast"
import { ExitProvider, useExit } from "./context/exit"
-import { Session as SessionApi } from "@/session"
+import { Session as SessionApi } from "@/session/session"
import { TuiEvent } from "./event"
import { KVProvider, useKV } from "./context/kv"
-import { Provider } from "@/provider"
+import { Provider } from "@/provider/provider"
import { ArgsProvider, useArgs, type Args } from "./context/args"
import open from "open"
import { PromptRefProvider, usePromptRef } from "./context/prompt"
import { TuiConfigProvider, useTuiConfig } from "./context/tui-config"
import { TuiConfig } from "@/cli/cmd/tui/config/tui"
-import { createTuiApi, TuiPluginRuntime, type RouteMap } from "./plugin"
+import { createTuiApi } from "@/cli/cmd/tui/plugin/api"
+import { TuiPluginRuntime } from "@/cli/cmd/tui/plugin/runtime"
+import type { RouteMap } from "@/cli/cmd/tui/plugin/api"
import { FormatError, FormatUnknownError } from "@/cli/error"
import type { EventSource } from "./context/sdk"
diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-mcp.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-mcp.tsx
index e3e80c0fd..173c5ff60 100644
--- a/packages/opencode/src/cli/cmd/tui/component/dialog-mcp.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/dialog-mcp.tsx
@@ -4,7 +4,7 @@ import { useSync } from "@tui/context/sync"
import { map, pipe, entries, sortBy } from "remeda"
import { DialogSelect, type DialogSelectRef, type DialogSelectOption } from "@tui/ui/dialog-select"
import { useTheme } from "../context/theme"
-import { Keybind } from "@/util"
+import { Keybind } from "@/util/keybind"
import { TextAttributes } from "@opentui/core"
import { useSDK } from "@tui/context/sdk"
diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx
index 7260a14f9..576098178 100644
--- a/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx
@@ -3,14 +3,14 @@ import { DialogSelect } from "@tui/ui/dialog-select"
import { useRoute } from "@tui/context/route"
import { useSync } from "@tui/context/sync"
import { createMemo, createResource, createSignal, onMount } from "solid-js"
-import { Locale } from "@/util"
+import { Locale } from "@/util/locale"
import { useProject } from "@tui/context/project"
import { useKeybind } from "../context/keybind"
import { useTheme } from "../context/theme"
import { useSDK } from "../context/sdk"
import { Flag } from "@opencode-ai/core/flag/flag"
import { DialogSessionRename } from "./dialog-session-rename"
-import { Keybind } from "@/util"
+import { Keybind } from "@/util/keybind"
import { createDebouncedSignal } from "../util/signal"
import { useToast } from "../ui/toast"
import { DialogWorkspaceCreate, openWorkspaceSession, restoreWorkspaceSession } from "./dialog-workspace-create"
diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-stash.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-stash.tsx
index 8a6e69145..e8664f628 100644
--- a/packages/opencode/src/cli/cmd/tui/component/dialog-stash.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/dialog-stash.tsx
@@ -1,7 +1,7 @@
import { useDialog } from "@tui/ui/dialog"
import { DialogSelect } from "@tui/ui/dialog-select"
import { createMemo, createSignal } from "solid-js"
-import { Locale } from "@/util"
+import { Locale } from "@/util/locale"
import { useTheme } from "../context/theme"
import { useKeybind } from "../context/keybind"
import { usePromptStash, type StashEntry } from "./prompt/stash"
diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx
index 4a5e1a4ca..47bb162cb 100644
--- a/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx
@@ -14,7 +14,7 @@ import { useTheme, selectedForeground } from "@tui/context/theme"
import { SplitBorder } from "@tui/component/border"
import { useCommandDialog } from "@tui/component/dialog-command"
import { useTerminalDimensions } from "@opentui/solid"
-import { Locale } from "@/util"
+import { Locale } from "@/util/locale"
import type { PromptInfo } from "./history"
import { useFrecency } from "./frecency"
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 61d4c9e99..c0710b536 100644
--- a/packages/opencode/src/cli/cmd/tui/component/prompt/frecency.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/prompt/frecency.tsx
@@ -1,6 +1,6 @@
import path from "path"
import { Global } from "@opencode-ai/core/global"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import { onMount } from "solid-js"
import { createStore } from "solid-js/store"
import { createSimpleContext } from "../../context/helper"
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 2d979ce99..630f725c7 100644
--- a/packages/opencode/src/cli/cmd/tui/component/prompt/history.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/prompt/history.tsx
@@ -1,6 +1,6 @@
import path from "path"
import { Global } from "@opencode-ai/core/global"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import { onMount } from "solid-js"
import { createStore, produce, unwrap } from "solid-js/store"
import { createSimpleContext } from "../../context/helper"
diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
index 5288a819b..fc0286892 100644
--- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
@@ -3,7 +3,7 @@ import { createEffect, createMemo, onMount, createSignal, onCleanup, on, Show, S
import "opentui-spinner/solid"
import path from "path"
import { fileURLToPath } from "url"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import { useLocal } from "@tui/context/local"
import { tint, useTheme } from "@tui/context/theme"
import { EmptyBorder, SplitBorder } from "@tui/component/border"
@@ -29,7 +29,7 @@ import * as Clipboard from "../../util/clipboard"
import type { AssistantMessage, FilePart, UserMessage } from "@opencode-ai/sdk/v2"
import { TuiEvent } from "../../event"
import { iife } from "@/util/iife"
-import { Locale } from "@/util"
+import { Locale } from "@/util/locale"
import { formatDuration } from "@/util/format"
import { createColors, createFrames } from "../../ui/spinner.ts"
import { useDialog } from "@tui/ui/dialog"
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 a7dd28965..da8970214 100644
--- a/packages/opencode/src/cli/cmd/tui/component/prompt/stash.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/prompt/stash.tsx
@@ -1,6 +1,6 @@
import path from "path"
import { Global } from "@opencode-ai/core/global"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import { onMount } from "solid-js"
import { createStore, produce, unwrap } from "solid-js/store"
import { createSimpleContext } from "../../context/helper"
diff --git a/packages/opencode/src/cli/cmd/tui/component/textarea-keybindings.ts b/packages/opencode/src/cli/cmd/tui/component/textarea-keybindings.ts
index eb7b622c6..36ab03de5 100644
--- a/packages/opencode/src/cli/cmd/tui/component/textarea-keybindings.ts
+++ b/packages/opencode/src/cli/cmd/tui/component/textarea-keybindings.ts
@@ -1,7 +1,7 @@
import { createMemo } from "solid-js"
import type { KeyBinding } from "@opentui/core"
import { useKeybind } from "../context/keybind"
-import { Keybind } from "@/util"
+import { Keybind } from "@/util/keybind"
const TEXTAREA_ACTIONS = [
"submit",
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 b6a832dcb..b90ce2a41 100644
--- a/packages/opencode/src/cli/cmd/tui/config/tui-migrate.ts
+++ b/packages/opencode/src/cli/cmd/tui/config/tui-migrate.ts
@@ -5,7 +5,8 @@ import z from "zod"
import { TuiInfo, TuiOptions } from "./tui-schema"
import { Flag } from "@opencode-ai/core/flag/flag"
import { Global } from "@opencode-ai/core/global"
-import { Filesystem, Log } from "@/util"
+import { Filesystem } from "@/util/filesystem"
+import * as Log from "@opencode-ai/core/util/log"
import * as ConfigPaths from "@/config/paths"
const log = Log.create({ service: "tui.migrate" })
diff --git a/packages/opencode/src/cli/cmd/tui/config/tui.ts b/packages/opencode/src/cli/cmd/tui/config/tui.ts
index 3f99e6d2f..fbedcccc1 100644
--- a/packages/opencode/src/cli/cmd/tui/config/tui.ts
+++ b/packages/opencode/src/cli/cmd/tui/config/tui.ts
@@ -16,7 +16,8 @@ import { ConfigPlugin } from "@/config/plugin"
import { ConfigKeybinds } from "@/config/keybinds"
import { InstallationLocal, InstallationVersion } from "@opencode-ai/core/installation/version"
import { makeRuntime } from "@opencode-ai/core/effect/runtime"
-import { Filesystem, Log } from "@/util"
+import { Filesystem } from "@/util/filesystem"
+import * as Log from "@opencode-ai/core/util/log"
import { ConfigVariable } from "@/config/variable"
import { Npm } from "@opencode-ai/core/npm"
diff --git a/packages/opencode/src/cli/cmd/tui/context/editor-zed.ts b/packages/opencode/src/cli/cmd/tui/context/editor-zed.ts
index cbf995f8d..aee819a8b 100644
--- a/packages/opencode/src/cli/cmd/tui/context/editor-zed.ts
+++ b/packages/opencode/src/cli/cmd/tui/context/editor-zed.ts
@@ -2,7 +2,7 @@ import { Database } from "bun:sqlite"
import os from "node:os"
import path from "node:path"
import z from "zod"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import type { EditorSelection } from "./editor"
const ZedEditorRowSchema = z.object({
diff --git a/packages/opencode/src/cli/cmd/tui/context/keybind.tsx b/packages/opencode/src/cli/cmd/tui/context/keybind.tsx
index bf40f6b87..2c1ab245a 100644
--- a/packages/opencode/src/cli/cmd/tui/context/keybind.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/keybind.tsx
@@ -1,5 +1,5 @@
import { createMemo } from "solid-js"
-import { Keybind } from "@/util"
+import { Keybind } from "@/util/keybind"
import { pipe, mapValues } from "remeda"
import type { TuiConfig } from "@/cli/cmd/tui/config/tui"
import type { ParsedKey, Renderable } from "@opentui/core"
diff --git a/packages/opencode/src/cli/cmd/tui/context/kv.tsx b/packages/opencode/src/cli/cmd/tui/context/kv.tsx
index 2efa314d9..811c542bb 100644
--- a/packages/opencode/src/cli/cmd/tui/context/kv.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/kv.tsx
@@ -1,5 +1,5 @@
import { Global } from "@opencode-ai/core/global"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import { Flock } from "@opencode-ai/core/util/flock"
import { rename, rm } from "fs/promises"
import { createSignal, type Setter } from "solid-js"
diff --git a/packages/opencode/src/cli/cmd/tui/context/local.tsx b/packages/opencode/src/cli/cmd/tui/context/local.tsx
index af06a2bf2..0b8c902c4 100644
--- a/packages/opencode/src/cli/cmd/tui/context/local.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/local.tsx
@@ -11,7 +11,7 @@ import { useToast } from "../ui/toast"
import { useArgs } from "./args"
import { useSDK } from "./sdk"
import { RGBA } from "@opentui/core"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
export function parseModel(model: string) {
const [providerID, ...rest] = model.split("/")
diff --git a/packages/opencode/src/cli/cmd/tui/context/sync.tsx b/packages/opencode/src/cli/cmd/tui/context/sync.tsx
index d35deb0b6..7b18d7f4e 100644
--- a/packages/opencode/src/cli/cmd/tui/context/sync.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/sync.tsx
@@ -28,7 +28,7 @@ import type { Snapshot } from "@/snapshot"
import { useExit } from "./exit"
import { useArgs } from "./args"
import { batch, onMount } from "solid-js"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { emptyConsoleState, type ConsoleState } from "@/config/console-state"
export const { use: useSync, provider: SyncProvider } = createSimpleContext({
diff --git a/packages/opencode/src/cli/cmd/tui/context/theme.tsx b/packages/opencode/src/cli/cmd/tui/context/theme.tsx
index ca6c0a6cf..d4e643ddd 100644
--- a/packages/opencode/src/cli/cmd/tui/context/theme.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/theme.tsx
@@ -40,7 +40,7 @@ import { useKV } from "./kv"
import { useRenderer } from "@opentui/solid"
import { createStore, produce } from "solid-js/store"
import { Global } from "@opencode-ai/core/global"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import { useTuiConfig } from "./tui-config"
import { isRecord } from "@/util/record"
import type { TuiThemeCurrent } from "@opencode-ai/plugin/tui"
diff --git a/packages/opencode/src/cli/cmd/tui/feature-plugins/system/plugins.tsx b/packages/opencode/src/cli/cmd/tui/feature-plugins/system/plugins.tsx
index b5edabcf0..a2f91b971 100644
--- a/packages/opencode/src/cli/cmd/tui/feature-plugins/system/plugins.tsx
+++ b/packages/opencode/src/cli/cmd/tui/feature-plugins/system/plugins.tsx
@@ -1,4 +1,4 @@
-import { Keybind } from "@/util"
+import { Keybind } from "@/util/keybind"
import type { TuiPlugin, TuiPluginApi, TuiPluginModule, TuiPluginStatus } from "@opencode-ai/plugin/tui"
import { useKeyboard, useTerminalDimensions } from "@opentui/solid"
import { fileURLToPath } from "url"
diff --git a/packages/opencode/src/cli/cmd/tui/plugin/index.ts b/packages/opencode/src/cli/cmd/tui/plugin/index.ts
deleted file mode 100644
index c970a318f..000000000
--- a/packages/opencode/src/cli/cmd/tui/plugin/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export { TuiPluginRuntime } from "./runtime"
-export { createTuiApi } from "./api"
-export type { RouteMap } from "./api"
diff --git a/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts b/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts
index 556e97684..2ef533324 100644
--- a/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts
+++ b/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts
@@ -13,7 +13,7 @@ import {
import path from "path"
import { fileURLToPath } from "url"
import { TuiConfig } from "@/cli/cmd/tui/config/tui"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { errorData, errorMessage } from "@/util/error"
import { isRecord } from "@/util/record"
import { Instance } from "@/project/instance"
@@ -30,8 +30,8 @@ import { PluginMeta } from "@/plugin/meta"
import { installPlugin as installModulePlugin, patchPluginConfig, readPluginManifest } from "@/plugin/install"
import { hasTheme, upsertTheme } from "../context/theme"
import { Global } from "@opencode-ai/core/global"
-import { Filesystem } from "@/util"
-import { Process } from "@/util"
+import { Filesystem } from "@/util/filesystem"
+import { Process } from "@/util/process"
import { Flock } from "@opencode-ai/core/util/flock"
import { Flag } from "@opencode-ai/core/flag/flag"
import { INTERNAL_TUI_PLUGINS, type InternalTuiPlugin } from "./internal"
diff --git a/packages/opencode/src/cli/cmd/tui/routes/home.tsx b/packages/opencode/src/cli/cmd/tui/routes/home.tsx
index 2f0ff07e9..4c1cd1bab 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/home.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/home.tsx
@@ -8,7 +8,7 @@ import { useArgs } from "../context/args"
import { useRouteData } from "@tui/context/route"
import { usePromptRef } from "../context/prompt"
import { useLocal } from "../context/local"
-import { TuiPluginRuntime } from "../plugin"
+import { TuiPluginRuntime } from "@/cli/cmd/tui/plugin/runtime"
let once = false
const placeholder = {
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx
index 7414cefd3..98eea1f82 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx
@@ -2,7 +2,7 @@ import { createMemo, onMount } from "solid-js"
import { useSync } from "@tui/context/sync"
import { DialogSelect, type DialogSelectOption } from "@tui/ui/dialog-select"
import type { TextPart } from "@opencode-ai/sdk/v2"
-import { Locale } from "@/util"
+import { Locale } from "@/util/locale"
import { useSDK } from "@tui/context/sdk"
import { useRoute } from "@tui/context/route"
import { useDialog, type DialogContext } from "../../ui/dialog"
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx
index c0052f25f..87248a6a8 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx
@@ -2,7 +2,7 @@ import { createMemo, onMount } from "solid-js"
import { useSync } from "@tui/context/sync"
import { DialogSelect, type DialogSelectOption } from "@tui/ui/dialog-select"
import type { TextPart } from "@opencode-ai/sdk/v2"
-import { Locale } from "@/util"
+import { Locale } from "@/util/locale"
import { DialogMessage } from "./dialog-message"
import { useDialog } from "../../ui/dialog"
import type { PromptInfo } from "../../component/prompt/history"
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 516f406ae..183ce52cd 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
@@ -33,8 +33,8 @@ import type {
ReasoningPart,
} from "@opencode-ai/sdk/v2"
import { useLocal } from "@tui/context/local"
-import { Locale } from "@/util"
-import type { Tool } from "@/tool"
+import { Locale } from "@/util/locale"
+import type { Tool } from "@/tool/tool"
import type { ReadTool } from "@/tool/read"
import type { WriteTool } from "@/tool/write"
import { BashTool } from "@/tool/bash"
@@ -75,7 +75,7 @@ import * as Editor from "../../util/editor"
import stripAnsi from "strip-ansi"
import { usePromptRef } from "../../context/prompt"
import { useExit } from "../../context/exit"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import { Global } from "@opencode-ai/core/global"
import { PermissionPrompt } from "./permission"
import { QuestionPrompt } from "./question"
@@ -85,7 +85,7 @@ import { formatTranscript } from "../../util/transcript"
import { UI } from "@/cli/ui.ts"
import { useTuiConfig } from "../../context/tui-config"
import { getScrollAcceleration } from "../../util/scroll"
-import { TuiPluginRuntime } from "../../plugin"
+import { TuiPluginRuntime } from "@/cli/cmd/tui/plugin/runtime"
import { DialogGoUpsell } from "../../component/dialog-go-upsell"
import { SessionRetry } from "@/session/retry"
import { getRevertDiffFiles } from "../../util/revert-diff"
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 d124734a3..30e2358ad 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx
@@ -12,8 +12,8 @@ import { useTextareaKeybindings } from "../../component/textarea-keybindings"
import { useProject } from "../../context/project"
import path from "path"
import { LANGUAGE_EXTENSIONS } from "@/lsp/language"
-import { Keybind } from "@/util"
-import { Locale } from "@/util"
+import { Keybind } from "@/util/keybind"
+import { Locale } from "@/util/locale"
import { Global } from "@opencode-ai/core/global"
import { useDialog } from "../../ui/dialog"
import { getScrollAcceleration } from "../../util/scroll"
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx
index c49946df7..7adc4c1db 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx
@@ -4,7 +4,7 @@ import { createMemo, Show } from "solid-js"
import { useTheme } from "../../context/theme"
import { useTuiConfig } from "../../context/tui-config"
import { InstallationChannel, InstallationVersion } from "@opencode-ai/core/installation/version"
-import { TuiPluginRuntime } from "../../plugin"
+import { TuiPluginRuntime } from "@/cli/cmd/tui/plugin/runtime"
import { getScrollAcceleration } from "../../util/scroll"
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/subagent-footer.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/subagent-footer.tsx
index 556959960..c857937d4 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/subagent-footer.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/subagent-footer.tsx
@@ -6,7 +6,7 @@ import { SplitBorder } from "@tui/component/border"
import type { AssistantMessage } from "@opencode-ai/sdk/v2"
import { useCommandDialog } from "@tui/component/dialog-command"
import { useKeybind } from "../../context/keybind"
-import { Locale } from "@/util"
+import { Locale } from "@/util/locale"
import { useTerminalDimensions } from "@opentui/solid"
export function SubagentFooter() {
diff --git a/packages/opencode/src/cli/cmd/tui/thread.ts b/packages/opencode/src/cli/cmd/tui/thread.ts
index 7a1c9e721..07f9107b6 100644
--- a/packages/opencode/src/cli/cmd/tui/thread.ts
+++ b/packages/opencode/src/cli/cmd/tui/thread.ts
@@ -1,15 +1,15 @@
import { cmd } from "@/cli/cmd/cmd"
import { tui } from "./app"
-import { Rpc } from "@/util"
+import { Rpc } from "@/util/rpc"
import { type rpc } from "./worker"
import path from "path"
import { fileURLToPath } from "url"
import { UI } from "@/cli/ui"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { errorMessage } from "@/util/error"
import { withTimeout } from "@/util/timeout"
import { withNetworkOptions, resolveNetworkOptionsNoConfig } from "@/cli/network"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import type { GlobalEvent } from "@opencode-ai/sdk/v2"
import type { EventSource } from "./context/sdk"
import { win32DisableProcessedInput, win32InstallCtrlCGuard } from "./win32"
diff --git a/packages/opencode/src/cli/cmd/tui/ui/dialog-confirm.tsx b/packages/opencode/src/cli/cmd/tui/ui/dialog-confirm.tsx
index 526f3a61b..48adddaed 100644
--- a/packages/opencode/src/cli/cmd/tui/ui/dialog-confirm.tsx
+++ b/packages/opencode/src/cli/cmd/tui/ui/dialog-confirm.tsx
@@ -4,7 +4,7 @@ import { useDialog, type DialogContext } from "./dialog"
import { createStore } from "solid-js/store"
import { For } from "solid-js"
import { useKeyboard } from "@opentui/solid"
-import { Locale } from "@/util"
+import { Locale } from "@/util/locale"
export type DialogConfirmProps = {
title: string
diff --git a/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx b/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx
index dda9a5a8e..b6c937f41 100644
--- a/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx
+++ b/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx
@@ -8,8 +8,8 @@ import * as fuzzysort from "fuzzysort"
import { isDeepEqual } from "remeda"
import { useDialog, type DialogContext } from "@tui/ui/dialog"
import { useKeybind } from "@tui/context/keybind"
-import { Keybind } from "@/util"
-import { Locale } from "@/util"
+import { Keybind } from "@/util/keybind"
+import { Locale } from "@/util/locale"
import { getScrollAcceleration } from "../util/scroll"
import { useTuiConfig } from "../context/tui-config"
diff --git a/packages/opencode/src/cli/cmd/tui/util/clipboard.ts b/packages/opencode/src/cli/cmd/tui/util/clipboard.ts
index 8c535833c..3a9996902 100644
--- a/packages/opencode/src/cli/cmd/tui/util/clipboard.ts
+++ b/packages/opencode/src/cli/cmd/tui/util/clipboard.ts
@@ -201,3 +201,5 @@ export async function copy(text: string): Promise<void> {
const method = await getCopyMethod()
await method(text)
}
+
+export * as Clipboard from "./clipboard"
diff --git a/packages/opencode/src/cli/cmd/tui/util/editor.ts b/packages/opencode/src/cli/cmd/tui/util/editor.ts
index 26e595dfb..45a9ffee9 100644
--- a/packages/opencode/src/cli/cmd/tui/util/editor.ts
+++ b/packages/opencode/src/cli/cmd/tui/util/editor.ts
@@ -3,8 +3,8 @@ import { rm } from "node:fs/promises"
import { tmpdir } from "node:os"
import { join } from "node:path"
import { CliRenderer } from "@opentui/core"
-import { Filesystem } from "@/util"
-import { Process } from "@/util"
+import { Filesystem } from "@/util/filesystem"
+import { Process } from "@/util/process"
export async function open(opts: { value: string; renderer: CliRenderer }): Promise<string | undefined> {
const editor = process.env["VISUAL"] || process.env["EDITOR"]
@@ -33,3 +33,5 @@ export async function open(opts: { value: string; renderer: CliRenderer }): Prom
opts.renderer.requestRender()
}
}
+
+export * as Editor from "./editor"
diff --git a/packages/opencode/src/cli/cmd/tui/util/index.ts b/packages/opencode/src/cli/cmd/tui/util/index.ts
deleted file mode 100644
index 940f18c23..000000000
--- a/packages/opencode/src/cli/cmd/tui/util/index.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export * as Editor from "./editor"
-export * as Selection from "./selection"
-export * as Sound from "./sound"
-export * as Clipboard from "./clipboard"
diff --git a/packages/opencode/src/cli/cmd/tui/util/selection.ts b/packages/opencode/src/cli/cmd/tui/util/selection.ts
index d677972ee..0e0c47874 100644
--- a/packages/opencode/src/cli/cmd/tui/util/selection.ts
+++ b/packages/opencode/src/cli/cmd/tui/util/selection.ts
@@ -21,3 +21,5 @@ export function copy(renderer: Renderer, toast: Toast): boolean {
renderer.clearSelection()
return true
}
+
+export * as Selection from "./selection"
diff --git a/packages/opencode/src/cli/cmd/tui/util/sound.ts b/packages/opencode/src/cli/cmd/tui/util/sound.ts
index e0a15c1a7..df8b4dc2d 100644
--- a/packages/opencode/src/cli/cmd/tui/util/sound.ts
+++ b/packages/opencode/src/cli/cmd/tui/util/sound.ts
@@ -2,7 +2,7 @@ import { Player } from "cli-sound"
import { mkdirSync } from "node:fs"
import { tmpdir } from "node:os"
import { basename, join } from "node:path"
-import { Process } from "@/util"
+import { Process } from "@/util/process"
import { which } from "@/util/which"
import pulseA from "../asset/pulse-a.wav" with { type: "file" }
import pulseB from "../asset/pulse-b.wav" with { type: "file" }
@@ -152,3 +152,5 @@ export function pulse(scale = 1) {
export function dispose() {
stop()
}
+
+export * as Sound from "./sound"
diff --git a/packages/opencode/src/cli/cmd/tui/util/transcript.ts b/packages/opencode/src/cli/cmd/tui/util/transcript.ts
index 8fa0bc426..a89559c95 100644
--- a/packages/opencode/src/cli/cmd/tui/util/transcript.ts
+++ b/packages/opencode/src/cli/cmd/tui/util/transcript.ts
@@ -1,5 +1,5 @@
import type { AssistantMessage, Part, Provider, UserMessage } from "@opencode-ai/sdk/v2"
-import { Locale } from "@/util"
+import { Locale } from "@/util/locale"
import * as Model from "./model"
export type TranscriptOptions = {
diff --git a/packages/opencode/src/cli/cmd/tui/worker.ts b/packages/opencode/src/cli/cmd/tui/worker.ts
index df09d5cc9..adb7453a7 100644
--- a/packages/opencode/src/cli/cmd/tui/worker.ts
+++ b/packages/opencode/src/cli/cmd/tui/worker.ts
@@ -1,11 +1,11 @@
import { Installation } from "@/installation"
import { Server } from "@/server/server"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { Instance } from "@/project/instance"
import { InstanceBootstrap } from "@/project/bootstrap"
-import { Rpc } from "@/util"
+import { Rpc } from "@/util/rpc"
import { upgrade } from "@/cli/upgrade"
-import { Config } from "@/config"
+import { Config } from "@/config/config"
import { GlobalBus } from "@/bus/global"
import { Flag } from "@opencode-ai/core/flag/flag"
import { writeHeapSnapshot } from "node:v8"
diff --git a/packages/opencode/src/cli/cmd/uninstall.ts b/packages/opencode/src/cli/cmd/uninstall.ts
index 254022dd5..0afdc5185 100644
--- a/packages/opencode/src/cli/cmd/uninstall.ts
+++ b/packages/opencode/src/cli/cmd/uninstall.ts
@@ -6,8 +6,8 @@ import { Global } from "@opencode-ai/core/global"
import fs from "fs/promises"
import path from "path"
import os from "os"
-import { Filesystem } from "../../util"
-import { Process } from "../../util"
+import { Filesystem } from "@/util/filesystem"
+import { Process } from "@/util/process"
interface UninstallArgs {
keepConfig: boolean
diff --git a/packages/opencode/src/cli/heap.ts b/packages/opencode/src/cli/heap.ts
index 45557391a..a865c2a4c 100644
--- a/packages/opencode/src/cli/heap.ts
+++ b/packages/opencode/src/cli/heap.ts
@@ -2,7 +2,7 @@ import path from "path"
import { writeHeapSnapshot } from "node:v8"
import { Flag } from "@opencode-ai/core/flag/flag"
import { Global } from "@opencode-ai/core/global"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
const log = Log.create({ service: "heap" })
const MINUTE = 60_000
diff --git a/packages/opencode/src/cli/network.ts b/packages/opencode/src/cli/network.ts
index a489ea14c..a6cecdfac 100644
--- a/packages/opencode/src/cli/network.ts
+++ b/packages/opencode/src/cli/network.ts
@@ -1,5 +1,5 @@
import type { Argv, InferredOptionTypes } from "yargs"
-import { Config } from "../config"
+import { Config } from "@/config/config"
import { AppRuntime } from "@/effect/app-runtime"
const options = {
diff --git a/packages/opencode/src/cli/upgrade.ts b/packages/opencode/src/cli/upgrade.ts
index 18f6bc45f..9f71fcc06 100644
--- a/packages/opencode/src/cli/upgrade.ts
+++ b/packages/opencode/src/cli/upgrade.ts
@@ -1,5 +1,5 @@
import { Bus } from "@/bus"
-import { Config } from "@/config"
+import { Config } from "@/config/config"
import { AppRuntime } from "@/effect/app-runtime"
import { Flag } from "@opencode-ai/core/flag/flag"
import { Installation } from "@/installation"
diff --git a/packages/opencode/src/command/index.ts b/packages/opencode/src/command/index.ts
index 7001d4f96..140d2b8a7 100644
--- a/packages/opencode/src/command/index.ts
+++ b/packages/opencode/src/command/index.ts
@@ -1,13 +1,13 @@
import { BusEvent } from "@/bus/bus-event"
-import { InstanceState } from "@/effect"
-import { EffectBridge } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
+import { EffectBridge } from "@/effect/bridge"
import type { InstanceContext } from "@/project/instance"
import { SessionID, MessageID } from "@/session/schema"
import { Effect, Layer, Context, Schema } from "effect"
import z from "zod"
import { zod, ZodOverride } from "@/util/effect-zod"
import { withStatics } from "@/util/schema"
-import { Config } from "../config"
+import { Config } from "@/config/config"
import { MCP } from "../mcp"
import { Skill } from "../skill"
import PROMPT_INITIALIZE from "./template/initialize.txt"
diff --git a/packages/opencode/src/config/agent.ts b/packages/opencode/src/config/agent.ts
index 1d1c66a13..e673edbad 100644
--- a/packages/opencode/src/config/agent.ts
+++ b/packages/opencode/src/config/agent.ts
@@ -4,7 +4,7 @@ import { Exit, Schema, SchemaGetter } from "effect"
import { Bus } from "@/bus"
import { zod } from "@/util/effect-zod"
import { PositiveInt, withStatics } from "@/util/schema"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { NamedError } from "@opencode-ai/core/util/error"
import { Glob } from "@opencode-ai/core/util/glob"
import { configEntryNameFromPath } from "./entry-name"
@@ -119,7 +119,7 @@ export async function load(dir: string) {
const message = ConfigMarkdown.FrontmatterError.isInstance(err)
? err.data.message
: `Failed to parse agent ${item}`
- const { Session } = await import("@/session")
+ const { Session } = await import("@/session/session")
void Bus.publish(Session.Event.Error, { error: new NamedError.Unknown({ message }).toObject() })
log.error("failed to load agent", { agent: item, err })
return undefined
@@ -151,7 +151,7 @@ export async function loadMode(dir: string) {
const message = ConfigMarkdown.FrontmatterError.isInstance(err)
? err.data.message
: `Failed to parse mode ${item}`
- const { Session } = await import("@/session")
+ const { Session } = await import("@/session/session")
void Bus.publish(Session.Event.Error, { error: new NamedError.Unknown({ message }).toObject() })
log.error("failed to load mode", { mode: item, err })
return undefined
diff --git a/packages/opencode/src/config/command.ts b/packages/opencode/src/config/command.ts
index 36cae6f97..4d0fec687 100644
--- a/packages/opencode/src/config/command.ts
+++ b/packages/opencode/src/config/command.ts
@@ -1,6 +1,6 @@
export * as ConfigCommand from "./command"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { Schema } from "effect"
import { NamedError } from "@opencode-ai/core/util/error"
import { Glob } from "@opencode-ai/core/util/glob"
@@ -36,7 +36,7 @@ export async function load(dir: string) {
const message = ConfigMarkdown.FrontmatterError.isInstance(err)
? err.data.message
: `Failed to parse command ${item}`
- const { Session } = await import("@/session")
+ const { Session } = await import("@/session/session")
void Bus.publish(Session.Event.Error, { error: new NamedError.Unknown({ message }).toObject() })
log.error("failed to load command", { command: item, err })
return undefined
diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts
index 1b6b58500..817f8c3e3 100644
--- a/packages/opencode/src/config/config.ts
+++ b/packages/opencode/src/config/config.ts
@@ -1,4 +1,4 @@
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import path from "path"
import { pathToFileURL } from "url"
import os from "os"
@@ -20,7 +20,7 @@ import { Account } from "@/account/account"
import { isRecord } from "@/util/record"
import type { ConsoleState } from "./console-state"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { Context, Duration, Effect, Exit, Fiber, Layer, Option, Schema } from "effect"
import { EffectFlock } from "@opencode-ai/core/util/effect-flock"
import { InstanceRef } from "@/effect/instance-ref"
@@ -795,3 +795,5 @@ export const defaultLayer = layer.pipe(
Layer.provide(Account.defaultLayer),
Layer.provide(Npm.defaultLayer),
)
+
+export * as Config from "./config"
diff --git a/packages/opencode/src/config/index.ts b/packages/opencode/src/config/index.ts
deleted file mode 100644
index a05c29d25..000000000
--- a/packages/opencode/src/config/index.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-export * as Config from "./config"
-export * as ConfigAgent from "./agent"
-export * as ConfigCommand from "./command"
-export * as ConfigError from "./error"
-export * as ConfigFormatter from "./formatter"
-export * as ConfigLSP from "./lsp"
-export * as ConfigVariable from "./variable"
-export { ConfigManaged } from "./managed"
-export * as ConfigMarkdown from "./markdown"
-export * as ConfigMCP from "./mcp"
-export { ConfigModelID } from "./model-id"
-export * as ConfigParse from "./parse"
-export * as ConfigPermission from "./permission"
-export * as ConfigPaths from "./paths"
-export * as ConfigProvider from "./provider"
-export * as ConfigSkills from "./skills"
diff --git a/packages/opencode/src/config/managed.ts b/packages/opencode/src/config/managed.ts
index a53fb70af..81744664b 100644
--- a/packages/opencode/src/config/managed.ts
+++ b/packages/opencode/src/config/managed.ts
@@ -3,7 +3,8 @@ export * as ConfigManaged from "./managed"
import { existsSync } from "fs"
import os from "os"
import path from "path"
-import { Log, Process } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
+import { Process } from "@/util/process"
import { warn } from "console"
const log = Log.create({ service: "config" })
diff --git a/packages/opencode/src/config/markdown.ts b/packages/opencode/src/config/markdown.ts
index d782d655e..390f7f8b0 100644
--- a/packages/opencode/src/config/markdown.ts
+++ b/packages/opencode/src/config/markdown.ts
@@ -1,7 +1,7 @@
import { NamedError } from "@opencode-ai/core/util/error"
import matter from "gray-matter"
import { z } from "zod"
-import { Filesystem } from "../util"
+import { Filesystem } from "@/util/filesystem"
export const FILE_REGEX = /(?<![\w`])@(\.?[^\s`,.]*(?:\.[^\s`,.]+)*)/g
export const SHELL_REGEX = /!`([^`]+)`/g
@@ -95,3 +95,5 @@ export const FrontmatterError = NamedError.create(
message: z.string(),
}),
)
+
+export * as ConfigMarkdown from "./markdown"
diff --git a/packages/opencode/src/config/paths.ts b/packages/opencode/src/config/paths.ts
index 92c1f45e1..90f49ee79 100644
--- a/packages/opencode/src/config/paths.ts
+++ b/packages/opencode/src/config/paths.ts
@@ -1,7 +1,7 @@
export * as ConfigPaths from "./paths"
import path from "path"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import { Flag } from "@opencode-ai/core/flag/flag"
import { Global } from "@opencode-ai/core/global"
import { unique } from "remeda"
diff --git a/packages/opencode/src/config/variable.ts b/packages/opencode/src/config/variable.ts
index e52db6147..e61e06d41 100644
--- a/packages/opencode/src/config/variable.ts
+++ b/packages/opencode/src/config/variable.ts
@@ -2,7 +2,7 @@ export * as ConfigVariable from "./variable"
import path from "path"
import os from "os"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import { InvalidError } from "./error"
type ParseSource =
diff --git a/packages/opencode/src/control-plane/workspace-context.ts b/packages/opencode/src/control-plane/workspace-context.ts
index 85ef596e7..2e6aff1be 100644
--- a/packages/opencode/src/control-plane/workspace-context.ts
+++ b/packages/opencode/src/control-plane/workspace-context.ts
@@ -1,4 +1,4 @@
-import { LocalContext } from "../util"
+import { LocalContext } from "@/util/local-context"
import type { WorkspaceID } from "../control-plane/schema"
export interface WorkspaceContext {
diff --git a/packages/opencode/src/control-plane/workspace.ts b/packages/opencode/src/control-plane/workspace.ts
index fbc4336fe..c56ff2631 100644
--- a/packages/opencode/src/control-plane/workspace.ts
+++ b/packages/opencode/src/control-plane/workspace.ts
@@ -1,16 +1,19 @@
import { Schema } from "effect"
import { setTimeout as sleep } from "node:timers/promises"
import { fn } from "@/util/fn"
-import { Database, asc, eq, inArray } from "@/storage"
-import { Project } from "@/project"
+import { Database } from "@/storage/db"
+import { asc } from "drizzle-orm"
+import { eq } from "drizzle-orm"
+import { inArray } from "drizzle-orm"
+import { Project } from "@/project/project"
import { BusEvent } from "@/bus/bus-event"
import { GlobalBus } from "@/bus/global"
import { Auth } from "@/auth"
import { SyncEvent } from "@/sync"
import { EventSequenceTable, EventTable } from "@/sync/event.sql"
import { Flag } from "@opencode-ai/core/flag/flag"
-import { Log } from "@/util"
-import { Filesystem } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
+import { Filesystem } from "@/util/filesystem"
import { ProjectID } from "@/project/schema"
import { Slug } from "@opencode-ai/core/util/slug"
import { WorkspaceTable } from "./workspace.sql"
@@ -18,7 +21,7 @@ import { getAdaptor } from "./adaptors"
import { type WorkspaceInfo, WorkspaceInfo as WorkspaceInfoSchema } from "./types"
import { WorkspaceID } from "./schema"
import { parseSSE } from "./sse"
-import { Session } from "@/session"
+import { Session } from "@/session/session"
import { SessionTable } from "@/session/session.sql"
import { SessionID } from "@/session/schema"
import { errorData } from "@/util/error"
diff --git a/packages/opencode/src/effect/app-runtime.ts b/packages/opencode/src/effect/app-runtime.ts
index fcf64b9d2..fdd305362 100644
--- a/packages/opencode/src/effect/app-runtime.ts
+++ b/packages/opencode/src/effect/app-runtime.ts
@@ -6,23 +6,23 @@ import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Bus } from "@/bus"
import { Auth } from "@/auth"
import { Account } from "@/account/account"
-import { Config } from "@/config"
+import { Config } from "@/config/config"
import { Git } from "@/git"
import { Ripgrep } from "@/file/ripgrep"
import { File } from "@/file"
import { FileWatcher } from "@/file/watcher"
-import { Storage } from "@/storage"
+import { Storage } from "@/storage/storage"
import { Snapshot } from "@/snapshot"
import { Plugin } from "@/plugin"
-import { Provider } from "@/provider"
-import { ProviderAuth } from "@/provider"
+import { Provider } from "@/provider/provider"
+import { ProviderAuth } from "@/provider/auth"
import { Agent } from "@/agent/agent"
import { Skill } from "@/skill"
import { Discovery } from "@/skill/discovery"
import { Question } from "@/question"
import { Permission } from "@/permission"
import { Todo } from "@/session/todo"
-import { Session } from "@/session"
+import { Session } from "@/session/session"
import { SessionStatus } from "@/session/status"
import { SessionRunState } from "@/session/run-state"
import { SessionProcessor } from "@/session/processor"
@@ -32,20 +32,20 @@ import { SessionSummary } from "@/session/summary"
import { SessionPrompt } from "@/session/prompt"
import { Instruction } from "@/session/instruction"
import { LLM } from "@/session/llm"
-import { LSP } from "@/lsp"
+import { LSP } from "@/lsp/lsp"
import { MCP } from "@/mcp"
import { McpAuth } from "@/mcp/auth"
import { Command } from "@/command"
-import { Truncate } from "@/tool"
-import { ToolRegistry } from "@/tool"
+import { Truncate } from "@/tool/truncate"
+import { ToolRegistry } from "@/tool/registry"
import { Format } from "@/format"
-import { Project } from "@/project"
-import { Vcs } from "@/project"
+import { Project } from "@/project/project"
+import { Vcs } from "@/project/vcs"
import { Worktree } from "@/worktree"
import { Pty } from "@/pty"
import { Installation } from "@/installation"
-import { ShareNext } from "@/share"
-import { SessionShare } from "@/share"
+import { ShareNext } from "@/share/share-next"
+import { SessionShare } from "@/share/session"
import { Npm } from "@opencode-ai/core/npm"
import { memoMap } from "@opencode-ai/core/effect/memo-map"
diff --git a/packages/opencode/src/effect/bootstrap-runtime.ts b/packages/opencode/src/effect/bootstrap-runtime.ts
index 2d542bf24..7f1853852 100644
--- a/packages/opencode/src/effect/bootstrap-runtime.ts
+++ b/packages/opencode/src/effect/bootstrap-runtime.ts
@@ -1,15 +1,15 @@
import { Layer, ManagedRuntime } from "effect"
import { Plugin } from "@/plugin"
-import { LSP } from "@/lsp"
+import { LSP } from "@/lsp/lsp"
import { FileWatcher } from "@/file/watcher"
import { Format } from "@/format"
-import { ShareNext } from "@/share"
+import { ShareNext } from "@/share/share-next"
import { File } from "@/file"
-import { Vcs } from "@/project"
+import { Vcs } from "@/project/vcs"
import { Snapshot } from "@/snapshot"
import { Bus } from "@/bus"
-import { Config } from "@/config"
+import { Config } from "@/config/config"
import * as Observability from "@opencode-ai/core/effect/observability"
import { memoMap } from "@opencode-ai/core/effect/memo-map"
diff --git a/packages/opencode/src/effect/bridge.ts b/packages/opencode/src/effect/bridge.ts
index 03e5aefd2..281cfa010 100644
--- a/packages/opencode/src/effect/bridge.ts
+++ b/packages/opencode/src/effect/bridge.ts
@@ -2,7 +2,7 @@ import { Effect, Fiber } from "effect"
import { WorkspaceContext } from "@/control-plane/workspace-context"
import { Instance, type InstanceContext } from "@/project/instance"
import type { WorkspaceID } from "@/control-plane/schema"
-import { LocalContext } from "@/util"
+import { LocalContext } from "@/util/local-context"
import { InstanceRef, WorkspaceRef } from "./instance-ref"
import { attachWith } from "./run-service"
@@ -46,3 +46,5 @@ export function make(): Effect.Effect<Shape> {
} satisfies Shape
})
}
+
+export * as EffectBridge from "./bridge"
diff --git a/packages/opencode/src/effect/index.ts b/packages/opencode/src/effect/index.ts
deleted file mode 100644
index 623bd5f0b..000000000
--- a/packages/opencode/src/effect/index.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export * as InstanceState from "./instance-state"
-export * as EffectBridge from "./bridge"
-export * as Runner from "./runner"
-export * as Observability from "@opencode-ai/core/effect/observability"
-export * as EffectLogger from "@opencode-ai/core/effect/logger"
diff --git a/packages/opencode/src/effect/instance-state.ts b/packages/opencode/src/effect/instance-state.ts
index dc9214494..e467b6ef2 100644
--- a/packages/opencode/src/effect/instance-state.ts
+++ b/packages/opencode/src/effect/instance-state.ts
@@ -1,7 +1,7 @@
import { Effect, Fiber, ScopedCache, Scope, Context } from "effect"
import * as EffectLogger from "@opencode-ai/core/effect/logger"
import { Instance, type InstanceContext } from "@/project/instance"
-import { LocalContext } from "@/util"
+import { LocalContext } from "@/util/local-context"
import { InstanceRef, WorkspaceRef } from "./instance-ref"
import { registerDisposer } from "./instance-registry"
import { WorkspaceContext } from "@/control-plane/workspace-context"
@@ -79,3 +79,5 @@ export const invalidate = <A, E, R>(self: InstanceState<A, E, R>) =>
Effect.gen(function* () {
return yield* ScopedCache.invalidate(self.cache, yield* directory)
})
+
+export * as InstanceState from "./instance-state"
diff --git a/packages/opencode/src/effect/run-service.ts b/packages/opencode/src/effect/run-service.ts
index 2a54979af..28f1068c3 100644
--- a/packages/opencode/src/effect/run-service.ts
+++ b/packages/opencode/src/effect/run-service.ts
@@ -1,7 +1,7 @@
import { Effect, Layer, ManagedRuntime } from "effect"
import * as Context from "effect/Context"
import { Instance } from "@/project/instance"
-import { LocalContext } from "@/util"
+import { LocalContext } from "@/util/local-context"
import { InstanceRef, WorkspaceRef } from "./instance-ref"
import * as Observability from "@opencode-ai/core/effect/observability"
import { WorkspaceContext } from "@/control-plane/workspace-context"
diff --git a/packages/opencode/src/effect/runner.ts b/packages/opencode/src/effect/runner.ts
index 925c268f8..0e923b119 100644
--- a/packages/opencode/src/effect/runner.ts
+++ b/packages/opencode/src/effect/runner.ts
@@ -204,3 +204,5 @@ export const make = <A, E = never>(
cancel,
}
}
+
+export * as Runner from "./runner"
diff --git a/packages/opencode/src/env/index.ts b/packages/opencode/src/env/index.ts
index a53d96def..e7af61422 100644
--- a/packages/opencode/src/env/index.ts
+++ b/packages/opencode/src/env/index.ts
@@ -1,5 +1,5 @@
import { Context, Effect, Layer } from "effect"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
type State = Record<string, string | undefined>
diff --git a/packages/opencode/src/file/index.ts b/packages/opencode/src/file/index.ts
index 1308d3f69..122add21f 100644
--- a/packages/opencode/src/file/index.ts
+++ b/packages/opencode/src/file/index.ts
@@ -1,5 +1,5 @@
import { BusEvent } from "@/bus/bus-event"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Git } from "@/git"
@@ -11,7 +11,7 @@ import ignore from "ignore"
import path from "path"
import { Global } from "@opencode-ai/core/global"
import { Instance } from "../project/instance"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { Protected } from "./protected"
import { Ripgrep } from "./ripgrep"
import { zod } from "@/util/effect-zod"
diff --git a/packages/opencode/src/file/ripgrep.ts b/packages/opencode/src/file/ripgrep.ts
index da5981737..3a5411c31 100644
--- a/packages/opencode/src/file/ripgrep.ts
+++ b/packages/opencode/src/file/ripgrep.ts
@@ -8,7 +8,7 @@ import { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { Global } from "@opencode-ai/core/global"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { sanitizedProcessEnv } from "@opencode-ai/core/util/opencode-process"
import { which } from "@/util/which"
import { zod } from "@/util/effect-zod"
diff --git a/packages/opencode/src/file/watcher.ts b/packages/opencode/src/file/watcher.ts
index 57f3dda9f..004679d64 100644
--- a/packages/opencode/src/file/watcher.ts
+++ b/packages/opencode/src/file/watcher.ts
@@ -7,15 +7,15 @@ import path from "path"
import z from "zod"
import { Bus } from "@/bus"
import { BusEvent } from "@/bus/bus-event"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { Flag } from "@opencode-ai/core/flag/flag"
import { Git } from "@/git"
import { Instance } from "@/project/instance"
import { lazy } from "@/util/lazy"
-import { Config } from "../config"
+import { Config } from "@/config/config"
import { FileIgnore } from "./ignore"
import { Protected } from "./protected"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
declare const OPENCODE_LIBC: string | undefined
diff --git a/packages/opencode/src/format/formatter.ts b/packages/opencode/src/format/formatter.ts
index 82666b799..dbc132601 100644
--- a/packages/opencode/src/format/formatter.ts
+++ b/packages/opencode/src/format/formatter.ts
@@ -1,7 +1,7 @@
import { Npm } from "@opencode-ai/core/npm"
import type { InstanceContext } from "../project/instance"
-import { Filesystem } from "../util"
-import { Process } from "../util"
+import { Filesystem } from "@/util/filesystem"
+import { Process } from "@/util/process"
import { which } from "../util/which"
import { Flag } from "@opencode-ai/core/flag/flag"
diff --git a/packages/opencode/src/format/index.ts b/packages/opencode/src/format/index.ts
index 9fa53293f..7c122e350 100644
--- a/packages/opencode/src/format/index.ts
+++ b/packages/opencode/src/format/index.ts
@@ -1,11 +1,11 @@
import { Effect, Layer, Context, Schema } from "effect"
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import path from "path"
import { mergeDeep } from "remeda"
-import { Config } from "../config"
-import { Log } from "../util"
+import { Config } from "@/config/config"
+import * as Log from "@opencode-ai/core/util/log"
import * as Formatter from "./formatter"
import { zod } from "@/util/effect-zod"
import { withStatics } from "@/util/schema"
diff --git a/packages/opencode/src/ide/index.ts b/packages/opencode/src/ide/index.ts
index 4a2576f68..2df293f16 100644
--- a/packages/opencode/src/ide/index.ts
+++ b/packages/opencode/src/ide/index.ts
@@ -2,8 +2,8 @@ import { BusEvent } from "@/bus/bus-event"
import z from "zod"
import { Schema } from "effect"
import { NamedError } from "@opencode-ai/core/util/error"
-import { Log } from "../util"
-import { Process } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
+import { Process } from "@/util/process"
const SUPPORTED_IDES = [
{ name: "Windsurf" as const, cmd: "windsurf" },
diff --git a/packages/opencode/src/index.ts b/packages/opencode/src/index.ts
index 3c475f133..4c8e44704 100644
--- a/packages/opencode/src/index.ts
+++ b/packages/opencode/src/index.ts
@@ -2,7 +2,7 @@ import yargs from "yargs"
import { hideBin } from "yargs/helpers"
import { RunCommand } from "./cli/cmd/run"
import { GenerateCommand } from "./cli/cmd/generate"
-import { Log } from "./util"
+import * as Log from "@opencode-ai/core/util/log"
import { ConsoleCommand } from "./cli/cmd/account"
import { ProvidersCommand } from "./cli/cmd/providers"
import { AgentCommand } from "./cli/cmd/agent"
@@ -15,7 +15,7 @@ import { InstallationVersion } from "@opencode-ai/core/installation/version"
import { NamedError } from "@opencode-ai/core/util/error"
import { FormatError } from "./cli/error"
import { ServeCommand } from "./cli/cmd/serve"
-import { Filesystem } from "./util"
+import { Filesystem } from "@/util/filesystem"
import { DebugCommand } from "./cli/cmd/debug"
import { StatsCommand } from "./cli/cmd/stats"
import { McpCommand } from "./cli/cmd/mcp"
@@ -32,8 +32,8 @@ import { SessionCommand } from "./cli/cmd/session"
import { DbCommand } from "./cli/cmd/db"
import path from "path"
import { Global } from "@opencode-ai/core/global"
-import { JsonMigration } from "./storage"
-import { Database } from "./storage"
+import { JsonMigration } from "@/storage/json-migration"
+import { Database } from "@/storage/db"
import { errorMessage } from "./util/error"
import { PluginCommand } from "./cli/cmd/plug"
import { Heap } from "./cli/heap"
diff --git a/packages/opencode/src/installation/index.ts b/packages/opencode/src/installation/index.ts
index 35bb310e0..be3bc4769 100644
--- a/packages/opencode/src/installation/index.ts
+++ b/packages/opencode/src/installation/index.ts
@@ -7,7 +7,7 @@ import path from "path"
import z from "zod"
import { BusEvent } from "@/bus/bus-event"
import { Flag } from "@opencode-ai/core/flag/flag"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { makeRuntime } from "@opencode-ai/core/effect/runtime"
import semver from "semver"
import { InstallationChannel, InstallationVersion } from "@opencode-ai/core/installation/version"
diff --git a/packages/opencode/src/lsp/client.ts b/packages/opencode/src/lsp/client.ts
index 4eaa32f77..809ea9509 100644
--- a/packages/opencode/src/lsp/client.ts
+++ b/packages/opencode/src/lsp/client.ts
@@ -4,15 +4,15 @@ import path from "path"
import { pathToFileURL, fileURLToPath } from "url"
import { createMessageConnection, StreamMessageReader, StreamMessageWriter } from "vscode-jsonrpc/node"
import type { Diagnostic as VSCodeDiagnostic } from "vscode-languageserver-types"
-import { Log } from "../util"
-import { Process } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
+import { Process } from "@/util/process"
import { LANGUAGE_EXTENSIONS } from "./language"
import z from "zod"
import { Schema } from "effect"
import type * as LSPServer from "./server"
import { NamedError } from "@opencode-ai/core/util/error"
import { withTimeout } from "../util/timeout"
-import { Filesystem } from "../util"
+import { Filesystem } from "@/util/filesystem"
const DIAGNOSTICS_DEBOUNCE_MS = 150
const DIAGNOSTICS_DOCUMENT_WAIT_TIMEOUT_MS = 5_000
@@ -693,3 +693,5 @@ export async function create(input: { serverID: string; server: LSPServer.Handle
return result
}
+
+export * as LSPClient from "./client"
diff --git a/packages/opencode/src/lsp/index.ts b/packages/opencode/src/lsp/index.ts
deleted file mode 100644
index 9fc06fa21..000000000
--- a/packages/opencode/src/lsp/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * as LSP from "./lsp"
-export * as LSPClient from "./client"
-export * as LSPServer from "./server"
diff --git a/packages/opencode/src/lsp/launch.ts b/packages/opencode/src/lsp/launch.ts
index fb84666b0..4f687b197 100644
--- a/packages/opencode/src/lsp/launch.ts
+++ b/packages/opencode/src/lsp/launch.ts
@@ -1,5 +1,5 @@
import type { ChildProcessWithoutNullStreams } from "child_process"
-import { Process } from "../util"
+import { Process } from "@/util/process"
type Child = Process.Child & ChildProcessWithoutNullStreams
diff --git a/packages/opencode/src/lsp/lsp.ts b/packages/opencode/src/lsp/lsp.ts
index 96741b687..45a818997 100644
--- a/packages/opencode/src/lsp/lsp.ts
+++ b/packages/opencode/src/lsp/lsp.ts
@@ -1,17 +1,17 @@
import { BusEvent } from "@/bus/bus-event"
import { Bus } from "@/bus"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import * as LSPClient from "./client"
import path from "path"
import { pathToFileURL, fileURLToPath } from "url"
import * as LSPServer from "./server"
import z from "zod"
-import { Config } from "../config"
+import { Config } from "@/config/config"
import { Flag } from "@opencode-ai/core/flag/flag"
-import { Process } from "../util"
+import { Process } from "@/util/process"
import { spawn as lspspawn } from "./launch"
import { Effect, Layer, Context, Schema } from "effect"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { withStatics } from "@/util/schema"
import { zod, ZodOverride } from "@/util/effect-zod"
@@ -518,3 +518,5 @@ export const layer = Layer.effect(
export const defaultLayer = layer.pipe(Layer.provide(Config.defaultLayer))
export * as Diagnostic from "./diagnostic"
+
+export * as LSP from "./lsp"
diff --git a/packages/opencode/src/lsp/server.ts b/packages/opencode/src/lsp/server.ts
index 32a5239be..b8861d1f8 100644
--- a/packages/opencode/src/lsp/server.ts
+++ b/packages/opencode/src/lsp/server.ts
@@ -2,14 +2,14 @@ import type { ChildProcessWithoutNullStreams } from "child_process"
import path from "path"
import os from "os"
import { Global } from "@opencode-ai/core/global"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { text } from "node:stream/consumers"
import fs from "fs/promises"
-import { Filesystem } from "../util"
+import { Filesystem } from "@/util/filesystem"
import type { InstanceContext } from "../project/instance"
import { Flag } from "@opencode-ai/core/flag/flag"
-import { Archive } from "../util"
-import { Process } from "../util"
+import { Archive } from "@/util/archive"
+import { Process } from "@/util/process"
import { which } from "../util/which"
import { Module } from "@opencode-ai/core/util/module"
import { spawn } from "./launch"
diff --git a/packages/opencode/src/mcp/index.ts b/packages/opencode/src/mcp/index.ts
index 533466925..0a3137c0e 100644
--- a/packages/opencode/src/mcp/index.ts
+++ b/packages/opencode/src/mcp/index.ts
@@ -9,9 +9,9 @@ import {
type Tool as MCPToolDef,
ToolListChangedNotificationSchema,
} from "@modelcontextprotocol/sdk/types.js"
-import { Config } from "../config"
+import { Config } from "@/config/config"
import { ConfigMCP } from "../config/mcp"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { NamedError } from "@opencode-ai/core/util/error"
import z from "zod/v4"
import { Installation } from "../installation"
@@ -26,8 +26,8 @@ import { Bus } from "@/bus"
import { TuiEvent } from "@/cli/cmd/tui/event"
import open from "open"
import { Effect, Exit, Layer, Option, Context, Schema, Stream } from "effect"
-import { EffectBridge } from "@/effect"
-import { InstanceState } from "@/effect"
+import { EffectBridge } from "@/effect/bridge"
+import { InstanceState } from "@/effect/instance-state"
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { zod as effectZod } from "@/util/effect-zod"
diff --git a/packages/opencode/src/mcp/oauth-callback.ts b/packages/opencode/src/mcp/oauth-callback.ts
index fbb43d392..622cae61e 100644
--- a/packages/opencode/src/mcp/oauth-callback.ts
+++ b/packages/opencode/src/mcp/oauth-callback.ts
@@ -1,6 +1,6 @@
import { createConnection } from "net"
import { createServer } from "http"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { OAUTH_CALLBACK_PORT, OAUTH_CALLBACK_PATH, parseRedirectUri } from "./oauth-provider"
const log = Log.create({ service: "mcp.oauth-callback" })
diff --git a/packages/opencode/src/mcp/oauth-provider.ts b/packages/opencode/src/mcp/oauth-provider.ts
index fe09e14a5..45dcff50f 100644
--- a/packages/opencode/src/mcp/oauth-provider.ts
+++ b/packages/opencode/src/mcp/oauth-provider.ts
@@ -7,7 +7,7 @@ import type {
} from "@modelcontextprotocol/sdk/shared/auth.js"
import { Effect } from "effect"
import { McpAuth } from "./auth"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
const log = Log.create({ service: "mcp.oauth" })
diff --git a/packages/opencode/src/node.ts b/packages/opencode/src/node.ts
index 1cb30d808..9c29dcd98 100644
--- a/packages/opencode/src/node.ts
+++ b/packages/opencode/src/node.ts
@@ -1,6 +1,6 @@
-export { Config } from "./config"
+export { Config } from "@/config/config"
export { Server } from "./server/server"
export { bootstrap } from "./cli/bootstrap"
-export { Log } from "./util"
-export { Database } from "./storage"
-export { JsonMigration } from "./storage"
+export * as Log from "@opencode-ai/core/util/log"
+export { Database } from "@/storage/db"
+export { JsonMigration } from "@/storage/json-migration"
diff --git a/packages/opencode/src/patch/index.ts b/packages/opencode/src/patch/index.ts
index 3662f9e90..fd5fff562 100644
--- a/packages/opencode/src/patch/index.ts
+++ b/packages/opencode/src/patch/index.ts
@@ -2,7 +2,7 @@ import z from "zod"
import * as path from "path"
import * as fs from "fs/promises"
import { readFileSync } from "fs"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import * as Bom from "../util/bom"
const log = Log.create({ service: "patch" })
diff --git a/packages/opencode/src/permission/evaluate.ts b/packages/opencode/src/permission/evaluate.ts
index bcc4e5811..2b0604f4b 100644
--- a/packages/opencode/src/permission/evaluate.ts
+++ b/packages/opencode/src/permission/evaluate.ts
@@ -1,4 +1,4 @@
-import { Wildcard } from "@/util"
+import { Wildcard } from "@/util/wildcard"
type Rule = {
permission: string
diff --git a/packages/opencode/src/permission/index.ts b/packages/opencode/src/permission/index.ts
index 2dfa8e940..3fedd41d2 100644
--- a/packages/opencode/src/permission/index.ts
+++ b/packages/opencode/src/permission/index.ts
@@ -1,15 +1,16 @@
import { Bus } from "@/bus"
import { BusEvent } from "@/bus/bus-event"
import { ConfigPermission } from "@/config/permission"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { ProjectID } from "@/project/schema"
import { MessageID, SessionID } from "@/session/schema"
import { PermissionTable } from "@/session/session.sql"
-import { Database, eq } from "@/storage"
+import { Database } from "@/storage/db"
+import { eq } from "drizzle-orm"
import { zod } from "@/util/effect-zod"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { withStatics } from "@/util/schema"
-import { Wildcard } from "@/util"
+import { Wildcard } from "@/util/wildcard"
import { Deferred, Effect, Layer, Schema, Context } from "effect"
import os from "os"
import { evaluate as evalRule } from "./evaluate"
diff --git a/packages/opencode/src/plugin/codex.ts b/packages/opencode/src/plugin/codex.ts
index 337a4e91f..a0ff0002f 100644
--- a/packages/opencode/src/plugin/codex.ts
+++ b/packages/opencode/src/plugin/codex.ts
@@ -1,5 +1,5 @@
import type { Hooks, PluginInput } from "@opencode-ai/plugin"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { Installation } from "../installation"
import { InstallationVersion } from "@opencode-ai/core/installation/version"
import { OAUTH_DUMMY_KEY } from "../auth"
diff --git a/packages/opencode/src/plugin/github-copilot/copilot.ts b/packages/opencode/src/plugin/github-copilot/copilot.ts
index 6f0e46402..d24d9b9da 100644
--- a/packages/opencode/src/plugin/github-copilot/copilot.ts
+++ b/packages/opencode/src/plugin/github-copilot/copilot.ts
@@ -2,7 +2,7 @@ import type { Hooks, PluginInput } from "@opencode-ai/plugin"
import type { Model } from "@opencode-ai/sdk/v2"
import { InstallationVersion } from "@opencode-ai/core/installation/version"
import { iife } from "@/util/iife"
-import { Log } from "../../util"
+import * as Log from "@opencode-ai/core/util/log"
import { setTimeout as sleep } from "node:timers/promises"
import { CopilotModels } from "./models"
import { MessageV2 } from "@/session/message-v2"
diff --git a/packages/opencode/src/plugin/index.ts b/packages/opencode/src/plugin/index.ts
index 762d38be3..465d05310 100644
--- a/packages/opencode/src/plugin/index.ts
+++ b/packages/opencode/src/plugin/index.ts
@@ -5,21 +5,21 @@ import type {
PluginModule,
WorkspaceAdaptor as PluginWorkspaceAdaptor,
} from "@opencode-ai/plugin"
-import { Config } from "../config"
+import { Config } from "@/config/config"
import { Bus } from "../bus"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { createOpencodeClient } from "@opencode-ai/sdk"
import { Flag } from "@opencode-ai/core/flag/flag"
import { CodexAuthPlugin } from "./codex"
-import { Session } from "../session"
+import { Session } from "@/session/session"
import { NamedError } from "@opencode-ai/core/util/error"
import { CopilotAuthPlugin } from "./github-copilot/copilot"
import { gitlabAuthPlugin as GitlabAuthPlugin } from "opencode-gitlab-auth"
import { PoeAuthPlugin } from "opencode-poe-auth"
import { CloudflareAIGatewayAuthPlugin, CloudflareWorkersAuthPlugin } from "./cloudflare"
import { Effect, Layer, Context, Stream } from "effect"
-import { EffectBridge } from "@/effect"
-import { InstanceState } from "@/effect"
+import { EffectBridge } from "@/effect/bridge"
+import { InstanceState } from "@/effect/instance-state"
import { errorMessage } from "@/util/error"
import { PluginLoader } from "./loader"
import { parsePluginSpecifier, readPluginId, readV1Plugin, resolvePluginId } from "./shared"
diff --git a/packages/opencode/src/plugin/install.ts b/packages/opencode/src/plugin/install.ts
index a76048312..f07b78bc3 100644
--- a/packages/opencode/src/plugin/install.ts
+++ b/packages/opencode/src/plugin/install.ts
@@ -9,7 +9,7 @@ import {
import * as ConfigPaths from "@/config/paths"
import { Global } from "@opencode-ai/core/global"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
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 4bc8f5772..54f784d17 100644
--- a/packages/opencode/src/plugin/meta.ts
+++ b/packages/opencode/src/plugin/meta.ts
@@ -3,7 +3,7 @@ import { fileURLToPath } from "url"
import { Flag } from "@opencode-ai/core/flag/flag"
import { Global } from "@opencode-ai/core/global"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import { Flock } from "@opencode-ai/core/util/flock"
import { parsePluginSpecifier, pluginSource } from "./shared"
diff --git a/packages/opencode/src/plugin/shared.ts b/packages/opencode/src/plugin/shared.ts
index a930d5b26..1a519359b 100644
--- a/packages/opencode/src/plugin/shared.ts
+++ b/packages/opencode/src/plugin/shared.ts
@@ -2,7 +2,7 @@ import path from "path"
import { fileURLToPath, pathToFileURL } from "url"
import npa from "npm-package-arg"
import semver from "semver"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import { isRecord } from "@/util/record"
import { Npm } from "@opencode-ai/core/npm"
diff --git a/packages/opencode/src/project/bootstrap.ts b/packages/opencode/src/project/bootstrap.ts
index a7c071a9f..2ea07bb8d 100644
--- a/packages/opencode/src/project/bootstrap.ts
+++ b/packages/opencode/src/project/bootstrap.ts
@@ -1,6 +1,6 @@
import { Plugin } from "../plugin"
import { Format } from "../format"
-import { LSP } from "../lsp"
+import { LSP } from "@/lsp/lsp"
import { File } from "../file"
import { Snapshot } from "../snapshot"
import * as Project from "./project"
@@ -8,11 +8,11 @@ import * as Vcs from "./vcs"
import { Bus } from "../bus"
import { Command } from "../command"
import { Instance } from "./instance"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { FileWatcher } from "@/file/watcher"
-import { ShareNext } from "@/share"
+import { ShareNext } from "@/share/share-next"
import * as Effect from "effect/Effect"
-import { Config } from "@/config"
+import { Config } from "@/config/config"
export const InstanceBootstrap = Effect.gen(function* () {
Log.Default.info("bootstrapping", { directory: Instance.directory })
diff --git a/packages/opencode/src/project/index.ts b/packages/opencode/src/project/index.ts
deleted file mode 100644
index d9f168f6f..000000000
--- a/packages/opencode/src/project/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * as Vcs from "./vcs"
-export * as Project from "./project"
diff --git a/packages/opencode/src/project/instance.ts b/packages/opencode/src/project/instance.ts
index cd2013674..623e88623 100644
--- a/packages/opencode/src/project/instance.ts
+++ b/packages/opencode/src/project/instance.ts
@@ -3,8 +3,8 @@ import { disposeInstance } from "@/effect/instance-registry"
import { makeRuntime } from "@/effect/run-service"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { iife } from "@/util/iife"
-import { Log } from "@/util"
-import { LocalContext } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
+import { LocalContext } from "@/util/local-context"
import * as Project from "./project"
import { WorkspaceContext } from "@/control-plane/workspace-context"
diff --git a/packages/opencode/src/project/project.ts b/packages/opencode/src/project/project.ts
index c26114506..648bfc8fe 100644
--- a/packages/opencode/src/project/project.ts
+++ b/packages/opencode/src/project/project.ts
@@ -1,8 +1,10 @@
import z from "zod"
-import { and, Database, eq } from "../storage"
+import { and } from "drizzle-orm"
+import { Database } from "@/storage/db"
+import { eq } from "drizzle-orm"
import { ProjectTable } from "./project.sql"
import { SessionTable } from "../session/session.sql"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { Flag } from "@opencode-ai/core/flag/flag"
import { BusEvent } from "@/bus/bus-event"
import { GlobalBus } from "@/bus/global"
@@ -504,3 +506,5 @@ export function setInitialized(id: ProjectID) {
db.update(ProjectTable).set({ time_initialized: Date.now() }).where(eq(ProjectTable.id, id)).run(),
)
}
+
+export * as Project from "./project"
diff --git a/packages/opencode/src/project/vcs.ts b/packages/opencode/src/project/vcs.ts
index 2fbab4f63..e12a031d6 100644
--- a/packages/opencode/src/project/vcs.ts
+++ b/packages/opencode/src/project/vcs.ts
@@ -3,11 +3,11 @@ import { formatPatch, structuredPatch } from "diff"
import path from "path"
import { Bus } from "@/bus"
import { BusEvent } from "@/bus/bus-event"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { FileWatcher } from "@/file/watcher"
import { Git } from "@/git"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { zod } from "@/util/effect-zod"
import { withStatics } from "@/util/schema"
@@ -222,3 +222,5 @@ export const defaultLayer = layer.pipe(
Layer.provide(AppFileSystem.defaultLayer),
Layer.provide(Bus.layer),
)
+
+export * as Vcs from "./vcs"
diff --git a/packages/opencode/src/provider/auth.ts b/packages/opencode/src/provider/auth.ts
index 0b4ac995a..4df83f020 100644
--- a/packages/opencode/src/provider/auth.ts
+++ b/packages/opencode/src/provider/auth.ts
@@ -1,6 +1,6 @@
import type { AuthOAuthResult, Hooks } from "@opencode-ai/plugin"
import { Auth } from "@/auth"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { zod } from "@/util/effect-zod"
import { namedSchemaError } from "@/util/named-schema-error"
import { withStatics } from "@/util/schema"
@@ -222,3 +222,5 @@ export const layer: Layer.Layer<Service, never, Auth.Service | Plugin.Service> =
export const defaultLayer = Layer.suspend(() =>
layer.pipe(Layer.provide(Auth.defaultLayer), Layer.provide(Plugin.defaultLayer)),
)
+
+export * as ProviderAuth from "./auth"
diff --git a/packages/opencode/src/provider/error.ts b/packages/opencode/src/provider/error.ts
index a4f629caf..3877dcb7f 100644
--- a/packages/opencode/src/provider/error.ts
+++ b/packages/opencode/src/provider/error.ts
@@ -199,3 +199,5 @@ export function parseAPICallError(input: { providerID: ProviderID; error: APICal
metadata,
}
}
+
+export * as ProviderError from "./error"
diff --git a/packages/opencode/src/provider/index.ts b/packages/opencode/src/provider/index.ts
deleted file mode 100644
index 9e8891144..000000000
--- a/packages/opencode/src/provider/index.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export * as Provider from "./provider"
-export * as ProviderAuth from "./auth"
-export * as ProviderError from "./error"
-export * as ModelsDev from "./models"
-export * as ProviderTransform from "./transform"
diff --git a/packages/opencode/src/provider/models.ts b/packages/opencode/src/provider/models.ts
index 8d7d7b03b..ed2d11eb7 100644
--- a/packages/opencode/src/provider/models.ts
+++ b/packages/opencode/src/provider/models.ts
@@ -1,11 +1,11 @@
import { Global } from "@opencode-ai/core/global"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import path from "path"
import { Schema } from "effect"
import { Installation } from "../installation"
import { Flag } from "@opencode-ai/core/flag/flag"
import { lazy } from "@/util/lazy"
-import { Filesystem } from "../util"
+import { Filesystem } from "@/util/filesystem"
import { Flock } from "@opencode-ai/core/util/flock"
import { Hash } from "@opencode-ai/core/util/hash"
@@ -172,3 +172,5 @@ if (!Flag.OPENCODE_DISABLE_MODELS_FETCH && !process.argv.includes("--get-yargs-c
60 * 1000 * 60,
).unref()
}
+
+export * as ModelsDev from "./models"
diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts
index 04d53a685..841fd97f0 100644
--- a/packages/opencode/src/provider/provider.ts
+++ b/packages/opencode/src/provider/provider.ts
@@ -1,9 +1,9 @@
import os from "os"
import fuzzysort from "fuzzysort"
-import { Config } from "../config"
+import { Config } from "@/config/config"
import { mapValues, mergeDeep, omit, pickBy, sortBy } from "remeda"
import { NoSuchModelError, type Provider as SDK } from "ai"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { Npm } from "@opencode-ai/core/npm"
import { Hash } from "@opencode-ai/core/util/hash"
import { Plugin } from "../plugin"
@@ -20,8 +20,8 @@ import { Global } from "@opencode-ai/core/global"
import path from "path"
import { pathToFileURL } from "url"
import { Effect, Layer, Context, Schema, Types } from "effect"
-import { EffectBridge } from "@/effect"
-import { InstanceState } from "@/effect"
+import { EffectBridge } from "@/effect/bridge"
+import { InstanceState } from "@/effect/instance-state"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { isRecord } from "@/util/record"
import { withStatics } from "@/util/schema"
@@ -112,7 +112,7 @@ const BUNDLED_PROVIDERS: Record<string, () => Promise<(opts: any) => BundledSDK>
"@ai-sdk/vercel": () => import("@ai-sdk/vercel").then((m) => m.createVercel),
"@ai-sdk/alibaba": () => import("@ai-sdk/alibaba").then((m) => m.createAlibaba),
"gitlab-ai-provider": () => import("gitlab-ai-provider").then((m) => m.createGitLab),
- "@ai-sdk/github-copilot": () => import("./sdk/copilot").then((m) => m.createOpenaiCompatible),
+ "@ai-sdk/github-copilot": () => import("./sdk/copilot/copilot-provider").then((m) => m.createOpenaiCompatible),
"venice-ai-sdk-provider": () => import("venice-ai-sdk-provider").then((m) => m.createVenice),
}
@@ -1728,3 +1728,5 @@ export const ModelNotFoundError = namedSchemaError("ProviderModelNotFoundError",
export const InitError = namedSchemaError("ProviderInitError", {
providerID: ProviderID,
})
+
+export * as Provider from "./provider"
diff --git a/packages/opencode/src/provider/sdk/copilot/index.ts b/packages/opencode/src/provider/sdk/copilot/index.ts
deleted file mode 100644
index 4da9cc21f..000000000
--- a/packages/opencode/src/provider/sdk/copilot/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { createOpenaiCompatible, openaiCompatible } from "./copilot-provider"
-export type { OpenaiCompatibleProvider, OpenaiCompatibleProviderSettings } from "./copilot-provider"
diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts
index 5e9da5c08..6e82d211e 100644
--- a/packages/opencode/src/provider/transform.ts
+++ b/packages/opencode/src/provider/transform.ts
@@ -1167,3 +1167,5 @@ export function schema(model: Provider.Model, schema: JSONSchema.BaseSchema | JS
return schema as JSONSchema7
}
+
+export * as ProviderTransform from "./transform"
diff --git a/packages/opencode/src/pty/index.ts b/packages/opencode/src/pty/index.ts
index 5dcb9e7ac..beccade09 100644
--- a/packages/opencode/src/pty/index.ts
+++ b/packages/opencode/src/pty/index.ts
@@ -1,13 +1,14 @@
import { BusEvent } from "@/bus/bus-event"
import { Bus } from "@/bus"
-import { Config } from "@/config"
-import { InstanceState, EffectBridge } from "@/effect"
+import { Config } from "@/config/config"
+import { InstanceState } from "@/effect/instance-state"
+import { EffectBridge } from "@/effect/bridge"
import { lazy } from "@opencode-ai/core/util/lazy"
import { Plugin } from "@/plugin"
import { Instance } from "@/project/instance"
import { Shell } from "@/shell/shell"
import type { Proc } from "#pty"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { PtyID } from "./schema"
import { Effect, Layer, Context, Schema, Types } from "effect"
import { zod } from "@/util/effect-zod"
diff --git a/packages/opencode/src/question/index.ts b/packages/opencode/src/question/index.ts
index 626c71826..d52f353da 100644
--- a/packages/opencode/src/question/index.ts
+++ b/packages/opencode/src/question/index.ts
@@ -1,10 +1,10 @@
import { Deferred, Effect, Layer, Schema, Context } from "effect"
import { Bus } from "@/bus"
import { BusEvent } from "@/bus/bus-event"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { SessionID, MessageID } from "@/session/schema"
import { zod } from "@/util/effect-zod"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { withStatics } from "@/util/schema"
import { QuestionID } from "./schema"
diff --git a/packages/opencode/src/server/error.ts b/packages/opencode/src/server/error.ts
index 73d28e735..7c5861d91 100644
--- a/packages/opencode/src/server/error.ts
+++ b/packages/opencode/src/server/error.ts
@@ -1,6 +1,6 @@
import { resolver } from "hono-openapi"
import z from "zod"
-import { NotFoundError } from "../storage"
+import { NotFoundError } from "@/storage/storage"
export const ERRORS = {
400: {
diff --git a/packages/opencode/src/server/fence.ts b/packages/opencode/src/server/fence.ts
index b461a9dac..ce9a9dba6 100644
--- a/packages/opencode/src/server/fence.ts
+++ b/packages/opencode/src/server/fence.ts
@@ -1,9 +1,10 @@
import type { MiddlewareHandler } from "hono"
-import { Database, inArray } from "@/storage"
+import { Database } from "@/storage/db"
+import { inArray } from "drizzle-orm"
import { EventSequenceTable } from "@/sync/event.sql"
import { Workspace } from "@/control-plane/workspace"
import type { WorkspaceID } from "@/control-plane/schema"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
const HEADER = "x-opencode-sync"
type State = Record<string, number>
diff --git a/packages/opencode/src/server/mdns.ts b/packages/opencode/src/server/mdns.ts
index 580456754..581139ddc 100644
--- a/packages/opencode/src/server/mdns.ts
+++ b/packages/opencode/src/server/mdns.ts
@@ -1,4 +1,4 @@
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { Bonjour } from "bonjour-service"
const log = Log.create({ service: "mdns" })
diff --git a/packages/opencode/src/server/middleware.ts b/packages/opencode/src/server/middleware.ts
index aceba8821..ffcfd4ce0 100644
--- a/packages/opencode/src/server/middleware.ts
+++ b/packages/opencode/src/server/middleware.ts
@@ -1,11 +1,11 @@
-import { Provider } from "../provider"
+import { Provider } from "@/provider/provider"
import { NamedError } from "@opencode-ai/core/util/error"
-import { NotFoundError } from "../storage"
-import { Session } from "../session"
+import { NotFoundError } from "@/storage/storage"
+import { Session } from "@/session/session"
import type { ContentfulStatusCode } from "hono/utils/http-status"
import type { ErrorHandler, MiddlewareHandler } from "hono"
import { HTTPException } from "hono/http-exception"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { Flag } from "@opencode-ai/core/flag/flag"
import { basicAuth } from "hono/basic-auth"
import { cors } from "hono/cors"
diff --git a/packages/opencode/src/server/projectors.ts b/packages/opencode/src/server/projectors.ts
index 18c273d58..367e3715e 100644
--- a/packages/opencode/src/server/projectors.ts
+++ b/packages/opencode/src/server/projectors.ts
@@ -1,8 +1,9 @@
import sessionProjectors from "../session/projectors"
import { SyncEvent } from "@/sync"
-import { Session } from "@/session"
+import { Session } from "@/session/session"
import { SessionTable } from "@/session/session.sql"
-import { Database, eq } from "@/storage"
+import { Database } from "@/storage/db"
+import { eq } from "drizzle-orm"
export function initProjectors() {
SyncEvent.init({
diff --git a/packages/opencode/src/server/proxy.ts b/packages/opencode/src/server/proxy.ts
index 4d9bcd117..441d7a5c2 100644
--- a/packages/opencode/src/server/proxy.ts
+++ b/packages/opencode/src/server/proxy.ts
@@ -1,6 +1,6 @@
import { Hono } from "hono"
import type { UpgradeWebSocket } from "hono/ws"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import * as Fence from "./fence"
import type { WorkspaceID } from "@/control-plane/schema"
import { Workspace } from "@/control-plane/workspace"
diff --git a/packages/opencode/src/server/routes/control/index.ts b/packages/opencode/src/server/routes/control/index.ts
index 60883274a..c5b39abde 100644
--- a/packages/opencode/src/server/routes/control/index.ts
+++ b/packages/opencode/src/server/routes/control/index.ts
@@ -1,6 +1,6 @@
import { Auth } from "@/auth"
import { AppRuntime } from "@/effect/app-runtime"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { Effect } from "effect"
import { ProviderID } from "@/provider/schema"
import { Hono } from "hono"
diff --git a/packages/opencode/src/server/routes/control/workspace.ts b/packages/opencode/src/server/routes/control/workspace.ts
index bf5584347..19fbc757f 100644
--- a/packages/opencode/src/server/routes/control/workspace.ts
+++ b/packages/opencode/src/server/routes/control/workspace.ts
@@ -8,7 +8,7 @@ import { zodObject } from "@/util/effect-zod"
import { Instance } from "@/project/instance"
import { errors } from "../../error"
import { lazy } from "@/util/lazy"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { errorData } from "@/util/error"
const log = Log.create({ service: "server.workspace" })
diff --git a/packages/opencode/src/server/routes/global.ts b/packages/opencode/src/server/routes/global.ts
index c2f8b695d..e78df61c2 100644
--- a/packages/opencode/src/server/routes/global.ts
+++ b/packages/opencode/src/server/routes/global.ts
@@ -11,9 +11,9 @@ import { AsyncQueue } from "@/util/queue"
import { Instance } from "../../project/instance"
import { Installation } from "@/installation"
import { InstallationVersion } from "@opencode-ai/core/installation/version"
-import { Log } from "../../util"
+import * as Log from "@opencode-ai/core/util/log"
import { lazy } from "../../util/lazy"
-import { Config } from "../../config"
+import { Config } from "@/config/config"
import { errors } from "../error"
const log = Log.create({ service: "server" })
diff --git a/packages/opencode/src/server/routes/instance/config.ts b/packages/opencode/src/server/routes/instance/config.ts
index 88e5feef9..f055917b0 100644
--- a/packages/opencode/src/server/routes/instance/config.ts
+++ b/packages/opencode/src/server/routes/instance/config.ts
@@ -1,8 +1,8 @@
import { Hono } from "hono"
import { describeRoute, validator, resolver } from "hono-openapi"
import z from "zod"
-import { Config } from "@/config"
-import { Provider } from "@/provider"
+import { Config } from "@/config/config"
+import { Provider } from "@/provider/provider"
import { errors } from "../../error"
import { lazy } from "@/util/lazy"
import { jsonRequest } from "./trace"
diff --git a/packages/opencode/src/server/routes/instance/event.ts b/packages/opencode/src/server/routes/instance/event.ts
index 1d883bd88..474d92b31 100644
--- a/packages/opencode/src/server/routes/instance/event.ts
+++ b/packages/opencode/src/server/routes/instance/event.ts
@@ -2,7 +2,7 @@ import z from "zod"
import { Hono } from "hono"
import { describeRoute, resolver } from "hono-openapi"
import { streamSSE } from "hono/streaming"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { BusEvent } from "@/bus/bus-event"
import { Bus } from "@/bus"
import { AsyncQueue } from "@/util/queue"
diff --git a/packages/opencode/src/server/routes/instance/experimental.ts b/packages/opencode/src/server/routes/instance/experimental.ts
index a407590f2..9c50abd62 100644
--- a/packages/opencode/src/server/routes/instance/experimental.ts
+++ b/packages/opencode/src/server/routes/instance/experimental.ts
@@ -3,13 +3,13 @@ import { describeRoute, validator, resolver } from "hono-openapi"
import z from "zod"
import * as EffectZod from "@/util/effect-zod"
import { ProviderID, ModelID } from "@/provider/schema"
-import { ToolRegistry } from "@/tool"
+import { ToolRegistry } from "@/tool/registry"
import { Worktree } from "@/worktree"
import { Instance } from "@/project/instance"
-import { Project } from "@/project"
+import { Project } from "@/project/project"
import { MCP } from "@/mcp"
-import { Session } from "@/session"
-import { Config } from "@/config"
+import { Session } from "@/session/session"
+import { Config } from "@/config/config"
import { ConsoleState } from "@/config/console-state"
import { Account } from "@/account/account"
import { AccountID, OrgID } from "@/account/schema"
diff --git a/packages/opencode/src/server/routes/instance/file.ts b/packages/opencode/src/server/routes/instance/file.ts
index 65b3cbad3..d0e9ee618 100644
--- a/packages/opencode/src/server/routes/instance/file.ts
+++ b/packages/opencode/src/server/routes/instance/file.ts
@@ -3,7 +3,7 @@ import { describeRoute, validator, resolver } from "hono-openapi"
import z from "zod"
import { File } from "@/file"
import { Ripgrep } from "@/file/ripgrep"
-import { LSP } from "@/lsp"
+import { LSP } from "@/lsp/lsp"
import { Instance } from "@/project/instance"
import { lazy } from "@/util/lazy"
import { jsonRequest } from "./trace"
diff --git a/packages/opencode/src/server/routes/instance/httpapi/config.ts b/packages/opencode/src/server/routes/instance/httpapi/config.ts
index d7808c78d..e659cf74e 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/config.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/config.ts
@@ -1,5 +1,5 @@
-import { Config } from "@/config"
-import { Provider } from "@/provider"
+import { Config } from "@/config/config"
+import { Provider } from "@/provider/provider"
import * as InstanceState from "@/effect/instance-state"
import { Effect, Layer } from "effect"
import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, OpenApi } from "effect/unstable/httpapi"
diff --git a/packages/opencode/src/server/routes/instance/httpapi/event.ts b/packages/opencode/src/server/routes/instance/httpapi/event.ts
index dc5fa9c53..78113e976 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/event.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/event.ts
@@ -1,5 +1,5 @@
import { Bus } from "@/bus"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { Effect } from "effect"
import * as Stream from "effect/Stream"
import { HttpRouter, HttpServerResponse } from "effect/unstable/http"
diff --git a/packages/opencode/src/server/routes/instance/httpapi/experimental.ts b/packages/opencode/src/server/routes/instance/httpapi/experimental.ts
index f11191d64..caf32bcbb 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/experimental.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/experimental.ts
@@ -1,13 +1,13 @@
import { Account } from "@/account/account"
import { AccountID, OrgID } from "@/account/schema"
import { Agent } from "@/agent/agent"
-import { Config } from "@/config"
-import { InstanceState } from "@/effect"
+import { Config } from "@/config/config"
+import { InstanceState } from "@/effect/instance-state"
import { MCP } from "@/mcp"
-import { Project } from "@/project"
+import { Project } from "@/project/project"
import { ProviderID, ModelID } from "@/provider/schema"
-import { Session } from "@/session"
-import { ToolRegistry } from "@/tool"
+import { Session } from "@/session/session"
+import { ToolRegistry } from "@/tool/registry"
import * as EffectZod from "@/util/effect-zod"
import { Worktree } from "@/worktree"
import { Effect, Layer, Option, Schema } from "effect"
diff --git a/packages/opencode/src/server/routes/instance/httpapi/file.ts b/packages/opencode/src/server/routes/instance/httpapi/file.ts
index 5222f4ab8..9f2ab8a3c 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/file.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/file.ts
@@ -1,7 +1,7 @@
import { File } from "@/file"
import { Ripgrep } from "@/file/ripgrep"
import * as InstanceState from "@/effect/instance-state"
-import { LSP } from "@/lsp"
+import { LSP } from "@/lsp/lsp"
import { Effect, Layer, Schema } from "effect"
import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, OpenApi } from "effect/unstable/httpapi"
import { Authorization } from "./auth"
diff --git a/packages/opencode/src/server/routes/instance/httpapi/instance.ts b/packages/opencode/src/server/routes/instance/httpapi/instance.ts
index 8788dee5f..d36c43c76 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/instance.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/instance.ts
@@ -2,8 +2,8 @@ import { Agent } from "@/agent/agent"
import { Command } from "@/command"
import { Format } from "@/format"
import { Global } from "@opencode-ai/core/global"
-import { LSP } from "@/lsp"
-import { Vcs } from "@/project"
+import { LSP } from "@/lsp/lsp"
+import { Vcs } from "@/project/vcs"
import { Skill } from "@/skill"
import * as InstanceState from "@/effect/instance-state"
import { Effect, Layer, Schema } from "effect"
diff --git a/packages/opencode/src/server/routes/instance/httpapi/project.ts b/packages/opencode/src/server/routes/instance/httpapi/project.ts
index 73152de0e..f5a39e39e 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/project.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/project.ts
@@ -1,6 +1,6 @@
import * as InstanceState from "@/effect/instance-state"
import { AppRuntime } from "@/effect/app-runtime"
-import { Project } from "@/project"
+import { Project } from "@/project/project"
import { InstanceBootstrap } from "@/project/bootstrap"
import { ProjectID } from "@/project/schema"
import { Effect, Layer, Schema } from "effect"
diff --git a/packages/opencode/src/server/routes/instance/httpapi/provider.ts b/packages/opencode/src/server/routes/instance/httpapi/provider.ts
index dd1a21d2b..9f4be61ad 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/provider.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/provider.ts
@@ -1,7 +1,7 @@
-import { ProviderAuth } from "@/provider"
-import { Config } from "@/config"
-import { ModelsDev } from "@/provider"
-import { Provider } from "@/provider"
+import { ProviderAuth } from "@/provider/auth"
+import { Config } from "@/config/config"
+import { ModelsDev } from "@/provider/models"
+import { Provider } from "@/provider/provider"
import { ProviderID } from "@/provider/schema"
import { mapValues } from "remeda"
import { Effect, Layer, Schema } from "effect"
diff --git a/packages/opencode/src/server/routes/instance/httpapi/pty.ts b/packages/opencode/src/server/routes/instance/httpapi/pty.ts
index de29d9609..930322ff3 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/pty.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/pty.ts
@@ -1,4 +1,4 @@
-import { EffectBridge } from "@/effect"
+import { EffectBridge } from "@/effect/bridge"
import { Pty } from "@/pty"
import { PtyID } from "@/pty/schema"
import { Effect, Layer, Schema } from "effect"
diff --git a/packages/opencode/src/server/routes/instance/httpapi/server.ts b/packages/opencode/src/server/routes/instance/httpapi/server.ts
index 0501ce5af..6a719d94b 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/server.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/server.ts
@@ -4,13 +4,13 @@ import { HttpRouter, HttpServer, HttpServerRequest } from "effect/unstable/http"
import { Bus } from "@/bus"
import { AppRuntime } from "@/effect/app-runtime"
import { InstanceRef, WorkspaceRef } from "@/effect/instance-ref"
-import { Observability } from "@/effect"
+import * as Observability from "@opencode-ai/core/effect/observability"
import { InstanceBootstrap } from "@/project/bootstrap"
import { Instance } from "@/project/instance"
import { Pty } from "@/pty"
-import { Session } from "@/session"
+import { Session } from "@/session/session"
import { lazy } from "@/util/lazy"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import { authorizationLayer } from "./auth"
import { ConfigApi, configHandlers } from "./config"
import { eventRoute } from "./event"
diff --git a/packages/opencode/src/server/routes/instance/httpapi/session.ts b/packages/opencode/src/server/routes/instance/httpapi/session.ts
index 0d25c5bd9..dccfb3ecb 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/session.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/session.ts
@@ -7,8 +7,8 @@ import { Permission } from "@/permission"
import { PermissionID } from "@/permission/schema"
import { Instance } from "@/project/instance"
import { ModelID, ProviderID } from "@/provider/schema"
-import { SessionShare } from "@/share"
-import { Session } from "@/session"
+import { SessionShare } from "@/share/session"
+import { Session } from "@/session/session"
import { SessionCompaction } from "@/session/compaction"
import { MessageV2 } from "@/session/message-v2"
import { SessionPrompt } from "@/session/prompt"
@@ -19,7 +19,7 @@ import { SessionSummary } from "@/session/summary"
import { Todo } from "@/session/todo"
import { MessageID, PartID, SessionID } from "@/session/schema"
import { Snapshot } from "@/snapshot"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { NamedError } from "@opencode-ai/core/util/error"
import { Effect, Layer, Schema, Struct } from "effect"
import * as Stream from "effect/Stream"
diff --git a/packages/opencode/src/server/routes/instance/httpapi/sync.ts b/packages/opencode/src/server/routes/instance/httpapi/sync.ts
index aa213cc16..8e19cdccd 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/sync.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/sync.ts
@@ -1,6 +1,12 @@
import { startWorkspaceSyncing } from "@/control-plane/workspace"
import * as InstanceState from "@/effect/instance-state"
-import { Database, asc, and, eq, lte, not, or } from "@/storage"
+import { Database } from "@/storage/db"
+import { asc } from "drizzle-orm"
+import { and } from "drizzle-orm"
+import { eq } from "drizzle-orm"
+import { lte } from "drizzle-orm"
+import { not } from "drizzle-orm"
+import { or } from "drizzle-orm"
import { SyncEvent } from "@/sync"
import { EventTable } from "@/sync/event.sql"
import { Effect, Layer, Schema } from "effect"
diff --git a/packages/opencode/src/server/routes/instance/httpapi/tui.ts b/packages/opencode/src/server/routes/instance/httpapi/tui.ts
index 55f53df98..030644bff 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/tui.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/tui.ts
@@ -1,7 +1,9 @@
import { Bus } from "@/bus"
import { TuiEvent } from "@/cli/cmd/tui/event"
-import { Session } from "@/session"
import { SessionID } from "@/session/schema"
+import { SessionTable } from "@/session/session.sql"
+import * as Database from "@/storage/db"
+import { eq } from "drizzle-orm"
import { Effect, Layer, Schema } from "effect"
import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiError, HttpApiGroup, OpenApi } from "effect/unstable/httpapi"
import { nextTuiRequest, submitTuiResponse } from "../tui"
@@ -181,7 +183,6 @@ export const TuiApi = HttpApi.make("tui")
export const tuiHandlers = Layer.unwrap(
Effect.gen(function* () {
const bus = yield* Bus.Service
- const session = yield* Session.Service
const publishCommand = (command: typeof TuiEvent.CommandExecute.properties.Type.command) =>
bus.publish(TuiEvent.CommandExecute, { command })
@@ -250,9 +251,10 @@ export const tuiHandlers = Layer.unwrap(
const selectSession = Effect.fn("TuiHttpApi.selectSession")(function* (ctx: {
payload: typeof TuiEvent.SessionSelect.properties.Type
}) {
- yield* session
- .get(ctx.payload.sessionID)
- .pipe(Effect.catchCause(() => Effect.fail(new HttpApiError.NotFound({}))))
+ const row = yield* Effect.sync(() =>
+ Database.use((db) => db.select({ id: SessionTable.id }).from(SessionTable).where(eq(SessionTable.id, ctx.payload.sessionID)).get()),
+ )
+ if (!row) return yield* new HttpApiError.NotFound({})
yield* bus.publish(TuiEvent.SessionSelect, ctx.payload)
return true
})
diff --git a/packages/opencode/src/server/routes/instance/index.ts b/packages/opencode/src/server/routes/instance/index.ts
index 24328bde7..86a1db12b 100644
--- a/packages/opencode/src/server/routes/instance/index.ts
+++ b/packages/opencode/src/server/routes/instance/index.ts
@@ -6,11 +6,11 @@ import z from "zod"
import { Format } from "@/format"
import { TuiRoutes } from "./tui"
import { Instance } from "@/project/instance"
-import { Vcs } from "@/project"
+import { Vcs } from "@/project/vcs"
import { Agent } from "@/agent/agent"
import { Skill } from "@/skill"
import { Global } from "@opencode-ai/core/global"
-import { LSP } from "@/lsp"
+import { LSP } from "@/lsp/lsp"
import { Command } from "@/command"
import { QuestionRoutes } from "./question"
import { PermissionRoutes } from "./permission"
diff --git a/packages/opencode/src/server/routes/instance/project.ts b/packages/opencode/src/server/routes/instance/project.ts
index 5acef6d78..b9f86b183 100644
--- a/packages/opencode/src/server/routes/instance/project.ts
+++ b/packages/opencode/src/server/routes/instance/project.ts
@@ -2,7 +2,7 @@ import { Hono } from "hono"
import { describeRoute, validator } from "hono-openapi"
import { resolver } from "hono-openapi"
import { Instance } from "@/project/instance"
-import { Project } from "@/project"
+import { Project } from "@/project/project"
import z from "zod"
import { ProjectID } from "@/project/schema"
import { errors } from "../../error"
diff --git a/packages/opencode/src/server/routes/instance/provider.ts b/packages/opencode/src/server/routes/instance/provider.ts
index 617980e39..cc6735590 100644
--- a/packages/opencode/src/server/routes/instance/provider.ts
+++ b/packages/opencode/src/server/routes/instance/provider.ts
@@ -1,10 +1,10 @@
import { Hono } from "hono"
import { describeRoute, validator, resolver } from "hono-openapi"
import z from "zod"
-import { Config } from "@/config"
-import { Provider } from "@/provider"
-import { ModelsDev } from "@/provider"
-import { ProviderAuth } from "@/provider"
+import { Config } from "@/config/config"
+import { Provider } from "@/provider/provider"
+import { ModelsDev } from "@/provider/models"
+import { ProviderAuth } from "@/provider/auth"
import { ProviderID } from "@/provider/schema"
import { mapValues } from "remeda"
import { errors } from "../../error"
diff --git a/packages/opencode/src/server/routes/instance/pty.ts b/packages/opencode/src/server/routes/instance/pty.ts
index 2ccdb1be1..bff0b7191 100644
--- a/packages/opencode/src/server/routes/instance/pty.ts
+++ b/packages/opencode/src/server/routes/instance/pty.ts
@@ -7,7 +7,7 @@ import { AppRuntime } from "@/effect/app-runtime"
import { Pty } from "@/pty"
import { PtyID } from "@/pty/schema"
import { Shell } from "@/shell/shell"
-import { NotFoundError } from "@/storage"
+import { NotFoundError } from "@/storage/storage"
import { errors } from "../../error"
import { jsonRequest, runRequest } from "./trace"
diff --git a/packages/opencode/src/server/routes/instance/session.ts b/packages/opencode/src/server/routes/instance/session.ts
index 52a803467..5791a0cd7 100644
--- a/packages/opencode/src/server/routes/instance/session.ts
+++ b/packages/opencode/src/server/routes/instance/session.ts
@@ -3,13 +3,13 @@ import { stream } from "hono/streaming"
import { describeRoute, validator, resolver } from "hono-openapi"
import { SessionID, MessageID, PartID } from "@/session/schema"
import z from "zod"
-import { Session } from "@/session"
+import { Session } from "@/session/session"
import { MessageV2 } from "@/session/message-v2"
import { SessionPrompt } from "@/session/prompt"
import { SessionRunState } from "@/session/run-state"
import { SessionCompaction } from "@/session/compaction"
import { SessionRevert } from "@/session/revert"
-import { SessionShare } from "@/share"
+import { SessionShare } from "@/share/session"
import { SessionStatus } from "@/session/status"
import { SessionSummary } from "@/session/summary"
import { Todo } from "@/session/todo"
@@ -17,7 +17,7 @@ import { Effect } from "effect"
import { Agent } from "@/agent/agent"
import { Snapshot } from "@/snapshot"
import { Command } from "@/command"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { Permission } from "@/permission"
import { PermissionID } from "@/permission/schema"
import { ModelID, ProviderID } from "@/provider/schema"
diff --git a/packages/opencode/src/server/routes/instance/sync.ts b/packages/opencode/src/server/routes/instance/sync.ts
index b124cd875..b48047777 100644
--- a/packages/opencode/src/server/routes/instance/sync.ts
+++ b/packages/opencode/src/server/routes/instance/sync.ts
@@ -2,10 +2,16 @@ import z from "zod"
import { Hono } from "hono"
import { describeRoute, validator, resolver } from "hono-openapi"
import { SyncEvent } from "@/sync"
-import { Database, asc, and, not, or, lte, eq } from "@/storage"
+import { Database } from "@/storage/db"
+import { asc } from "drizzle-orm"
+import { and } from "drizzle-orm"
+import { not } from "drizzle-orm"
+import { or } from "drizzle-orm"
+import { lte } from "drizzle-orm"
+import { eq } from "drizzle-orm"
import { EventTable } from "@/sync/event.sql"
import { lazy } from "@/util/lazy"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { startWorkspaceSyncing } from "@/control-plane/workspace"
import { Instance } from "@/project/instance"
import { errors } from "../../error"
diff --git a/packages/opencode/src/server/routes/instance/tui.ts b/packages/opencode/src/server/routes/instance/tui.ts
index 2fd931112..48399a5f4 100644
--- a/packages/opencode/src/server/routes/instance/tui.ts
+++ b/packages/opencode/src/server/routes/instance/tui.ts
@@ -3,7 +3,7 @@ import { describeRoute, validator, resolver } from "hono-openapi"
import { Schema } from "effect"
import z from "zod"
import { Bus } from "@/bus"
-import { Session } from "@/session"
+import { Session } from "@/session/session"
import type { SessionID } from "@/session/schema"
import { TuiEvent } from "@/cli/cmd/tui/event"
import { zodObject } from "@/util/effect-zod"
diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts
index c493e4e70..7d5373dd9 100644
--- a/packages/opencode/src/server/server.ts
+++ b/packages/opencode/src/server/server.ts
@@ -2,7 +2,7 @@ import { generateSpecs } from "hono-openapi"
import { Hono } from "hono"
import { adapter } from "#hono"
import { lazy } from "@/util/lazy"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { Flag } from "@opencode-ai/core/flag/flag"
import { WorkspaceID } from "@/control-plane/schema"
import { MDNS } from "./mdns"
diff --git a/packages/opencode/src/server/workspace.ts b/packages/opencode/src/server/workspace.ts
index 3f71bf2f7..5117fb8fa 100644
--- a/packages/opencode/src/server/workspace.ts
+++ b/packages/opencode/src/server/workspace.ts
@@ -7,11 +7,11 @@ import { Workspace } from "@/control-plane/workspace"
import { Flag } from "@opencode-ai/core/flag/flag"
import { InstanceBootstrap } from "@/project/bootstrap"
import { Instance } from "@/project/instance"
-import { Session } from "@/session"
+import { Session } from "@/session/session"
import { SessionID } from "@/session/schema"
import { AppRuntime } from "@/effect/app-runtime"
import { Effect } from "effect"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { ServerProxy } from "./proxy"
type Rule = { method?: string; path: string; exact?: boolean; action: "local" | "forward" }
diff --git a/packages/opencode/src/session/compaction.ts b/packages/opencode/src/session/compaction.ts
index dc126e683..d1a3d327f 100644
--- a/packages/opencode/src/session/compaction.ts
+++ b/packages/opencode/src/session/compaction.ts
@@ -2,19 +2,19 @@ import { BusEvent } from "@/bus/bus-event"
import { Bus } from "@/bus"
import * as Session from "./session"
import { SessionID, MessageID, PartID } from "./schema"
-import { Provider } from "../provider"
+import { Provider } from "@/provider/provider"
import { MessageV2 } from "./message-v2"
import z from "zod"
-import { Token } from "../util"
-import { Log } from "../util"
+import { Token } from "@/util/token"
+import * as Log from "@opencode-ai/core/util/log"
import { SessionProcessor } from "./processor"
import { Agent } from "@/agent/agent"
import { Plugin } from "@/plugin"
-import { Config } from "@/config"
-import { NotFoundError } from "@/storage"
+import { Config } from "@/config/config"
+import { NotFoundError } from "@/storage/storage"
import { ModelID, ProviderID } from "@/provider/schema"
import { Effect, Layer, Context, Schema } from "effect"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { isOverflow as overflow, usable } from "./overflow"
import { makeRuntime } from "@/effect/run-service"
import { fn } from "@/util/fn"
diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts
deleted file mode 100644
index 1b79fd01a..000000000
--- a/packages/opencode/src/session/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * as Session from "./session"
diff --git a/packages/opencode/src/session/instruction.ts b/packages/opencode/src/session/instruction.ts
index 35de71819..bd5098015 100644
--- a/packages/opencode/src/session/instruction.ts
+++ b/packages/opencode/src/session/instruction.ts
@@ -2,13 +2,13 @@ import os from "os"
import path from "path"
import { Effect, Layer, Context } from "effect"
import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/unstable/http"
-import { Config } from "@/config"
-import { InstanceState } from "@/effect"
+import { Config } from "@/config/config"
+import { InstanceState } from "@/effect/instance-state"
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 "@opencode-ai/core/global"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import type { MessageV2 } from "./message-v2"
import type { MessageID } from "./schema"
diff --git a/packages/opencode/src/session/llm.ts b/packages/opencode/src/session/llm.ts
index 7a225ba9e..b8b891185 100644
--- a/packages/opencode/src/session/llm.ts
+++ b/packages/opencode/src/session/llm.ts
@@ -1,12 +1,12 @@
-import { Provider } from "@/provider"
-import { Log } from "@/util"
+import { Provider } from "@/provider/provider"
+import * as Log from "@opencode-ai/core/util/log"
import { Context, Effect, Layer, Record } from "effect"
import * as Stream from "effect/Stream"
import { streamText, wrapLanguageModel, type ModelMessage, type Tool, tool, jsonSchema } from "ai"
import { mergeDeep, pipe } from "remeda"
import { GitLabWorkflowLanguageModel } from "gitlab-ai-provider"
-import { ProviderTransform } from "@/provider"
-import { Config } from "@/config"
+import { ProviderTransform } from "@/provider/transform"
+import { Config } from "@/config/config"
import { Instance } from "@/project/instance"
import type { Agent } from "@/agent/agent"
import type { MessageV2 } from "./message-v2"
@@ -16,12 +16,12 @@ import { Flag } from "@opencode-ai/core/flag/flag"
import { Permission } from "@/permission"
import { PermissionID } from "@/permission/schema"
import { Bus } from "@/bus"
-import { Wildcard } from "@/util"
+import { Wildcard } from "@/util/wildcard"
import { SessionID } from "@/session/schema"
import { Auth } from "@/auth"
import { Installation } from "@/installation"
import { InstallationVersion } from "@opencode-ai/core/installation/version"
-import { EffectBridge } from "@/effect"
+import { EffectBridge } from "@/effect/bridge"
import * as Option from "effect/Option"
import * as OtelTracer from "@effect/opentelemetry/Tracer"
diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts
index 8a2d352a5..6b64b0231 100644
--- a/packages/opencode/src/session/message-v2.ts
+++ b/packages/opencode/src/session/message-v2.ts
@@ -3,23 +3,30 @@ import { SessionID, MessageID, PartID } from "./schema"
import z from "zod"
import { NamedError } from "@opencode-ai/core/util/error"
import { APICallError, convertToModelMessages, LoadAPIKeyError, type ModelMessage, type UIMessage } from "ai"
-import { LSP } from "../lsp"
+import { LSP } from "@/lsp/lsp"
import { Snapshot } from "@/snapshot"
import { SyncEvent } from "../sync"
-import { Database, NotFoundError, and, desc, eq, inArray, lt, or } from "@/storage"
+import { Database } from "@/storage/db"
+import { NotFoundError } from "@/storage/storage"
+import { and } from "drizzle-orm"
+import { desc } from "drizzle-orm"
+import { eq } from "drizzle-orm"
+import { inArray } from "drizzle-orm"
+import { lt } from "drizzle-orm"
+import { or } from "drizzle-orm"
import { MessageTable, PartTable, SessionTable } from "./session.sql"
-import { ProviderError } from "@/provider"
+import * as ProviderError from "@/provider/error"
import { iife } from "@/util/iife"
import { errorMessage } from "@/util/error"
import { isMedia } from "@/util/media"
import type { SystemError } from "bun"
-import type { Provider } from "@/provider"
+import type { Provider } from "@/provider/provider"
import { ModelID, ProviderID } from "@/provider/schema"
import { Effect, Schema, Types } from "effect"
import { zod, ZodOverride } from "@/util/effect-zod"
import { NonNegativeInt, withStatics } from "@/util/schema"
import { namedSchemaError } from "@/util/named-schema-error"
-import { EffectLogger } from "@/effect"
+import * as EffectLogger from "@opencode-ai/core/effect/logger"
/** Error shape thrown by Bun's fetch() when gzip/br decompression fails mid-stream */
interface FetchDecompressionError extends Error {
diff --git a/packages/opencode/src/session/overflow.ts b/packages/opencode/src/session/overflow.ts
index 477b5815b..6485950dc 100644
--- a/packages/opencode/src/session/overflow.ts
+++ b/packages/opencode/src/session/overflow.ts
@@ -1,6 +1,6 @@
-import type { Config } from "@/config"
-import type { Provider } from "@/provider"
-import { ProviderTransform } from "@/provider"
+import type { Config } from "@/config/config"
+import type { Provider } from "@/provider/provider"
+import { ProviderTransform } from "@/provider/transform"
import type { MessageV2 } from "./message-v2"
const COMPACTION_BUFFER = 20_000
diff --git a/packages/opencode/src/session/processor.ts b/packages/opencode/src/session/processor.ts
index 21f9329c6..b475ec1c5 100644
--- a/packages/opencode/src/session/processor.ts
+++ b/packages/opencode/src/session/processor.ts
@@ -2,7 +2,7 @@ import { Cause, Deferred, Effect, Layer, Context, Scope } from "effect"
import * as Stream from "effect/Stream"
import { Agent } from "@/agent/agent"
import { Bus } from "@/bus"
-import { Config } from "@/config"
+import { Config } from "@/config/config"
import { Permission } from "@/permission"
import { Plugin } from "@/plugin"
import { Snapshot } from "@/snapshot"
@@ -15,10 +15,10 @@ import type { SessionID } from "./schema"
import { SessionRetry } from "./retry"
import { SessionStatus } from "./status"
import { SessionSummary } from "./summary"
-import type { Provider } from "@/provider"
+import type { Provider } from "@/provider/provider"
import { Question } from "@/question"
import { errorMessage } from "@/util/error"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { isRecord } from "@/util/record"
const DOOM_LOOP_THRESHOLD = 3
diff --git a/packages/opencode/src/session/projectors.ts b/packages/opencode/src/session/projectors.ts
index 3a5fd0d8c..35c847380 100644
--- a/packages/opencode/src/session/projectors.ts
+++ b/packages/opencode/src/session/projectors.ts
@@ -1,9 +1,11 @@
-import { NotFoundError, eq, and } from "../storage"
+import { NotFoundError } from "@/storage/storage"
+import { eq } from "drizzle-orm"
+import { and } from "drizzle-orm"
import { SyncEvent } from "@/sync"
import * as Session from "./session"
import { MessageV2 } from "./message-v2"
import { SessionTable, MessageTable, PartTable } from "./session.sql"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
const log = Log.create({ service: "session.projector" })
diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts
index 861f7285c..f7306280f 100644
--- a/packages/opencode/src/session/prompt.ts
+++ b/packages/opencode/src/session/prompt.ts
@@ -4,26 +4,26 @@ import z from "zod"
import * as EffectZod from "@/util/effect-zod"
import { SessionID, MessageID, PartID } from "./schema"
import { MessageV2 } from "./message-v2"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { SessionRevert } from "./revert"
import * as Session from "./session"
import { Agent } from "../agent/agent"
-import { Provider } from "../provider"
+import { Provider } from "@/provider/provider"
import { ModelID, ProviderID } from "../provider/schema"
import { type Tool as AITool, tool, jsonSchema, type ToolExecutionOptions, asSchema } from "ai"
import type { JSONSchema7 } from "@ai-sdk/provider"
import { SessionCompaction } from "./compaction"
import { Bus } from "../bus"
-import { ProviderTransform } from "../provider"
+import { ProviderTransform } from "@/provider/transform"
import { SystemPrompt } from "./system"
import { Instruction } from "./instruction"
import { Plugin } from "../plugin"
import PROMPT_PLAN from "../session/prompt/plan.txt"
import BUILD_SWITCH from "../session/prompt/build-switch.txt"
import MAX_STEPS from "../session/prompt/max-steps.txt"
-import { ToolRegistry } from "../tool"
+import { ToolRegistry } from "@/tool/registry"
import { MCP } from "../mcp"
-import { LSP } from "../lsp"
+import { LSP } from "@/lsp/lsp"
import { Flag } from "@opencode-ai/core/flag/flag"
import { ulid } from "ulid"
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"
@@ -31,27 +31,28 @@ import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import * as Stream from "effect/Stream"
import { Command } from "../command"
import { pathToFileURL, fileURLToPath } from "url"
-import { Config, ConfigMarkdown } from "../config"
+import { Config } from "@/config/config"
+import { ConfigMarkdown } from "@/config/markdown"
import { SessionSummary } from "./summary"
import { NamedError } from "@opencode-ai/core/util/error"
import { SessionProcessor } from "./processor"
-import { Tool } from "@/tool"
+import { Tool } from "@/tool/tool"
import { Permission } from "@/permission"
import { SessionStatus } from "./status"
import { LLM } from "./llm"
import { Shell } from "@/shell/shell"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
-import { Truncate } from "@/tool"
+import { Truncate } from "@/tool/truncate"
import { decodeDataUrl } from "@/util/data-url"
-import { Process } from "@/util"
+import { Process } from "@/util/process"
import { Cause, Effect, Exit, Layer, Option, Scope, Context, Schema } from "effect"
import { zod } from "@/util/effect-zod"
import { withStatics } from "@/util/schema"
-import { EffectLogger } from "@/effect"
-import { InstanceState } from "@/effect"
+import * as EffectLogger from "@opencode-ai/core/effect/logger"
+import { InstanceState } from "@/effect/instance-state"
import { TaskTool, type TaskPromptOps } from "@/tool/task"
import { SessionRunState } from "./run-state"
-import { EffectBridge } from "@/effect"
+import { EffectBridge } from "@/effect/bridge"
// @ts-ignore
globalThis.AI_SDK_LOG_WARNINGS = false
diff --git a/packages/opencode/src/session/revert.ts b/packages/opencode/src/session/revert.ts
index e1db26510..da9952ccb 100644
--- a/packages/opencode/src/session/revert.ts
+++ b/packages/opencode/src/session/revert.ts
@@ -1,9 +1,9 @@
import { Effect, Layer, Context, Schema } from "effect"
import { Bus } from "../bus"
import { Snapshot } from "../snapshot"
-import { Storage } from "@/storage"
+import { Storage } from "@/storage/storage"
import { SyncEvent } from "../sync"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { zod } from "@/util/effect-zod"
import { withStatics } from "@/util/schema"
import * as Session from "./session"
diff --git a/packages/opencode/src/session/run-state.ts b/packages/opencode/src/session/run-state.ts
index 7a106f8a4..4b210d63d 100644
--- a/packages/opencode/src/session/run-state.ts
+++ b/packages/opencode/src/session/run-state.ts
@@ -1,5 +1,5 @@
-import { InstanceState } from "@/effect"
-import { Runner } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
+import { Runner } from "@/effect/runner"
import { Effect, Layer, Scope, Context } from "effect"
import * as Session from "./session"
import { MessageV2 } from "./message-v2"
diff --git a/packages/opencode/src/session/session.ts b/packages/opencode/src/session/session.ts
index 6c67b8517..e167908e8 100644
--- a/packages/opencode/src/session/session.ts
+++ b/packages/opencode/src/session/session.ts
@@ -8,22 +8,31 @@ import { type ProviderMetadata, type LanguageModelUsage } from "ai"
import { Flag } from "@opencode-ai/core/flag/flag"
import { InstallationVersion } from "@opencode-ai/core/installation/version"
-import { Database, NotFoundError, eq, and, gte, isNull, desc, like, inArray, lt } from "../storage"
+import { Database } from "@/storage/db"
+import { NotFoundError } from "@/storage/storage"
+import { eq } from "drizzle-orm"
+import { and } from "drizzle-orm"
+import { gte } from "drizzle-orm"
+import { isNull } from "drizzle-orm"
+import { desc } from "drizzle-orm"
+import { like } from "drizzle-orm"
+import { inArray } from "drizzle-orm"
+import { lt } from "drizzle-orm"
import { SyncEvent } from "../sync"
-import type { SQL } from "../storage"
+import type { SQL } from "drizzle-orm"
import { PartTable, SessionTable } from "./session.sql"
import { ProjectTable } from "../project/project.sql"
-import { Storage } from "@/storage"
-import { Log } from "../util"
+import { Storage } from "@/storage/storage"
+import * as Log from "@opencode-ai/core/util/log"
import { MessageV2 } from "./message-v2"
import { Instance } from "../project/instance"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { Snapshot } from "@/snapshot"
import { ProjectID } from "../project/schema"
import { WorkspaceID } from "../control-plane/schema"
import { SessionID, MessageID, PartID } from "./schema"
-import type { Provider } from "@/provider"
+import type { Provider } from "@/provider/provider"
import { Permission } from "@/permission"
import { Global } from "@opencode-ai/core/global"
import { Effect, Layer, Option, Context, Schema, Types } from "effect"
@@ -849,3 +858,5 @@ export function* listGlobal(input?: {
yield { ...fromRow(row), project }
}
}
+
+export * as Session from "./session"
diff --git a/packages/opencode/src/session/status.ts b/packages/opencode/src/session/status.ts
index e5165a787..fdd561b4a 100644
--- a/packages/opencode/src/session/status.ts
+++ b/packages/opencode/src/session/status.ts
@@ -1,6 +1,6 @@
import { BusEvent } from "@/bus/bus-event"
import { Bus } from "@/bus"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { SessionID } from "./schema"
import { zod } from "@/util/effect-zod"
import { withStatics } from "@/util/schema"
diff --git a/packages/opencode/src/session/summary.ts b/packages/opencode/src/session/summary.ts
index 04a24d2c2..f1709d5a2 100644
--- a/packages/opencode/src/session/summary.ts
+++ b/packages/opencode/src/session/summary.ts
@@ -1,7 +1,7 @@
import { Effect, Layer, Context, Schema } from "effect"
import { Bus } from "@/bus"
import { Snapshot } from "@/snapshot"
-import { Storage } from "@/storage"
+import { Storage } from "@/storage/storage"
import { zod } from "@/util/effect-zod"
import { withStatics } from "@/util/schema"
import * as Session from "./session"
diff --git a/packages/opencode/src/session/system.ts b/packages/opencode/src/session/system.ts
index ec60f6eef..9099f2d17 100644
--- a/packages/opencode/src/session/system.ts
+++ b/packages/opencode/src/session/system.ts
@@ -11,7 +11,7 @@ import PROMPT_KIMI from "./prompt/kimi.txt"
import PROMPT_CODEX from "./prompt/codex.txt"
import PROMPT_TRINITY from "./prompt/trinity.txt"
-import type { Provider } from "@/provider"
+import type { Provider } from "@/provider/provider"
import type { Agent } from "@/agent/agent"
import { Permission } from "@/permission"
import { Skill } from "@/skill"
diff --git a/packages/opencode/src/session/todo.ts b/packages/opencode/src/session/todo.ts
index c3a9b106b..32a837046 100644
--- a/packages/opencode/src/session/todo.ts
+++ b/packages/opencode/src/session/todo.ts
@@ -5,7 +5,9 @@ import { zod } from "@/util/effect-zod"
import { withStatics } from "@/util/schema"
import { Effect, Layer, Context, Schema } from "effect"
import z from "zod"
-import { Database, eq, asc } from "../storage"
+import { Database } from "@/storage/db"
+import { eq } from "drizzle-orm"
+import { asc } from "drizzle-orm"
import { TodoTable } from "./session.sql"
export const Info = Schema.Struct({
diff --git a/packages/opencode/src/share/index.ts b/packages/opencode/src/share/index.ts
deleted file mode 100644
index 534375a0a..000000000
--- a/packages/opencode/src/share/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * as ShareNext from "./share-next"
-export * as SessionShare from "./session"
diff --git a/packages/opencode/src/share/session.ts b/packages/opencode/src/share/session.ts
index c5394716b..99e46a009 100644
--- a/packages/opencode/src/share/session.ts
+++ b/packages/opencode/src/share/session.ts
@@ -1,8 +1,8 @@
-import { Session } from "@/session"
+import { Session } from "@/session/session"
import { SessionID } from "@/session/schema"
import { SyncEvent } from "@/sync"
import { Effect, Layer, Scope, Context } from "effect"
-import { Config } from "../config"
+import { Config } from "@/config/config"
import { Flag } from "@opencode-ai/core/flag/flag"
import * as ShareNext from "./share-next"
@@ -55,3 +55,5 @@ export const defaultLayer = layer.pipe(
Layer.provide(Session.defaultLayer),
Layer.provide(Config.defaultLayer),
)
+
+export * as SessionShare from "./session"
diff --git a/packages/opencode/src/share/share-next.ts b/packages/opencode/src/share/share-next.ts
index f26a085c2..384027436 100644
--- a/packages/opencode/src/share/share-next.ts
+++ b/packages/opencode/src/share/share-next.ts
@@ -3,15 +3,16 @@ import { Effect, Exit, Layer, Option, Schema, Scope, Context, Stream } from "eff
import { FetchHttpClient, HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http"
import { Account } from "@/account/account"
import { Bus } from "@/bus"
-import { InstanceState } from "@/effect"
-import { Provider } from "@/provider"
+import { InstanceState } from "@/effect/instance-state"
+import { Provider } from "@/provider/provider"
import { ModelID, ProviderID } from "@/provider/schema"
-import { Session } from "@/session"
+import { Session } from "@/session/session"
import { MessageV2 } from "@/session/message-v2"
import type { SessionID } from "@/session/schema"
-import { Database, eq } from "@/storage"
-import { Config } from "@/config"
-import { Log } from "@/util"
+import { Database } from "@/storage/db"
+import { eq } from "drizzle-orm"
+import { Config } from "@/config/config"
+import * as Log from "@opencode-ai/core/util/log"
import { SessionShareTable } from "./share.sql"
const log = Log.create({ service: "share-next" })
@@ -371,3 +372,5 @@ export const defaultLayer = layer.pipe(
Layer.provide(Provider.defaultLayer),
Layer.provide(Session.defaultLayer),
)
+
+export * as ShareNext from "./share-next"
diff --git a/packages/opencode/src/shell/shell.ts b/packages/opencode/src/shell/shell.ts
index 60af58059..516a5bf23 100644
--- a/packages/opencode/src/shell/shell.ts
+++ b/packages/opencode/src/shell/shell.ts
@@ -1,6 +1,6 @@
import { Flag } from "@opencode-ai/core/flag/flag"
import { lazy } from "@/util/lazy"
-import { Filesystem } from "@/util"
+import { Filesystem } from "@/util/filesystem"
import { which } from "@/util/which"
import path from "path"
import { spawn, type ChildProcess } from "child_process"
diff --git a/packages/opencode/src/skill/discovery.ts b/packages/opencode/src/skill/discovery.ts
index 9ce56d4ce..9db70ba11 100644
--- a/packages/opencode/src/skill/discovery.ts
+++ b/packages/opencode/src/skill/discovery.ts
@@ -4,7 +4,7 @@ import { FetchHttpClient, HttpClient, HttpClientRequest, HttpClientResponse } fr
import { withTransientReadRetry } from "@/util/effect-http-client"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Global } from "@opencode-ai/core/global"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
const skillConcurrency = 4
const fileConcurrency = 8
diff --git a/packages/opencode/src/skill/index.ts b/packages/opencode/src/skill/index.ts
index ebb433971..701ecaba8 100644
--- a/packages/opencode/src/skill/index.ts
+++ b/packages/opencode/src/skill/index.ts
@@ -8,15 +8,15 @@ import { withStatics } from "@/util/schema"
import { NamedError } from "@opencode-ai/core/util/error"
import type { Agent } from "@/agent/agent"
import { Bus } from "@/bus"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { Flag } from "@opencode-ai/core/flag/flag"
import { Global } from "@opencode-ai/core/global"
import { Permission } from "@/permission"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
-import { Config } from "../config"
-import { ConfigMarkdown } from "../config"
+import { Config } from "@/config/config"
+import { ConfigMarkdown } from "@/config/markdown"
import { Glob } from "@opencode-ai/core/util/glob"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { Discovery } from "./discovery"
const log = Log.create({ service: "skill" })
@@ -83,7 +83,7 @@ const add = Effect.fnUntraced(function* (state: State, match: string, bus: Bus.I
const message = ConfigMarkdown.FrontmatterError.isInstance(err)
? err.data.message
: `Failed to parse skill ${match}`
- const { Session } = yield* Effect.promise(() => import("@/session"))
+ const { Session } = yield* Effect.promise(() => import("@/session/session"))
yield* bus.publish(Session.Event.Error, { error: new NamedError.Unknown({ message }).toObject() })
log.error("failed to load skill", { skill: match, err })
return undefined
diff --git a/packages/opencode/src/snapshot/index.ts b/packages/opencode/src/snapshot/index.ts
index 88ea274f8..cd28377aa 100644
--- a/packages/opencode/src/snapshot/index.ts
+++ b/packages/opencode/src/snapshot/index.ts
@@ -4,12 +4,12 @@ import { formatPatch, structuredPatch } from "diff"
import path from "path"
import z from "zod"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Hash } from "@opencode-ai/core/util/hash"
-import { Config } from "../config"
+import { Config } from "@/config/config"
import { Global } from "@opencode-ai/core/global"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
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 e442b2a76..95bb568bd 100644
--- a/packages/opencode/src/storage/db.ts
+++ b/packages/opencode/src/storage/db.ts
@@ -2,17 +2,17 @@ import { type SQLiteBunDatabase } from "drizzle-orm/bun-sqlite"
import { migrate } from "drizzle-orm/bun-sqlite/migrator"
import { type SQLiteTransaction } from "drizzle-orm/sqlite-core"
export * from "drizzle-orm"
-import { LocalContext } from "../util"
+import { LocalContext } from "@/util/local-context"
import { lazy } from "../util/lazy"
import { Global } from "@opencode-ai/core/global"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { NamedError } from "@opencode-ai/core/util/error"
import z from "zod"
import path from "path"
import { readFileSync, readdirSync, existsSync } from "fs"
import { Flag } from "@opencode-ai/core/flag/flag"
import { InstallationChannel } from "@opencode-ai/core/installation/version"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { iife } from "@/util/iife"
import { init } from "#db"
@@ -170,3 +170,5 @@ export function transaction<T>(
throw err
}
}
+
+export * as Database from "./db"
diff --git a/packages/opencode/src/storage/index.ts b/packages/opencode/src/storage/index.ts
deleted file mode 100644
index 212c9eecf..000000000
--- a/packages/opencode/src/storage/index.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-export * as JsonMigration from "./json-migration"
-export * as Database from "./db"
-export * as Storage from "./storage"
-export {
- asc,
- eq,
- and,
- or,
- inArray,
- desc,
- not,
- sql,
- isNull,
- isNotNull,
- count,
- like,
- exists,
- between,
- gt,
- gte,
- lt,
- lte,
- ne,
-} from "drizzle-orm"
-export type { SQL } from "drizzle-orm"
-export { NotFoundError } from "./storage"
diff --git a/packages/opencode/src/storage/json-migration.ts b/packages/opencode/src/storage/json-migration.ts
index 787b50117..db1ba75e0 100644
--- a/packages/opencode/src/storage/json-migration.ts
+++ b/packages/opencode/src/storage/json-migration.ts
@@ -1,13 +1,13 @@
import type { SQLiteBunDatabase } from "drizzle-orm/bun-sqlite"
import type { NodeSQLiteDatabase } from "drizzle-orm/node-sqlite"
import { Global } from "@opencode-ai/core/global"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { ProjectTable } from "../project/project.sql"
import { SessionTable, MessageTable, PartTable, TodoTable, PermissionTable } from "../session/session.sql"
import { SessionShareTable } from "../share/share.sql"
import path from "path"
import { existsSync } from "fs"
-import { Filesystem } from "../util"
+import { Filesystem } from "@/util/filesystem"
import { Glob } from "@opencode-ai/core/util/glob"
const log = Log.create({ service: "json-migration" })
@@ -426,3 +426,5 @@ export async function run(db: SQLiteBunDatabase<any, any> | NodeSQLiteDatabase<a
return stats
}
+
+export * as JsonMigration from "./json-migration"
diff --git a/packages/opencode/src/storage/storage.ts b/packages/opencode/src/storage/storage.ts
index 71cc37e01..af18d88b3 100644
--- a/packages/opencode/src/storage/storage.ts
+++ b/packages/opencode/src/storage/storage.ts
@@ -1,4 +1,4 @@
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import path from "path"
import { Global } from "@opencode-ai/core/global"
import { NamedError } from "@opencode-ai/core/util/error"
@@ -329,3 +329,5 @@ export const layer = Layer.effect(
)
export const defaultLayer = layer.pipe(Layer.provide(AppFileSystem.defaultLayer), Layer.provide(Git.defaultLayer))
+
+export * as Storage from "./storage"
diff --git a/packages/opencode/src/sync/index.ts b/packages/opencode/src/sync/index.ts
index da33b7aa9..ad899531b 100644
--- a/packages/opencode/src/sync/index.ts
+++ b/packages/opencode/src/sync/index.ts
@@ -1,5 +1,6 @@
import z from "zod"
-import { Database, eq } from "@/storage"
+import { Database } from "@/storage/db"
+import { eq } from "drizzle-orm"
import { GlobalBus } from "@/bus/global"
import { Bus as ProjectBus } from "@/bus"
import { BusEvent } from "@/bus/bus-event"
diff --git a/packages/opencode/src/tool/apply_patch.ts b/packages/opencode/src/tool/apply_patch.ts
index 9a009189d..2de18ad08 100644
--- a/packages/opencode/src/tool/apply_patch.ts
+++ b/packages/opencode/src/tool/apply_patch.ts
@@ -8,7 +8,7 @@ import { Patch } from "../patch"
import { createTwoFilesPatch, diffLines } from "diff"
import { assertExternalDirectoryEffect } from "./external-directory"
import { trimDiff } from "./edit"
-import { LSP } from "../lsp"
+import { LSP } from "@/lsp/lsp"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import DESCRIPTION from "./apply_patch.txt"
import { File } from "../file"
diff --git a/packages/opencode/src/tool/bash.ts b/packages/opencode/src/tool/bash.ts
index 2b72e58b9..859389949 100644
--- a/packages/opencode/src/tool/bash.ts
+++ b/packages/opencode/src/tool/bash.ts
@@ -4,14 +4,14 @@ import { createWriteStream } from "node:fs"
import * as Tool from "./tool"
import path from "path"
import DESCRIPTION from "./bash.txt"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { Instance } from "../project/instance"
import { lazy } from "@/util/lazy"
import { Language, type Node } from "web-tree-sitter"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { fileURLToPath } from "url"
-import { Config } from "@/config"
+import { Config } from "@/config/config"
import { Flag } from "@opencode-ai/core/flag/flag"
import { Shell } from "@/shell/shell"
@@ -21,7 +21,7 @@ import { Plugin } from "@/plugin"
import { Effect, Stream } from "effect"
import { ChildProcess } from "effect/unstable/process"
import { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
const MAX_METADATA_LENGTH = 30_000
const DEFAULT_TIMEOUT = Flag.OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS || 2 * 60 * 1000
diff --git a/packages/opencode/src/tool/edit.ts b/packages/opencode/src/tool/edit.ts
index 04a84a388..2463d48fa 100644
--- a/packages/opencode/src/tool/edit.ts
+++ b/packages/opencode/src/tool/edit.ts
@@ -6,7 +6,7 @@
import * as path from "path"
import { Effect, Schema, Semaphore } from "effect"
import * as Tool from "./tool"
-import { LSP } from "../lsp"
+import { LSP } from "@/lsp/lsp"
import { createTwoFilesPatch, diffLines } from "diff"
import DESCRIPTION from "./edit.txt"
import { File } from "../file"
diff --git a/packages/opencode/src/tool/external-directory.ts b/packages/opencode/src/tool/external-directory.ts
index b8def1d75..0dd9a1af3 100644
--- a/packages/opencode/src/tool/external-directory.ts
+++ b/packages/opencode/src/tool/external-directory.ts
@@ -1,7 +1,7 @@
import path from "path"
import { Effect } from "effect"
-import { EffectLogger } from "@/effect"
-import { InstanceState } from "@/effect"
+import * as EffectLogger from "@opencode-ai/core/effect/logger"
+import { InstanceState } from "@/effect/instance-state"
import type * as Tool from "./tool"
import { Instance } from "../project/instance"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
diff --git a/packages/opencode/src/tool/glob.ts b/packages/opencode/src/tool/glob.ts
index 984c13d41..0c97b9cdf 100644
--- a/packages/opencode/src/tool/glob.ts
+++ b/packages/opencode/src/tool/glob.ts
@@ -1,7 +1,7 @@
import path from "path"
import { Effect, Option, Schema } from "effect"
import * as Stream from "effect/Stream"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Ripgrep } from "../file/ripgrep"
import { assertExternalDirectoryEffect } from "./external-directory"
diff --git a/packages/opencode/src/tool/grep.ts b/packages/opencode/src/tool/grep.ts
index 844de6753..fb3e70cad 100644
--- a/packages/opencode/src/tool/grep.ts
+++ b/packages/opencode/src/tool/grep.ts
@@ -1,7 +1,7 @@
import path from "path"
import { Schema } from "effect"
import { Effect, Option } from "effect"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Ripgrep } from "../file/ripgrep"
import { assertExternalDirectoryEffect } from "./external-directory"
diff --git a/packages/opencode/src/tool/index.ts b/packages/opencode/src/tool/index.ts
deleted file mode 100644
index 5b2463b50..000000000
--- a/packages/opencode/src/tool/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * as Truncate from "./truncate"
-export * as ToolRegistry from "./registry"
-export * as Tool from "./tool"
diff --git a/packages/opencode/src/tool/lsp.ts b/packages/opencode/src/tool/lsp.ts
index d1f36d346..828beeefe 100644
--- a/packages/opencode/src/tool/lsp.ts
+++ b/packages/opencode/src/tool/lsp.ts
@@ -1,7 +1,7 @@
import { Effect, Schema } from "effect"
import * as Tool from "./tool"
import path from "path"
-import { LSP } from "../lsp"
+import { LSP } from "@/lsp/lsp"
import DESCRIPTION from "./lsp.txt"
import { Instance } from "../project/instance"
import { pathToFileURL } from "url"
diff --git a/packages/opencode/src/tool/plan.ts b/packages/opencode/src/tool/plan.ts
index 8e2f11360..dc49ef48b 100644
--- a/packages/opencode/src/tool/plan.ts
+++ b/packages/opencode/src/tool/plan.ts
@@ -2,9 +2,9 @@ import path from "path"
import { Effect, Schema } from "effect"
import * as Tool from "./tool"
import { Question } from "../question"
-import { Session } from "../session"
+import { Session } from "@/session/session"
import { MessageV2 } from "../session/message-v2"
-import { Provider } from "../provider"
+import { Provider } from "@/provider/provider"
import { Instance } from "../project/instance"
import { type SessionID, MessageID, PartID } from "../session/schema"
import EXIT_DESCRIPTION from "./plan-exit.txt"
diff --git a/packages/opencode/src/tool/read.ts b/packages/opencode/src/tool/read.ts
index e89f03109..0f528b8f6 100644
--- a/packages/opencode/src/tool/read.ts
+++ b/packages/opencode/src/tool/read.ts
@@ -4,7 +4,7 @@ import * as path from "path"
import { createInterface } from "readline"
import * as Tool from "./tool"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
-import { LSP } from "../lsp"
+import { LSP } from "@/lsp/lsp"
import DESCRIPTION from "./read.txt"
import { Instance } from "../project/instance"
import { assertExternalDirectoryEffect } from "./external-directory"
diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts
index 4e3d3d714..4b442d4e3 100644
--- a/packages/opencode/src/tool/registry.ts
+++ b/packages/opencode/src/tool/registry.ts
@@ -1,5 +1,5 @@
import { PlanExitTool } from "./plan"
-import { Session } from "../session"
+import { Session } from "@/session/session"
import { QuestionTool } from "./question"
import { BashTool } from "./bash"
import { EditTool } from "./edit"
@@ -13,18 +13,18 @@ import { WriteTool } from "./write"
import { InvalidTool } from "./invalid"
import { SkillTool } from "./skill"
import * as Tool from "./tool"
-import { Config } from "../config"
+import { Config } from "@/config/config"
import { type ToolContext as PluginToolContext, type ToolDefinition } from "@opencode-ai/plugin"
import { Schema } from "effect"
import z from "zod"
import { ZodOverride } from "@/util/effect-zod"
import { Plugin } from "../plugin"
-import { Provider } from "../provider"
+import { Provider } from "@/provider/provider"
import { ProviderID, type ModelID } from "../provider/schema"
import { WebSearchTool } from "./websearch"
import { CodeSearchTool } from "./codesearch"
import { Flag } from "@opencode-ai/core/flag/flag"
-import { Log } from "@/util"
+import * as Log from "@opencode-ai/core/util/log"
import { LspTool } from "./lsp"
import * as Truncate from "./truncate"
import { ApplyPatchTool } from "./apply_patch"
@@ -37,10 +37,10 @@ import { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { Ripgrep } from "../file/ripgrep"
import { Format } from "../format"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { Question } from "../question"
import { Todo } from "../session/todo"
-import { LSP } from "../lsp"
+import { LSP } from "@/lsp/lsp"
import { Instruction } from "../session/instruction"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Bus } from "../bus"
@@ -347,3 +347,5 @@ export const defaultLayer = Layer.suspend(() =>
Layer.provide(Truncate.defaultLayer),
),
)
+
+export * as ToolRegistry from "./registry"
diff --git a/packages/opencode/src/tool/task.ts b/packages/opencode/src/tool/task.ts
index 5cb0dc6a8..bd8645d3c 100644
--- a/packages/opencode/src/tool/task.ts
+++ b/packages/opencode/src/tool/task.ts
@@ -1,11 +1,11 @@
import * as Tool from "./tool"
import DESCRIPTION from "./task.txt"
-import { Session } from "../session"
+import { Session } from "@/session/session"
import { SessionID, MessageID } from "../session/schema"
import { MessageV2 } from "../session/message-v2"
import { Agent } from "../agent/agent"
import type { SessionPrompt } from "../session/prompt"
-import { Config } from "../config"
+import { Config } from "@/config/config"
import { Effect, Schema } from "effect"
export interface TaskPromptOps {
diff --git a/packages/opencode/src/tool/tool.ts b/packages/opencode/src/tool/tool.ts
index 7e753cb9b..4b9ea8774 100644
--- a/packages/opencode/src/tool/tool.ts
+++ b/packages/opencode/src/tool/tool.ts
@@ -158,3 +158,5 @@ export function init<P extends Schema.Decoder<unknown>, M extends Metadata>(
}
})
}
+
+export * as Tool from "./tool"
diff --git a/packages/opencode/src/tool/truncate.ts b/packages/opencode/src/tool/truncate.ts
index 191d96795..ffc16c0b9 100644
--- a/packages/opencode/src/tool/truncate.ts
+++ b/packages/opencode/src/tool/truncate.ts
@@ -4,9 +4,9 @@ import path from "path"
import type { Agent } from "../agent/agent"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { evaluate } from "@/permission/evaluate"
-import { Config } from "../config"
+import { Config } from "@/config/config"
import { Identifier } from "../id/id"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { ToolID } from "./schema"
import { TRUNCATION_DIR } from "./truncation-dir"
@@ -156,3 +156,5 @@ export const layer = Layer.effect(
)
export const defaultLayer = layer.pipe(Layer.provide(AppFileSystem.defaultLayer), Layer.provide(NodePath.layer))
+
+export * as Truncate from "./truncate"
diff --git a/packages/opencode/src/tool/write.ts b/packages/opencode/src/tool/write.ts
index d977325f1..09c3a3805 100644
--- a/packages/opencode/src/tool/write.ts
+++ b/packages/opencode/src/tool/write.ts
@@ -2,7 +2,7 @@ import { Schema } from "effect"
import * as path from "path"
import { Effect } from "effect"
import * as Tool from "./tool"
-import { LSP } from "../lsp"
+import { LSP } from "@/lsp/lsp"
import { createTwoFilesPatch } from "diff"
import DESCRIPTION from "./write.txt"
import { Bus } from "../bus"
diff --git a/packages/opencode/src/util/archive.ts b/packages/opencode/src/util/archive.ts
index 97fe6aefb..8fc549779 100644
--- a/packages/opencode/src/util/archive.ts
+++ b/packages/opencode/src/util/archive.ts
@@ -13,3 +13,5 @@ export async function extractZip(zipPath: string, destDir: string) {
await Process.run(["unzip", "-o", "-q", zipPath, "-d", destDir])
}
+
+export * as Archive from "./archive"
diff --git a/packages/opencode/src/util/color.ts b/packages/opencode/src/util/color.ts
index 43408295f..3752fd19b 100644
--- a/packages/opencode/src/util/color.ts
+++ b/packages/opencode/src/util/color.ts
@@ -15,3 +15,5 @@ export function hexToAnsiBold(hex?: string): string | undefined {
const { r, g, b } = hexToRgb(hex)
return `\x1b[38;2;${r};${g};${b}m\x1b[1m`
}
+
+export * as Color from "./color"
diff --git a/packages/opencode/src/util/filesystem.ts b/packages/opencode/src/util/filesystem.ts
index 6225c80d2..ded2b4517 100644
--- a/packages/opencode/src/util/filesystem.ts
+++ b/packages/opencode/src/util/filesystem.ts
@@ -241,3 +241,5 @@ export async function globUp(pattern: string, start: string, stop?: string) {
}
return result
}
+
+export * as Filesystem from "./filesystem"
diff --git a/packages/opencode/src/util/index.ts b/packages/opencode/src/util/index.ts
deleted file mode 100644
index c67a3d140..000000000
--- a/packages/opencode/src/util/index.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-export * as Archive from "./archive"
-export * as Color from "./color"
-export * as Filesystem from "./filesystem"
-export * as Keybind from "./keybind"
-export * as LocalContext from "./local-context"
-export * as Locale from "./locale"
-export * as Lock from "./lock"
-export * as Log from "@opencode-ai/core/util/log"
-export * as Process from "./process"
-export * as Rpc from "./rpc"
-export * as Token from "./token"
-export * as Wildcard from "./wildcard"
diff --git a/packages/opencode/src/util/keybind.ts b/packages/opencode/src/util/keybind.ts
index 10a68c4b2..e3c9b2bc0 100644
--- a/packages/opencode/src/util/keybind.ts
+++ b/packages/opencode/src/util/keybind.ts
@@ -99,3 +99,5 @@ export function parse(key: string): Info[] {
return info
})
}
+
+export * as Keybind from "./keybind"
diff --git a/packages/opencode/src/util/local-context.ts b/packages/opencode/src/util/local-context.ts
index c1aef946f..deb866f40 100644
--- a/packages/opencode/src/util/local-context.ts
+++ b/packages/opencode/src/util/local-context.ts
@@ -21,3 +21,5 @@ export function create<T>(name: string) {
},
}
}
+
+export * as LocalContext from "./local-context"
diff --git a/packages/opencode/src/util/locale.ts b/packages/opencode/src/util/locale.ts
index 202e856b2..49f60e931 100644
--- a/packages/opencode/src/util/locale.ts
+++ b/packages/opencode/src/util/locale.ts
@@ -77,3 +77,5 @@ export function pluralize(count: number, singular: string, plural: string): stri
const template = count === 1 ? singular : plural
return template.replace("{}", count.toString())
}
+
+export * as Locale from "./locale"
diff --git a/packages/opencode/src/util/lock.ts b/packages/opencode/src/util/lock.ts
index 3f8e60937..15635996e 100644
--- a/packages/opencode/src/util/lock.ts
+++ b/packages/opencode/src/util/lock.ts
@@ -94,3 +94,5 @@ export async function write(key: string): Promise<Disposable> {
}
})
}
+
+export * as Lock from "./lock"
diff --git a/packages/opencode/src/util/process.ts b/packages/opencode/src/util/process.ts
index 96c35e5d6..1fa1a1463 100644
--- a/packages/opencode/src/util/process.ts
+++ b/packages/opencode/src/util/process.ts
@@ -172,3 +172,5 @@ export async function text(cmd: string[], opts: RunOptions = {}): Promise<TextRe
export async function lines(cmd: string[], opts: RunOptions = {}): Promise<string[]> {
return (await text(cmd, opts)).text.split(/\r?\n/).filter(Boolean)
}
+
+export * as Process from "./process"
diff --git a/packages/opencode/src/util/rpc.ts b/packages/opencode/src/util/rpc.ts
index 98f3a09d4..02586ebcf 100644
--- a/packages/opencode/src/util/rpc.ts
+++ b/packages/opencode/src/util/rpc.ts
@@ -62,3 +62,5 @@ export function client<T extends Definition>(target: {
},
}
}
+
+export * as Rpc from "./rpc"
diff --git a/packages/opencode/src/util/token.ts b/packages/opencode/src/util/token.ts
index 52951c4cf..fccbcac0d 100644
--- a/packages/opencode/src/util/token.ts
+++ b/packages/opencode/src/util/token.ts
@@ -3,3 +3,5 @@ const CHARS_PER_TOKEN = 4
export function estimate(input: string) {
return Math.max(0, Math.round((input || "").length / CHARS_PER_TOKEN))
}
+
+export * as Token from "./token"
diff --git a/packages/opencode/src/util/wildcard.ts b/packages/opencode/src/util/wildcard.ts
index 0efb94e91..b2affbf84 100644
--- a/packages/opencode/src/util/wildcard.ts
+++ b/packages/opencode/src/util/wildcard.ts
@@ -55,3 +55,5 @@ function matchSequence(items: string[], patterns: string[]): boolean {
}
return false
}
+
+export * as Wildcard from "./wildcard"
diff --git a/packages/opencode/src/v2/session.ts b/packages/opencode/src/v2/session.ts
index 79a691612..2bac11f4f 100644
--- a/packages/opencode/src/v2/session.ts
+++ b/packages/opencode/src/v2/session.ts
@@ -1,7 +1,7 @@
import { Context, Layer, Schema, Effect } from "effect"
import { SessionEntry } from "./session-entry"
import { Struct } from "effect"
-import { Session } from "@/session"
+import { Session } from "@/session/session"
import { SessionID } from "@/session/schema"
export const ID = SessionID
diff --git a/packages/opencode/src/worktree/index.ts b/packages/opencode/src/worktree/index.ts
index 8d635e80f..6a7ccb961 100644
--- a/packages/opencode/src/worktree/index.ts
+++ b/packages/opencode/src/worktree/index.ts
@@ -3,11 +3,12 @@ import { NamedError } from "@opencode-ai/core/util/error"
import { Global } from "@opencode-ai/core/global"
import { Instance } from "../project/instance"
import { InstanceBootstrap } from "../project/bootstrap"
-import { Project } from "../project"
-import { Database, eq } from "../storage"
+import { Project } from "@/project/project"
+import { Database } from "@/storage/db"
+import { eq } from "drizzle-orm"
import { ProjectTable } from "../project/project.sql"
import type { ProjectID } from "../project/schema"
-import { Log } from "../util"
+import * as Log from "@opencode-ai/core/util/log"
import { Slug } from "@opencode-ai/core/util/slug"
import { errorMessage } from "../util/error"
import { BusEvent } from "@/bus/bus-event"
@@ -19,7 +20,7 @@ import { NodePath } from "@effect/platform-node"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { BootstrapRuntime } from "@/effect/bootstrap-runtime"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
-import { InstanceState } from "@/effect"
+import { InstanceState } from "@/effect/instance-state"
import { zod as effectZod } from "@/util/effect-zod"
import { withStatics } from "@/util/schema"
diff --git a/packages/opencode/test/account/repo.test.ts b/packages/opencode/test/account/repo.test.ts
index 8e59b85b3..9a1e72ae2 100644
--- a/packages/opencode/test/account/repo.test.ts
+++ b/packages/opencode/test/account/repo.test.ts
@@ -3,7 +3,7 @@ import { Effect, Layer, Option } from "effect"
import { AccountRepo } from "../../src/account/repo"
import { AccessToken, AccountID, OrgID, RefreshToken } from "../../src/account/schema"
-import { Database } from "../../src/storage"
+import { Database } from "@/storage/db"
import { testEffect } from "../lib/effect"
const truncate = Layer.effectDiscard(
diff --git a/packages/opencode/test/account/service.test.ts b/packages/opencode/test/account/service.test.ts
index 6908c8726..b7f28b85d 100644
--- a/packages/opencode/test/account/service.test.ts
+++ b/packages/opencode/test/account/service.test.ts
@@ -15,7 +15,7 @@ import {
RefreshToken,
UserCode,
} from "../../src/account/schema"
-import { Database } from "../../src/storage"
+import { Database } from "@/storage/db"
import { testEffect } from "../lib/effect"
const truncate = Layer.effectDiscard(
diff --git a/packages/opencode/test/agent/agent.test.ts b/packages/opencode/test/agent/agent.test.ts
index 50a3668f9..ec384709d 100644
--- a/packages/opencode/test/agent/agent.test.ts
+++ b/packages/opencode/test/agent/agent.test.ts
@@ -84,7 +84,7 @@ test("explore agent denies edit and write", async () => {
})
test("explore agent asks for external directories and allows Truncate.GLOB", async () => {
- const { Truncate } = await import("../../src/tool")
+ const { Truncate } = await import("../../src/tool/truncate")
await using tmp = await tmpdir()
await Instance.provide({
directory: tmp.path,
@@ -496,7 +496,7 @@ test("legacy tools config maps write/edit/patch to edit permission", async () =>
})
test("Truncate.GLOB is allowed even when user denies external_directory globally", async () => {
- const { Truncate } = await import("../../src/tool")
+ const { Truncate } = await import("../../src/tool/truncate")
await using tmp = await tmpdir({
config: {
permission: {
@@ -516,7 +516,7 @@ test("Truncate.GLOB is allowed even when user denies external_directory globally
})
test("Truncate.GLOB is allowed even when user denies external_directory per-agent", async () => {
- const { Truncate } = await import("../../src/tool")
+ const { Truncate } = await import("../../src/tool/truncate")
await using tmp = await tmpdir({
config: {
agent: {
@@ -540,7 +540,7 @@ test("Truncate.GLOB is allowed even when user denies external_directory per-agen
})
test("explicit Truncate.GLOB deny is respected", async () => {
- const { Truncate } = await import("../../src/tool")
+ const { Truncate } = await import("../../src/tool/truncate")
await using tmp = await tmpdir({
config: {
permission: {
diff --git a/packages/opencode/test/cli/tui/plugin-loader.test.ts b/packages/opencode/test/cli/tui/plugin-loader.test.ts
index 3dd8b6015..4266906a2 100644
--- a/packages/opencode/test/cli/tui/plugin-loader.test.ts
+++ b/packages/opencode/test/cli/tui/plugin-loader.test.ts
@@ -6,7 +6,7 @@ import { tmpdir } from "../../fixture/fixture"
import { createTuiPluginApi } from "../../fixture/tui-plugin"
import { Global } from "@opencode-ai/core/global"
import { TuiConfig } from "../../../src/cli/cmd/tui/config/tui"
-import { Filesystem } from "../../../src/util/"
+import { Filesystem } from "@/util/filesystem"
const { allThemes, addTheme } = await import("../../../src/cli/cmd/tui/context/theme")
const { TuiPluginRuntime } = await import("../../../src/cli/cmd/tui/plugin/runtime")
diff --git a/packages/opencode/test/cli/tui/thread.test.ts b/packages/opencode/test/cli/tui/thread.test.ts
index 40f4021a2..bca0d8750 100644
--- a/packages/opencode/test/cli/tui/thread.test.ts
+++ b/packages/opencode/test/cli/tui/thread.test.ts
@@ -3,7 +3,7 @@ import fs from "fs/promises"
import path from "path"
import { tmpdir } from "../../fixture/fixture"
import * as App from "../../../src/cli/cmd/tui/app"
-import { Rpc } from "../../../src/util"
+import { Rpc } from "@/util/rpc"
import { UI } from "../../../src/cli/ui"
import * as Timeout from "../../../src/util/timeout"
import * as Network from "../../../src/cli/network"
diff --git a/packages/opencode/test/config/agent-color.test.ts b/packages/opencode/test/config/agent-color.test.ts
index bfa948619..fd3d73fd1 100644
--- a/packages/opencode/test/config/agent-color.test.ts
+++ b/packages/opencode/test/config/agent-color.test.ts
@@ -3,9 +3,9 @@ import { Effect } from "effect"
import path from "path"
import { provideInstance, tmpdir } from "../fixture/fixture"
import { Instance } from "../../src/project/instance"
-import { Config } from "../../src/config"
+import { Config } from "@/config/config"
import { Agent as AgentSvc } from "../../src/agent/agent"
-import { Color } from "../../src/util"
+import { Color } from "@/util/color"
import { AppRuntime } from "../../src/effect/app-runtime"
const load = () => AppRuntime.runPromise(Config.Service.use((svc) => svc.get()))
diff --git a/packages/opencode/test/config/config.test.ts b/packages/opencode/test/config/config.test.ts
index 24c29fd1e..c3ae249e5 100644
--- a/packages/opencode/test/config/config.test.ts
+++ b/packages/opencode/test/config/config.test.ts
@@ -1,7 +1,8 @@
import { test, expect, describe, mock, afterEach, beforeEach } from "bun:test"
import { Effect, Layer, Option } from "effect"
import { NodeFileSystem, NodePath } from "@effect/platform-node"
-import { Config, ConfigManaged } from "../../src/config"
+import { Config } from "@/config/config"
+import { ConfigManaged } from "@/config/managed"
import { ConfigParse } from "../../src/config/parse"
import { EffectFlock } from "@opencode-ai/core/util/effect-flock"
@@ -25,7 +26,7 @@ import fs from "fs/promises"
import { pathToFileURL } from "url"
import { Global } from "@opencode-ai/core/global"
import { ProjectID } from "../../src/project/schema"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { ConfigPlugin } from "@/config/plugin"
import { Npm } from "@opencode-ai/core/npm"
diff --git a/packages/opencode/test/config/markdown.test.ts b/packages/opencode/test/config/markdown.test.ts
index b807850c3..90f1a74dd 100644
--- a/packages/opencode/test/config/markdown.test.ts
+++ b/packages/opencode/test/config/markdown.test.ts
@@ -1,5 +1,5 @@
import { expect, test, describe } from "bun:test"
-import { ConfigMarkdown } from "../../src/config"
+import { ConfigMarkdown } from "@/config/markdown"
describe("ConfigMarkdown: normal template", () => {
const template = `This is a @valid/path/to/a/file and it should also match at
diff --git a/packages/opencode/test/config/tui.test.ts b/packages/opencode/test/config/tui.test.ts
index 0dbe49cef..46a3f0626 100644
--- a/packages/opencode/test/config/tui.test.ts
+++ b/packages/opencode/test/config/tui.test.ts
@@ -4,9 +4,9 @@ import fs from "fs/promises"
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 { Config } from "@/config/config"
import { Global } from "@opencode-ai/core/global"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { AppRuntime } from "../../src/effect/app-runtime"
import { Effect, Layer } from "effect"
import { CurrentWorkingDirectory } from "@/cli/cmd/tui/config/cwd"
diff --git a/packages/opencode/test/effect/app-runtime-logger.test.ts b/packages/opencode/test/effect/app-runtime-logger.test.ts
index 8d5649a20..dc88c60bf 100644
--- a/packages/opencode/test/effect/app-runtime-logger.test.ts
+++ b/packages/opencode/test/effect/app-runtime-logger.test.ts
@@ -1,9 +1,9 @@
import { expect, test } from "bun:test"
import { Context, Effect, Layer, Logger } from "effect"
import { AppRuntime } from "../../src/effect/app-runtime"
-import { EffectBridge } from "../../src/effect"
+import { EffectBridge } from "@/effect/bridge"
import { InstanceRef } from "../../src/effect/instance-ref"
-import { EffectLogger } from "../../src/effect"
+import * as EffectLogger from "@opencode-ai/core/effect/logger"
import { makeRuntime } from "../../src/effect/run-service"
import { Instance } from "../../src/project/instance"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/effect/instance-state.test.ts b/packages/opencode/test/effect/instance-state.test.ts
index 50206ba84..710c24474 100644
--- a/packages/opencode/test/effect/instance-state.test.ts
+++ b/packages/opencode/test/effect/instance-state.test.ts
@@ -1,6 +1,6 @@
import { afterEach, expect, test } from "bun:test"
import { Deferred, Duration, Effect, Exit, Fiber, Layer, ManagedRuntime, Context } from "effect"
-import { InstanceState } from "../../src/effect"
+import { InstanceState } from "@/effect/instance-state"
import { InstanceRef } from "../../src/effect/instance-ref"
import { Instance } from "../../src/project/instance"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/effect/runner.test.ts b/packages/opencode/test/effect/runner.test.ts
index deebdcaa3..4b0fbc1b5 100644
--- a/packages/opencode/test/effect/runner.test.ts
+++ b/packages/opencode/test/effect/runner.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, test } from "bun:test"
import { Deferred, Effect, Exit, Fiber, Ref, Scope } from "effect"
-import { Runner } from "../../src/effect"
+import { Runner } from "@/effect/runner"
import { it } from "../lib/effect"
describe("Runner", () => {
diff --git a/packages/opencode/test/fake/provider.ts b/packages/opencode/test/fake/provider.ts
index bfb185a4b..5f8f7a330 100644
--- a/packages/opencode/test/fake/provider.ts
+++ b/packages/opencode/test/fake/provider.ts
@@ -1,5 +1,5 @@
import { Effect, Layer } from "effect"
-import { Provider } from "../../src/provider"
+import { Provider } from "@/provider/provider"
import { ModelID, ProviderID } from "../../src/provider/schema"
export namespace ProviderTest {
diff --git a/packages/opencode/test/file/index.test.ts b/packages/opencode/test/file/index.test.ts
index 21dbc75b9..091626be8 100644
--- a/packages/opencode/test/file/index.test.ts
+++ b/packages/opencode/test/file/index.test.ts
@@ -5,7 +5,7 @@ import path from "path"
import fs from "fs/promises"
import { File } from "../../src/file"
import { Instance } from "../../src/project/instance"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { provideInstance, tmpdir } from "../fixture/fixture"
afterEach(async () => {
diff --git a/packages/opencode/test/file/path-traversal.test.ts b/packages/opencode/test/file/path-traversal.test.ts
index 119005394..a52af7023 100644
--- a/packages/opencode/test/file/path-traversal.test.ts
+++ b/packages/opencode/test/file/path-traversal.test.ts
@@ -2,7 +2,7 @@ import { test, expect, describe } from "bun:test"
import { Effect } from "effect"
import path from "path"
import fs from "fs/promises"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { File } from "../../src/file"
import { Instance } from "../../src/project/instance"
import { provideInstance, tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/file/watcher.test.ts b/packages/opencode/test/file/watcher.test.ts
index 0c2355008..2c2663b0e 100644
--- a/packages/opencode/test/file/watcher.test.ts
+++ b/packages/opencode/test/file/watcher.test.ts
@@ -5,7 +5,7 @@ import path from "path"
import { ConfigProvider, Deferred, Effect, Layer, ManagedRuntime, Option } from "effect"
import { tmpdir } from "../fixture/fixture"
import { Bus } from "../../src/bus"
-import { Config } from "../../src/config"
+import { Config } from "@/config/config"
import { FileWatcher } from "../../src/file/watcher"
import { Git } from "../../src/git"
import { Instance } from "../../src/project/instance"
diff --git a/packages/opencode/test/fixture/db.ts b/packages/opencode/test/fixture/db.ts
index 581739a6f..4e83d0b90 100644
--- a/packages/opencode/test/fixture/db.ts
+++ b/packages/opencode/test/fixture/db.ts
@@ -1,6 +1,6 @@
import { rm } from "fs/promises"
import { Instance } from "../../src/project/instance"
-import { Database } from "../../src/storage"
+import { Database } from "@/storage/db"
export async function resetDatabase() {
await Instance.disposeAll().catch(() => undefined)
diff --git a/packages/opencode/test/fixture/fixture.ts b/packages/opencode/test/fixture/fixture.ts
index fd7f5e380..91605e15a 100644
--- a/packages/opencode/test/fixture/fixture.ts
+++ b/packages/opencode/test/fixture/fixture.ts
@@ -6,7 +6,7 @@ import { Effect, Context } from "effect"
import type * as PlatformError from "effect/PlatformError"
import type * as Scope from "effect/Scope"
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"
-import type { Config } from "../../src/config"
+import type { Config } from "@/config/config"
import { InstanceRef } from "../../src/effect/instance-ref"
import { Instance } from "../../src/project/instance"
import { TestLLMServer } from "../lib/llm-server"
diff --git a/packages/opencode/test/fixture/plug-worker.ts b/packages/opencode/test/fixture/plug-worker.ts
index c9afcd39f..262a0f2b1 100644
--- a/packages/opencode/test/fixture/plug-worker.ts
+++ b/packages/opencode/test/fixture/plug-worker.ts
@@ -1,7 +1,7 @@
import path from "path"
import { createPlugTask, type PlugCtx, type PlugDeps } from "../../src/cli/cmd/plug"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
type Msg = {
dir: string
diff --git a/packages/opencode/test/keybind.test.ts b/packages/opencode/test/keybind.test.ts
index 1e900a602..09df51992 100644
--- a/packages/opencode/test/keybind.test.ts
+++ b/packages/opencode/test/keybind.test.ts
@@ -1,5 +1,5 @@
import { describe, test, expect } from "bun:test"
-import { Keybind } from "../src/util"
+import { Keybind } from "@/util/keybind"
describe("Keybind.toString", () => {
test("should convert simple key to string", () => {
diff --git a/packages/opencode/test/lsp/client.test.ts b/packages/opencode/test/lsp/client.test.ts
index 4862f6839..f3c7893d9 100644
--- a/packages/opencode/test/lsp/client.test.ts
+++ b/packages/opencode/test/lsp/client.test.ts
@@ -2,10 +2,10 @@ import { beforeEach, describe, expect, test } from "bun:test"
import path from "path"
import { pathToFileURL } from "url"
import { tmpdir } from "../fixture/fixture"
-import { LSPClient } from "../../src/lsp"
-import { LSPServer } from "../../src/lsp"
+import { LSPClient } from "@/lsp/client"
+import * as LSPServer from "@/lsp/server"
import { Instance } from "../../src/project/instance"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
function spawnFakeServer() {
const { spawn } = require("child_process")
diff --git a/packages/opencode/test/lsp/index.test.ts b/packages/opencode/test/lsp/index.test.ts
index 092bfef51..cd6648ae9 100644
--- a/packages/opencode/test/lsp/index.test.ts
+++ b/packages/opencode/test/lsp/index.test.ts
@@ -1,8 +1,8 @@
import { describe, expect, spyOn } from "bun:test"
import path from "path"
import { Effect, Layer } from "effect"
-import { LSP } from "../../src/lsp"
-import { LSPServer } from "../../src/lsp"
+import { LSP } from "@/lsp/lsp"
+import * as LSPServer from "@/lsp/server"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { provideTmpdirInstance } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
diff --git a/packages/opencode/test/lsp/lifecycle.test.ts b/packages/opencode/test/lsp/lifecycle.test.ts
index e39290973..11b191f00 100644
--- a/packages/opencode/test/lsp/lifecycle.test.ts
+++ b/packages/opencode/test/lsp/lifecycle.test.ts
@@ -1,8 +1,8 @@
import { afterEach, beforeEach, describe, expect, spyOn, test } from "bun:test"
import path from "path"
import { Effect, Layer } from "effect"
-import { LSP } from "../../src/lsp"
-import { LSPServer } from "../../src/lsp"
+import { LSP } from "@/lsp/lsp"
+import * as LSPServer from "@/lsp/server"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { provideTmpdirInstance } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
diff --git a/packages/opencode/test/permission-task.test.ts b/packages/opencode/test/permission-task.test.ts
index 3c53314b6..5ce7eee93 100644
--- a/packages/opencode/test/permission-task.test.ts
+++ b/packages/opencode/test/permission-task.test.ts
@@ -1,6 +1,6 @@
import { afterEach, describe, test, expect } from "bun:test"
import { Permission } from "../src/permission"
-import { Config } from "../src/config"
+import { Config } from "@/config/config"
import { Instance } from "../src/project/instance"
import { tmpdir } from "./fixture/fixture"
import { AppRuntime } from "../src/effect/app-runtime"
diff --git a/packages/opencode/test/plugin/auth-override.test.ts b/packages/opencode/test/plugin/auth-override.test.ts
index 89d1641af..4bee98579 100644
--- a/packages/opencode/test/plugin/auth-override.test.ts
+++ b/packages/opencode/test/plugin/auth-override.test.ts
@@ -4,7 +4,7 @@ import fs from "fs/promises"
import { Effect } from "effect"
import { tmpdir } from "../fixture/fixture"
import { Instance } from "../../src/project/instance"
-import { ProviderAuth } from "../../src/provider"
+import { ProviderAuth } from "@/provider/auth"
import { ProviderID } from "../../src/provider/schema"
describe("plugin.auth-override", () => {
diff --git a/packages/opencode/test/plugin/install-concurrency.test.ts b/packages/opencode/test/plugin/install-concurrency.test.ts
index 06ec2fc99..dd9f8c928 100644
--- a/packages/opencode/test/plugin/install-concurrency.test.ts
+++ b/packages/opencode/test/plugin/install-concurrency.test.ts
@@ -2,8 +2,8 @@ import { describe, expect, test } from "bun:test"
import fs from "fs/promises"
import path from "path"
-import { Process } from "../../src/util"
-import { Filesystem } from "../../src/util"
+import { Process } from "@/util/process"
+import { Filesystem } from "@/util/filesystem"
import { tmpdir } from "../fixture/fixture"
const root = path.join(import.meta.dir, "../..")
diff --git a/packages/opencode/test/plugin/install.test.ts b/packages/opencode/test/plugin/install.test.ts
index f125f188a..6dc9175be 100644
--- a/packages/opencode/test/plugin/install.test.ts
+++ b/packages/opencode/test/plugin/install.test.ts
@@ -2,7 +2,7 @@ import { describe, expect, test } from "bun:test"
import fs from "fs/promises"
import path from "path"
import { parse as parseJsonc } from "jsonc-parser"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { createPlugTask, type PlugCtx, type PlugDeps } from "../../src/cli/cmd/plug"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/plugin/loader-shared.test.ts b/packages/opencode/test/plugin/loader-shared.test.ts
index 88b3bf343..211a93a60 100644
--- a/packages/opencode/test/plugin/loader-shared.test.ts
+++ b/packages/opencode/test/plugin/loader-shared.test.ts
@@ -4,7 +4,7 @@ import fs from "fs/promises"
import path from "path"
import { pathToFileURL } from "url"
import { tmpdir } from "../fixture/fixture"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
const disableDefault = process.env.OPENCODE_DISABLE_DEFAULT_PLUGINS
process.env.OPENCODE_DISABLE_DEFAULT_PLUGINS = "1"
diff --git a/packages/opencode/test/plugin/meta.test.ts b/packages/opencode/test/plugin/meta.test.ts
index 3e2d4c617..d48c22c97 100644
--- a/packages/opencode/test/plugin/meta.test.ts
+++ b/packages/opencode/test/plugin/meta.test.ts
@@ -4,8 +4,8 @@ import path from "path"
import { pathToFileURL } from "url"
import { tmpdir } from "../fixture/fixture"
-import { Process } from "../../src/util"
-import { Filesystem } from "../../src/util"
+import { Process } from "@/util/process"
+import { Filesystem } from "@/util/filesystem"
const { PluginMeta } = await import("../../src/plugin/meta")
const root = path.join(import.meta.dir, "../..")
diff --git a/packages/opencode/test/preload.ts b/packages/opencode/test/preload.ts
index 58dc2b0b4..479da7f51 100644
--- a/packages/opencode/test/preload.ts
+++ b/packages/opencode/test/preload.ts
@@ -10,7 +10,7 @@ import { afterAll } from "bun:test"
const dir = path.join(os.tmpdir(), "opencode-test-data-" + process.pid)
await fs.mkdir(dir, { recursive: true })
afterAll(async () => {
- const { Database } = await import("../src/storage")
+ const { Database } = await import("../src/storage/db")
Database.close()
const busy = (error: unknown) =>
typeof error === "object" && error !== null && "code" in error && error.code === "EBUSY"
@@ -79,7 +79,7 @@ delete process.env["OPENCODE_SERVER_USERNAME"]
process.env["OPENCODE_DB"] = ":memory:"
// Now safe to import from src/
-const { Log } = await import("../src/util")
+const Log = await import("@opencode-ai/core/util/log")
const { initProjectors } = await import("../src/server/projectors")
void Log.init({
diff --git a/packages/opencode/test/project/migrate-global.test.ts b/packages/opencode/test/project/migrate-global.test.ts
index 8c9982afb..2a1580579 100644
--- a/packages/opencode/test/project/migrate-global.test.ts
+++ b/packages/opencode/test/project/migrate-global.test.ts
@@ -1,11 +1,12 @@
import { describe, expect, test } from "bun:test"
-import { Project } from "../../src/project"
-import { Database, eq } from "../../src/storage"
+import { Project } from "@/project/project"
+import { Database } from "@/storage/db"
+import { eq } from "drizzle-orm"
import { SessionTable } from "../../src/session/session.sql"
import { ProjectTable } from "../../src/project/project.sql"
import { ProjectID } from "../../src/project/schema"
import { SessionID } from "../../src/session/schema"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { $ } from "bun"
import { tmpdir } from "../fixture/fixture"
import { Effect } from "effect"
diff --git a/packages/opencode/test/project/project.test.ts b/packages/opencode/test/project/project.test.ts
index c3aba55de..e69b8e6df 100644
--- a/packages/opencode/test/project/project.test.ts
+++ b/packages/opencode/test/project/project.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, test } from "bun:test"
-import { Project } from "../../src/project"
-import { Log } from "../../src/util"
+import { Project } from "@/project/project"
+import * as Log from "@opencode-ai/core/util/log"
import { $ } from "bun"
import path from "path"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/project/vcs.test.ts b/packages/opencode/test/project/vcs.test.ts
index 8f0eaecc2..a2a5cff60 100644
--- a/packages/opencode/test/project/vcs.test.ts
+++ b/packages/opencode/test/project/vcs.test.ts
@@ -8,7 +8,7 @@ import { AppRuntime } from "../../src/effect/app-runtime"
import { FileWatcher } from "../../src/file/watcher"
import { Instance } from "../../src/project/instance"
import { GlobalBus } from "../../src/bus/global"
-import { Vcs } from "../../src/project"
+import { Vcs } from "@/project/vcs"
// Skip in CI — native @parcel/watcher binding needed
const describeVcs = FileWatcher.hasNativeBinding() && !process.env.CI ? describe : describe.skip
diff --git a/packages/opencode/test/provider/amazon-bedrock.test.ts b/packages/opencode/test/provider/amazon-bedrock.test.ts
index aff67494b..88c67aa6d 100644
--- a/packages/opencode/test/provider/amazon-bedrock.test.ts
+++ b/packages/opencode/test/provider/amazon-bedrock.test.ts
@@ -5,10 +5,10 @@ import { unlink } from "fs/promises"
import { ProviderID } from "../../src/provider/schema"
import { tmpdir } from "../fixture/fixture"
import { Instance } from "../../src/project/instance"
-import { Provider } from "../../src/provider"
+import { Provider } from "@/provider/provider"
import { Env } from "../../src/env"
import { Global } from "@opencode-ai/core/global"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { Effect } from "effect"
import { AppRuntime } from "../../src/effect/app-runtime"
import { makeRuntime } from "../../src/effect/run-service"
diff --git a/packages/opencode/test/provider/gitlab-duo.test.ts b/packages/opencode/test/provider/gitlab-duo.test.ts
index a74ef360b..84478a34c 100644
--- a/packages/opencode/test/provider/gitlab-duo.test.ts
+++ b/packages/opencode/test/provider/gitlab-duo.test.ts
@@ -9,7 +9,7 @@ export {}
// import { ProviderID, ModelID } from "../../src/provider/schema"
// import { tmpdir } from "../fixture/fixture"
// import { Instance } from "../../src/project/instance"
-// import { Provider } from "../../src/provider"
+// import { Provider } from "@/provider/provider"
// import { Env } from "../../src/env"
// import { Global } from "@opencode-ai/core/global"
// import { GitLabWorkflowLanguageModel } from "gitlab-ai-provider"
diff --git a/packages/opencode/test/provider/provider.test.ts b/packages/opencode/test/provider/provider.test.ts
index 1480b2314..d0aa299e7 100644
--- a/packages/opencode/test/provider/provider.test.ts
+++ b/packages/opencode/test/provider/provider.test.ts
@@ -6,10 +6,10 @@ import { tmpdir } from "../fixture/fixture"
import { Global } from "@opencode-ai/core/global"
import { Instance } from "../../src/project/instance"
import { Plugin } from "../../src/plugin/index"
-import { ModelsDev } from "../../src/provider"
-import { Provider } from "../../src/provider"
+import { ModelsDev } from "@/provider/models"
+import { Provider } from "@/provider/provider"
import { ProviderID, ModelID } from "../../src/provider/schema"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { Env } from "../../src/env"
import { Effect } from "effect"
import { AppRuntime } from "../../src/effect/app-runtime"
diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts
index 791fcdedc..d9eb36407 100644
--- a/packages/opencode/test/provider/transform.test.ts
+++ b/packages/opencode/test/provider/transform.test.ts
@@ -1,5 +1,5 @@
import { describe, expect, test } from "bun:test"
-import { ProviderTransform } from "../../src/provider"
+import { ProviderTransform } from "@/provider/transform"
import { ModelID, ProviderID } from "../../src/provider/schema"
describe("ProviderTransform.options - setCacheKey", () => {
diff --git a/packages/opencode/test/server/global-session-list.test.ts b/packages/opencode/test/server/global-session-list.test.ts
index 03b1a0346..a5ab7b8f3 100644
--- a/packages/opencode/test/server/global-session-list.test.ts
+++ b/packages/opencode/test/server/global-session-list.test.ts
@@ -2,9 +2,9 @@ import { describe, expect, test } from "bun:test"
import { Effect } from "effect"
import z from "zod"
import { Instance } from "../../src/project/instance"
-import { Project } from "../../src/project"
-import { Session as SessionNs } from "../../src/session"
-import { Log } from "../../src/util"
+import { Project } from "@/project/project"
+import { Session as SessionNs } from "@/session/session"
+import * as Log from "@opencode-ai/core/util/log"
import { tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
diff --git a/packages/opencode/test/server/httpapi-bridge.test.ts b/packages/opencode/test/server/httpapi-bridge.test.ts
index 35f173371..37f0a5ec1 100644
--- a/packages/opencode/test/server/httpapi-bridge.test.ts
+++ b/packages/opencode/test/server/httpapi-bridge.test.ts
@@ -4,7 +4,7 @@ import { Flag } from "@opencode-ai/core/flag/flag"
import { Instance } from "../../src/project/instance"
import { InstanceRoutes } from "../../src/server/routes/instance"
import { FilePaths } from "../../src/server/routes/instance/httpapi/file"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/server/httpapi-config.test.ts b/packages/opencode/test/server/httpapi-config.test.ts
index 351ac2c50..10a168414 100644
--- a/packages/opencode/test/server/httpapi-config.test.ts
+++ b/packages/opencode/test/server/httpapi-config.test.ts
@@ -5,7 +5,7 @@ import { Flag } from "@opencode-ai/core/flag/flag"
import { GlobalBus } from "@/bus/global"
import { Instance } from "../../src/project/instance"
import { InstanceRoutes } from "../../src/server/routes/instance"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/server/httpapi-event.test.ts b/packages/opencode/test/server/httpapi-event.test.ts
index 53bb1edb2..4930ce7e7 100644
--- a/packages/opencode/test/server/httpapi-event.test.ts
+++ b/packages/opencode/test/server/httpapi-event.test.ts
@@ -4,7 +4,7 @@ import { Flag } from "@opencode-ai/core/flag/flag"
import { Instance } from "../../src/project/instance"
import { InstanceRoutes } from "../../src/server/routes/instance"
import { EventPaths } from "../../src/server/routes/instance/httpapi/event"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/server/httpapi-experimental.test.ts b/packages/opencode/test/server/httpapi-experimental.test.ts
index 384301280..cf0242048 100644
--- a/packages/opencode/test/server/httpapi-experimental.test.ts
+++ b/packages/opencode/test/server/httpapi-experimental.test.ts
@@ -6,9 +6,9 @@ import { GlobalBus } from "@/bus/global"
import { Instance } from "../../src/project/instance"
import { InstanceRoutes } from "../../src/server/routes/instance"
import { ExperimentalPaths } from "../../src/server/routes/instance/httpapi/experimental"
-import { Session } from "../../src/session"
-import { Database } from "../../src/storage"
-import { Log } from "../../src/util"
+import { Session } from "@/session/session"
+import { Database } from "@/storage/db"
+import * as Log from "@opencode-ai/core/util/log"
import { Worktree } from "../../src/worktree"
import { resetDatabase } from "../fixture/db"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/server/httpapi-file.test.ts b/packages/opencode/test/server/httpapi-file.test.ts
index 302e0a349..f9e94eeaa 100644
--- a/packages/opencode/test/server/httpapi-file.test.ts
+++ b/packages/opencode/test/server/httpapi-file.test.ts
@@ -4,7 +4,7 @@ import path from "path"
import { ExperimentalHttpApiServer } from "../../src/server/routes/instance/httpapi/server"
import { FilePaths } from "../../src/server/routes/instance/httpapi/file"
import { Instance } from "../../src/project/instance"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/server/httpapi-instance.test.ts b/packages/opencode/test/server/httpapi-instance.test.ts
index 404807984..65814ebde 100644
--- a/packages/opencode/test/server/httpapi-instance.test.ts
+++ b/packages/opencode/test/server/httpapi-instance.test.ts
@@ -6,7 +6,7 @@ import { GlobalBus } from "@/bus/global"
import { Instance } from "../../src/project/instance"
import { InstanceRoutes } from "../../src/server/routes/instance"
import { InstancePaths } from "../../src/server/routes/instance/httpapi/instance"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/server/httpapi-mcp.test.ts b/packages/opencode/test/server/httpapi-mcp.test.ts
index 07d0b72ed..35ea3240c 100644
--- a/packages/opencode/test/server/httpapi-mcp.test.ts
+++ b/packages/opencode/test/server/httpapi-mcp.test.ts
@@ -3,7 +3,7 @@ import { Context } from "effect"
import { ExperimentalHttpApiServer } from "../../src/server/routes/instance/httpapi/server"
import { McpPaths } from "../../src/server/routes/instance/httpapi/mcp"
import { Instance } from "../../src/project/instance"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/server/httpapi-pty.test.ts b/packages/opencode/test/server/httpapi-pty.test.ts
index 00aa8e21f..65a115a41 100644
--- a/packages/opencode/test/server/httpapi-pty.test.ts
+++ b/packages/opencode/test/server/httpapi-pty.test.ts
@@ -5,7 +5,7 @@ import { PtyID } from "../../src/pty/schema"
import { Instance } from "../../src/project/instance"
import { InstanceRoutes } from "../../src/server/routes/instance"
import { PtyPaths } from "../../src/server/routes/instance/httpapi/pty"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/server/httpapi-session.test.ts b/packages/opencode/test/server/httpapi-session.test.ts
index d1d36c7d4..264e66022 100644
--- a/packages/opencode/test/server/httpapi-session.test.ts
+++ b/packages/opencode/test/server/httpapi-session.test.ts
@@ -7,10 +7,10 @@ import { ModelID, ProviderID } from "../../src/provider/schema"
import { Instance } from "../../src/project/instance"
import { InstanceRoutes } from "../../src/server/routes/instance"
import { SessionPaths } from "../../src/server/routes/instance/httpapi/session"
-import { Session } from "../../src/session"
+import { Session } from "@/session/session"
import { MessageID, PartID, type SessionID } from "../../src/session/schema"
import { MessageV2 } from "../../src/session/message-v2"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/server/httpapi-sync.test.ts b/packages/opencode/test/server/httpapi-sync.test.ts
index d48d7608a..75e67db46 100644
--- a/packages/opencode/test/server/httpapi-sync.test.ts
+++ b/packages/opencode/test/server/httpapi-sync.test.ts
@@ -5,8 +5,8 @@ import { Flag } from "@opencode-ai/core/flag/flag"
import { Instance } from "../../src/project/instance"
import { InstanceRoutes } from "../../src/server/routes/instance"
import { SyncPaths } from "../../src/server/routes/instance/httpapi/sync"
-import { Session } from "../../src/session"
-import { Log } from "../../src/util"
+import { Session } from "@/session/session"
+import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/server/httpapi-tui.test.ts b/packages/opencode/test/server/httpapi-tui.test.ts
index f5dac5ab4..f47d11c67 100644
--- a/packages/opencode/test/server/httpapi-tui.test.ts
+++ b/packages/opencode/test/server/httpapi-tui.test.ts
@@ -7,7 +7,7 @@ import { Instance } from "../../src/project/instance"
import { InstanceRoutes } from "../../src/server/routes/instance"
import { TuiPaths } from "../../src/server/routes/instance/httpapi/tui"
import { callTui } from "../../src/server/routes/instance/tui"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/server/httpapi-workspace.test.ts b/packages/opencode/test/server/httpapi-workspace.test.ts
index 75f3bd9ef..180d83ee4 100644
--- a/packages/opencode/test/server/httpapi-workspace.test.ts
+++ b/packages/opencode/test/server/httpapi-workspace.test.ts
@@ -8,9 +8,9 @@ import { registerAdaptor } from "../../src/control-plane/adaptors"
import type { WorkspaceAdaptor } from "../../src/control-plane/types"
import { Workspace } from "../../src/control-plane/workspace"
import { WorkspacePaths } from "../../src/server/routes/instance/httpapi/workspace"
+import { Session } from "@/session/session"
+import * as Log from "@opencode-ai/core/util/log"
import { InstanceRoutes } from "../../src/server/routes/instance"
-import { Session } from "../../src/session"
-import { Log } from "../../src/util"
import { resetDatabase } from "../fixture/db"
import { tmpdir } from "../fixture/fixture"
import { Instance } from "../../src/project/instance"
diff --git a/packages/opencode/test/server/project-init-git.test.ts b/packages/opencode/test/server/project-init-git.test.ts
index a29b4ebb3..86c52096e 100644
--- a/packages/opencode/test/server/project-init-git.test.ts
+++ b/packages/opencode/test/server/project-init-git.test.ts
@@ -5,8 +5,8 @@ import { GlobalBus } from "../../src/bus/global"
import { Snapshot } from "../../src/snapshot"
import { Instance } from "../../src/project/instance"
import { Server } from "../../src/server/server"
-import { Filesystem } from "../../src/util"
-import { Log } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
+import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
import { provideInstance, tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/server/session-actions.test.ts b/packages/opencode/test/server/session-actions.test.ts
index 4be2344aa..843986ba8 100644
--- a/packages/opencode/test/server/session-actions.test.ts
+++ b/packages/opencode/test/server/session-actions.test.ts
@@ -2,9 +2,9 @@ import { afterEach, describe, expect, mock, test } from "bun:test"
import { Effect } from "effect"
import { Instance } from "../../src/project/instance"
import { Server } from "../../src/server/server"
-import { Session as SessionNs } from "../../src/session"
+import { Session as SessionNs } from "@/session/session"
import type { SessionID } from "../../src/session/schema"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
diff --git a/packages/opencode/test/server/session-list.test.ts b/packages/opencode/test/server/session-list.test.ts
index 602d0f204..2e2945d07 100644
--- a/packages/opencode/test/server/session-list.test.ts
+++ b/packages/opencode/test/server/session-list.test.ts
@@ -1,8 +1,8 @@
import { afterEach, describe, expect, test } from "bun:test"
import { Effect } from "effect"
import { Instance } from "../../src/project/instance"
-import { Session as SessionNs } from "../../src/session"
-import { Log } from "../../src/util"
+import { Session as SessionNs } from "@/session/session"
+import * as Log from "@opencode-ai/core/util/log"
import { tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
diff --git a/packages/opencode/test/server/session-messages.test.ts b/packages/opencode/test/server/session-messages.test.ts
index 23e8b5014..e64d28bb4 100644
--- a/packages/opencode/test/server/session-messages.test.ts
+++ b/packages/opencode/test/server/session-messages.test.ts
@@ -2,10 +2,10 @@ import { afterEach, describe, expect, test } from "bun:test"
import { Effect } from "effect"
import { Instance } from "../../src/project/instance"
import { Server } from "../../src/server/server"
-import { Session as SessionNs } from "../../src/session"
+import { Session as SessionNs } from "@/session/session"
import { MessageV2 } from "../../src/session/message-v2"
import { MessageID, PartID, type SessionID } from "../../src/session/schema"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { tmpdir } from "../fixture/fixture"
void Log.init({ print: false })
diff --git a/packages/opencode/test/server/session-select.test.ts b/packages/opencode/test/server/session-select.test.ts
index 21e07f88a..278fba94d 100644
--- a/packages/opencode/test/server/session-select.test.ts
+++ b/packages/opencode/test/server/session-select.test.ts
@@ -1,8 +1,8 @@
import { afterEach, describe, expect, test } from "bun:test"
import { Effect } from "effect"
-import { Session as SessionNs } from "../../src/session"
+import { Session as SessionNs } from "@/session/session"
import type { SessionID } from "../../src/session/schema"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { Instance } from "../../src/project/instance"
import { Server } from "../../src/server/server"
import { tmpdir } from "../fixture/fixture"
diff --git a/packages/opencode/test/session/compaction.test.ts b/packages/opencode/test/session/compaction.test.ts
index 1b2b120b6..f35e044d7 100644
--- a/packages/opencode/test/session/compaction.test.ts
+++ b/packages/opencode/test/session/compaction.test.ts
@@ -4,23 +4,23 @@ import { Cause, Effect, Exit, Layer, ManagedRuntime } from "effect"
import * as Stream from "effect/Stream"
import z from "zod"
import { Bus } from "../../src/bus"
-import { Config } from "../../src/config"
+import { Config } from "@/config/config"
import { Agent } from "../../src/agent/agent"
import { LLM } from "../../src/session/llm"
import { SessionCompaction } from "../../src/session/compaction"
-import { Token } from "../../src/util"
+import { Token } from "@/util/token"
import { Instance } from "../../src/project/instance"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { Permission } from "../../src/permission"
import { Plugin } from "../../src/plugin"
import { provideTmpdirInstance, tmpdir } from "../fixture/fixture"
-import { Session as SessionNs } from "../../src/session"
+import { Session as SessionNs } from "@/session/session"
import { MessageV2 } from "../../src/session/message-v2"
import { MessageID, PartID, SessionID } from "../../src/session/schema"
import { SessionStatus } from "../../src/session/status"
import { SessionSummary } from "../../src/session/summary"
import { ModelID, ProviderID } from "../../src/provider/schema"
-import type { Provider } from "../../src/provider"
+import type { Provider } from "@/provider/provider"
import * as SessionProcessorModule from "../../src/session/processor"
import { Snapshot } from "../../src/snapshot"
import { ProviderTest } from "../fake/provider"
diff --git a/packages/opencode/test/session/llm.test.ts b/packages/opencode/test/session/llm.test.ts
index 4d82096f3..c648d62be 100644
--- a/packages/opencode/test/session/llm.test.ts
+++ b/packages/opencode/test/session/llm.test.ts
@@ -6,11 +6,11 @@ import z from "zod"
import { makeRuntime } from "../../src/effect/run-service"
import { LLM } from "../../src/session/llm"
import { Instance } from "../../src/project/instance"
-import { Provider } from "../../src/provider"
-import { ProviderTransform } from "../../src/provider"
-import { ModelsDev } from "../../src/provider"
+import { Provider } from "@/provider/provider"
+import { ProviderTransform } from "@/provider/transform"
+import { ModelsDev } from "@/provider/models"
import { ProviderID, ModelID } from "../../src/provider/schema"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { tmpdir } from "../fixture/fixture"
import type { Agent } from "../../src/agent/agent"
import { MessageV2 } from "../../src/session/message-v2"
diff --git a/packages/opencode/test/session/message-v2.test.ts b/packages/opencode/test/session/message-v2.test.ts
index 9591a5d62..89bae246a 100644
--- a/packages/opencode/test/session/message-v2.test.ts
+++ b/packages/opencode/test/session/message-v2.test.ts
@@ -1,8 +1,8 @@
import { describe, expect, test } from "bun:test"
import { APICallError } from "ai"
import { MessageV2 } from "../../src/session/message-v2"
-import { ProviderTransform } from "../../src/provider"
-import type { Provider } from "../../src/provider"
+import { ProviderTransform } from "@/provider/transform"
+import type { Provider } from "@/provider/provider"
import { ModelID, ProviderID } from "../../src/provider/schema"
import { SessionID, MessageID, PartID } from "../../src/session/schema"
import { Question } from "../../src/question"
diff --git a/packages/opencode/test/session/messages-pagination.test.ts b/packages/opencode/test/session/messages-pagination.test.ts
index df2d18b9f..3fe64ce80 100644
--- a/packages/opencode/test/session/messages-pagination.test.ts
+++ b/packages/opencode/test/session/messages-pagination.test.ts
@@ -2,11 +2,11 @@ import { describe, expect, test } from "bun:test"
import { Effect } from "effect"
import path from "path"
import { Instance } from "../../src/project/instance"
-import { Session as SessionNs } from "../../src/session"
+import { Session as SessionNs } from "@/session/session"
import { MessageV2 } from "../../src/session/message-v2"
import { MessageID, PartID, type SessionID } from "../../src/session/schema"
import { ModelID, ProviderID } from "../../src/provider/schema"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
const root = path.join(__dirname, "../..")
void Log.init({ print: false })
diff --git a/packages/opencode/test/session/processor-effect.test.ts b/packages/opencode/test/session/processor-effect.test.ts
index fee42a939..226bab986 100644
--- a/packages/opencode/test/session/processor-effect.test.ts
+++ b/packages/opencode/test/session/processor-effect.test.ts
@@ -5,12 +5,12 @@ import path from "path"
import type { Agent } from "../../src/agent/agent"
import { Agent as AgentSvc } from "../../src/agent/agent"
import { Bus } from "../../src/bus"
-import { Config } from "../../src/config"
+import { Config } from "@/config/config"
import { Permission } from "../../src/permission"
import { Plugin } from "../../src/plugin"
-import { Provider } from "../../src/provider"
+import { Provider } from "@/provider/provider"
import { ModelID, ProviderID } from "../../src/provider/schema"
-import { Session } from "../../src/session"
+import { Session } from "@/session/session"
import { LLM } from "../../src/session/llm"
import { MessageV2 } from "../../src/session/message-v2"
import { SessionProcessor } from "../../src/session/processor"
@@ -18,7 +18,7 @@ import { MessageID, PartID, SessionID } from "../../src/session/schema"
import { SessionStatus } from "../../src/session/status"
import { SessionSummary } from "../../src/session/summary"
import { Snapshot } from "../../src/snapshot"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { provideTmpdirServer } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
diff --git a/packages/opencode/test/session/prompt.test.ts b/packages/opencode/test/session/prompt.test.ts
index b592d06df..422c1400c 100644
--- a/packages/opencode/test/session/prompt.test.ts
+++ b/packages/opencode/test/session/prompt.test.ts
@@ -8,17 +8,17 @@ import { NamedError } from "@opencode-ai/core/util/error"
import { Agent as AgentSvc } from "../../src/agent/agent"
import { Bus } from "../../src/bus"
import { Command } from "../../src/command"
-import { Config } from "../../src/config"
-import { LSP } from "../../src/lsp"
+import { Config } from "@/config/config"
+import { LSP } from "@/lsp/lsp"
import { MCP } from "../../src/mcp"
import { Permission } from "../../src/permission"
import { Plugin } from "../../src/plugin"
-import { Provider as ProviderSvc } from "../../src/provider"
+import { Provider as ProviderSvc } from "@/provider/provider"
import { Env } from "../../src/env"
import { ModelID, ProviderID } from "../../src/provider/schema"
import { Question } from "../../src/question"
import { Todo } from "../../src/session/todo"
-import { Session } from "../../src/session"
+import { Session } from "@/session/session"
import { LLM } from "../../src/session/llm"
import { MessageV2 } from "../../src/session/message-v2"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
@@ -35,9 +35,9 @@ import { Skill } from "../../src/skill"
import { SystemPrompt } from "../../src/session/system"
import { Shell } from "../../src/shell/shell"
import { Snapshot } from "../../src/snapshot"
-import { ToolRegistry } from "../../src/tool"
-import { Truncate } from "../../src/tool"
-import { Log } from "../../src/util"
+import { ToolRegistry } from "@/tool/registry"
+import { Truncate } from "@/tool/truncate"
+import * as Log from "@opencode-ai/core/util/log"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { Ripgrep } from "../../src/file/ripgrep"
import { Format } from "../../src/format"
diff --git a/packages/opencode/test/session/revert-compact.test.ts b/packages/opencode/test/session/revert-compact.test.ts
index d77ef3e05..c70c17d45 100644
--- a/packages/opencode/test/session/revert-compact.test.ts
+++ b/packages/opencode/test/session/revert-compact.test.ts
@@ -2,12 +2,12 @@ import { describe, expect } from "bun:test"
import fs from "fs/promises"
import path from "path"
import { Effect, Layer } from "effect"
-import { Session } from "../../src/session"
+import { Session } from "@/session/session"
import { ModelID, ProviderID } from "../../src/provider/schema"
import { SessionRevert } from "../../src/session/revert"
import { MessageV2 } from "../../src/session/message-v2"
import { Snapshot } from "../../src/snapshot"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { MessageID, PartID, SessionID } from "../../src/session/schema"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { provideTmpdirInstance } from "../fixture/fixture"
diff --git a/packages/opencode/test/session/schema-decoding.test.ts b/packages/opencode/test/session/schema-decoding.test.ts
index 5894b2615..6ac695cd6 100644
--- a/packages/opencode/test/session/schema-decoding.test.ts
+++ b/packages/opencode/test/session/schema-decoding.test.ts
@@ -1,7 +1,7 @@
import { describe, expect, test } from "bun:test"
import { Schema } from "effect"
-import { Session } from "../../src/session"
+import { Session } from "@/session/session"
import { SessionPrompt } from "../../src/session/prompt"
import { SessionRevert } from "../../src/session/revert"
import { SessionStatus } from "../../src/session/status"
diff --git a/packages/opencode/test/session/session.test.ts b/packages/opencode/test/session/session.test.ts
index d4a1d711d..c1ff9ae03 100644
--- a/packages/opencode/test/session/session.test.ts
+++ b/packages/opencode/test/session/session.test.ts
@@ -1,8 +1,8 @@
import { describe, expect, test } from "bun:test"
import path from "path"
-import { Session as SessionNs } from "../../src/session"
+import { Session as SessionNs } from "@/session/session"
import { Bus } from "../../src/bus"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { Instance } from "../../src/project/instance"
import { MessageV2 } from "../../src/session/message-v2"
import { MessageID, PartID, type SessionID } from "../../src/session/schema"
diff --git a/packages/opencode/test/session/snapshot-tool-race.test.ts b/packages/opencode/test/session/snapshot-tool-race.test.ts
index 269c23148..ab5a3ab7e 100644
--- a/packages/opencode/test/session/snapshot-tool-race.test.ts
+++ b/packages/opencode/test/session/snapshot-tool-race.test.ts
@@ -16,13 +16,13 @@ import { Effect, Layer } from "effect"
import { FetchHttpClient } from "effect/unstable/http"
import fs from "fs/promises"
import path from "path"
-import { Session } from "../../src/session"
+import { Session } from "@/session/session"
import { LLM } from "../../src/session/llm"
import { SessionPrompt } from "../../src/session/prompt"
import { SessionRevert } from "../../src/session/revert"
import { SessionSummary } from "../../src/session/summary"
import { MessageV2 } from "../../src/session/message-v2"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { provideTmpdirServer } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
import { TestLLMServer } from "../lib/llm-server"
@@ -32,12 +32,12 @@ import { NodeFileSystem } from "@effect/platform-node"
import { Agent as AgentSvc } from "../../src/agent/agent"
import { Bus } from "../../src/bus"
import { Command } from "../../src/command"
-import { Config } from "../../src/config"
-import { LSP } from "../../src/lsp"
+import { Config } from "@/config/config"
+import { LSP } from "@/lsp/lsp"
import { MCP } from "../../src/mcp"
import { Permission } from "../../src/permission"
import { Plugin } from "../../src/plugin"
-import { Provider as ProviderSvc } from "../../src/provider"
+import { Provider as ProviderSvc } from "@/provider/provider"
import { Env } from "../../src/env"
import { Question } from "../../src/question"
import { Skill } from "../../src/skill"
@@ -49,8 +49,8 @@ import { SessionProcessor } from "../../src/session/processor"
import { SessionRunState } from "../../src/session/run-state"
import { SessionStatus } from "../../src/session/status"
import { Snapshot } from "../../src/snapshot"
-import { ToolRegistry } from "../../src/tool"
-import { Truncate } from "../../src/tool"
+import { ToolRegistry } from "@/tool/registry"
+import { Truncate } from "@/tool/truncate"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { Ripgrep } from "../../src/file/ripgrep"
diff --git a/packages/opencode/test/session/structured-output-integration.test.ts b/packages/opencode/test/session/structured-output-integration.test.ts
index fb8d42f07..bdf95caed 100644
--- a/packages/opencode/test/session/structured-output-integration.test.ts
+++ b/packages/opencode/test/session/structured-output-integration.test.ts
@@ -1,9 +1,9 @@
import { describe, expect, test } from "bun:test"
import path from "path"
import { Effect, Layer } from "effect"
-import { Session } from "../../src/session"
+import { Session } from "@/session/session"
import { SessionPrompt } from "../../src/session/prompt"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { Instance } from "../../src/project/instance"
import { MessageV2 } from "../../src/session/message-v2"
diff --git a/packages/opencode/test/share/share-next.test.ts b/packages/opencode/test/share/share-next.test.ts
index 5470d654a..14ecff745 100644
--- a/packages/opencode/test/share/share-next.test.ts
+++ b/packages/opencode/test/share/share-next.test.ts
@@ -8,13 +8,14 @@ import { Account } from "../../src/account/account"
import { AccountRepo } from "../../src/account/repo"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { Bus } from "../../src/bus"
-import { Config } from "../../src/config"
-import { Provider } from "../../src/provider"
-import { Session } from "../../src/session"
+import { Config } from "@/config/config"
+import { Provider } from "@/provider/provider"
+import { Session } from "@/session/session"
import type { SessionID } from "../../src/session/schema"
-import { ShareNext } from "../../src/share"
+import { ShareNext } from "@/share/share-next"
import { SessionShareTable } from "../../src/share/share.sql"
-import { Database, eq } from "../../src/storage"
+import { Database } from "@/storage/db"
+import { eq } from "drizzle-orm"
import { provideTmpdirInstance } from "../fixture/fixture"
import { resetDatabase } from "../fixture/db"
import { testEffect } from "../lib/effect"
diff --git a/packages/opencode/test/shell/shell.test.ts b/packages/opencode/test/shell/shell.test.ts
index ed29a4cc8..d7821fe46 100644
--- a/packages/opencode/test/shell/shell.test.ts
+++ b/packages/opencode/test/shell/shell.test.ts
@@ -1,7 +1,7 @@
import { describe, expect, test } from "bun:test"
import path from "path"
import { Shell } from "../../src/shell/shell"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { which } from "../../src/util/which"
const withShell = async (shell: string | undefined, fn: () => void | Promise<void>) => {
diff --git a/packages/opencode/test/skill/discovery.test.ts b/packages/opencode/test/skill/discovery.test.ts
index 230a9e03e..f4a17f25c 100644
--- a/packages/opencode/test/skill/discovery.test.ts
+++ b/packages/opencode/test/skill/discovery.test.ts
@@ -2,7 +2,7 @@ import { describe, test, expect, beforeAll, afterAll } from "bun:test"
import { Effect } from "effect"
import { Discovery } from "../../src/skill/discovery"
import { Global } from "@opencode-ai/core/global"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { rm } from "fs/promises"
import path from "path"
diff --git a/packages/opencode/test/snapshot/snapshot.test.ts b/packages/opencode/test/snapshot/snapshot.test.ts
index 3330b497c..b85d570dc 100644
--- a/packages/opencode/test/snapshot/snapshot.test.ts
+++ b/packages/opencode/test/snapshot/snapshot.test.ts
@@ -5,7 +5,7 @@ import path from "path"
import { Effect } from "effect"
import { Snapshot } from "../../src/snapshot"
import { Instance } from "../../src/project/instance"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { provideInstance, tmpdir } from "../fixture/fixture"
// Git always outputs /-separated paths internally. Snapshot.patch() joins them
diff --git a/packages/opencode/test/storage/db.test.ts b/packages/opencode/test/storage/db.test.ts
index 2cd9f817c..f667fc904 100644
--- a/packages/opencode/test/storage/db.test.ts
+++ b/packages/opencode/test/storage/db.test.ts
@@ -2,7 +2,7 @@ import { describe, expect, test } from "bun:test"
import path from "path"
import { Global } from "@opencode-ai/core/global"
import { InstallationChannel } from "@opencode-ai/core/installation/version"
-import { Database } from "../../src/storage"
+import { Database } from "@/storage/db"
describe("Database.Path", () => {
test("returns database path for the current channel", () => {
diff --git a/packages/opencode/test/storage/json-migration.test.ts b/packages/opencode/test/storage/json-migration.test.ts
index 263573794..598a635cd 100644
--- a/packages/opencode/test/storage/json-migration.test.ts
+++ b/packages/opencode/test/storage/json-migration.test.ts
@@ -5,7 +5,7 @@ import { migrate } from "drizzle-orm/bun-sqlite/migrator"
import path from "path"
import fs from "fs/promises"
import { readFileSync, readdirSync } from "fs"
-import { JsonMigration } from "../../src/storage"
+import { JsonMigration } from "@/storage/json-migration"
import { Global } from "@opencode-ai/core/global"
import { ProjectTable } from "../../src/project/project.sql"
import { ProjectID } from "../../src/project/schema"
diff --git a/packages/opencode/test/storage/storage.test.ts b/packages/opencode/test/storage/storage.test.ts
index a3d5a8ac5..f0aff4ba7 100644
--- a/packages/opencode/test/storage/storage.test.ts
+++ b/packages/opencode/test/storage/storage.test.ts
@@ -5,7 +5,7 @@ import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { Git } from "../../src/git"
import { Global } from "@opencode-ai/core/global"
-import { Storage } from "../../src/storage"
+import { Storage } from "@/storage/storage"
import { tmpdirScoped } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
diff --git a/packages/opencode/test/sync/index.test.ts b/packages/opencode/test/sync/index.test.ts
index c9f6812ca..32a08715c 100644
--- a/packages/opencode/test/sync/index.test.ts
+++ b/packages/opencode/test/sync/index.test.ts
@@ -4,7 +4,7 @@ import { Schema } from "effect"
import { Bus } from "../../src/bus"
import { Instance } from "../../src/project/instance"
import { SyncEvent } from "../../src/sync"
-import { Database } from "../../src/storage"
+import { Database } from "@/storage/db"
import { EventTable } from "../../src/sync/event.sql"
import { Identifier } from "../../src/id/id"
import { Flag } from "@opencode-ai/core/flag/flag"
diff --git a/packages/opencode/test/tool/apply_patch.test.ts b/packages/opencode/test/tool/apply_patch.test.ts
index f311b3d9b..c4cccc6eb 100644
--- a/packages/opencode/test/tool/apply_patch.test.ts
+++ b/packages/opencode/test/tool/apply_patch.test.ts
@@ -4,12 +4,12 @@ import * as fs from "fs/promises"
import { Effect, ManagedRuntime, Layer } from "effect"
import { ApplyPatchTool } from "../../src/tool/apply_patch"
import { Instance } from "../../src/project/instance"
-import { LSP } from "../../src/lsp"
+import { LSP } from "@/lsp/lsp"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Format } from "../../src/format"
import { Agent } from "../../src/agent/agent"
import { Bus } from "../../src/bus"
-import { Truncate } from "../../src/tool"
+import { Truncate } from "@/tool/truncate"
import { tmpdir } from "../fixture/fixture"
import { SessionID, MessageID } from "../../src/session/schema"
diff --git a/packages/opencode/test/tool/bash.test.ts b/packages/opencode/test/tool/bash.test.ts
index dd5d50f55..513cfa18e 100644
--- a/packages/opencode/test/tool/bash.test.ts
+++ b/packages/opencode/test/tool/bash.test.ts
@@ -2,15 +2,15 @@ import { describe, expect, test } from "bun:test"
import { Effect, Layer, ManagedRuntime } from "effect"
import os from "os"
import path from "path"
-import { Config } from "../../src/config"
+import { Config } from "@/config/config"
import { Shell } from "../../src/shell/shell"
import { BashTool } from "../../src/tool/bash"
import { Instance } from "../../src/project/instance"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { tmpdir } from "../fixture/fixture"
import type { Permission } from "../../src/permission"
import { Agent } from "../../src/agent/agent"
-import { Truncate } from "../../src/tool"
+import { Truncate } from "@/tool/truncate"
import { SessionID, MessageID } from "../../src/session/schema"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
diff --git a/packages/opencode/test/tool/edit.test.ts b/packages/opencode/test/tool/edit.test.ts
index fb2080591..01dc74bb2 100644
--- a/packages/opencode/test/tool/edit.test.ts
+++ b/packages/opencode/test/tool/edit.test.ts
@@ -5,13 +5,13 @@ import { Effect, Layer, ManagedRuntime } from "effect"
import { EditTool } from "../../src/tool/edit"
import { Instance } from "../../src/project/instance"
import { tmpdir } from "../fixture/fixture"
-import { LSP } from "../../src/lsp"
+import { LSP } from "@/lsp/lsp"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Format } from "../../src/format"
import { Agent } from "../../src/agent/agent"
import { Bus } from "../../src/bus"
import { BusEvent } from "../../src/bus/bus-event"
-import { Truncate } from "../../src/tool"
+import { Truncate } from "@/tool/truncate"
import { SessionID, MessageID } from "../../src/session/schema"
const ctx = {
diff --git a/packages/opencode/test/tool/external-directory.test.ts b/packages/opencode/test/tool/external-directory.test.ts
index 8cbfe7827..ea1d340ce 100644
--- a/packages/opencode/test/tool/external-directory.test.ts
+++ b/packages/opencode/test/tool/external-directory.test.ts
@@ -1,10 +1,10 @@
import { describe, expect, test } from "bun:test"
import path from "path"
import { Effect } from "effect"
-import type { Tool } from "../../src/tool"
+import type { Tool } from "@/tool/tool"
import { Instance } from "../../src/project/instance"
import { assertExternalDirectory } from "../../src/tool/external-directory"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { tmpdir } from "../fixture/fixture"
import type { Permission } from "../../src/permission"
import { SessionID, MessageID } from "../../src/session/schema"
diff --git a/packages/opencode/test/tool/glob.test.ts b/packages/opencode/test/tool/glob.test.ts
index a8637ea9c..028436d29 100644
--- a/packages/opencode/test/tool/glob.test.ts
+++ b/packages/opencode/test/tool/glob.test.ts
@@ -6,7 +6,7 @@ import { SessionID, MessageID } from "../../src/session/schema"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { Ripgrep } from "../../src/file/ripgrep"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
-import { Truncate } from "../../src/tool"
+import { Truncate } from "@/tool/truncate"
import { Agent } from "../../src/agent/agent"
import { provideTmpdirInstance } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
diff --git a/packages/opencode/test/tool/grep.test.ts b/packages/opencode/test/tool/grep.test.ts
index acdaff03a..c807d1281 100644
--- a/packages/opencode/test/tool/grep.test.ts
+++ b/packages/opencode/test/tool/grep.test.ts
@@ -5,7 +5,7 @@ import { GrepTool } from "../../src/tool/grep"
import { provideInstance, provideTmpdirInstance } from "../fixture/fixture"
import { SessionID, MessageID } from "../../src/session/schema"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
-import { Truncate } from "../../src/tool"
+import { Truncate } from "@/tool/truncate"
import { Agent } from "../../src/agent/agent"
import { Ripgrep } from "../../src/file/ripgrep"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
diff --git a/packages/opencode/test/tool/lsp.test.ts b/packages/opencode/test/tool/lsp.test.ts
index 502ea30a0..8a3189cab 100644
--- a/packages/opencode/test/tool/lsp.test.ts
+++ b/packages/opencode/test/tool/lsp.test.ts
@@ -4,11 +4,12 @@ import path from "path"
import { Agent } from "../../src/agent/agent"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
-import { LSP } from "../../src/lsp"
+import { LSP } from "@/lsp/lsp"
import { Permission } from "../../src/permission"
import { Instance } from "../../src/project/instance"
import { MessageID, SessionID } from "../../src/session/schema"
-import { Tool, Truncate } from "../../src/tool"
+import { Tool } from "@/tool/tool"
+import { Truncate } from "@/tool/truncate"
import { LspTool } from "../../src/tool/lsp"
import { provideTmpdirInstance } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
diff --git a/packages/opencode/test/tool/question.test.ts b/packages/opencode/test/tool/question.test.ts
index 537d1f950..662073a8c 100644
--- a/packages/opencode/test/tool/question.test.ts
+++ b/packages/opencode/test/tool/question.test.ts
@@ -5,7 +5,7 @@ import { Question } from "../../src/question"
import { SessionID, MessageID } from "../../src/session/schema"
import { Agent } from "../../src/agent/agent"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
-import { Truncate } from "../../src/tool"
+import { Truncate } from "@/tool/truncate"
import { provideTmpdirInstance } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
diff --git a/packages/opencode/test/tool/read.test.ts b/packages/opencode/test/tool/read.test.ts
index b9c313bdc..db6678754 100644
--- a/packages/opencode/test/tool/read.test.ts
+++ b/packages/opencode/test/tool/read.test.ts
@@ -4,15 +4,15 @@ import path from "path"
import { Agent } from "../../src/agent/agent"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
-import { LSP } from "../../src/lsp"
+import { LSP } from "@/lsp/lsp"
import { Permission } from "../../src/permission"
import { Instance } from "../../src/project/instance"
import { SessionID, MessageID } from "../../src/session/schema"
import { Instruction } from "../../src/session/instruction"
import { ReadTool } from "../../src/tool/read"
-import { Truncate } from "../../src/tool"
-import { Tool } from "../../src/tool"
-import { Filesystem } from "../../src/util"
+import { Truncate } from "@/tool/truncate"
+import { Tool } from "@/tool/tool"
+import { Filesystem } from "@/util/filesystem"
import { provideInstance, tmpdirScoped } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
diff --git a/packages/opencode/test/tool/registry.test.ts b/packages/opencode/test/tool/registry.test.ts
index 523352d41..8e03177f8 100644
--- a/packages/opencode/test/tool/registry.test.ts
+++ b/packages/opencode/test/tool/registry.test.ts
@@ -4,7 +4,7 @@ import fs from "fs/promises"
import { Effect, Layer } from "effect"
import { Instance } from "../../src/project/instance"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
-import { ToolRegistry } from "../../src/tool"
+import { ToolRegistry } from "@/tool/registry"
import { provideTmpdirInstance } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
diff --git a/packages/opencode/test/tool/skill.test.ts b/packages/opencode/test/tool/skill.test.ts
index 43659187f..175c1526d 100644
--- a/packages/opencode/test/tool/skill.test.ts
+++ b/packages/opencode/test/tool/skill.test.ts
@@ -4,10 +4,10 @@ import { afterEach, describe, expect } from "bun:test"
import path from "path"
import { pathToFileURL } from "url"
import type { Permission } from "../../src/permission"
-import type { Tool } from "../../src/tool"
+import type { Tool } from "@/tool/tool"
import { Instance } from "../../src/project/instance"
import { SkillTool } from "../../src/tool/skill"
-import { ToolRegistry } from "../../src/tool"
+import { ToolRegistry } from "@/tool/registry"
import { provideTmpdirInstance } from "../fixture/fixture"
import { SessionID, MessageID } from "../../src/session/schema"
import { testEffect } from "../lib/effect"
diff --git a/packages/opencode/test/tool/task.test.ts b/packages/opencode/test/tool/task.test.ts
index 490b3f200..147541f3d 100644
--- a/packages/opencode/test/tool/task.test.ts
+++ b/packages/opencode/test/tool/task.test.ts
@@ -1,17 +1,17 @@
import { afterEach, describe, expect } from "bun:test"
import { Effect, Layer } from "effect"
import { Agent } from "../../src/agent/agent"
-import { Config } from "../../src/config"
+import { Config } from "@/config/config"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { Instance } from "../../src/project/instance"
-import { Session } from "../../src/session"
+import { Session } from "@/session/session"
import { MessageV2 } from "../../src/session/message-v2"
import type { SessionPrompt } from "../../src/session/prompt"
import { MessageID, PartID } from "../../src/session/schema"
import { ModelID, ProviderID } from "../../src/provider/schema"
import { TaskTool, type TaskPromptOps } from "../../src/tool/task"
-import { Truncate } from "../../src/tool"
-import { ToolRegistry } from "../../src/tool"
+import { Truncate } from "@/tool/truncate"
+import { ToolRegistry } from "@/tool/registry"
import { provideTmpdirInstance } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
diff --git a/packages/opencode/test/tool/tool-define.test.ts b/packages/opencode/test/tool/tool-define.test.ts
index 283708767..a291b9f7f 100644
--- a/packages/opencode/test/tool/tool-define.test.ts
+++ b/packages/opencode/test/tool/tool-define.test.ts
@@ -2,8 +2,8 @@ import { describe, test, expect } from "bun:test"
import { Effect, Layer, ManagedRuntime, Schema } from "effect"
import { Agent } from "../../src/agent/agent"
import { MessageID, SessionID } from "../../src/session/schema"
-import { Tool } from "../../src/tool"
-import { Truncate } from "../../src/tool"
+import { Tool } from "@/tool/tool"
+import { Truncate } from "@/tool/truncate"
const runtime = ManagedRuntime.make(Layer.mergeAll(Truncate.defaultLayer, Agent.defaultLayer))
diff --git a/packages/opencode/test/tool/truncation.test.ts b/packages/opencode/test/tool/truncation.test.ts
index 369ad2d58..9a01f95cd 100644
--- a/packages/opencode/test/tool/truncation.test.ts
+++ b/packages/opencode/test/tool/truncation.test.ts
@@ -1,11 +1,11 @@
import { describe, test, expect } from "bun:test"
import { NodeFileSystem } from "@effect/platform-node"
import { Effect, FileSystem, Layer } from "effect"
-import { Truncate } from "../../src/tool"
-import { Config } from "../../src/config"
+import { Truncate } from "@/tool/truncate"
+import { Config } from "@/config/config"
import { Identifier } from "../../src/id/id"
-import { Process } from "../../src/util"
-import { Filesystem } from "../../src/util"
+import { Process } from "@/util/process"
+import { Filesystem } from "@/util/filesystem"
import path from "path"
import { testEffect } from "../lib/effect"
import { writeFileStringScoped } from "../lib/filesystem"
diff --git a/packages/opencode/test/tool/webfetch.test.ts b/packages/opencode/test/tool/webfetch.test.ts
index 699e388fb..dbde4ed5b 100644
--- a/packages/opencode/test/tool/webfetch.test.ts
+++ b/packages/opencode/test/tool/webfetch.test.ts
@@ -3,7 +3,7 @@ import path from "path"
import { Effect, Layer } from "effect"
import { FetchHttpClient } from "effect/unstable/http"
import { Agent } from "../../src/agent/agent"
-import { Truncate } from "../../src/tool"
+import { Truncate } from "@/tool/truncate"
import { Instance } from "../../src/project/instance"
import { WebFetchTool } from "../../src/tool/webfetch"
import { SessionID, MessageID } from "../../src/session/schema"
diff --git a/packages/opencode/test/tool/write.test.ts b/packages/opencode/test/tool/write.test.ts
index e6e383189..cc9f87100 100644
--- a/packages/opencode/test/tool/write.test.ts
+++ b/packages/opencode/test/tool/write.test.ts
@@ -4,12 +4,12 @@ import path from "path"
import fs from "fs/promises"
import { WriteTool } from "../../src/tool/write"
import { Instance } from "../../src/project/instance"
-import { LSP } from "../../src/lsp"
+import { LSP } from "@/lsp/lsp"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { Bus } from "../../src/bus"
import { Format } from "../../src/format"
-import { Truncate } from "../../src/tool"
-import { Tool } from "../../src/tool"
+import { Truncate } from "@/tool/truncate"
+import { Tool } from "@/tool/tool"
import { Agent } from "../../src/agent/agent"
import { SessionID, MessageID } from "../../src/session/schema"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
diff --git a/packages/opencode/test/util/filesystem.test.ts b/packages/opencode/test/util/filesystem.test.ts
index d5f8a529b..9b8e3f797 100644
--- a/packages/opencode/test/util/filesystem.test.ts
+++ b/packages/opencode/test/util/filesystem.test.ts
@@ -1,7 +1,7 @@
import { describe, test, expect } from "bun:test"
import path from "path"
import fs from "fs/promises"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { tmpdir } from "../fixture/fixture"
describe("filesystem", () => {
diff --git a/packages/opencode/test/util/lock.test.ts b/packages/opencode/test/util/lock.test.ts
index d51b93648..79fbb5831 100644
--- a/packages/opencode/test/util/lock.test.ts
+++ b/packages/opencode/test/util/lock.test.ts
@@ -1,5 +1,5 @@
import { describe, expect, test } from "bun:test"
-import { Lock } from "../../src/util"
+import { Lock } from "@/util/lock"
function tick() {
return new Promise<void>((r) => queueMicrotask(r))
diff --git a/packages/opencode/test/util/log.test.ts b/packages/opencode/test/util/log.test.ts
index 9a3b61732..486ca0f3b 100644
--- a/packages/opencode/test/util/log.test.ts
+++ b/packages/opencode/test/util/log.test.ts
@@ -2,7 +2,7 @@ import { afterEach, expect, test } from "bun:test"
import fs from "fs/promises"
import path from "path"
import { Global } from "@opencode-ai/core/global"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { tmpdir } from "../fixture/fixture"
const log = Global.Path.log
diff --git a/packages/opencode/test/util/module.test.ts b/packages/opencode/test/util/module.test.ts
index 19c7958fc..6da011ebe 100644
--- a/packages/opencode/test/util/module.test.ts
+++ b/packages/opencode/test/util/module.test.ts
@@ -1,7 +1,7 @@
import { describe, expect, test } from "bun:test"
import path from "path"
import { Module } from "@opencode-ai/core/util/module"
-import { Filesystem } from "../../src/util"
+import { Filesystem } from "@/util/filesystem"
import { tmpdir } from "../fixture/fixture"
describe("util.module", () => {
diff --git a/packages/opencode/test/util/process.test.ts b/packages/opencode/test/util/process.test.ts
index 544202570..934833d1d 100644
--- a/packages/opencode/test/util/process.test.ts
+++ b/packages/opencode/test/util/process.test.ts
@@ -1,7 +1,7 @@
import { describe, expect, test } from "bun:test"
import fs from "fs/promises"
import path from "path"
-import { Process } from "../../src/util"
+import { Process } from "@/util/process"
import { tmpdir } from "../fixture/fixture"
function node(script: string) {
diff --git a/packages/opencode/test/util/wildcard.test.ts b/packages/opencode/test/util/wildcard.test.ts
index 7c9b1e4ac..2f7b26328 100644
--- a/packages/opencode/test/util/wildcard.test.ts
+++ b/packages/opencode/test/util/wildcard.test.ts
@@ -1,5 +1,5 @@
import { test, expect } from "bun:test"
-import { Wildcard } from "../../src/util"
+import { Wildcard } from "@/util/wildcard"
test("match handles glob tokens", () => {
expect(Wildcard.match("file1.txt", "file?.txt")).toBe(true)
diff --git a/packages/opencode/test/workspace/workspace-restore.test.ts b/packages/opencode/test/workspace/workspace-restore.test.ts
index 2f8b236b5..7f802150e 100644
--- a/packages/opencode/test/workspace/workspace-restore.test.ts
+++ b/packages/opencode/test/workspace/workspace-restore.test.ts
@@ -9,13 +9,15 @@ import { AppRuntime } from "../../src/effect/app-runtime"
import { Flag } from "@opencode-ai/core/flag/flag"
import { ModelID, ProviderID } from "../../src/provider/schema"
import { Instance } from "../../src/project/instance"
-import { Session as SessionNs } from "../../src/session"
+import { Session as SessionNs } from "@/session/session"
import { MessageV2 } from "../../src/session/message-v2"
import { MessageID, PartID, type SessionID } from "../../src/session/schema"
-import { Database, asc, eq } from "../../src/storage"
+import { Database } from "@/storage/db"
+import { asc } from "drizzle-orm"
+import { eq } from "drizzle-orm"
import { SyncEvent } from "../../src/sync"
import { EventTable } from "../../src/sync/event.sql"
-import { Log } from "../../src/util"
+import * as Log from "@opencode-ai/core/util/log"
import { resetDatabase } from "../fixture/db"
import { tmpdir } from "../fixture/fixture"