Remove wrappers for Provider service (#10658)

* refactor(opencode): remove legacy Provider promise wrappers in favor of Effect service usage

Replace static `Provider.list`, `Provider.getModel`, `Provider.getLanguage`,
`Provider.getSmallModel`, and `Provider.defaultModel` promise helpers with
direct `Provider.Service.use()` calls through `AppRuntime.runPromise`. This
eliminates the `makeRuntime` import and the wrapper functions that bypassed
the Effect dependency injection system.

- Remove legacy promise helpers from provider.ts
- Update kilo-sessions, roll-call, commit-message, enhance-prompt, and
  task tool to use Provider.Service via AppRuntime directly
- Thread Provider.Interface into KiloTask.select for proper DI
- Add Provider.defaultLayer to test layers that exercise TaskTool
- Update commit-message tests to spy on CommitMessageRuntime.model()

* docs(sdk): regenerate v2 SDK types and update edit endpoint description
This commit is contained in:
Imanol Maiztegui
2026-05-29 09:24:56 +02:00
committed by GitHub
parent 2d03c428ea
commit 8f225e2eec
11 changed files with 76 additions and 59 deletions
@@ -1,5 +1,6 @@
import { describe, expect, test, mock, beforeEach, spyOn } from "bun:test"
import type { GitContext } from "@/kilocode/commit-message/types"
import type { Provider } from "@/provider/provider"
// Mock dependencies before importing the module under test.
// IMPORTANT: Bun's mock.module() is process-wide and permanent. To avoid
@@ -7,7 +8,6 @@ import type { GitContext } from "@/kilocode/commit-message/types"
// this test needs.
const realLog = await import("@opencode-ai/core/util/log")
const realProvider = await import("@/provider/provider")
const realAgent = await import("@/agent/agent")
const realGitContext = await import("@/kilocode/commit-message/git-context")
@@ -36,19 +36,6 @@ mock.module("@/kilocode/commit-message/git-context", () => ({
},
}))
mock.module("@/provider/provider", () => ({
...realProvider,
Provider: {
...realProvider.Provider,
defaultModel: async () => ({ providerID: "test", modelID: "test-model" }),
getSmallModel: async () => ({
providerID: "test",
id: "test-small-model",
}),
getModel: async () => ({ providerID: "test", id: "test-model" }),
},
}))
mock.module("@/agent/agent", () => ({
...realAgent,
Agent: {},
@@ -67,10 +54,14 @@ mock.module("@opencode-ai/core/util/log", () => ({
import { CommitMessageRuntime, generateCommitMessage } from "../../../src/kilocode/commit-message/generate"
const stream = spyOn(CommitMessageRuntime, "generate").mockImplementation(async () => mockStreamText)
const model = spyOn(CommitMessageRuntime, "model").mockImplementation(
async () => ({ providerID: "test", id: "test-small-model" }) as Provider.Model,
)
describe("commit-message.generate", () => {
beforeEach(() => {
stream.mockImplementation(async () => mockStreamText)
model.mockImplementation(async () => ({ providerID: "test", id: "test-small-model" }) as Provider.Model)
mockStreamText = "feat(src): add hello world logging"
mockGitContext = { ...defaultGitContext }
captured = { path: "" }
@@ -8,6 +8,7 @@ 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 { Provider } from "../../src/provider/provider"
import { TaskTool, type TaskPromptOps } from "../../src/tool/task"
import { Truncate } from "../../src/tool/truncate"
import { ToolRegistry } from "../../src/tool/registry"
@@ -26,6 +27,7 @@ const it = testEffect(
CrossSpawnSpawner.defaultLayer,
Session.defaultLayer,
Truncate.defaultLayer,
Provider.defaultLayer,
ToolRegistry.defaultLayer,
),
)
@@ -12,6 +12,7 @@ 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 { Provider } from "../../src/provider/provider"
import { TaskTool, type TaskPromptOps } from "../../src/tool/task"
import { Truncate } from "../../src/tool/truncate"
import { ToolRegistry } from "../../src/tool/registry"
@@ -94,6 +95,7 @@ const it = testEffect(
CrossSpawnSpawner.defaultLayer,
Session.defaultLayer,
Truncate.defaultLayer,
Provider.defaultLayer,
ToolRegistry.defaultLayer,
),
)
+2
View File
@@ -8,6 +8,7 @@ import { MessageV2 } from "../../src/session/message-v2"
import type { SessionPrompt } from "../../src/session/prompt"
import { MessageID, PartID, SessionID } from "../../src/session/schema" // kilocode_change - SessionID used by cost propagation tests
import { ModelID, ProviderID } from "../../src/provider/schema"
import { Provider } from "../../src/provider/provider" // kilocode_change
import { TaskTool, type TaskPromptOps } from "../../src/tool/task"
import { Truncate } from "@/tool/truncate"
import { ToolRegistry } from "@/tool/registry"
@@ -30,6 +31,7 @@ const it = testEffect(
CrossSpawnSpawner.defaultLayer,
Session.defaultLayer,
Truncate.defaultLayer,
Provider.defaultLayer, // kilocode_change
ToolRegistry.defaultLayer,
),
)